Index: /trunk/SophyaLib/Samba/scan.cc
===================================================================
--- /trunk/SophyaLib/Samba/scan.cc	(revision 566)
+++ /trunk/SophyaLib/Samba/scan.cc	(revision 567)
@@ -5,4 +5,6 @@
 
 #include "scan.h"
+#include <complex>
+#include "piocmplx.h"
 
 // valeurs de Pi, 2*Pi, etc                                              
@@ -14,24 +16,8 @@
 // Class	Scan
 //
-// include      scan.h  nbmath.h 
-//
-//    Cette classe permet de stocker et traiter les données pour un balayage 
-//    d'une portion de ciel pour un jeu de valeurs fixé des paramètres précisé
-//    dans le constructeur.    
-//--
-//++
-//
-// Links	Parents
-//
-//    
-//-- 
-//++
-//
-// Links	Descendants
-//
-//     
-//-- 
-//++
-// Titre	Constructeurs
+// include      scan.h  dvlist.h math.h nbmath.h 
+//
+//    Storage and treatment of data for a scanning of a part of the sky
+//    with a set of given values for parameters (see constructor)
 //--
 //++
@@ -40,11 +26,11 @@
 
 //  
-//    * Ouv      = angle d'ouverture (rad)
-//    * Omega[3] = direction de l'axe de rotation du satellite (teta,phi)
-//    et vitesse de rotation (rad/s)
-//    * Fech     = fréquence d'échantillonnage (Hz)
-//    * T        = temps total de prise des données (s)
-//    * t0       = instant de départ (s)
-//    * phi0     = offset antenne (rad)
+//    * Ouv      = aperture angle (rad)
+//    * Omega[3] = direction of rotation axis of the satellite (teta,phi)
+//    and rotation velocity (rad/s)
+//    * Fech     = sampling frequency  (Hz)
+//    * T        = total time of data acquistion (s)
+//    * t0       = starting time (s)
+//    * phi0     = offset of antenna (rad)
 //--
 {
@@ -79,6 +65,9 @@
 
   // Creation et initialisation du vecteur des mesures aux points
-  sPix_ = new r_8[NmaxPts_];
-  for( int_4 i=0; i<NmaxPts_; i++ )  sPix_[i]= 0.;
+  //  sPix_ = new r_8[NmaxPts_];
+  sPix_.ReSize(NmaxPts_);
+  sPix_.Reset();
+  //  for( int_4 i=0; i<NmaxPts_; i++ )  sPix_[i]= 0.;
+    for( int_4 i=0; i<NmaxPts_; i++ )  sPix_(i)= 0.;
 
   // matrice de passage du systeme lie au satellite au systeme fixe
@@ -100,26 +89,26 @@
 
 }
+
+
 //++
 Scan::Scan(const Scan& s)
 
-//    Constructeur de copie
-//--
-{
-  NmaxPts_      = s. NmaxPts_;
+//    copy  constructor
+//--
+{
+  NmaxPts_      = s.NmaxPts_;
   Ouverture_    = s.Ouverture_;
   OmegaTeta_    = s.OmegaTeta_;
   OmegaPhi_     = s.OmegaPhi_;
   OmegaRad_     = s.OmegaRad_;
-  FrequenceEch_ = s. FrequenceEch_;
-  TempsFinal_ = s.TempsFinal_;
+  FrequenceEch_ = s.FrequenceEch_;
+  TempsFinal_   = s.TempsFinal_;
   TempsInitial_ = s.TempsInitial_;
-  PhiZero_ = s. PhiZero_;
-  sPix_=new r_8[ NmaxPts_];
-  int_4 k;
-  for (k=0; k<NmaxPts_; k++)  sPix_[k]=s.sPix_[k];
-  for (k=0; k<9; k++) Rota_[k]=s. Rota_[k];
-}
-//++
-// Titre	Destructeur
+  PhiZero_      = s.PhiZero_;
+  sPix_=s.sPix_;
+  for (int k=0; k<9; k++) Rota_[k]=s. Rota_[k];
+}
+//++
+// Titre	Destructor
 //--
 //++
@@ -129,72 +118,10 @@
 //--
 {
-  delete[] sPix_ ;
-}
-//++
-void Scan::WriteSelf(POutPersist& s) const
-
-//    créer un fichier persistant
-//--
-{
-  char strg[256];
-  if (mInfo_) {sprintf(strg, "Scan: Theta=%9f Phi=%9f omega=%9f HasInfo", (float)OmegaTeta_, (float)OmegaPhi_, (float)OmegaRad_);
-  }
-  else {sprintf(strg, "Scan: Theta=%9f Phi=%9f omega=%9f ", (float)OmegaTeta_, (float)OmegaPhi_, (float)OmegaRad_); 
-  }
-  s.PutLine(strg);
-  if (mInfo_)  s << (*mInfo_);
-   s.PutI4( NmaxPts_);
-  s.PutI4(NmaxTrs_);
-  s.PutI4( NPts1Tr_);
-  s.PutR4(Ouverture_);
-  s.PutR4(OmegaTeta_);
-  s.PutR4(OmegaPhi_);
-  s.PutR4(OmegaRad_);
-  s.PutR4(FrequenceEch_);
-  s.PutR4(TempsFinal_);
-  s.PutR4( TempsInitial_);
-  s.PutR4( PhiZero_);
-  s.PutR8s(sPix_,NmaxPts_);
-  s.PutR8s(Rota_, 9);
-  return;
-}
-
-
-//++
-void Scan::ReadSelf(PInPersist& s) 
-
-//    relire un fichier persistant
-//--
-{
-  Clear();
-  char strg[256];
-  s.GetLine(strg,255);
-// Pour savoir s'il y avait un DVList Info associe
-  bool hadinfo = false;
-  if (strncmp(strg+strlen(strg)-7, "HasInfo", 7) == 0)  hadinfo = true;
-// Pour savoir s'il y avait un DVList Info associe
-  if (hadinfo) {    // Lecture eventuelle du DVList Info
-    if (mInfo_ == NULL)  mInfo_ = new DVList;
-    s >> (*mInfo_);
-  }
-  s.GetI4( NmaxPts_);
-  s.GetI4(NmaxTrs_);
-  s.GetI4( NPts1Tr_);
-  s.GetR4(Ouverture_);
-  s.GetR4(OmegaTeta_);
-  s.GetR4(OmegaPhi_);
-  s.GetR4(OmegaRad_);
-  s.GetR4(FrequenceEch_);
-  s.GetR4(TempsFinal_);
-  s.GetR4( TempsInitial_);
-  s.GetR4( PhiZero_);
-  sPix_=new r_8[NmaxPts_];
-  s.GetR8s(sPix_,NmaxPts_);
-  s.GetR8s(Rota_, 9);
-}
-
-
-//++
-// Titre	Méthodes
+  // delete[] sPix_ ;
+}
+
+
+//++
+// Titre	Public Methods
 //--
 
@@ -202,5 +129,5 @@
 int_4 Scan::NbPoints() const
 
-//    Retourne le nombre de Points du scan
+//    Return the number of points in the scan
 //--
 {
@@ -212,5 +139,5 @@
 int_4 Scan::NbTours() const
 
-//    Retourne le nombre total de tours
+//    Return total nomber of turns
 //--
 {
@@ -222,5 +149,5 @@
 int_4 Scan::NbPts1Tr() const
 
-//    Retourne le nombre de points pour 1 tour
+//    Return  nomber of points for 1 turn
 //--
 {
@@ -232,5 +159,5 @@
 int_4 Scan::ValueIndex(float t) const
 
-//    Retourne l'indice du pixel associé au temps t
+//    Return index of pixel associated to time t
 //--
 {
@@ -256,5 +183,5 @@
 void Scan::Direction(float t, float&  teta , float&  phi)
 
-//    Retourne les coordonnées (teta,phi) du pixel lié au temps t
+//    Return  (teta,phi) coordinate of pixel related to time t
 //--
 {
@@ -282,5 +209,5 @@
 void Scan::DirectionIndex(int_4 k, float&  teta, float&  phi)
 
-//    Retourne les coordonnées (teta,phi) du pixel d'indice k
+//    Return  (teta,phi) coordinates of  pixel with index k
 //--
 {
@@ -297,5 +224,5 @@
 /* --Methode-- */
 //++
-r_8& Scan::PixelValue(int_4 k) const
+r_8 const& Scan::PixelValue(int_4 k) const
 
 //    Retourne la valeur du contenu du pixel d'indice k
@@ -306,18 +233,50 @@
     return(dummy_pixel);
   }
-  return(sPix_[k]);
-}
-
-void Scan::Clear() {
-  if (sPix_)  delete[] sPix_;
-}         
+  //  return(sPix_[k]);
+  //return(sPix_(k));
+  return *(sPix_.Data()+k);
+}
+//++
+r_8 & Scan::PixelValue(int_4 k) 
+
+//    Retourne la valeur du contenu du pixel d'indice k
+//--
+{
+  if ( (k<0) || (k >=  NmaxPts_) ) {
+    printf("\n ValueIndex::indice du pixel errone k= %d",k); 
+    return(dummy_pixel);
+  }
+  //  return(sPix_[k]);
+  //return(sPix_(k));
+  return *(sPix_.Data()+k);
+}
+
+//void Scan::Clear() {
+//  if (sPix_)  delete[] sPix_;
+//}         
 void Scan::InitNull() {
-  sPix_=NULL;
+  //  sPix_=NULL;
+  sPix_.Reset();
   mInfo_=NULL;
 }         
-
-
-//++
-// Titre	Opérateurs
+Scan&  Scan::operator = (const Scan& s)
+{
+  NmaxPts_      = s.NmaxPts_;
+  Ouverture_    = s.Ouverture_;
+  OmegaTeta_    = s.OmegaTeta_;
+  OmegaPhi_     = s.OmegaPhi_;
+  OmegaRad_     = s.OmegaRad_;
+  FrequenceEch_ = s.FrequenceEch_;
+  TempsFinal_   = s.TempsFinal_;
+  TempsInitial_ = s.TempsInitial_;
+  PhiZero_      = s.PhiZero_;
+  sPix_=s.sPix_;
+  for (int k=0; k<9; k++) Rota_[k]=s. Rota_[k];
+  return *this;
+}
+
+
+//++
+// Titre	Operators
 //--
 //++
@@ -325,10 +284,159 @@
 //--
 //++
-//    Surcharge de la parenthese a un indice entier : remplit ou/et renvoie 
-//    la valeur du contenu du pixel d'indice k                               
-//--
-
-
-
-
-
+//    fill and/or return value of the pixel with index k
+//--
+
+
+
+
+
+//++
+// Titre	class FIO_Scan
+//    Delegated objects for persitance management
+//--
+
+//*******************************************************************
+// class FIO_Scan
+//  Les objets delegues pour la gestion de persistance 
+//*******************************************************************
+
+//++
+FIO_Scan::FIO_Scan()
+//
+//--
+{
+  dobj= new Scan;
+  ownobj= true;
+}
+//++
+FIO_Scan::FIO_Scan(string const& filename)
+//
+//--
+{
+  dobj= new Scan;
+  ownobj= true;
+  Read(filename);
+}
+//++
+FIO_Scan::FIO_Scan(const Scan& obj)
+//
+//--
+{
+  dobj= new Scan(obj);
+  ownobj= true;
+}
+FIO_Scan::FIO_Scan(Scan* obj)
+{
+  dobj= obj;
+  ownobj= false;
+}
+//++
+FIO_Scan::~FIO_Scan()
+//
+//--
+{
+  if (ownobj && dobj) delete dobj;
+}
+//++
+AnyDataObj* FIO_Scan::DataObj()
+//
+//--
+{
+  return(dobj);
+}
+
+//++
+void FIO_Scan::ReadSelf(PInPersist& is)
+//
+//--
+{
+
+  int NmaxPts, NmaxTrs, NPts1Tr;
+  r_4 Ouverture, OmegaTeta, OmegaPhi, OmegaRad, FrequenceEch; 
+  r_4 TempsFinal,  TempsInitial, PhiZero; 
+  r_8 Rota[9];
+
+  if(dobj == NULL) 
+    {
+      dobj= new Scan;
+    }
+
+  // Pour savoir s'il y avait un DVList Info associe
+  char strg[256];
+  is.GetLine(strg, 255);
+  bool hadinfo= false;
+  if (strncmp(strg+strlen(strg)-7, "HasInfo", 7) == 0)  hadinfo = true;
+  if(hadinfo) 
+    {    // Lecture eventuelle du DVList Info
+      is >> dobj->Info(); 
+    }
+
+
+  is.GetI4(NmaxPts);
+  is.GetI4(NmaxTrs);
+  is.GetI4(NPts1Tr);
+  dobj->SetIntParams(NmaxPts,NmaxTrs,NPts1Tr);
+
+  is.GetR4(Ouverture);
+  is.GetR4(OmegaTeta);
+  is.GetR4(OmegaPhi);
+  is.GetR4(OmegaRad);
+  is.GetR4(FrequenceEch);
+  is.GetR4(TempsFinal);
+  is.GetR4(TempsInitial);
+  is.GetR4(PhiZero);
+  is.GetR8s(Rota, 9);
+  dobj->SetFloatParams(Ouverture,OmegaTeta,OmegaPhi,OmegaRad,
+		       FrequenceEch,TempsFinal,TempsInitial,PhiZero,Rota);
+  r_8* sPix=new r_8[NmaxPts];
+  PIOSReadArray(is, sPix, NmaxPts);
+  dobj->setDataBlock(sPix, NmaxPts);
+  delete [] sPix;
+}
+//++
+void FIO_Scan::WriteSelf(POutPersist& os) const
+//
+//--
+{
+  r_4 Ouverture, OmegaTeta, OmegaPhi, OmegaRad, FrequenceEch; 
+  r_4 TempsFinal,  TempsInitial, PhiZero; 
+  r_8 Rota[9];
+  char strg[256];
+
+  if(dobj == NULL) 
+    {
+      cout << " FIO_Scan::WriteSelf:: dobj= null " << endl;
+      return;
+    }
+  dobj->GetFloatParams(Ouverture,OmegaTeta,OmegaPhi,OmegaRad,
+		       FrequenceEch,TempsFinal,TempsInitial,PhiZero,Rota);
+  if (dobj->ptrInfo()) 
+    {sprintf(strg, "Scan: Theta=%9f Phi=%9f omega=%9f HasInfo", 
+	     (float)OmegaTeta, (float)OmegaPhi, (float)OmegaRad);
+    os.PutLine(strg);
+    os << dobj->Info();
+    }
+  else 
+    {
+      sprintf(strg, "Scan: Theta=%9f Phi=%9f omega=%9f ", 
+	      (float)OmegaTeta, (float)OmegaPhi, (float)OmegaRad); 
+      os.PutLine(strg);
+    }
+
+  os.PutI4(dobj->NbPoints());
+  os.PutI4(dobj->NbTours());
+  os.PutI4(dobj->NbPts1Tr());
+
+  os.PutR4(Ouverture);
+  os.PutR4(OmegaTeta);
+  os.PutR4(OmegaPhi);
+  os.PutR4(OmegaRad);
+  os.PutR4(FrequenceEch);
+  os.PutR4(TempsFinal);
+  os.PutR4(TempsInitial);
+  os.PutR4(PhiZero);
+  os.PutR8s(Rota, 9);
+
+  PIOSWriteArray(os,(dobj->getDataBlock())->Data(), dobj->NbPoints());
+
+}
