Index: trunk/ArchTOIPipe/Kernel/fitstoirdr.cc
===================================================================
--- trunk/ArchTOIPipe/Kernel/fitstoirdr.cc	(revision 2041)
+++ trunk/ArchTOIPipe/Kernel/fitstoirdr.cc	(revision 2058)
@@ -3,5 +3,5 @@
 //                               Christophe Magneville
 //                               Reza Ansari
-// $Id: fitstoirdr.cc,v 1.29 2002-06-03 14:23:39 ansari Exp $
+// $Id: fitstoirdr.cc,v 1.30 2002-06-18 12:21:08 ansari Exp $
 
 #include "fitstoirdr.h"
@@ -22,4 +22,8 @@
   implicitSN = false;
   implicitSNStart = 0;
+
+  // Variables rajoutee pour gerer les fichiers de flag de LevelS Reza 18/6/2002
+  sepFlagfile = false;
+  fptrflg = NULL;
 }
 
@@ -63,5 +67,5 @@
     fits_report_error(stderr, fstatus);
     fits_unlock();
-    throw IOExc("fitsio error");
+    throw IOExc("FITSTOIReader::openFile() fitsio error");
   }
   
@@ -89,8 +93,39 @@
     firstSn = (int) (y+.1);
   }
+
+  // Ouverture fichier de flag separe  de LevelS (Reza 18/6/2002)
+  if (sepFlagfile) {
+    fits_open_file(&fptrflg,sepFlagFileName.c_str(),READONLY,&fstatus);
+    if (fstatus != 0) {
+      fits_report_error(stderr, fstatus);
+      fits_unlock();
+      throw IOExc("FITSTOIReader::openFile() - sepFlagfile open fitsio error");
+    }
+    fits_movabs_hdu(fptrflg, 2, NULL, &fstatus);
+    if (fstatus != 0) {
+      fits_report_error(stderr, fstatus);
+      fits_unlock();
+      throw IOExc("FITSTOIReader::openFile() - sepFlagfile fits_movabs_hdu(2) fitsio error");
+    }
+    long nrowsflg;
+    fits_get_num_rows(fptrflg,&nrowsflg,&fstatus);
+    if (nrows != nrowsflg) {
+      cerr << " FITSTOIReader::openFile()/Error: Different NRows in flag and data files!" << endl;
+      fits_unlock();
+      throw ParmError("FITSTOIReader::openFile() Different NRows in flag and data files");
+    }
+  }
+  // 
   fits_unlock();  
 }
 
 void FITSTOIReader::init() {
+
+  // Modif pour fichiers de flag separe de LevelS (Reza 18/6/2002)
+  if (sepFlagfile && (allfn.size() > 1) ) {
+    cerr << "FITSTOIReader::init()/Error- Multiple files and separate flag file not allowed !"<<endl;
+    throw ParmError("FITSTOIReader::init() Multiple files and separate flag file not allowed");
+  }
+
   openFile(allfn.front());
 
@@ -148,4 +183,16 @@
 }
 
+void FITSTOIReader::setFlagFile(string fn, vector<FlagToiDef> flags)
+{
+  if (flags.size() < 1) {
+    cerr << " FITSTOIReader::setFlagFile()/Error flag.size() = 0 ! " << endl;
+    throw ParmError("FITSTOIReader::setFlagFile() flag.size() = 0");
+  }
+
+  sepFlagfile = true;
+  sepFlagFileName = fn;
+  sepFlagCols =  flags;
+}
+
 void FITSTOIReader::run() {
   for (vector<string>::iterator i=allfn.begin(); i!=allfn.end(); i++) {
@@ -154,4 +201,14 @@
     else run1();              // Lecture un echantillon a la fois
   }
+  fits_lock();
+  if (fptr) {
+    fits_close_file(fptr,&fstatus);
+    fptr = NULL;
+  }
+  if (sepFlagfile && fptrflg) {
+    fits_close_file(fptrflg,&fstatus);
+    fptrflg = NULL;
+  }
+  fits_unlock();
 }
 
@@ -198,4 +255,14 @@
 	fits_read_col_lng(fptr,j+2,i+1,1,1,0,&flg,&anyNul,&fstatus);
       }
+
+      if (sepFlagfile) { // Ajout Reza (18/6/2002) pour fichier de flags separe
+	int sflg;
+	flg = 0;
+	for(int skf=0; skf<sepFlagCols.size(); skf++) {
+	  fits_read_col_int(fptrflg, skf+1, i+1,1,1,0,&sflg,&anyNul,&fstatus);
+	  if (sflg) flg |= sepFlagCols[skf];
+	}
+      }  // Fin modif pour fichier de flags separe (18/6/2002)
+
       tabflag[k] = flg;
       //      fits_unlock();
@@ -237,4 +304,10 @@
  }
  uint_8 * tmpflg = new uint_8[Buff_Sz];
+
+ // Ajout Reza (18/6/2002) pour fichier de flags separe
+ int* stmpflg = NULL; 
+ if (sepFlagfile) stmpflg = new int[Buff_Sz];
+ // Fin modif pour fichier de flags separe (18/6/2002)
+ 
 
  TOIManager* mgr = TOIManager::getManager();
@@ -286,4 +359,16 @@
        if(colflg[k]==NULL)  continue;
        fits_read_col_lng(fptr,j+2,ideb+1,1,n,0,colflg[k],&anyNul,&fstatus);
+       // Ajout Reza (18/6/2002) pour fichier de flags separe
+       if (sepFlagfile) { 
+	 uint_8 sflg = 0;
+	 int sjj;
+	 for(sjj=0; sjj<n; sjj++) colflg[k][sjj] = 0;
+	 for(int skf=0; skf<sepFlagCols.size(); skf++) {
+ 	   fits_read_col_int(fptrflg, skf+1, ideb+1,1,n,0,stmpflg,&anyNul,&fstatus);
+	   for(sjj=0; sjj<n; sjj++) 
+	     if (stmpflg) colflg[k][sjj] |= sepFlagCols[skf];
+	 }
+       }  // Fin modif pour fichier de flags separe (18/6/2002)
+
      }
      if(fstatus!=0) {
@@ -316,4 +401,5 @@
  delete [] samplenum;
  delete [] tmpflg;
+ if (sepFlagfile) delete [] stmpflg;
  {for(int k=0; k<getNOut(); k++) {
    if(colval[k]!=NULL) delete [] colval[k];
