Index: trunk/SophyaLib/Samba/spherethetaphi.cc
===================================================================
--- trunk/SophyaLib/Samba/spherethetaphi.cc	(revision 701)
+++ trunk/SophyaLib/Samba/spherethetaphi.cc	(revision 726)
@@ -68,15 +68,11 @@
   NTheta_= s.NTheta_;
   NPix_  = s.NPix_;
-  NPhi_  = new int_4[NTheta_];
-  Theta_ = new double[NTheta_+1];
-  TNphi_ = new int_4[NTheta_+1];
-  for(int k = 0; k < NTheta_; k++) 
-    {
-      NPhi_[k] = s.NPhi_[k];
-      Theta_[k]= s.Theta_[k];
-      TNphi_[k]= s.TNphi_[k];
-    }
-  Theta_[NTheta_]= s.Theta_[NTheta_];
-  TNphi_[NTheta_]= s.TNphi_[NTheta_];
+  NPhi_.ReSize(NTheta_);
+  Theta_.ReSize(NTheta_+1);
+  TNphi_.ReSize(NTheta_+1);
+
+  NPhi_  = s.NPhi_;
+  TNphi_ = s.TNphi_;
+  Theta_ = s.Theta_;
   Omega_ = s.Omega_;
 }
@@ -90,7 +86,5 @@
 
 //--
-{
-  Clear();
-}
+{}
 
 //++
@@ -100,24 +94,10 @@
 void SphereThetaPhi<T>::InitNul()
 //
-//    initialise à zéro les variables de classe pointeurs
 {
   NTheta_= 0;
   NPix_  = 0;
-  Theta_ = NULL;
-  NPhi_  = NULL;
-  TNphi_ = NULL;
 //  pixels_.Reset();  Pas de reset par InitNul (en cas de share) - Reza 20/11/99 $CHECK$
 }
 
-/* --Methode-- */
-template <class T>
-void SphereThetaPhi<T>::Clear()
-
-{
-  if(Theta_)  delete[] Theta_;
-  if(NPhi_ )  delete[] NPhi_;
-  if(TNphi_)  delete[] TNphi_;
-  InitNul();
-}
 
 //++
@@ -127,5 +107,5 @@
 //--
 {
-  Clear();
+  InitNul();
   Pixelize(m);
 }
@@ -152,7 +132,5 @@
   if((k < 0) || (k >= NPix_)) 
     {
-      //THROW(out_of_range("SphereThetaPhi::PIxVal Pixel index out of range"));
-      cout << " SphereThetaPhi::PIxVal : exceptions a mettre en place" <<endl;
-      THROW(rangeCheckErr);
+      throw RangeCheckError("SphereThetaPhi::PIxVal Pixel index out of range");
     }
   return pixels_(k);
@@ -168,7 +146,5 @@
   if((k < 0) || (k >= NPix_)) 
     {
-      cout << " SphereThetaPhi::PIxVal : exceptions  a mettre en place" <<endl;
-      //THROW(out_of_range("SphereThetaPhi::PIxVal Pixel index out of range"));
-      throw "SphereThetaPhi::PIxVal Pixel index out of range"; 
+       throw RangeCheckError("SphereThetaPhi::PIxVal Pixel index out of range");
     } 
   return *(pixels_.Data()+k);
@@ -204,10 +180,10 @@
   // Theta_[kt] et Theta_[kt+1]
   for( i=1; i< NTheta_; i++ ) 
-    if( theta < Theta_[i] ) break;
-  
-  dphi= DeuxPi/(double)NPhi_[i-1];
-  
-  if (fgzn)  k= NPix_-TNphi_[i]+(int_4)(phi/dphi);
-  else k= TNphi_[i-1]+(int_4)(phi/dphi); 
+    if( theta < Theta_(i) ) break;
+  
+  dphi= DeuxPi/(double)NPhi_(i-1);
+  
+  if (fgzn)  k= NPix_-TNphi_(i)+(int_4)(phi/dphi);
+  else k= TNphi_(i-1)+(int_4)(phi/dphi); 
   return(k);
 }
@@ -229,13 +205,13 @@
   // recupère l'indice i de la tranche qui contient le pixel k
   for( i=0; i< NTheta_; i++ ) 
-    if( k < TNphi_[i+1] ) break;
+    if( k < TNphi_(i+1) ) break;
 
   // angle theta
-  theta= 0.5*(Theta_[i]+Theta_[i+1]);
+  theta= 0.5*(Theta_(i)+Theta_(i+1));
   if (fgzn) theta= Pi-theta;
   
   // angle phi
-  k -= TNphi_[i];
-  phi= DeuxPi/(double)NPhi_[i]*(double)(k+.5);
+  k -= TNphi_(i);
+  phi= DeuxPi/(double)NPhi_(i)*(double)(k+.5);
   if (fgzn) phi= DeuxPi-phi;
 }
@@ -290,21 +266,21 @@
   int i;
   for( i=0; i< NTheta_; i++ ) 
-    if(k < TNphi_[i+1]) break;
+    if(k < TNphi_(i+1)) break;
   
   // valeurs limites de theta dans l'hemisphere Nord
-  tetMin= Theta_[i];
-  tetMax= Theta_[i+1];
+  tetMin= Theta_(i);
+  tetMax= Theta_(i+1);
   // valeurs limites de theta dans l'hemisphere Sud
   if (fgzn) {
-    tetMin= Pi-Theta_[i+1];
-    tetMax= Pi-Theta_[i];
+    tetMin= Pi - Theta_(i+1);
+    tetMax= Pi - Theta_(i);
   }
   
   // pixel correspondant dans l'hemisphere Nord
-  if (fgzn) k= TNphi_[i+1]-k+TNphi_[i]-1;
+  if (fgzn) k= TNphi_(i+1)-k+TNphi_(i)-1;
   
   // indice j de discretisation ( phi= j*dphi )
-  j= k-TNphi_[i];
-  dphi= DeuxPi/(double)NPhi_[i];
+  j= k-TNphi_(i);
+  dphi= DeuxPi/(double)NPhi_(i);
   
   // valeurs limites de phi 
@@ -317,9 +293,13 @@
 //++
 template <class T>
-int_4 SphereThetaPhi<T>::NbThetaSlices() const
+uint_4 SphereThetaPhi<T>::NbThetaSlices() const
 
 //    Return number of theta-slices on the sphere
 //--
 {
+  if (NTheta_<=0) 
+    {
+      throw PException(" sphere not pixelized, NbSlice=0 ");
+    }
   return( 2*NTheta_);
 }
@@ -343,5 +323,5 @@
   
   // nombre de pixels
-  nbpix= NPhi_[kt];
+  nbpix= NPhi_(kt);
   return(nbpix);
 }
@@ -371,10 +351,10 @@
   
   // valeurs limites de theta dans l'hemisphere Nord
-  tetMin= Theta_[kt];
-  tetMax= Theta_[kt+1];
+  tetMin= Theta_(kt);
+  tetMax= Theta_(kt+1);
   // valeurs limites de theta dans l'hemisphere Sud
   if (fgzn) {
-    tetMin= Pi-Theta_[kt+1];
-    tetMax= Pi-Theta_[kt];
+    tetMin= Pi - Theta_(kt+1);
+    tetMax= Pi - Theta_(kt);
   }  
 }
@@ -399,5 +379,5 @@
   
   // verifie si la tranche kt contient au moins jp pixels
-  if( (jp< 0) || (jp >= NPhi_[kt]) ) {
+  if( (jp< 0) || (jp >= NPhi_(kt)) ) {
     phiMin= -88888.; 
     phiMax= -88888.; 
@@ -405,5 +385,5 @@
   }
   
-  double dphi= DeuxPi/(double)NPhi_[kt];
+  double dphi= DeuxPi/(double)NPhi_(kt);
   phiMin= dphi*(double)(jp);
   phiMax= dphi*(double)(jp+1);
@@ -429,10 +409,10 @@
   
   // si la tranche kt contient au moins i pixels
-  if( (jp>=0) && (jp<NPhi_[kt]) ) 
+  if( (jp>=0) && (jp<NPhi_(kt)) ) 
     {
       // dans l'hemisphere Sud
-      if (fgzn) k= NPix_-TNphi_[kt+1]+jp;
+      if (fgzn) k= NPix_-TNphi_(kt+1)+jp;
       // dans l'hemisphere Nord
-      else k= TNphi_[kt]+jp;
+      else k= TNphi_(kt)+jp;
     }
   else
@@ -463,5 +443,5 @@
   int i;
   for(i = 0; i < NTheta_; i++) 
-    if(k < TNphi_[i+1]) break;
+    if(k < TNphi_(i+1)) break;
   
   // indice  kt de tranche
@@ -470,6 +450,6 @@
   
   // indice jp de pixel
-  if (fgzn) jp= TNphi_[i+1]-k-1;
-  else jp= k-TNphi_[i];  
+  if (fgzn) jp= TNphi_(i+1)-k-1;
+  else jp= k-TNphi_(i);  
 }
 //++
@@ -502,12 +482,15 @@
   // Creation des vecteurs contenant :
   // Les valeurs limites de theta (une valeur de plus que le nombre de bandes...)
-  Theta_= new double[m+1];
+  //  Theta_= new double[m+1];
+  Theta_.ReSize(m+1);
   
   // Le nombre de pixels en phi de chacune des bandes en theta
-  NPhi_ = new int_4[m];
+  //  NPhi_ = new int_4[m];
+  NPhi_.ReSize(m);
   
   // Le nombre/Deuxpi total des pixels contenus dans les bandes de z superieur a une
   // bande donnee (mTPphi[m] contient le nombre de pixels total de l'hemisphere)
-  TNphi_= new int_4[m+1];
+  //  TNphi_= new int_4[m+1];
+    TNphi_.ReSize(m+1);
   
   // Calcul du nombre total de pixels dans chaque bande pour optimiser
@@ -515,17 +498,17 @@
   
   //calotte polaire
-  TNphi_[0]= 0;
-  NPhi_[0] = 1;
+  TNphi_(0)= 0;
+  NPhi_(0) = 1;
   
   //bandes jusqu'a l'equateur
   for(j = 1; j < m; j++) 
     {
-      TNphi_[j]= TNphi_[j-1]+NPhi_[j-1];
-      NPhi_[j] = (int_4)(.5+4.*(double)(m-.5)*sin(Pi*(double)j/(double)(2.*m-1.))) ;
+      TNphi_(j)= TNphi_(j-1)+NPhi_(j-1);
+      NPhi_(j) = (int_4)(.5+4.*(double)(m-.5)*sin(Pi*(double)j/(double)(2.*m-1.))) ;
     }
   
   // Nombre total de pixels sur l'hemisphere
-  ntotpix  = TNphi_[m-1]+NPhi_[m-1];
-  TNphi_[m]= ntotpix;
+  ntotpix  = TNphi_(m-1)+NPhi_(m-1);
+  TNphi_(m)= ntotpix;
   // et sur la sphere entiere
   NPix_= 2*ntotpix;
@@ -548,5 +531,5 @@
   for(j=0; j <= m; j++) 
     {
-      Theta_[j]= acos(1.-(double)TNphi_[j]*omeg2pi);
+      Theta_(j)= acos(1.-(double)TNphi_(j)*omeg2pi);
     }
 }
@@ -566,7 +549,5 @@
   if(index < 0 || index >= NbThetaSlices()) 
     {
-      // THROW(out_of_range("SphereThetaPhi::PIxVal Pixel index out of range")); 
-      cout << " SphereThetaPhi::GetThetaSlice : Pixel index out of range" <<endl;
-      THROW(rangeCheckErr);
+       throw RangeCheckError("SphereThetaPhi::PIxVal Pixel index out of range"); 
     }
 
@@ -587,30 +568,40 @@
 }
 
-template <class T>
-void SphereThetaPhi<T>::setmNPhi(int_4* array, int_4 m)
-  //remplit le tableau contenant le nombre de pixels en phi de chacune des bandes en theta 
-  //
-{
-  NPhi_= new int_4[m];
-  for(int k = 0; k < m; k++) NPhi_[k]= array[k];
-}
-
-template <class T>
-void SphereThetaPhi<T>::setmTNphi(int_4* array, int_4 m)
-  //remplit  le tableau contenant le nombre/Deuxpi total des pixels contenus dans les bandes 
-  //
-{
-  TNphi_= new int_4[m];
-  for(int k = 0; k < m; k++) TNphi_[k]= array[k];
-}
-
-template <class T>
-void SphereThetaPhi<T>::setmTheta(double* array, int_4 m)
-  //remplit  le tableau contenant les valeurs limites de theta
-  //
-{
-  Theta_= new double[m];
-  for(int k = 0; k < m; k++) Theta_[k]= array[k];
-}
+//++
+template <class T>
+void SphereThetaPhi<T>::GetThetaSlice(int_4 index,double& theta, double& phi0,TVector<int>& pixelIndices, TVector<T>& value) const 
+
+//    For a theta-slice with index 'index', return : 
+//    the corresponding "theta" 
+//    the corresponding "phi" for first pixel of the slice 
+//    a vector containing the indices of the pixels of the slice
+//    (equally distributed in phi)
+//    a vector containing the corresponding values of pixels 
+//--
+
+{
+
+  if(index < 0 || index >= NbThetaSlices()) 
+    {
+       throw RangeCheckError("SphereThetaPhi::PIxVal Pixel index out of range"); 
+ 
+    }
+
+  int iring= Index(index,0);
+  int lring  = NPhi(index);
+
+  pixelIndices.ReSize(lring);
+  value.ReSize(lring);
+  double Te= 0.;
+  double Fi= 0.;
+  for(int kk = 0; kk < lring; kk++) 
+    {
+      pixelIndices(kk)=kk+iring ;
+      value(kk)= PixVal(kk+iring);
+    }
+      PixThetaPhi(iring,theta,phi0);
+}
+
+
 
 
@@ -629,5 +620,5 @@
     {
       if(i%5 == 0) os << endl;
-      os << NPhi_[i] <<", ";
+      os << NPhi_(i) <<", ";
     }
   os << endl;
@@ -637,5 +628,5 @@
     {
       if(i%5 == 0) os << endl;
-      os << Theta_[i] <<", ";
+      os << Theta_(i) <<", ";
     }
   os << endl;
@@ -645,5 +636,5 @@
     {
       if(i%5 == 0) os << endl;
-      os << TNphi_[i] <<", ";
+      os << TNphi_(i) <<", ";
     }
   os << endl;
@@ -675,5 +666,4 @@
 {
   dobj= new SphereThetaPhi<T>;
-  //  dobj->DataBlock().SetTemp(true);
   dobj->pixels_.SetTemp(true);
   ownobj= true;
@@ -685,5 +675,4 @@
 {
   dobj= new SphereThetaPhi<T>(obj, true);
-  //  dobj->DataBlock().SetTemp(true);
   dobj->pixels_.SetTemp(true);
   ownobj= true;
@@ -716,9 +705,11 @@
     {
       dobj= new SphereThetaPhi<T>;
-      //      dobj->DataBlock().SetTemp(true);
       dobj->pixels_.SetTemp(true);
       ownobj= true;      
     }
 
+  // On lit les 3 premiers uint_8
+  uint_8 itab[3];
+  is.Get(itab, 3);
 // Let's Read the SphereCoordSys object  -- ATTENTIOn - $CHECK$
   FIO_SphereCoordSys fio_scs( dobj->GetCoordSys());
@@ -742,25 +733,13 @@
   is.GetR8(mOmeg);
   dobj->setParameters(mNPix, mOmeg, mNTheta); 
-
-  int_4* mNphi= new int_4[mNTheta];
-  is.GetI4s(mNphi, mNTheta);
-  dobj->setmNPhi(mNphi, mNTheta);
-  delete [] mNphi;
-
-  int_4* mTNphi= new int_4[mNTheta+1];
-  is.GetI4s(mTNphi, mNTheta+1);
-  dobj->setmTNphi(mTNphi, mNTheta+1);
-  delete [] mTNphi;
-
-  double* mTheta= new double[mNTheta+1];
-  is.GetR8s(mTheta, mNTheta+1);
-  dobj->setmTheta(mTheta, mNTheta+1);
-  delete [] mTheta;
-
-// On lit le DataBlock;
-  //FIO_NDataBlock<T> fio_nd(&dobj->DataBlock());
+  FIO_NDataBlock<int_4> fio_nd_nphi(&dobj->NPhi_);
+  fio_nd_nphi.Read(is);
+  FIO_NDataBlock<int_4> fio_nd_Tnphi(&dobj->TNphi_);
+  fio_nd_Tnphi.Read(is);
+  FIO_NDataBlock<r_8> fio_nd_Theta(&dobj->Theta_);
+  fio_nd_Theta.Read(is);
+
 FIO_NDataBlock<T> fio_nd(&dobj->pixels_);
 fio_nd.Read(is);
-//  is >> dobj->DataBlock();
 }
 
@@ -775,4 +754,11 @@
     }
 
+//  On ecrit 3 uint_8 
+//  0 : Numero de version,  1 : Size index,  2  reserve a l
+uint_8 itab[3];
+itab[0] = 1;
+itab[1] = dobj->SizeIndex();
+itab[2] = 0;
+os.Put(itab, 3);
 // Let's write the SphereCoordSys object
   FIO_SphereCoordSys fio_scs( dobj->GetCoordSys());
@@ -798,12 +784,12 @@
   os.PutI4(mNPix);
   os.PutR8(dobj->PixSolAngle());
-  os.PutI4s(dobj->getmNPhi() , mNTheta);
-  os.PutI4s(dobj->getmTNphi(), mNTheta+1);
-  os.PutR8s(dobj->getmTheta(), mNTheta+1);
-// On ecrit le datablock
-  //FIO_NDataBlock<T> fio_nd(&dobj->DataBlock());
+  FIO_NDataBlock<int_4> fio_nd_nphi(&dobj->NPhi_);
+  fio_nd_nphi.Write(os);
+  FIO_NDataBlock<int_4> fio_nd_Tnphi(&dobj->TNphi_);
+  fio_nd_Tnphi.Write(os);
+  FIO_NDataBlock<r_8> fio_nd_Theta(&dobj->Theta_);
+  fio_nd_Theta.Write(os);
 FIO_NDataBlock<T> fio_nd(&dobj->pixels_);
 fio_nd.Write(os);
-//  os << dobj->DataBlock();
 }
 
