source: Sophya/trunk/Poubelle/archTOI.old/archeopsfile.cc@ 405

Last change on this file since 405 was 405, checked in by ansari, 26 years ago

divers

File size: 25.1 KB
RevLine 
[350]1// archeopsfile.cc
2// Eric Aubourg CEA/DAPNIA/SPP juillet 1999
3
4
[310]5#define utilitaires_de_block_archeops
6#include "archeopsfile.h"
[315]7extern "C" {
[310]8#include "compress.h"
[315]9}
[310]10#include <iostream.h>
11
[315]12// BlockSet is the current "state" of the file reader automate.
13// It contains the last blocks of each kind, the current block and
14// the look-ahead block.
15
[310]16class BlockSet {
17public:
18 BlockSet();
19 BlockSet(BlockSet const&);
20 ~BlockSet();
21 void setBloc(block_type_modele const& blk);
22 void setRawBloc(block_type_modele const& blk);
23
24 block_type_param* lastParam;
25 block_type_journal* lastJournal;
26 block_type_reglage* lastReglage;
27 block_type_dilution* lastDilution;
28 block_type_gps* lastGPS;
29 block_type_une_periode* lastUnePeriode;
30 block_type_synchro_sol* lastSynchroSol;
31 block_type_pointage_sol* lastPointageSol;
32 block_type_bolo* lastBolo; // can be uncompressed bolo_comp
33 block_type_bolo* llastBolo;
34 block_type_gyro* lastGyro;
35 block_type_sst* lastSST;
36 block_type_bolo_comprime* lastBoloComp; // can be uncompressed bolo_comp
37 block_type_gyro_comprime* lastGyroComp;
38 block_type_sst_comprime* lastSSTComp;
[315]39
40 block_type_modele curBlock;
41 block_type_modele peekBlock;
42
43 SSTHandler sstHandler;
[342]44 GPSParser gpsParser;
[310]45};
46
47BlockSet::BlockSet() {
48 lastParam = NULL;
49 lastJournal = NULL;
50 lastReglage = NULL;
51 lastDilution = NULL;
52 lastGPS = NULL;
53 lastUnePeriode = NULL;
54 lastSynchroSol = NULL;
55 lastPointageSol= NULL;
56 lastBolo = NULL;
57 llastBolo = NULL;
58 lastGyro = NULL;
59 lastSST = NULL;
60 lastBoloComp = NULL;
61 lastGyroComp = NULL;
62 lastSSTComp = NULL;
[315]63
64 memset(&curBlock,0,sizeof(block_type_modele));
65 memset(&peekBlock,0,sizeof(block_type_modele));
[310]66}
67
68BlockSet::~BlockSet() {
69 delete lastParam;
70 delete lastJournal;
71 delete lastReglage;
72 delete lastDilution;
73 delete lastGPS;
74 delete lastUnePeriode;
75 delete lastSynchroSol;
76 delete lastPointageSol;
77 delete lastBolo;
78 delete llastBolo;
79 delete lastGyro;
80 delete lastSST;
81 delete lastBoloComp;
82 delete lastGyroComp;
83 delete lastSSTComp;
84}
85
[315]86BlockSet::BlockSet(BlockSet const& x)
87: sstHandler(x.sstHandler)
88{
[310]89 lastParam = NULL;
90 lastJournal = NULL;
91 lastReglage = NULL;
92 lastDilution = NULL;
93 lastGPS = NULL;
94 lastUnePeriode = NULL;
95 lastSynchroSol = NULL;
96 lastPointageSol= NULL;
97 lastBolo = NULL;
98 llastBolo = NULL;
99 lastGyro = NULL;
100 lastSST = NULL;
101 lastBoloComp = NULL;
102 lastGyroComp = NULL;
103 lastSSTComp = NULL;
[315]104
[310]105 if (x.lastParam) {
106 lastParam = new block_type_param;
107 *lastParam = *x.lastParam;
108 }
109 if (x.lastJournal) {
110 lastJournal = new block_type_journal;
111 *lastJournal = *x.lastJournal;
112 }
113 if (x.lastReglage) {
114 lastReglage = new block_type_reglage;
115 *lastReglage = *x.lastReglage;
116 }
117 if (x.lastDilution) {
118 lastDilution = new block_type_dilution;
119 *lastDilution = *x.lastDilution;
120 }
121 if (x.lastGPS) {
122 lastGPS = new block_type_gps;
123 *lastGPS = *x.lastGPS;
124 }
125 if (x.lastUnePeriode) {
126 lastUnePeriode = new block_type_une_periode;
127 *lastUnePeriode = *x.lastUnePeriode;
128 }
129 if (x.lastSynchroSol) {
130 lastSynchroSol = new block_type_synchro_sol;
131 *lastSynchroSol = *x.lastSynchroSol;
132 }
133 if (x.lastPointageSol) {
134 lastPointageSol = new block_type_pointage_sol;
135 *lastPointageSol = *x.lastPointageSol;
136 }
137 if (x.lastBolo) {
138 lastBolo = new block_type_bolo;
139 *lastBolo = *x.lastBolo;
140 }
141 if (x.llastBolo) {
142 llastBolo = new block_type_bolo;
143 *llastBolo = *x.llastBolo;
144 }
145 if (x.lastGyro) {
146 lastGyro = new block_type_gyro;
147 *lastGyro = *x.lastGyro;
148 }
149 if (x.lastSST) {
150 lastSST = new block_type_sst;
151 *lastSST = *x.lastSST;
152 }
153 if (x.lastBoloComp) {
154 lastBoloComp = new block_type_bolo_comprime;
155 *lastBoloComp = *x.lastBoloComp;
156 }
157 if (x.lastGyroComp) {
158 lastGyroComp = new block_type_gyro_comprime;
159 *lastGyroComp = *x.lastGyroComp;
160 }
161 if (x.lastSSTComp) {
162 lastSSTComp = new block_type_sst_comprime;
163 *lastSSTComp = *x.lastSSTComp;
164 }
[315]165
166 memcpy(&curBlock,&x.curBlock,sizeof(block_type_modele));
167 memcpy(&peekBlock,&x.peekBlock,sizeof(block_type_modele));
168
[310]169}
170
171void BlockSet::setBloc(block_type_modele const& blk)
172{
173 int kind = type_block(&blk);
174 switch (kind) {
175 case block_param:
176 if (!lastParam) lastParam = new block_type_param;
177 memcpy(lastParam, &blk, sizeof(block_type_param));
178 // Les fichiers fournis contiennent des valeurs debiles...
179 if (lastParam->param.n_max_bolo < 0)
180 lastParam->param.n_max_bolo = nb_max_bolo;
181 if (lastParam->param.n_per_block < 0)
182 lastParam->param.n_per_block = nb_per_block;
183 if (lastParam->param.n_max_mes_per < 0)
184 lastParam->param.n_max_mes_per = nb_max_mes_per;
185 break;
186 case block_journal:
187 if (!lastJournal) lastJournal = new block_type_journal;
188 memcpy(lastJournal, &blk, sizeof(block_type_journal));
189 break;
190 case block_reglage:
191 if (!lastReglage) lastReglage = new block_type_reglage;
192 memcpy(lastReglage, &blk, sizeof(block_type_reglage));
193 break;
194 case block_dilution:
195 if (!lastDilution) lastDilution = new block_type_dilution;
196 memcpy(lastDilution, &blk, sizeof(block_type_dilution));
197 break;
198 case block_gps:
199 if (!lastGPS) lastGPS = new block_type_gps;
200 memcpy(lastGPS, &blk, sizeof(block_type_gps));
201 break;
202 case block_une_periode:
203 if (!lastUnePeriode) lastUnePeriode = new block_type_une_periode;
204 memcpy(lastUnePeriode, &blk, sizeof(block_type_une_periode));
205 break;
206 case block_synchro_sol:
207 if (!lastSynchroSol) lastSynchroSol = new block_type_synchro_sol;
208 memcpy(lastSynchroSol, &blk, sizeof(block_type_synchro_sol));
209 break;
210 case block_pointage_sol:
211 if (!lastPointageSol) lastPointageSol = new block_type_pointage_sol;
212 memcpy(lastPointageSol, &blk, sizeof(block_type_pointage_sol));
213 break;
214 case block_bolo:
215 if (!lastBolo) lastBolo = new block_type_bolo;
216 else if (!llastBolo) {
217 llastBolo = new block_type_bolo;
[342]218 }
219 if (llastBolo) {
[310]220 memcpy(llastBolo, lastBolo, sizeof(block_type_bolo));
221 }
222 memcpy(lastBolo, &blk, sizeof(block_type_bolo));
223 break;
224 case block_gyro:
225 if (!lastGyro) lastGyro = new block_type_gyro;
226 memcpy(lastGyro, &blk, sizeof(block_type_gyro));
227 break;
228 case block_sst:
229 if (!lastSST) lastSST = new block_type_sst;
230 memcpy(lastSST, &blk, sizeof(block_type_sst));
231 break;
232 }
233}
234
235void BlockSet::setRawBloc(block_type_modele const& blk)
236{
237 int kind = type_block(&blk);
238 switch (kind) {
239 case block_bolo_comprime:
240 if (!lastBoloComp) lastBoloComp = new block_type_bolo_comprime;
241 memcpy(lastBoloComp, &blk, sizeof(block_type_bolo_comprime));
242 break;
243 case block_gyro_comprime:
244 if (!lastGyroComp) lastGyroComp = new block_type_gyro_comprime;
245 memcpy(lastGyroComp, &blk, sizeof(block_type_gyro_comprime));
246 break;
247 case block_sst_comprime:
248 if (!lastSSTComp) lastSSTComp = new block_type_sst_comprime;
249 memcpy(lastSSTComp, &blk, sizeof(block_type_sst_comprime));
250 break;
251 }
252}
253
254ArcheopsFile::ArcheopsFile(string const& fname) {
255 f = fopen(fname.c_str(), "rb");
256 fn = fname;
257 if (!f) throw ArchExc("file not found");
258 fseek(f,0,SEEK_END);
259 fLen = ftell(f);
[315]260 curPos = -1;
261 peekPos = -1;
[310]262 curKind = -1;
263 curRawKind = -1;
264 blockSet = new BlockSet;
265 utcOffset=2;
266 computeMJD(fname);
267}
268
269ArcheopsFile::ArcheopsFile(ArcheopsFile const& x) {
270 blockSet = x.blockSet ? new BlockSet(*x.blockSet) : NULL;
271 fposStack = x.fposStack;
272
273 stack<BlockSet*> tmp;
274 ArcheopsFile& y = (ArcheopsFile&) x;
275 while (!y.blockStack.empty()) {
276 tmp.push(y.blockStack.top());
277 y.blockStack.pop();
278 }
279 while (!tmp.empty()) {
280 y.blockStack.push(tmp.top());
281 blockStack.push(new BlockSet(*tmp.top()));
282 tmp.pop();
283 }
284
[315]285 //curBlock = x.curBlock;
[310]286 curKind = x.curKind;
287 curRawKind = x.curRawKind;
288 curPos = x.curPos;
[315]289 peekPos = x.peekPos;
[310]290 fLen = x.fLen;
291 fn = x.fn;
292 f = fopen(fn.c_str(), "rb");
[342]293
294 rawMJD = x.rawMJD;
295 startMJD = x.startMJD;
296 utcOffset = x.utcOffset;
[310]297}
298
299ArcheopsFile::~ArcheopsFile() {
300 if (f) fclose(f);
301 delete blockSet;
302 while (!blockStack.empty())
303 { delete blockStack.top(); blockStack.pop();}
304}
305
306void ArcheopsFile::grabLastBlocs(ArcheopsFile const& oldFile) {
307 delete blockSet;
308 blockSet = new BlockSet(*oldFile.blockSet);
[315]309 //curBlock = oldFile.curBlock;
310 //peekBlock = oldFile.peekBlock;
[342]311 if (peekPos>0) peekPos = 0;
[310]312 setUTCOffset(oldFile.utcOffset);
313}
314
315
316def_nom_block
317
[342]318def_long_block
319
[310]320bool ArcheopsFile::nextBlock() {
[315]321 // si pas de peek, alors en lire un pour commencer...
322 if (peekPos<0) {
323 peekPos=0; if (!nextBlock()) return false;
324 }
325 block_type_modele* curBlock=currentBlock();
326 block_type_modele* peekBlock=aheadBlock();
327
328 memcpy(curBlock, peekBlock, sizeof(block_type_modele));
[342]329 curPos = peekPos;
[315]330
[342]331 while (true) {
332 if (peekPos+12 > fLen) return false; // fin de fichier
333 fseek(f,peekPos,SEEK_SET); // aller en peekPos
334 size_t read = fread(peekBlock,1,sizeof(block_type_modele),f);
335 swapEntete(peekBlock);
336 if (read < longueur_block(peekBlock) ||
337 type_block(peekBlock) < 0 || type_block(peekBlock) > 19 ||
338 longueur_block(peekBlock) != long_block[type_block(peekBlock)]) {
[350]339 cout << "invalid block, bad type or length" << endl;
[342]340 memset(peekBlock, 0, sizeof(block_type_modele)); // don't keep trash...
341 peekPos = searchNextBlock(peekPos);
342 if (peekPos<0) return false;
343 continue;
344 }
345 swapContent(peekBlock);
346 if (verifie_block(peekBlock) != block_correct) {
[350]347 cout << "invalid block " << numero_block(peekBlock);
[342]348 if (!fixBlock(peekBlock)) {
349 cout << " -- skipped" << endl;
350 peekPos += longueur_block(peekBlock); // la longueur doit etre ok...
351 continue;
352 } else {
353 cout << " -- fixed" << endl;
354 break;
355 }
356 }
357 break; // tout semble bon pour ce bloc...
[310]358 }
[342]359
360 peekPos += longueur_block(peekBlock); // on suppose que longueur OK...
[315]361 if (curPos < 0) {
362 curPos = 0; return true;
363 }
[342]364 if (curBlock->debut != 0) {
365 curRawKind = curKind = type_block(curBlock);
366 postProcessBlock();
367 saveCurBlock();
368 } else {
369 curRawKind = curKind = -1;
370 }
[310]371 return true;
372}
373
374bool ArcheopsFile::nextBlock(long mask) {
375 if (!mask) return false;
376 while (1) {
377 if (!nextBlock()) return false;
378 if (( 1 << curRawKind) & mask) return true;
379 }
380}
381
[350]382bool ArcheopsFile::fixBlock(block_type_modele* ) {
[342]383 return false;
384}
385
386
[310]387int ArcheopsFile::blockKind() {
388 return curKind;
389}
390
391int ArcheopsFile::blockRawKind() {
392 return curRawKind;
393}
394
395int ArcheopsFile::blockNum() {
[315]396 return numero_block(currentBlock());
[310]397}
398
399#define bitmot 24 // nb de bit horloge dans un mot ADC
400
401double ArcheopsFile::perEchant() { // periode d'echantillonage pour le dernier bloc reglage
402 double p,f1,f2,f3;
403 int pp;
[342]404 if (!lastReglage()) return -1;
[310]405 pp=lastReglage()->reglage.horloge.periode;
406 p=pp/5.;
407 f1=1000/p;f2=f1/bitmot;f3=f2*1000./(double)(lastReglage()->reglage.horloge.nb_mesures);
408 return 0.5/f3; // 2 fois la frequence de modulation
409}
410
411double ArcheopsFile::perBlock() { // duree (en secondes) correspondant a un bloc bolo
412 return perEchant() * (double)lastParam()->param.n_per_block*2.;
413}
414
415int ArcheopsFile::nEchBlock() { // Nb d'echantillons dans un bloc
[342]416 return lastParam()->param.n_per_block*2;
[310]417}
418
419string ArcheopsFile::blockKdName() {
420 return nom_block[curKind];
421}
422
423string ArcheopsFile::blockRawKdName() {
424 return nom_block[curRawKind];
425}
426
427
428block_type_modele* ArcheopsFile::currentBlock() {
[315]429 //if (curPos<0) return NULL;
430 return &blockSet->curBlock;
[310]431}
432
[315]433block_type_modele* ArcheopsFile::aheadBlock() {
434 //if (peekPos<0) return NULL;
435 return &blockSet->peekBlock;
436}
437
438bool ArcheopsFile::sameBlockNumAhead() {
439 if (curPos<0) return false;
440 return (numero_block(&blockSet->curBlock) == numero_block(&blockSet->peekBlock));
441}
442
443
[310]444block_type_param* ArcheopsFile::lastParam() {
445 return blockSet->lastParam;
446}
447block_type_journal* ArcheopsFile::lastJournal() {
448 return blockSet->lastJournal;
449}
450block_type_reglage* ArcheopsFile::lastReglage() {
451 return blockSet->lastReglage;
452}
453block_type_dilution* ArcheopsFile::lastDilution() {
454 return blockSet->lastDilution;
455}
456block_type_gps* ArcheopsFile::lastGPS() {
457 return blockSet->lastGPS;
458}
459block_type_une_periode* ArcheopsFile::lastUnePeriode() {
460 return blockSet->lastUnePeriode;
461}
462block_type_synchro_sol* ArcheopsFile::lastSynchroSol() {
463 return blockSet->lastSynchroSol;
464}
465block_type_pointage_sol* ArcheopsFile::lastPointageSol() {
466 return blockSet->lastPointageSol;
467}
468block_type_bolo* ArcheopsFile::lastBolo() {
469 return blockSet->lastBolo;
470}
471block_type_bolo* ArcheopsFile::llastBolo() {
472 return blockSet->llastBolo;
473}
474block_type_gyro* ArcheopsFile::lastGyro() {
475 return blockSet->lastGyro;
476}
477block_type_sst* ArcheopsFile::lastSST() {
478 return blockSet->lastSST;
479}
480block_type_bolo_comprime* ArcheopsFile::lastBoloComp() {
481 return blockSet->lastBoloComp;
482}
483block_type_gyro_comprime* ArcheopsFile::lastGyroComp() {
484 return blockSet->lastGyroComp;
485}
486block_type_sst_comprime* ArcheopsFile::lastSSTComp() {
487 return blockSet->lastSSTComp;
488}
489
[342]490void ArcheopsFile::forceBlock(block_type_modele* blk) {
491 blockSet->setBloc(*blk);
492}
493
494#define place_paquet(i,j) ((i/8) * 24 + j*8 + (i%8) )
495
[310]496void ArcheopsFile::postProcessBlock() {
497 switch (curKind) {
498 case block_bolo_comprime: {
[315]499 blockSet->setRawBloc(blockSet->curBlock);
[310]500 block_type_bolo blk2;
[315]501 block_type_bolo_comprime* blk = (block_type_bolo_comprime*) &blockSet->curBlock;
[342]502 #if version_num <= 25
[310]503 for(int j=0;j<nb_bolo_util;j++)
[342]504 {
505 decompress_7_2((int4*)blk->data_bolo[j],blk2.data_bolo[j],nb_per_block*2);
506 }
507 #else
508 block_type_param* param = lastParam();
[350]509 if (!param) return;
[342]510 int jc=0;for(int j=0;j<nb_max_bolo;j++) // jc = bolo_comprime // j=bolo normal
511 {
512 if( (param->param.bolo[j].bolo_code_util==bolo_normal_transmis) && (jc<nb_bolo_util) )
513 {
514 decompress_7_2((int4 *)blk->data_bolo[jc],blk2.data_bolo[j],nb_per_block*2);
515 jc++;
516 }
517 else {
518 memset(blk2.data_bolo[j], 0, nb_per_block*2*sizeof(int4));
[310]519 }
[342]520 }
521
522 #endif
[310]523 valide_block((block_type_modele*)&blk2,block_bolo,numero_block(blk));
[315]524 memcpy(&blockSet->curBlock,&blk2,sizeof(blk2));
[310]525 curKind = block_bolo;
526 break;
527 }
[405]528 case block_sst_comprime: {
[342]529 blockSet->setRawBloc(blockSet->curBlock);
[405]530 if (!blockSet->sstHandler.NeedBlocks()) break; // inutile de decompresser
[342]531 block_type_sst blk2;
532 block_type_sst_comprime* blk = (block_type_sst_comprime*) &blockSet->curBlock;
533 for (int j=0; j<18; j++)
534 for (int i=0; i<nb_per_block*2; i++)
535 blk2.sst[i][j] = 0;
536
537 int jc=0;
538 for( int j=0;j<48;j++) {
539 if ((j!=0) && (j!=4))
540 {
541 unsigned int4 sst_vrai[nb_per_block*2];
542 decompress_4_1((int4*)blk->sst[jc],(int4*)sst_vrai,nb_per_block*2);
543 for (int k=0;k<nb_per_block*2;k++) {
544 unsigned int4 a,b0,b1,b2;
545 b2 = sst_vrai[k] & 0xf;
546 b1 = (sst_vrai[k] >> 4) & 0xf;
547 b0 = (sst_vrai[k] >> 8) & 0xf;
548 a=place_paquet(j,0);
549 blk2.sst[k][a/8] |= (b0 << (a%8)*4);
550 a=place_paquet(j,1);
551 blk2.sst[k][a/8] |= (b1 << (a%8)*4);
552 a=place_paquet(j,2);
553 blk2.sst[k][a/8] |= (b2 << (a%8)*4);
554 }
555 jc++;
556 }
557 }
558 valide_block((block_type_modele*)&blk2,block_sst,numero_block(blk));
559 memcpy(&blockSet->curBlock,&blk2,sizeof(blk2));
560 curKind = block_sst;
[397]561 // cout << "process " << numero_block(&blockSet->curBlock) << "\n";
[342]562 blockSet->sstHandler.ProcessBlock((block_type_sst*)&blockSet->curBlock);
563 break;
[315]564 }
565 case block_sst : {
[397]566 // cout << "process " << numero_block(&blockSet->curBlock) << "\n";
[315]567 blockSet->sstHandler.ProcessBlock((block_type_sst*)&blockSet->curBlock);
568 }
[342]569 case block_gps : {
570 blockSet->gpsParser.ProcessBlock((block_type_gps*)&blockSet->curBlock);
571 }
[310]572 }
573}
574
575void ArcheopsFile::saveCurBlock() {
[315]576 blockSet->setBloc(blockSet->curBlock);
[310]577}
578
[398]579void ArcheopsFile::pushMark() { // push current file position, and "last" blocks
[310]580 fposStack.push(curPos);
[315]581 fposStack.push(peekPos);
[310]582 blockStack.push(new BlockSet(*blockSet));
583}
584
585void ArcheopsFile::popMark() { // pops last file position and "last" blocks
586 if (! blockStack.empty()) {
587 delete blockSet;
588 blockSet = blockStack.top();
589 blockStack.pop();
[315]590 peekPos = fposStack.top();
[310]591 fposStack.pop();
[315]592 curPos = fposStack.top();
593 fposStack.pop();
[310]594 }
595}
596
[315]597typedef unsigned int4 uint_4;
598typedef unsigned short uint_2;
599
600static inline void bswap4(void* p)
601{
602 uint_4 tmp = *(uint_4*)p;
603 *(uint_4*)p = ((tmp >> 24) & 0x000000FF) |
604 ((tmp >> 8) & 0x0000FF00) |
605 ((tmp & 0x0000FF00) << 8) |
606 ((tmp & 0x000000FF) << 24);
607}
608
609static inline void bswap2(void* p)
610{
611 uint_2 tmp = *(uint_2*)p;
612 *(uint_2*)p = ((tmp >> 8) & 0x00FF) |
613 ((tmp & 0x00FF) << 8);
614}
615
616#ifdef __DECCXX
617#define SWAP
618#endif
619#if defined(Linux) || defined(linux)
620#define SWAP
621#endif
622
[342]623#ifdef SWAP
[315]624void ArcheopsFile::swapEntete(block_type_modele* blk) {
625 bswap4(&(blk->debut));
626 bswap4(&(blk->code1));
627 bswap4(&(blk->code2));
628 long lg = longueur_block(blk);
[342]629 if (lg < taille_maxi_block_archeops)
630 bswap4(((char*)blk) + lg - 4);
631}
632#else
633void ArcheopsFile::swapEntete(block_type_modele* ) {
634}
[315]635#endif
636
[342]637#ifdef SWAP
[315]638void ArcheopsFile::swapContent(block_type_modele* blk) {
639 int typ = type_block(blk);
640
641 if (typ == block_gps) return; // char only, no swap
642 if (typ == block_une_periode) { // une_periode, des shorts
643 block_type_une_periode* b = (block_type_une_periode*) blk;
644 for (int i=0; i<nb_max_bolo; i++)
645 for (int j=0; j<nb_max_mes_per; j++)
646 bswap2(&b->bol_per[i][j]);
647 return;
648 }
649
650 for (int i=0; i<longueur_block(blk)/4-4; i++)
651 bswap4(blk->mot + i);
652 // On deswappe ce qui ne devait pas etre swappe...
653 switch (typ) {
654 case block_param: {
655 block_type_param* b = (block_type_param*) blk;
656 for (int i=0; i<nb_max_bolo; i++)
657 for (int j=0; j<8; j++)
[342]658#if version_num<=25
659 bswap4(&b->param.bolo[i].bolo_nom[4*j]);
660#else
661 bswap4(&b->param.nom_coef[i].bolo_nom[4*j]);
662#endif
[315]663 }
664
665 }
[342]666}
667#else
668void ArcheopsFile::swapContent(block_type_modele* ) {
669}
[315]670#endif
[342]671
672long ArcheopsFile::searchNextBlock(long pos) {
673 static char* buffer = 0;
674 static int4 debswp = debut_block_mesure;
675 static int4 longmax = taille_maxi_block_archeops*20;
676 if (!buffer) {
677 buffer = new char[longmax];
678#ifdef SWAP
679 bswap4(&debswp);
680#endif
681 }
682 fseek(f,pos,SEEK_SET);
683 size_t read = fread(buffer,1,taille_maxi_block_archeops*2,f);
684 //if (read<taille_maxi_block_archeops*2) return -1;
685 for (int i=4; i<read; i+=4) {
686 if (*(int4*)(buffer+i) == debswp) {
687 cout << "trying to skip " << i << " bytes to pos="<<pos+i << endl;
688 return pos+i;
689 }
690 }
691 cout << "cannot find block start" << endl;
692 return -1;
[315]693}
[342]694
[315]695
696
697
[310]698static int mlen[] = {31,28,31,30,31,30,31,31,30,31,30,31};
699
[342]700double ArcheopsFile::decodeMJD(string const& dateString) {
701 //99_04_29-15h36m22 ou 99_05_10
702 short y,m,d,hh,mm,ss;
703 char const* p = dateString.c_str();
704 char const* p2 = dateString.c_str() + dateString.length();
705 y = atoi(p); p+=3; if (p>p2) return -1;
706 m = atoi(p); p+=3; if (p>p2) return -1;
707 d = atoi(p); p+=3;
708 if (p<p2) {
709 hh = atoi(p); p+=3; if (p>p2) return -1;
710 mm = atoi(p); p+=3; if (p>p2) return -1;
711 ss = atoi(p);
712 } else {
713 hh=mm=ss=0;
714 }
715
716 if (y<50) y += 100;
717 // 1. depuis 0/1/97 minuit
718 double mjd = (int) (365.25 * (y-97));
719 for (int i=0; i<m-1; i++)
720 mjd += mlen[i];
721 if (y%4 == 0 && m > 2) mjd++;
722 mjd += d;
723 mjd += hh/24. + mm/24./60. + ss/24./60./60;
724
725 mjd += 448.5; // 0/1/97 minuit
726
727 return mjd;
728}
729
[310]730void ArcheopsFile::computeMJD(string const& fname) {
[342]731 //telemetrie : h99_04_29-15h36m22
732 //enregistreur : ARKxxxxxx.dat, et MJD = samedi 17 juillet, 21h -> 1377.4
[310]733 char const* p = fname.c_str();
734 char const* p2 = p + fname.length()-1;
735 while (*p2 != ':' && *p2 != '/' && p2 != p) p2--;
736 if (*p2 == ':' || *p2 == '/') p2++;
737 if (*p2 == 'h') p2++;
[350]738 if (!strncmp(p2, "ARK",3) || !strncmp(p2,"ark",3)) {
[342]739 rawMJD = 1377.4;
740 } else {
741 rawMJD = decodeMJD(p2);
742 }
[310]743 startMJD = rawMJD - utcOffset/24.;
744}
745
746void ArcheopsFile::setUTCOffset(int UTCOffset) {
747 utcOffset = UTCOffset;
748 startMJD = rawMJD - utcOffset/24.;
749}
750
751double ArcheopsFile::getStartMJD() {
752 return startMJD;
753}
754
[315]755int ArcheopsFile::getBoloBlockNum() {
756 if (!lastBolo()) return -1;
757 return numero_block(lastBolo());
758}
759
760int ArcheopsFile::getSSTBlockNum() {
761 if (!lastSST()) return -1;
762 return numero_block(lastSST());
763}
764
765
[342]766int ArcheopsFile::getGyroBlockNum() {
767 if (!lastGyro()) return -1;
768 return numero_block(lastGyro());
769}
770
771
[310]772// GPS
773// $GPGGA,hhmmss.ss,ddmm.mmmm,n,dddmm.mmmm,e,q,ss,y.y,a.a,z,
774
775
776int ArcheopsFile::getGPSBlockNum() {
777 if (!lastGPS()) return -1;
778 return numero_block(lastGPS());
779}
780
781double ArcheopsFile::getGPSUTC() { // en secondes depuis minuit UTC jour courant
[315]782 if (!lastGPS()) return -9.e99;
[342]783 return blockSet->gpsParser.getUTC();
[310]784}
785
786double ArcheopsFile::getGPSMJD() { // modified julian day du dernier bloc GPS, JD - 2450000
[342]787 double t = getGPSUTC()/86400. - 0.5;
[310]788 if (t<0) return t;
789 if (t > (startMJD - int(startMJD))) {
790 return int(startMJD) + t;
791 } else {
792 return int(startMJD) + 1. + t;
793 }
794}
795
796double ArcheopsFile::getGPSLat() { // degres, + = NORD
[315]797 if (!lastGPS()) return -9.e99;
[342]798 return blockSet->gpsParser.getLatitude();
[310]799}
800
[342]801
[310]802double ArcheopsFile::getGPSLong() { // degres, + = EST
[315]803 if (!lastGPS()) return -9.e99;
[342]804 return blockSet->gpsParser.getLongitude();
[310]805}
806
[342]807double ArcheopsFile::getGPSAlt() { // meters from sea level
808 if (!lastGPS()) return -9.e99;
809 return blockSet->gpsParser.getAltitude();
810}
[310]811
[342]812bool ArcheopsFile::hasGPSTime() {
813 if (!lastGPS()) return false;
[350]814 // return blockSet->gpsParser.hasGPSTime();
815 return blockSet->gpsParser.hasTime();
[342]816}
[310]817
[342]818bool ArcheopsFile::hasGPSPos() {
819 if (!lastGPS()) return false;
820 return blockSet->gpsParser.hasPosition();
821}
822
823bool ArcheopsFile::hasGPSAlt() {
824 if (!lastGPS()) return false;
825 return blockSet->gpsParser.hasAltitude();
826}
827
828
[310]829// Bolo
[342]830#define val_DS(j,i) (blk->data_bolo[j][i]&0x1fffff)
[310]831
[342]832
[310]833long ArcheopsFile::getRawBolo(int ibolo, int imesure) { // donnee brute, avec seulement soustraction offset
834 int nb_coups,aa;
835 block_type_bolo* blk = imesure >= 0 ? lastBolo() : llastBolo();
[342]836 //cout << "raw " << imesure << " ";
[310]837 if (imesure < 0) imesure += nEchBlock();
838 if (!blk) return 0;
839 block_type_reglage* reglage = lastReglage();
[346]840 if (!reglage) return 0;
841
[310]842 nb_coups= reglage->reglage.horloge.nb_mesures/2 - reglage->reglage.horloge.temp_mort;
843 aa = (nb_coups<<14) + (nb_coups*190) ;
844
845 int s = imesure % 2 ? 1 : -1;
[342]846
847 //cout << s*(((val_DS(ibolo,imesure)-aa)<<1)/nb_coups) << "\n";
[310]848
[342]849 return s*(((val_DS(ibolo,imesure)-aa)<<1)/nb_coups);
[310]850}
851
852def_gains
853
854double ArcheopsFile::getMuVBolo(int ibolo, int imesure) { // microvolts, filtre avec filtre carre
[342]855 double y = (getRawBolo(ibolo, imesure-1) + getRawBolo(ibolo, imesure))/2.;
856 //if (imesure%2) y=-y;
[310]857 block_type_reglage* reglage = lastReglage();
[342]858 block_type_param* param = lastParam();
[346]859 if (!reglage) return 0;
860 if (!param) return 0;
[342]861 //cout << "muv " << imesure << " " << y << "\n";
862 return bol_micro_volt(y,(double)param->param.bolo[ibolo].bolo_gain*gain_ampli(reglage->reglage.bolo[ibolo]));
863 //return ((1e5*y)/(65536.*gain_ampli(reglage->reglage.bolo[ibolo])));
[310]864}
865
866
867// SST, gyros...
[315]868
869void ArcheopsFile::needSSTProcessMask(int mask) {
870 blockSet->sstHandler.NeedProcess(mask);
871}
872
873long ArcheopsFile::getSSTSignal(int idiode, int imesure) {
874 return blockSet->sstHandler.getSignal(imesure, idiode);
875}
[342]876
877long ArcheopsFile::getSSTRawSignal(int idiode, int imesure) {
878 return blockSet->sstHandler.getRawSignal(imesure, idiode);
879}
880
881double ArcheopsFile::getSSTStarZ(int istar, int imesure) {
[396]882 return blockSet->sstHandler.getStarZ(imesure+getSSTBlockNum()*nb_per_block*2, istar);
[342]883}
884
885double ArcheopsFile::getSSTStarF(int istar, int imesure) {
[396]886 return blockSet->sstHandler.getStarF(imesure+getSSTBlockNum()*nb_per_block*2, istar);
[342]887}
888
[394]889double ArcheopsFile::getSSTStarT(int istar, int imesure) {
[396]890 return blockSet->sstHandler.getStarTime(imesure+getSSTBlockNum()*nb_per_block*2, istar);
[394]891}
892
893double ArcheopsFile::getNumbStar(int imesure) {
[396]894 return blockSet->sstHandler.getNumbStar(imesure+getSSTBlockNum()*nb_per_block*2);
[394]895}
896
[342]897long ArcheopsFile::getGyro(int igyro, int imesure) {
898 if (igyro<0 || igyro>2) return 0;
899 if (imesure<0 || imesure>= nb_per_block*2) return 0;
900 block_type_gyro* blk = lastGyro() ;
901 if (!blk) return 0;
902#if version_num<=25
[405]903 return blk->gyros[igyro][imesure]-32768.;
[342]904#else
[405]905 return blk->gyro[igyro][imesure]-32768.;
[342]906#endif
907}
908
909
910
[310]911// $CHECK$ TBD
912
913
914double ArcheopsFile::getAzimut(int imesure) {return imesure*360/nEchBlock();}
915double ArcheopsFile::getPendDirect(int /*imesure*/) {return 0;}
916double ArcheopsFile::getPendOrth(int /*imesure*/) {return 0;}
917double ArcheopsFile::getAlpha(int /*imesure*/) {return 0;}
918double ArcheopsFile::getDelta(int /*imesure*/) {return 0;}
Note: See TracBrowser for help on using the repository browser.