Changeset 350 in Sophya for trunk/Poubelle/archTOI.old/toiiter.cc


Ignore:
Timestamp:
Aug 4, 1999, 4:10:06 PM (26 years ago)
Author:
ansari
Message:

Gestion TRANGE, MJD0, PERECH....

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Poubelle/archTOI.old/toiiter.cc

    r342 r350  
     1// toiiter.cc
     2// Eric Aubourg         CEA/DAPNIA/SPP   juillet 1999
     3
     4
    15#include "toiiter.h"
    26#include "toiinterpolator.h"
     
    1317 file = NULL;
    1418 directory = "";
    15  fileName = "";
    1619 
    1720 files.clear();
     
    2629 tBlock0 = -1;
    2730 perEch = -1;
     31 // Values for Trapani 99 = default values
     32 tBlock0 = 1376.8358818;
     33 perEch = 0.005836818076;
    2834 
    2935 trigMask = 0;
     
    3743TOIIter::TOIIter(TOIIter const& x) {
    3844  directory = x.directory;
    39   fileName = x.fileName;
    4045  files = x.files;
    4146  //  curFile = x.curFile; // $CHECK$ DANGER !!
     
    8287
    8388void TOIIter::Init() {
    84  // On a soit un repertoire, soit un fichier, soit une liste de fichiers....
     89 // On a soit un repertoire, soit une liste de fichiers....
    8590  if (directory == "") {
    86     if (files.empty()) {   // un seul fichier
    87       file = new ArcheopsFile(fileName);
     91    if (files.empty()) {   // Ni repertoire, ni fichiers
     92      cerr << "toiiter : pas de repertoire, pas de fichiers" << endl;
     93      exit(-1);
    8894    } else {
    89       curFile = files.begin();
    90       file = new ArcheopsFile((*curFile).c_str());
     95      // On a deja une liste de fichiers
    9196    }
    9297  } else { // On a un repertoire a explorer
     
    123128          }
    124129        } else if (isOnBoardRecorder) {
    125           if (strncmp(ent->d_name, "ARK", 3)) continue;
     130          if (strncmp(ent->d_name, "ARK", 3) && strncmp(ent->d_name, "ark", 3)) continue;
    126131          char * sfx = ent->d_name + strlen(ent->d_name) - 4;
    127           if (strcmp(sfx, ".DAT")) continue;
     132          if (strcmp(sfx, ".DAT") && strcmp(sfx, ".dat")) continue;
    128133          files.insert(directory + ent->d_name);
    129134        }
     
    131136    }
    132137    closedir(dir);
    133     curFile = files.begin();
    134     file = new ArcheopsFile((*curFile).c_str());
    135   }
     138  }
     139   
     140  ScanFiles();
     141 
     142  curFile = files.begin();
     143  file = new ArcheopsFile((*curFile).c_str());
     144  cout << "opening file " << (*curFile).c_str() << endl;
    136145
    137146  // On avance jusqu'a avoir au moins un bloc param et un bloc reglage,
     
    139148  // Si on a des donnees de l'enregistreur de vol, pas de bloc param, et
    140149  // on en simule un
     150  double oldTStart = tStart;
     151  tStart = -9.e99; // pour init, on accepte des blocs avant tstart....
     152 
    141153  if (!file->lastParam()) {
    142154    if (isOnBoardRecorder) {
     
    170182    file->popMark();
    171183  }
     184  tStart = oldTStart;  // on restaure
    172185 
    173186  if (perEch < 0)
     
    200213          trigMask |= block_sst_mask;
    201214          break;
    202         case sstSignal:
     215        case sstDiode:
    203216          file->needSSTProcessMask(SSTHandler::rmveOffset);
    204217          trigMask |= block_sst_mask;
    205218          break;
    206         case sstRaw:
     219        case sstChannel:
    207220          trigMask |= block_sst_mask;
    208221          break;
     
    234247    }
    235248    delete file; file = NULL; // on ne travaille plus sur le fichier directement...
     249  }
     250}
     251
     252void TOIIter::ScanFiles() {
     253  file1stSamp.clear();
     254  cout << "Scanning all files" << endl;
     255  // Petite astuce pour les STL non conformes comme celles de digital
     256  // qui ne supportent pas files.erase(i) suivi de i++....
     257  set<string> copy = files;
     258  for (set<string>::iterator i = copy.begin(); i != copy.end(); i++) {
     259    ArcheopsFile fich((*i).c_str());
     260    if (fich.nextBlock()) {
     261      file1stSamp[*i] = fich.blockNum()*72; // premier numsample
     262      cout << "File " << *i << " 1st sample = " << fich.blockNum()*72 << endl;
     263    } else {
     264      cout << "File " << *i << " unrecoverable, skipping" << endl;
     265      files.erase(*i);
     266    }
     267  }
     268  cout << "Scan done" << endl;
     269 
     270  // Et maintenant, on ne garde que ceux qui tombent dans l'intervalle...
     271  copy = files;
     272  string prev="";
     273  for (set<string>::iterator i = copy.begin(); i != copy.end(); i++) {
     274    double smp = file1stSamp[*i];
     275    double t   = tBlock0 + smp * perEch/86400.;
     276    if (t>tEnd) {  // premier echantillon apres tEnd
     277     files.erase(*i);
     278     prev = "";
     279     continue;
     280    }
     281    if (t<tStart) { // premier echantillon avant tStart -> on vire le precedent si existe
     282      if (prev != "") {
     283        files.erase(prev);
     284      }
     285    }
     286    prev = *i;
    236287  }
    237288}
     
    256307}
    257308
     309
    258310bool TOIIter::Next() {
     311  while (1) {
     312    if (!NextSample()) return false; // end of files
     313    double t = tBlock0+(file->blockNum() * file->nEchBlock() + imes) * perEch/86400.;
     314    if (t < tStart) continue;
     315    if (t > tEnd) return false;
     316    return true;
     317  }
     318}
     319
     320bool TOIIter::NextSample() {
    259321  if (rawIter) {  // Delegation pour interpolation
    260322    // Trouve prochain sample disponible
     
    324386     case sampleNum:
    325387     case internalTime:
    326      case utc:
     388     case mjd:
    327389       return true;
    328390     case boloTens:
     
    331393     case boloRaw:
    332394       return file->lastBolo() != NULL;
    333      case sstSignal:
    334      case sstRaw:
     395     case sstDiode:
     396     case sstChannel:
    335397       return file->lastSST() != NULL;
    336398     case sstStarZ:
     
    370432       //return (file->blockNum() * file->nEchBlock() + imes) * file->perEchant();
    371433       return (file->blockNum() * file->nEchBlock() + imes) * perEch;
    372      case utc:
    373       /* printf("utc: %d %d %g %g %g\n",file->blockNum(),
     434     case mjd:
     435      /* printf("mjd: %d %d %g %g %g\n",file->blockNum(),
    374436         (file->blockNum() * file->nEchBlock() + imes),
    375437         file->perEchant(),
     
    382444     case boloRaw:
    383445       return file->getRawBolo(index, imes);
    384      case sstSignal:
     446     case sstDiode:
    385447       return file->getSSTSignal(index, imes);
    386      case sstRaw:
     448     case sstChannel:
    387449       return file->getSSTRawSignal(index, imes);
    388450     case sstStarZ:
     
    419481     case sampleNum:
    420482     case internalTime:
    421      case utc:
     483     case mjd:
    422484       return true;
    423485     case boloTens:
     
    425487     case boloRaw:
    426488       return file->blockNum() == file->getBoloBlockNum();
    427      case sstRaw:
    428      case sstSignal:
     489     case sstChannel:
     490     case sstDiode:
    429491     case sstStarZ:
    430492     case sstStarF:
Note: See TracChangeset for help on using the changeset viewer.