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


Ignore:
Timestamp:
Aug 2, 1999, 3:45:52 PM (26 years ago)
Author:
ansari
Message:

archtoi 2 aout 99

File:
1 edited

Legend:

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

    r315 r342  
    22#include "toiinterpolator.h"
    33#include <dirent.h>
     4#include <iostream.h>
    45
    56// Format bloc GPS
     
    1415 fileName = "";
    1516 
     17 files.clear();
     18
     19 isOnBoardRecorder = false;
     20   
     21 imes=0;
     22
    1623 tStart = -9.e99;
    17  tEnd   = -9.e99;
     24 tEnd   = 9.e99;
    1825 
    1926 tBlock0 = -1;
    20  
     27 perEch = -1;
     28 
     29 trigMask = 0;
    2130 rawIter = NULL;
    2231 interp  = NULL;
    2332 lastSample = -1;
    24  maxLookAhead = 1000;
     33 maxLookAhead = 10000;
    2534
    2635}
     
    3039  fileName = x.fileName;
    3140  files = x.files;
    32   curFile = x.curFile;
     41  //  curFile = x.curFile; // $CHECK$ DANGER !!
     42  curFile = files.find(*(x.curFile));
     43  isOnBoardRecorder = x.isOnBoardRecorder;
    3344  imes = x.imes;
    3445  tStart = x.tStart;
    3546  tEnd = x.tEnd;
    3647  tBlock0 = x.tBlock0;
     48  perEch = x.perEch;
    3749  trigMask = x.trigMask;
    3850  infos = x.infos;   
     
    6375}
    6476
     77#ifdef __MWERKS__
     78#define filesep ':'
     79#else
     80#define filesep '/'
     81#endif
     82
    6583void TOIIter::Init() {
    66 
    67   // $CHECK$ a deplacer, pour gerer repertoires...
     84 // On a soit un repertoire, soit un fichier, soit une liste de fichiers....
    6885  if (directory == "") {
    69     file = new ArcheopsFile(fileName);
    70   } else {
     86    if (files.empty()) {   // un seul fichier
     87      file = new ArcheopsFile(fileName);
     88    } else {
     89      curFile = files.begin();
     90      file = new ArcheopsFile((*curFile).c_str());
     91    }
     92  } else { // On a un repertoire a explorer
     93    // On cherche soit les fichiers dans le repertoire donne, soit des fichiers
     94    // dans un sous-repertoire "arch-YY_MM_DD". Les fichiers ont un nom en
     95    // "hYY_MM_DD-hh_mm_ss".
     96    // Pour l'enregistreur de vol, les fichiers ont un nom en ARKxxxxxx.DAT
     97    if (directory[directory.length()-1] != filesep)
     98      directory += filesep;
    7199    DIR* dir = opendir(directory.c_str());
    72100    struct dirent* ent;
    73101    while ((ent = readdir(dir)) != NULL) {
    74       files.insert(ent->d_name);
     102      // si c'est un repertoire, avec un nom de jour, il faut l'explorer...
     103      if (!strncmp(ent->d_name, "arch-", 5)) {
     104        double mjd = ArcheopsFile::decodeMJD(ent->d_name+5) - 2./24.; // ENTIER + .5 en temps local!
     105        if (mjd >= tStart - 1. && mjd <= tEnd) {
     106          string direc2 = directory + ent->d_name + filesep;
     107          DIR* dir2 = opendir(direc2.c_str());
     108          struct dirent* ent2;
     109          while ((ent2 = readdir(dir2)) != NULL) {
     110            if (*ent2->d_name == 'h') {
     111              double mjd2 = ArcheopsFile::decodeMJD(ent->d_name+1) - 2./24.;
     112              if (mjd2 >= tStart - 1./24. && mjd2 <= tEnd) {
     113                files.insert(direc2 + ent2->d_name);
     114              }
     115            }
     116          }
     117        }
     118      } else {
     119        if (!isOnBoardRecorder && *ent->d_name == 'h') {
     120          double mjd = ArcheopsFile::decodeMJD(ent->d_name+1) - 2./24.; // $CHECK$ UTCOffset
     121          if (mjd >= tStart - 1./24. && mjd <= tEnd) {
     122            files.insert(directory + ent->d_name);
     123          }
     124        } else if (isOnBoardRecorder) {
     125          if (strncmp(ent->d_name, "ARK", 3)) continue;
     126          char * sfx = ent->d_name + strlen(ent->d_name) - 4;
     127          if (strcmp(sfx, ".DAT")) continue;
     128          files.insert(directory + ent->d_name);
     129        }
     130      }
    75131    }
    76132    closedir(dir);
     
    79135  }
    80136
    81   if (!file->lastParam()) file->nextBlock(block_param_mask);
     137  // On avance jusqu'a avoir au moins un bloc param et un bloc reglage,
     138  // car on ne peut rien faire sans...
     139  // Si on a des donnees de l'enregistreur de vol, pas de bloc param, et
     140  // on en simule un
     141  if (!file->lastParam()) {
     142    if (isOnBoardRecorder) {
     143      extern param_bolo  parametr;
     144      block_type_param block;
     145      block.param = parametr;
     146      valide_block((block_type_modele*)&block, block_param, 0);
     147      file->forceBlock((block_type_modele*)&block);
     148    } else {
     149      file->nextBlock(block_param_mask);
     150    }
     151  }
    82152  if (!file->lastReglage()) file->nextBlock(block_reglage_mask);
    83153 
    84154  // On cherche un bloc GPS pour avoir la correspondance timestamp/UTC.
    85155  // Pour le moment, on se fonde sur le premier bloc GPS. On pourra faire
    86   // mieux en prenant le min de tous les delta_T.
    87  
    88   tBlock0 = file->getStartMJD();
    89 
    90   file->pushMark();
    91   if (file->lastGPS() || file->nextBlock(block_gps_mask)) {
    92     // le temps du bloc courant, en secondes
    93     double dt = file->blockNum() * file->perBlock();
    94     tBlock0 = file->getGPSMJD() - dt/86400.;
    95   } else { // pas de bloc GPS...
     156  // mieux en prenant le min de tous les delta_T, a condition d'avoir un
     157  // peu plus de details sur la facon dont le GPS est lu.
     158 
     159  if (tBlock0 < 0) {
    96160    tBlock0 = file->getStartMJD();
    97   }
    98   file->popMark();
     161
     162    file->pushMark();
     163    if (file->lastGPS() || file->nextBlock(block_gps_mask)) {
     164      // le temps du bloc courant, en secondes
     165      double dt = file->blockNum() * file->perBlock();
     166      tBlock0 = file->getGPSMJD() - dt/86400.;
     167    } else { // pas de bloc GPS...
     168      tBlock0 = file->getStartMJD();
     169    }
     170    file->popMark();
     171  }
     172 
     173  if (perEch < 0)
     174    perEch = file->perEchant();
    99175
    100176  bool hasInterp = false;
     
    109185          trigMask |= block_bolo_mask;
    110186          break;
     187        case gpsTime:
    111188        case longitude:
    112189        case latitude:
     190        case altitude:
    113191          trigMask |= block_gps_mask;
    114192          break;
     
    125203          file->needSSTProcessMask(SSTHandler::rmveOffset);
    126204          trigMask |= block_sst_mask;
     205          break;
     206        case sstRaw:
     207          trigMask |= block_sst_mask;
     208          break;
     209        case gyroRaw:
     210          trigMask |= block_gyro_mask;
    127211          break;
    128212        case alphaAxis:
     
    157241    return rawIter->NextFile();
    158242   
    159   if (directory == "") {
     243  if (files.empty()) {
    160244    return false;
    161245  } else {
     
    163247    curFile++;
    164248    if (curFile == files.end()) return false;
     249    cout << "opening file " << (*curFile).c_str() << endl;
    165250    ArcheopsFile* newfile = new ArcheopsFile((*curFile).c_str());
    166251    newfile->grabLastBlocs(*file);
     
    242327       return true;
    243328     case boloTens:
     329       if (imes==0 && file->llastBolo()==NULL) return false;
     330       return file->lastBolo() != NULL;
    244331     case boloRaw:
    245332       return file->lastBolo() != NULL;
    246333     case sstSignal:
     334     case sstRaw:
    247335       return file->lastSST() != NULL;
     336     case sstStarZ:
     337     case sstStarF:
     338       return (file->lastSST() != NULL) && (file->getSSTStarZ(index, imes) >= 0);
     339     case gyroRaw:
     340       return (file->lastGyro() != NULL);
     341     case gpsTime:
     342       return file->hasGPSTime();
    248343     case longitude:
    249344     case latitude:
    250        return file->lastGPS() != NULL;
     345       return file->hasGPSPos();
     346     case altitude:
     347       return file->hasGPSAlt();
    251348     case azimut:
    252349     case alphaAxis:
     
    271368       return file->blockNum() * file->nEchBlock() + imes;
    272369     case internalTime:
    273        return (file->blockNum() * file->nEchBlock() + imes) * file->perEchant();
     370       //return (file->blockNum() * file->nEchBlock() + imes) * file->perEchant();
     371       return (file->blockNum() * file->nEchBlock() + imes) * perEch;
    274372     case utc:
    275373      /* printf("utc: %d %d %g %g %g\n",file->blockNum(),
     
    278376         (file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400.,
    279377         tBlock0+(file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400.); */
    280        return tBlock0+(file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400.;
     378       //return tBlock0+(file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400.;
     379       return tBlock0+(file->blockNum() * file->nEchBlock() + imes) * perEch/86400.;
    281380     case boloTens:
    282381       return file->getMuVBolo(index, imes);
     
    285384     case sstSignal:
    286385       return file->getSSTSignal(index, imes);
     386     case sstRaw:
     387       return file->getSSTRawSignal(index, imes);
     388     case sstStarZ:
     389       return file->getSSTStarZ(index, imes);
     390     case sstStarF:
     391       return file->getSSTStarF(index, imes);
     392     case gyroRaw:
     393       return file->getGyro(index, imes);
     394     case gpsTime:
     395       return file->getGPSUTC();
    287396     case longitude:
    288        return file->getGPSLong(); // $CHECK$ TBD gerer interpolation (dans file)
     397       return file->getGPSLong();
    289398     case latitude:
    290        return file->getGPSLat();  // $CHECK$ TBD gerer interpolation (dans file)
     399       return file->getGPSLat();
     400     case altitude:
     401       return file->getGPSAlt();
    291402     case azimut:
    292403       return file->getAzimut(imes);
     
    301412bool   TOIIter::newValue(int column) {
    302413   if (column < 0 || column >= infos.size()) return false;
     414   if (rawIter) {
     415       return interp[column].isNewValue(lastSample);
     416   }
    303417   TOIKind kind = infos[column].kind;
    304418   switch (kind) {
     
    311425     case boloRaw:
    312426       return file->blockNum() == file->getBoloBlockNum();
     427     case sstRaw:
    313428     case sstSignal:
     429     case sstStarZ:
     430     case sstStarF:
    314431       return file->blockNum() == file->getSSTBlockNum();
     432     case gyroRaw:
     433       return file->blockNum() == file->getGyroBlockNum();
     434     case gpsTime:
     435       return file->blockNum() == file->getGPSBlockNum() && imes==0;
    315436     case longitude:
    316437       return file->blockNum() == file->getGPSBlockNum() && imes==0;
    317438     case latitude:
     439       return file->blockNum() == file->getGPSBlockNum() && imes==0;
     440     case altitude:
    318441       return file->blockNum() == file->getGPSBlockNum() && imes==0;
    319442     case azimut:
     
    334457   return (infos[column].interpolated && !newValue(column));
    335458}
     459
     460bool TOIIter::isTrig(int column) {
     461   if (column < 0 || column >= infos.size()) return false;
     462   return infos[column].triggering;
     463}
     464
    336465 
    337466TOIKind TOIIter::getKind(int column) {
     
    370499 
    371500int TOIIter::getSampleIndex() {
    372    return file->blockNum() * file->nEchBlock() + imes;
     501   if (file) {
     502     return file->blockNum() * file->nEchBlock() + imes;
     503   } else {
     504     return lastSample;
     505   }
    373506}
    374507 
     
    378511  long sample = rawIter->getSampleIndex();
    379512  for (int i=0; i<infos.size(); i++) {
    380     if (rawIter->canGetValue(i) && rawIter->newValue(i))
     513    if (rawIter->canGetValue(i) && rawIter->newValue(i)) {
    381514      interp[i].enterValue(rawIter->getValue(i), sample);
     515    }
    382516  }
    383517  return true;
    384518}
    385519
     520block_type_param* TOIIter::lastParam() {
     521  if (file) return file->lastParam();
     522  else return rawIter->lastParam();
     523}
     524
     525
Note: See TracChangeset for help on using the changeset viewer.