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

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

Integration detecteur d'etoiles DY

File size: 24.7 KB
Line 
1// archeopsfile.cc
2// Eric Aubourg CEA/DAPNIA/SPP juillet 1999
3
4
5#define utilitaires_de_block_archeops
6#include "archeopsfile.h"
7extern "C" {
8#include "compress.h"
9}
10#include <iostream.h>
11
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
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;
39
40 block_type_modele curBlock;
41 block_type_modele peekBlock;
42
43 SSTHandler sstHandler;
44 GPSParser gpsParser;
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;
63
64 memset(&curBlock,0,sizeof(block_type_modele));
65 memset(&peekBlock,0,sizeof(block_type_modele));
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
86BlockSet::BlockSet(BlockSet const& x)
87: sstHandler(x.sstHandler)
88{
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;
104
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 }
165
166 memcpy(&curBlock,&x.curBlock,sizeof(block_type_modele));
167 memcpy(&peekBlock,&x.peekBlock,sizeof(block_type_modele));
168
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;
218 }
219 if (llastBolo) {
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);
260 curPos = -1;
261 peekPos = -1;
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
285 //curBlock = x.curBlock;
286 curKind = x.curKind;
287 curRawKind = x.curRawKind;
288 curPos = x.curPos;
289 peekPos = x.peekPos;
290 fLen = x.fLen;
291 fn = x.fn;
292 f = fopen(fn.c_str(), "rb");
293
294 rawMJD = x.rawMJD;
295 startMJD = x.startMJD;
296 utcOffset = x.utcOffset;
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);
309 //curBlock = oldFile.curBlock;
310 //peekBlock = oldFile.peekBlock;
311 if (peekPos>0) peekPos = 0;
312 setUTCOffset(oldFile.utcOffset);
313}
314
315
316def_nom_block
317
318def_long_block
319
320bool ArcheopsFile::nextBlock() {
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));
329 curPos = peekPos;
330
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)]) {
339 cout << "invalid block, bad type or length" << endl;
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) {
347 cout << "invalid block " << numero_block(peekBlock);
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...
358 }
359
360 peekPos += longueur_block(peekBlock); // on suppose que longueur OK...
361 if (curPos < 0) {
362 curPos = 0; return true;
363 }
364 if (curBlock->debut != 0) {
365 curRawKind = curKind = type_block(curBlock);
366 postProcessBlock();
367 saveCurBlock();
368 } else {
369 curRawKind = curKind = -1;
370 }
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
382bool ArcheopsFile::fixBlock(block_type_modele* ) {
383 return false;
384}
385
386
387int ArcheopsFile::blockKind() {
388 return curKind;
389}
390
391int ArcheopsFile::blockRawKind() {
392 return curRawKind;
393}
394
395int ArcheopsFile::blockNum() {
396 return numero_block(currentBlock());
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;
404 if (!lastReglage()) return -1;
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
416 return lastParam()->param.n_per_block*2;
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() {
429 //if (curPos<0) return NULL;
430 return &blockSet->curBlock;
431}
432
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
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
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
496void ArcheopsFile::postProcessBlock() {
497 switch (curKind) {
498 case block_bolo_comprime: {
499 blockSet->setRawBloc(blockSet->curBlock);
500 block_type_bolo blk2;
501 block_type_bolo_comprime* blk = (block_type_bolo_comprime*) &blockSet->curBlock;
502 #if version_num <= 25
503 for(int j=0;j<nb_bolo_util;j++)
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();
509 if (!param) return;
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));
519 }
520 }
521
522 #endif
523 valide_block((block_type_modele*)&blk2,block_bolo,numero_block(blk));
524 memcpy(&blockSet->curBlock,&blk2,sizeof(blk2));
525 curKind = block_bolo;
526 break;
527 }
528 case block_sst_comprime: { // $CHECK$ TBD
529 blockSet->setRawBloc(blockSet->curBlock);
530 block_type_sst blk2;
531 block_type_sst_comprime* blk = (block_type_sst_comprime*) &blockSet->curBlock;
532 for (int j=0; j<18; j++)
533 for (int i=0; i<nb_per_block*2; i++)
534 blk2.sst[i][j] = 0;
535
536 int jc=0;
537 for( int j=0;j<48;j++) {
538 if ((j!=0) && (j!=4))
539 {
540 unsigned int4 sst_vrai[nb_per_block*2];
541 decompress_4_1((int4*)blk->sst[jc],(int4*)sst_vrai,nb_per_block*2);
542 for (int k=0;k<nb_per_block*2;k++) {
543 unsigned int4 a,b0,b1,b2;
544 b2 = sst_vrai[k] & 0xf;
545 b1 = (sst_vrai[k] >> 4) & 0xf;
546 b0 = (sst_vrai[k] >> 8) & 0xf;
547 a=place_paquet(j,0);
548 blk2.sst[k][a/8] |= (b0 << (a%8)*4);
549 a=place_paquet(j,1);
550 blk2.sst[k][a/8] |= (b1 << (a%8)*4);
551 a=place_paquet(j,2);
552 blk2.sst[k][a/8] |= (b2 << (a%8)*4);
553 }
554 jc++;
555 }
556 }
557 valide_block((block_type_modele*)&blk2,block_sst,numero_block(blk));
558 memcpy(&blockSet->curBlock,&blk2,sizeof(blk2));
559 curKind = block_sst;
560 blockSet->sstHandler.ProcessBlock((block_type_sst*)&blockSet->curBlock);
561 break;
562 }
563 case block_sst : {
564 blockSet->sstHandler.ProcessBlock((block_type_sst*)&blockSet->curBlock);
565 }
566 case block_gps : {
567 blockSet->gpsParser.ProcessBlock((block_type_gps*)&blockSet->curBlock);
568 }
569 }
570}
571
572void ArcheopsFile::saveCurBlock() {
573 blockSet->setBloc(blockSet->curBlock);
574}
575
576void ArcheopsFile::pushMark() { // push current file position, and "last" blocks`
577 fposStack.push(curPos);
578 fposStack.push(peekPos);
579 blockStack.push(new BlockSet(*blockSet));
580}
581
582void ArcheopsFile::popMark() { // pops last file position and "last" blocks
583 if (! blockStack.empty()) {
584 delete blockSet;
585 blockSet = blockStack.top();
586 blockStack.pop();
587 peekPos = fposStack.top();
588 fposStack.pop();
589 curPos = fposStack.top();
590 fposStack.pop();
591 }
592}
593
594typedef unsigned int4 uint_4;
595typedef unsigned short uint_2;
596
597static inline void bswap4(void* p)
598{
599 uint_4 tmp = *(uint_4*)p;
600 *(uint_4*)p = ((tmp >> 24) & 0x000000FF) |
601 ((tmp >> 8) & 0x0000FF00) |
602 ((tmp & 0x0000FF00) << 8) |
603 ((tmp & 0x000000FF) << 24);
604}
605
606static inline void bswap2(void* p)
607{
608 uint_2 tmp = *(uint_2*)p;
609 *(uint_2*)p = ((tmp >> 8) & 0x00FF) |
610 ((tmp & 0x00FF) << 8);
611}
612
613#ifdef __DECCXX
614#define SWAP
615#endif
616#if defined(Linux) || defined(linux)
617#define SWAP
618#endif
619
620#ifdef SWAP
621void ArcheopsFile::swapEntete(block_type_modele* blk) {
622 bswap4(&(blk->debut));
623 bswap4(&(blk->code1));
624 bswap4(&(blk->code2));
625 long lg = longueur_block(blk);
626 if (lg < taille_maxi_block_archeops)
627 bswap4(((char*)blk) + lg - 4);
628}
629#else
630void ArcheopsFile::swapEntete(block_type_modele* ) {
631}
632#endif
633
634#ifdef SWAP
635void ArcheopsFile::swapContent(block_type_modele* blk) {
636 int typ = type_block(blk);
637
638 if (typ == block_gps) return; // char only, no swap
639 if (typ == block_une_periode) { // une_periode, des shorts
640 block_type_une_periode* b = (block_type_une_periode*) blk;
641 for (int i=0; i<nb_max_bolo; i++)
642 for (int j=0; j<nb_max_mes_per; j++)
643 bswap2(&b->bol_per[i][j]);
644 return;
645 }
646
647 for (int i=0; i<longueur_block(blk)/4-4; i++)
648 bswap4(blk->mot + i);
649 // On deswappe ce qui ne devait pas etre swappe...
650 switch (typ) {
651 case block_param: {
652 block_type_param* b = (block_type_param*) blk;
653 for (int i=0; i<nb_max_bolo; i++)
654 for (int j=0; j<8; j++)
655#if version_num<=25
656 bswap4(&b->param.bolo[i].bolo_nom[4*j]);
657#else
658 bswap4(&b->param.nom_coef[i].bolo_nom[4*j]);
659#endif
660 }
661
662 }
663}
664#else
665void ArcheopsFile::swapContent(block_type_modele* ) {
666}
667#endif
668
669long ArcheopsFile::searchNextBlock(long pos) {
670 static char* buffer = 0;
671 static int4 debswp = debut_block_mesure;
672 static int4 longmax = taille_maxi_block_archeops*20;
673 if (!buffer) {
674 buffer = new char[longmax];
675#ifdef SWAP
676 bswap4(&debswp);
677#endif
678 }
679 fseek(f,pos,SEEK_SET);
680 size_t read = fread(buffer,1,taille_maxi_block_archeops*2,f);
681 //if (read<taille_maxi_block_archeops*2) return -1;
682 for (int i=4; i<read; i+=4) {
683 if (*(int4*)(buffer+i) == debswp) {
684 cout << "trying to skip " << i << " bytes to pos="<<pos+i << endl;
685 return pos+i;
686 }
687 }
688 cout << "cannot find block start" << endl;
689 return -1;
690}
691
692
693
694
695static int mlen[] = {31,28,31,30,31,30,31,31,30,31,30,31};
696
697double ArcheopsFile::decodeMJD(string const& dateString) {
698 //99_04_29-15h36m22 ou 99_05_10
699 short y,m,d,hh,mm,ss;
700 char const* p = dateString.c_str();
701 char const* p2 = dateString.c_str() + dateString.length();
702 y = atoi(p); p+=3; if (p>p2) return -1;
703 m = atoi(p); p+=3; if (p>p2) return -1;
704 d = atoi(p); p+=3;
705 if (p<p2) {
706 hh = atoi(p); p+=3; if (p>p2) return -1;
707 mm = atoi(p); p+=3; if (p>p2) return -1;
708 ss = atoi(p);
709 } else {
710 hh=mm=ss=0;
711 }
712
713 if (y<50) y += 100;
714 // 1. depuis 0/1/97 minuit
715 double mjd = (int) (365.25 * (y-97));
716 for (int i=0; i<m-1; i++)
717 mjd += mlen[i];
718 if (y%4 == 0 && m > 2) mjd++;
719 mjd += d;
720 mjd += hh/24. + mm/24./60. + ss/24./60./60;
721
722 mjd += 448.5; // 0/1/97 minuit
723
724 return mjd;
725}
726
727void ArcheopsFile::computeMJD(string const& fname) {
728 //telemetrie : h99_04_29-15h36m22
729 //enregistreur : ARKxxxxxx.dat, et MJD = samedi 17 juillet, 21h -> 1377.4
730 char const* p = fname.c_str();
731 char const* p2 = p + fname.length()-1;
732 while (*p2 != ':' && *p2 != '/' && p2 != p) p2--;
733 if (*p2 == ':' || *p2 == '/') p2++;
734 if (*p2 == 'h') p2++;
735 if (!strncmp(p2, "ARK",3) || !strncmp(p2,"ark",3)) {
736 rawMJD = 1377.4;
737 } else {
738 rawMJD = decodeMJD(p2);
739 }
740 startMJD = rawMJD - utcOffset/24.;
741}
742
743void ArcheopsFile::setUTCOffset(int UTCOffset) {
744 utcOffset = UTCOffset;
745 startMJD = rawMJD - utcOffset/24.;
746}
747
748double ArcheopsFile::getStartMJD() {
749 return startMJD;
750}
751
752int ArcheopsFile::getBoloBlockNum() {
753 if (!lastBolo()) return -1;
754 return numero_block(lastBolo());
755}
756
757int ArcheopsFile::getSSTBlockNum() {
758 if (!lastSST()) return -1;
759 return numero_block(lastSST());
760}
761
762
763int ArcheopsFile::getGyroBlockNum() {
764 if (!lastGyro()) return -1;
765 return numero_block(lastGyro());
766}
767
768
769// GPS
770// $GPGGA,hhmmss.ss,ddmm.mmmm,n,dddmm.mmmm,e,q,ss,y.y,a.a,z,
771
772
773int ArcheopsFile::getGPSBlockNum() {
774 if (!lastGPS()) return -1;
775 return numero_block(lastGPS());
776}
777
778double ArcheopsFile::getGPSUTC() { // en secondes depuis minuit UTC jour courant
779 if (!lastGPS()) return -9.e99;
780 return blockSet->gpsParser.getUTC();
781}
782
783double ArcheopsFile::getGPSMJD() { // modified julian day du dernier bloc GPS, JD - 2450000
784 double t = getGPSUTC()/86400. - 0.5;
785 if (t<0) return t;
786 if (t > (startMJD - int(startMJD))) {
787 return int(startMJD) + t;
788 } else {
789 return int(startMJD) + 1. + t;
790 }
791}
792
793double ArcheopsFile::getGPSLat() { // degres, + = NORD
794 if (!lastGPS()) return -9.e99;
795 return blockSet->gpsParser.getLatitude();
796}
797
798
799double ArcheopsFile::getGPSLong() { // degres, + = EST
800 if (!lastGPS()) return -9.e99;
801 return blockSet->gpsParser.getLongitude();
802}
803
804double ArcheopsFile::getGPSAlt() { // meters from sea level
805 if (!lastGPS()) return -9.e99;
806 return blockSet->gpsParser.getAltitude();
807}
808
809bool ArcheopsFile::hasGPSTime() {
810 if (!lastGPS()) return false;
811 // return blockSet->gpsParser.hasGPSTime();
812 return blockSet->gpsParser.hasTime();
813}
814
815bool ArcheopsFile::hasGPSPos() {
816 if (!lastGPS()) return false;
817 return blockSet->gpsParser.hasPosition();
818}
819
820bool ArcheopsFile::hasGPSAlt() {
821 if (!lastGPS()) return false;
822 return blockSet->gpsParser.hasAltitude();
823}
824
825
826// Bolo
827#define val_DS(j,i) (blk->data_bolo[j][i]&0x1fffff)
828
829
830long ArcheopsFile::getRawBolo(int ibolo, int imesure) { // donnee brute, avec seulement soustraction offset
831 int nb_coups,aa;
832 block_type_bolo* blk = imesure >= 0 ? lastBolo() : llastBolo();
833 //cout << "raw " << imesure << " ";
834 if (imesure < 0) imesure += nEchBlock();
835 if (!blk) return 0;
836 block_type_reglage* reglage = lastReglage();
837 if (!reglage) return 0;
838
839 nb_coups= reglage->reglage.horloge.nb_mesures/2 - reglage->reglage.horloge.temp_mort;
840 aa = (nb_coups<<14) + (nb_coups*190) ;
841
842 int s = imesure % 2 ? 1 : -1;
843
844 //cout << s*(((val_DS(ibolo,imesure)-aa)<<1)/nb_coups) << "\n";
845
846 return s*(((val_DS(ibolo,imesure)-aa)<<1)/nb_coups);
847}
848
849def_gains
850
851double ArcheopsFile::getMuVBolo(int ibolo, int imesure) { // microvolts, filtre avec filtre carre
852 double y = (getRawBolo(ibolo, imesure-1) + getRawBolo(ibolo, imesure))/2.;
853 //if (imesure%2) y=-y;
854 block_type_reglage* reglage = lastReglage();
855 block_type_param* param = lastParam();
856 if (!reglage) return 0;
857 if (!param) return 0;
858 //cout << "muv " << imesure << " " << y << "\n";
859 return bol_micro_volt(y,(double)param->param.bolo[ibolo].bolo_gain*gain_ampli(reglage->reglage.bolo[ibolo]));
860 //return ((1e5*y)/(65536.*gain_ampli(reglage->reglage.bolo[ibolo])));
861}
862
863
864// SST, gyros...
865
866void ArcheopsFile::needSSTProcessMask(int mask) {
867 blockSet->sstHandler.NeedProcess(mask);
868}
869
870long ArcheopsFile::getSSTSignal(int idiode, int imesure) {
871 return blockSet->sstHandler.getSignal(imesure, idiode);
872}
873
874long ArcheopsFile::getSSTRawSignal(int idiode, int imesure) {
875 return blockSet->sstHandler.getRawSignal(imesure, idiode);
876}
877
878double ArcheopsFile::getSSTStarZ(int istar, int imesure) {
879 return blockSet->sstHandler.getStarZ(imesure, istar);
880}
881
882double ArcheopsFile::getSSTStarF(int istar, int imesure) {
883 return blockSet->sstHandler.getStarF(imesure, istar);
884}
885
886double ArcheopsFile::getSSTStarT(int istar, int imesure) {
887 return blockSet->sstHandler.getStarTime(imesure, istar);
888}
889
890double ArcheopsFile::getNumbStar(int imesure) {
891 return blockSet->sstHandler.getNumbStar(imesure);
892}
893
894long ArcheopsFile::getGyro(int igyro, int imesure) {
895 if (igyro<0 || igyro>2) return 0;
896 if (imesure<0 || imesure>= nb_per_block*2) return 0;
897 block_type_gyro* blk = lastGyro() ;
898 if (!blk) return 0;
899#if version_num<=25
900 return blk->gyros[igyro][imesure];
901#else
902 return blk->gyro[igyro][imesure];
903#endif
904}
905
906
907
908// $CHECK$ TBD
909
910
911double ArcheopsFile::getAzimut(int imesure) {return imesure*360/nEchBlock();}
912double ArcheopsFile::getPendDirect(int /*imesure*/) {return 0;}
913double ArcheopsFile::getPendOrth(int /*imesure*/) {return 0;}
914double ArcheopsFile::getAlpha(int /*imesure*/) {return 0;}
915double ArcheopsFile::getDelta(int /*imesure*/) {return 0;}
Note: See TracBrowser for help on using the repository browser.