Index: trunk/Poubelle/archTOI.old/toiiter.cc
===================================================================
--- trunk/Poubelle/archTOI.old/toiiter.cc	(revision 342)
+++ trunk/Poubelle/archTOI.old/toiiter.cc	(revision 350)
@@ -1,2 +1,6 @@
+// toiiter.cc
+// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
+
+
 #include "toiiter.h"
 #include "toiinterpolator.h"
@@ -13,5 +17,4 @@
  file = NULL;
  directory = "";
- fileName = "";
  
  files.clear();
@@ -26,4 +29,7 @@
  tBlock0 = -1;
  perEch = -1;
+ // Values for Trapani 99 = default values
+ tBlock0 = 1376.8358818;
+ perEch = 0.005836818076;
  
  trigMask = 0;
@@ -37,5 +43,4 @@
 TOIIter::TOIIter(TOIIter const& x) {
   directory = x.directory;
-  fileName = x.fileName;
   files = x.files;
   //  curFile = x.curFile; // $CHECK$ DANGER !!
@@ -82,11 +87,11 @@
 
 void TOIIter::Init() {
- // On a soit un repertoire, soit un fichier, soit une liste de fichiers....
+ // On a soit un repertoire, soit une liste de fichiers....
   if (directory == "") {
-    if (files.empty()) {   // un seul fichier
-      file = new ArcheopsFile(fileName);
+    if (files.empty()) {   // Ni repertoire, ni fichiers
+      cerr << "toiiter : pas de repertoire, pas de fichiers" << endl;
+      exit(-1);
     } else {
-      curFile = files.begin();
-      file = new ArcheopsFile((*curFile).c_str());
+      // On a deja une liste de fichiers
     }
   } else { // On a un repertoire a explorer
@@ -123,7 +128,7 @@
           }
         } else if (isOnBoardRecorder) {
-          if (strncmp(ent->d_name, "ARK", 3)) continue;
+          if (strncmp(ent->d_name, "ARK", 3) && strncmp(ent->d_name, "ark", 3)) continue;
           char * sfx = ent->d_name + strlen(ent->d_name) - 4;
-          if (strcmp(sfx, ".DAT")) continue;
+          if (strcmp(sfx, ".DAT") && strcmp(sfx, ".dat")) continue;
           files.insert(directory + ent->d_name);
         }
@@ -131,7 +136,11 @@
     }
     closedir(dir);
-    curFile = files.begin();
-    file = new ArcheopsFile((*curFile).c_str());
-  }
+  }
+    
+  ScanFiles();
+  
+  curFile = files.begin();
+  file = new ArcheopsFile((*curFile).c_str());
+  cout << "opening file " << (*curFile).c_str() << endl;
 
   // On avance jusqu'a avoir au moins un bloc param et un bloc reglage,
@@ -139,4 +148,7 @@
   // Si on a des donnees de l'enregistreur de vol, pas de bloc param, et
   // on en simule un
+  double oldTStart = tStart;
+  tStart = -9.e99; // pour init, on accepte des blocs avant tstart....
+  
   if (!file->lastParam()) {
     if (isOnBoardRecorder) {
@@ -170,4 +182,5 @@
     file->popMark();
   }
+  tStart = oldTStart;  // on restaure
   
   if (perEch < 0)
@@ -200,9 +213,9 @@
           trigMask |= block_sst_mask;
           break;
-        case sstSignal:
+        case sstDiode:
           file->needSSTProcessMask(SSTHandler::rmveOffset);
           trigMask |= block_sst_mask;
           break;
-        case sstRaw:
+        case sstChannel:
           trigMask |= block_sst_mask;
           break;
@@ -234,4 +247,42 @@
     }
     delete file; file = NULL; // on ne travaille plus sur le fichier directement...
+  }
+}
+
+void TOIIter::ScanFiles() {
+  file1stSamp.clear();
+  cout << "Scanning all files" << endl;
+  // Petite astuce pour les STL non conformes comme celles de digital
+  // qui ne supportent pas files.erase(i) suivi de i++....
+  set<string> copy = files;
+  for (set<string>::iterator i = copy.begin(); i != copy.end(); i++) {
+    ArcheopsFile fich((*i).c_str());
+    if (fich.nextBlock()) {
+      file1stSamp[*i] = fich.blockNum()*72; // premier numsample
+      cout << "File " << *i << " 1st sample = " << fich.blockNum()*72 << endl;
+    } else {
+      cout << "File " << *i << " unrecoverable, skipping" << endl;
+      files.erase(*i);
+    }
+  }
+  cout << "Scan done" << endl;
+  
+  // Et maintenant, on ne garde que ceux qui tombent dans l'intervalle...
+  copy = files;
+  string prev="";
+  for (set<string>::iterator i = copy.begin(); i != copy.end(); i++) {
+    double smp = file1stSamp[*i];
+    double t   = tBlock0 + smp * perEch/86400.;
+    if (t>tEnd) {  // premier echantillon apres tEnd
+     files.erase(*i);
+     prev = "";
+     continue;
+    }
+    if (t<tStart) { // premier echantillon avant tStart -> on vire le precedent si existe
+      if (prev != "") {
+        files.erase(prev);
+      }
+    }
+    prev = *i;
   }
 }
@@ -256,5 +307,16 @@
 }
 
+
 bool TOIIter::Next() {
+  while (1) {
+    if (!NextSample()) return false; // end of files
+    double t = tBlock0+(file->blockNum() * file->nEchBlock() + imes) * perEch/86400.;
+    if (t < tStart) continue;
+    if (t > tEnd) return false;
+    return true;
+  }
+}
+
+bool TOIIter::NextSample() {
   if (rawIter) {  // Delegation pour interpolation
     // Trouve prochain sample disponible
@@ -324,5 +386,5 @@
      case sampleNum:
      case internalTime:
-     case utc:
+     case mjd:
        return true;
      case boloTens:
@@ -331,6 +393,6 @@
      case boloRaw:
        return file->lastBolo() != NULL;
-     case sstSignal:
-     case sstRaw:
+     case sstDiode:
+     case sstChannel:
        return file->lastSST() != NULL;
      case sstStarZ:
@@ -370,6 +432,6 @@
        //return (file->blockNum() * file->nEchBlock() + imes) * file->perEchant();
        return (file->blockNum() * file->nEchBlock() + imes) * perEch;
-     case utc:
-      /* printf("utc: %d %d %g %g %g\n",file->blockNum(),
+     case mjd:
+      /* printf("mjd: %d %d %g %g %g\n",file->blockNum(),
          (file->blockNum() * file->nEchBlock() + imes),
          file->perEchant(),
@@ -382,7 +444,7 @@
      case boloRaw:
        return file->getRawBolo(index, imes);
-     case sstSignal:
+     case sstDiode:
        return file->getSSTSignal(index, imes);
-     case sstRaw:
+     case sstChannel:
        return file->getSSTRawSignal(index, imes);
      case sstStarZ:
@@ -419,5 +481,5 @@
      case sampleNum:
      case internalTime:
-     case utc:
+     case mjd:
        return true;
      case boloTens:
@@ -425,6 +487,6 @@
      case boloRaw:
        return file->blockNum() == file->getBoloBlockNum();
-     case sstRaw:
-     case sstSignal:
+     case sstChannel:
+     case sstDiode:
      case sstStarZ:
      case sstStarF:
