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

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

Conversion Archeops raw file -> TOI

File size: 15.7 KB
RevLine 
[310]1#define utilitaires_de_block_archeops
2#include "archeopsfile.h"
3#include "compress.h"
4#include <iostream.h>
5
6class BlockSet {
7public:
8 BlockSet();
9 BlockSet(BlockSet const&);
10 ~BlockSet();
11 void setBloc(block_type_modele const& blk);
12 void setRawBloc(block_type_modele const& blk);
13
14 block_type_param* lastParam;
15 block_type_journal* lastJournal;
16 block_type_reglage* lastReglage;
17 block_type_dilution* lastDilution;
18 block_type_gps* lastGPS;
19 block_type_une_periode* lastUnePeriode;
20 block_type_synchro_sol* lastSynchroSol;
21 block_type_pointage_sol* lastPointageSol;
22 block_type_bolo* lastBolo; // can be uncompressed bolo_comp
23 block_type_bolo* llastBolo;
24 block_type_gyro* lastGyro;
25 block_type_sst* lastSST;
26 block_type_bolo_comprime* lastBoloComp; // can be uncompressed bolo_comp
27 block_type_gyro_comprime* lastGyroComp;
28 block_type_sst_comprime* lastSSTComp;
29};
30
31BlockSet::BlockSet() {
32 lastParam = NULL;
33 lastJournal = NULL;
34 lastReglage = NULL;
35 lastDilution = NULL;
36 lastGPS = NULL;
37 lastUnePeriode = NULL;
38 lastSynchroSol = NULL;
39 lastPointageSol= NULL;
40 lastBolo = NULL;
41 llastBolo = NULL;
42 lastGyro = NULL;
43 lastSST = NULL;
44 lastBoloComp = NULL;
45 lastGyroComp = NULL;
46 lastSSTComp = NULL;
47}
48
49BlockSet::~BlockSet() {
50 delete lastParam;
51 delete lastJournal;
52 delete lastReglage;
53 delete lastDilution;
54 delete lastGPS;
55 delete lastUnePeriode;
56 delete lastSynchroSol;
57 delete lastPointageSol;
58 delete lastBolo;
59 delete llastBolo;
60 delete lastGyro;
61 delete lastSST;
62 delete lastBoloComp;
63 delete lastGyroComp;
64 delete lastSSTComp;
65}
66
67BlockSet::BlockSet(BlockSet const& x) {
68 lastParam = NULL;
69 lastJournal = NULL;
70 lastReglage = NULL;
71 lastDilution = NULL;
72 lastGPS = NULL;
73 lastUnePeriode = NULL;
74 lastSynchroSol = NULL;
75 lastPointageSol= NULL;
76 lastBolo = NULL;
77 llastBolo = NULL;
78 lastGyro = NULL;
79 lastSST = NULL;
80 lastBoloComp = NULL;
81 lastGyroComp = NULL;
82 lastSSTComp = NULL;
83 if (x.lastParam) {
84 lastParam = new block_type_param;
85 *lastParam = *x.lastParam;
86 }
87 if (x.lastJournal) {
88 lastJournal = new block_type_journal;
89 *lastJournal = *x.lastJournal;
90 }
91 if (x.lastReglage) {
92 lastReglage = new block_type_reglage;
93 *lastReglage = *x.lastReglage;
94 }
95 if (x.lastDilution) {
96 lastDilution = new block_type_dilution;
97 *lastDilution = *x.lastDilution;
98 }
99 if (x.lastGPS) {
100 lastGPS = new block_type_gps;
101 *lastGPS = *x.lastGPS;
102 }
103 if (x.lastUnePeriode) {
104 lastUnePeriode = new block_type_une_periode;
105 *lastUnePeriode = *x.lastUnePeriode;
106 }
107 if (x.lastSynchroSol) {
108 lastSynchroSol = new block_type_synchro_sol;
109 *lastSynchroSol = *x.lastSynchroSol;
110 }
111 if (x.lastPointageSol) {
112 lastPointageSol = new block_type_pointage_sol;
113 *lastPointageSol = *x.lastPointageSol;
114 }
115 if (x.lastBolo) {
116 lastBolo = new block_type_bolo;
117 *lastBolo = *x.lastBolo;
118 }
119 if (x.llastBolo) {
120 llastBolo = new block_type_bolo;
121 *llastBolo = *x.llastBolo;
122 }
123 if (x.lastGyro) {
124 lastGyro = new block_type_gyro;
125 *lastGyro = *x.lastGyro;
126 }
127 if (x.lastSST) {
128 lastSST = new block_type_sst;
129 *lastSST = *x.lastSST;
130 }
131 if (x.lastBoloComp) {
132 lastBoloComp = new block_type_bolo_comprime;
133 *lastBoloComp = *x.lastBoloComp;
134 }
135 if (x.lastGyroComp) {
136 lastGyroComp = new block_type_gyro_comprime;
137 *lastGyroComp = *x.lastGyroComp;
138 }
139 if (x.lastSSTComp) {
140 lastSSTComp = new block_type_sst_comprime;
141 *lastSSTComp = *x.lastSSTComp;
142 }
143}
144
145void BlockSet::setBloc(block_type_modele const& blk)
146{
147 int kind = type_block(&blk);
148 switch (kind) {
149 case block_param:
150 if (!lastParam) lastParam = new block_type_param;
151 memcpy(lastParam, &blk, sizeof(block_type_param));
152 // Les fichiers fournis contiennent des valeurs debiles...
153 if (lastParam->param.n_max_bolo < 0)
154 lastParam->param.n_max_bolo = nb_max_bolo;
155 if (lastParam->param.n_per_block < 0)
156 lastParam->param.n_per_block = nb_per_block;
157 if (lastParam->param.n_max_mes_per < 0)
158 lastParam->param.n_max_mes_per = nb_max_mes_per;
159 break;
160 case block_journal:
161 if (!lastJournal) lastJournal = new block_type_journal;
162 memcpy(lastJournal, &blk, sizeof(block_type_journal));
163 break;
164 case block_reglage:
165 if (!lastReglage) lastReglage = new block_type_reglage;
166 memcpy(lastReglage, &blk, sizeof(block_type_reglage));
167 break;
168 case block_dilution:
169 if (!lastDilution) lastDilution = new block_type_dilution;
170 memcpy(lastDilution, &blk, sizeof(block_type_dilution));
171 break;
172 case block_gps:
173 if (!lastGPS) lastGPS = new block_type_gps;
174 memcpy(lastGPS, &blk, sizeof(block_type_gps));
175 break;
176 case block_une_periode:
177 if (!lastUnePeriode) lastUnePeriode = new block_type_une_periode;
178 memcpy(lastUnePeriode, &blk, sizeof(block_type_une_periode));
179 break;
180 case block_synchro_sol:
181 if (!lastSynchroSol) lastSynchroSol = new block_type_synchro_sol;
182 memcpy(lastSynchroSol, &blk, sizeof(block_type_synchro_sol));
183 break;
184 case block_pointage_sol:
185 if (!lastPointageSol) lastPointageSol = new block_type_pointage_sol;
186 memcpy(lastPointageSol, &blk, sizeof(block_type_pointage_sol));
187 break;
188 case block_bolo:
189 if (!lastBolo) lastBolo = new block_type_bolo;
190 else if (!llastBolo) {
191 llastBolo = new block_type_bolo;
192 memcpy(llastBolo, lastBolo, sizeof(block_type_bolo));
193 }
194 memcpy(lastBolo, &blk, sizeof(block_type_bolo));
195 break;
196 case block_gyro:
197 if (!lastGyro) lastGyro = new block_type_gyro;
198 memcpy(lastGyro, &blk, sizeof(block_type_gyro));
199 break;
200 case block_sst:
201 if (!lastSST) lastSST = new block_type_sst;
202 memcpy(lastSST, &blk, sizeof(block_type_sst));
203 break;
204 }
205}
206
207void BlockSet::setRawBloc(block_type_modele const& blk)
208{
209 int kind = type_block(&blk);
210 switch (kind) {
211 case block_bolo_comprime:
212 if (!lastBoloComp) lastBoloComp = new block_type_bolo_comprime;
213 memcpy(lastBoloComp, &blk, sizeof(block_type_bolo_comprime));
214 break;
215 case block_gyro_comprime:
216 if (!lastGyroComp) lastGyroComp = new block_type_gyro_comprime;
217 memcpy(lastGyroComp, &blk, sizeof(block_type_gyro_comprime));
218 break;
219 case block_sst_comprime:
220 if (!lastSSTComp) lastSSTComp = new block_type_sst_comprime;
221 memcpy(lastSSTComp, &blk, sizeof(block_type_sst_comprime));
222 break;
223 }
224}
225
226
227
228ArcheopsFile::ArcheopsFile(string const& fname) {
229 f = fopen(fname.c_str(), "rb");
230 fn = fname;
231 if (!f) throw ArchExc("file not found");
232 fseek(f,0,SEEK_END);
233 fLen = ftell(f);
234 curPos = 0;
235 curKind = -1;
236 curRawKind = -1;
237 blockSet = new BlockSet;
238 utcOffset=2;
239 computeMJD(fname);
240}
241
242ArcheopsFile::ArcheopsFile(ArcheopsFile const& x) {
243 blockSet = x.blockSet ? new BlockSet(*x.blockSet) : NULL;
244 fposStack = x.fposStack;
245
246 stack<BlockSet*> tmp;
247 ArcheopsFile& y = (ArcheopsFile&) x;
248 while (!y.blockStack.empty()) {
249 tmp.push(y.blockStack.top());
250 y.blockStack.pop();
251 }
252 while (!tmp.empty()) {
253 y.blockStack.push(tmp.top());
254 blockStack.push(new BlockSet(*tmp.top()));
255 tmp.pop();
256 }
257
258 curBlock = x.curBlock;
259 curKind = x.curKind;
260 curRawKind = x.curRawKind;
261 curPos = x.curPos;
262 fLen = x.fLen;
263 fn = x.fn;
264 f = fopen(fn.c_str(), "rb");
265}
266
267ArcheopsFile::~ArcheopsFile() {
268 if (f) fclose(f);
269 delete blockSet;
270 while (!blockStack.empty())
271 { delete blockStack.top(); blockStack.pop();}
272}
273
274void ArcheopsFile::grabLastBlocs(ArcheopsFile const& oldFile) {
275 delete blockSet;
276 blockSet = new BlockSet(*oldFile.blockSet);
277 setUTCOffset(oldFile.utcOffset);
278}
279
280
281def_nom_block
282
283bool ArcheopsFile::nextBlock() {
284 //if (curPos>0) saveCurBlock();
285 //if (curPos<0) curPos = 0;
286 if (curPos+12 > fLen) return false;
287 fseek(f,curPos,SEEK_SET);
288 size_t read = fread(&curBlock,1,sizeof(curBlock),f);
289 if (read < longueur_block(&curBlock)) return false;
290 if (verifie_block(&curBlock) != block_correct) {
291 printf("block invalide\n"); throw ArchExc("invalid block");
292 }
293 curRawKind = curKind = type_block(&curBlock);
294 curPos += longueur_block(&curBlock);
295 //printf("block %d : %s \n",numero_block(&curBlock),nom_block[curKind]);
296 postProcessBlock();
297 saveCurBlock();
298 return true;
299}
300
301bool ArcheopsFile::nextBlock(long mask) {
302 if (!mask) return false;
303 while (1) {
304 if (!nextBlock()) return false;
305 if (( 1 << curRawKind) & mask) return true;
306 }
307}
308
309int ArcheopsFile::blockKind() {
310 return curKind;
311}
312
313int ArcheopsFile::blockRawKind() {
314 return curRawKind;
315}
316
317int ArcheopsFile::blockNum() {
318 return numero_block(&curBlock);
319}
320
321#define bitmot 24 // nb de bit horloge dans un mot ADC
322
323double ArcheopsFile::perEchant() { // periode d'echantillonage pour le dernier bloc reglage
324 double p,f1,f2,f3;
325 int pp;
326 pp=lastReglage()->reglage.horloge.periode;
327 p=pp/5.;
328 f1=1000/p;f2=f1/bitmot;f3=f2*1000./(double)(lastReglage()->reglage.horloge.nb_mesures);
329 return 0.5/f3; // 2 fois la frequence de modulation
330}
331
332double ArcheopsFile::perBlock() { // duree (en secondes) correspondant a un bloc bolo
333 return perEchant() * (double)lastParam()->param.n_per_block*2.;
334}
335
336int ArcheopsFile::nEchBlock() { // Nb d'echantillons dans un bloc
337 return lastParam()->param.n_per_block*2.;
338}
339
340string ArcheopsFile::blockKdName() {
341 return nom_block[curKind];
342}
343
344string ArcheopsFile::blockRawKdName() {
345 return nom_block[curRawKind];
346}
347
348
349block_type_modele* ArcheopsFile::currentBlock() {
350 if (curPos<0) return NULL;
351 return &curBlock;
352}
353
354block_type_param* ArcheopsFile::lastParam() {
355 return blockSet->lastParam;
356}
357block_type_journal* ArcheopsFile::lastJournal() {
358 return blockSet->lastJournal;
359}
360block_type_reglage* ArcheopsFile::lastReglage() {
361 return blockSet->lastReglage;
362}
363block_type_dilution* ArcheopsFile::lastDilution() {
364 return blockSet->lastDilution;
365}
366block_type_gps* ArcheopsFile::lastGPS() {
367 return blockSet->lastGPS;
368}
369block_type_une_periode* ArcheopsFile::lastUnePeriode() {
370 return blockSet->lastUnePeriode;
371}
372block_type_synchro_sol* ArcheopsFile::lastSynchroSol() {
373 return blockSet->lastSynchroSol;
374}
375block_type_pointage_sol* ArcheopsFile::lastPointageSol() {
376 return blockSet->lastPointageSol;
377}
378block_type_bolo* ArcheopsFile::lastBolo() {
379 return blockSet->lastBolo;
380}
381block_type_bolo* ArcheopsFile::llastBolo() {
382 return blockSet->llastBolo;
383}
384block_type_gyro* ArcheopsFile::lastGyro() {
385 return blockSet->lastGyro;
386}
387block_type_sst* ArcheopsFile::lastSST() {
388 return blockSet->lastSST;
389}
390block_type_bolo_comprime* ArcheopsFile::lastBoloComp() {
391 return blockSet->lastBoloComp;
392}
393block_type_gyro_comprime* ArcheopsFile::lastGyroComp() {
394 return blockSet->lastGyroComp;
395}
396block_type_sst_comprime* ArcheopsFile::lastSSTComp() {
397 return blockSet->lastSSTComp;
398}
399
400void ArcheopsFile::postProcessBlock() {
401 switch (curKind) {
402 case block_bolo_comprime: {
403 blockSet->setRawBloc(curBlock);
404 block_type_bolo blk2;
405 block_type_bolo_comprime* blk = (block_type_bolo_comprime*) &curBlock;
406 for(int j=0;j<nb_bolo_util;j++)
407 {
408 decompress_7_2(blk->data_bolo[j],blk2.data_bolo[j],nb_per_block*2);
409 }
410 valide_block((block_type_modele*)&blk2,block_bolo,numero_block(blk));
411 memcpy(&curBlock,&blk2,sizeof(blk2));
412 curKind = block_bolo;
413 break;
414 }
415 }
416}
417
418void ArcheopsFile::saveCurBlock() {
419 blockSet->setBloc(curBlock);
420}
421
422void ArcheopsFile::pushMark() { // push current file position, and "last" blocks`
423 fposStack.push(curPos);
424 blockStack.push(new BlockSet(*blockSet));
425}
426
427void ArcheopsFile::popMark() { // pops last file position and "last" blocks
428 if (! blockStack.empty()) {
429 delete blockSet;
430 blockSet = blockStack.top();
431 curPos = fposStack.top();
432 blockStack.pop();
433 fposStack.pop();
434 }
435}
436
437static int mlen[] = {31,28,31,30,31,30,31,31,30,31,30,31};
438
439void ArcheopsFile::computeMJD(string const& fname) {
440 //h99_04_29-15h36m22
441 short y,m,d,hh,mm,ss;
442 char const* p = fname.c_str();
443 char const* p2 = p + fname.length()-1;
444 while (*p2 != ':' && *p2 != '/' && p2 != p) p2--;
445 if (*p2 == ':' || *p2 == '/') p2++;
446 if (*p2 == 'h') p2++;
447 y = atoi(p2); p2+=3;
448 m = atoi(p2); p2+=3;
449 d = atoi(p2); p2+=3;
450 hh = atoi(p2); p2+=3;
451 mm = atoi(p2); p2+=3;
452 ss = atoi(p2);
453
454 if (y<50) y += 100;
455 // 1. depuis 0/1/97 minuit
456 rawMJD = (int) (365.25 * (y-97));
457 for (int i=0; i<m-1; i++)
458 rawMJD += mlen[i];
459 if (y%4 == 0 && m > 2) rawMJD++;
460 rawMJD += d;
461 rawMJD += hh/24. + mm/24./60. + ss/24./60./60;
462
463 rawMJD += 448.5; // 0/1/97 minuit
464 startMJD = rawMJD - utcOffset/24.;
465}
466
467void ArcheopsFile::setUTCOffset(int UTCOffset) {
468 utcOffset = UTCOffset;
469 startMJD = rawMJD - utcOffset/24.;
470}
471
472double ArcheopsFile::getStartMJD() {
473 return startMJD;
474}
475
476// GPS
477// $GPGGA,hhmmss.ss,ddmm.mmmm,n,dddmm.mmmm,e,q,ss,y.y,a.a,z,
478
479
480int ArcheopsFile::getGPSBlockNum() {
481 if (!lastGPS()) return -1;
482 return numero_block(lastGPS());
483}
484
485double ArcheopsFile::getGPSUTC() { // en secondes depuis minuit UTC jour courant
486 if (!lastGPS()) return -1;
487 char* p = lastGPS()->gps;
488 if (strncmp(p, "$GPGGA,", 7)) return -1;
489 p += 7;
490 double t;
491 sscanf(p, "%lg", &t);
492 int h = int(t/10000); t -= h*10000;
493 int m = int(t/100); t -= m*100;
494 return h*3600. + m*60. + t;
495}
496
497double ArcheopsFile::getGPSMJD() { // modified julian day du dernier bloc GPS, JD - 2450000
498 double t = getGPSUTC()/86400.;
499 if (t<0) return t;
500 if (t > (startMJD - int(startMJD))) {
501 return int(startMJD) + t;
502 } else {
503 return int(startMJD) + 1. + t;
504 }
505}
506
507double ArcheopsFile::getGPSLat() { // degres, + = NORD
508 if (!lastGPS()) return 99999;
509 char* p = lastGPS()->gps;
510 if (strncmp(p, "$GPGGA,", 7)) return 99999;
511 char* fence = p+80;
512 p += 7;
513 while (*p != ',' && p<fence) p++;
514 if (*p != ',') return 99999;
515 p++;
516 double t;
517 sscanf(p, "%lg", &t);
518 int d = int(t/100); t -= d*100;
519 t = d + t/60;
520 while (*p != ',' && p<fence) p++;
521 if (*p != ',') return 99999;
522 p++;
523 if (*p == 'S') t = -t;
524 return t;
525}
526
527double ArcheopsFile::getGPSLong() { // degres, + = EST
528 if (!lastGPS()) return -1;
529 char* p = lastGPS()->gps;
530 if (strncmp(p, "$GPGGA,", 7)) return 99999;
531 char* fence = p+80;
532 p += 7;
533 for (int i=0; i<3; i++) {
534 while (*p != ',' && p<fence) p++;
535 if (*p != ',') return 99999;
536 p++;
537 }
538 double t;
539 sscanf(p, "%lg", &t);
540 int d = int(t/100); t -= d*100;
541 t = d + t/60;
542 while (*p != ',' && p<fence) p++;
543 if (*p != ',') return 99999;
544 p++;
545 if (*p == 'W') t = -t;
546 return t;
547}
548
549
550
551// Bolo
552
553long ArcheopsFile::getRawBolo(int ibolo, int imesure) { // donnee brute, avec seulement soustraction offset
554 int nb_coups,aa;
555 block_type_bolo* blk = imesure >= 0 ? lastBolo() : llastBolo();
556 if (imesure < 0) imesure += nEchBlock();
557 if (!blk) return 0;
558 block_type_reglage* reglage = lastReglage();
559 block_type_param* param = lastParam();
560
561 nb_coups= reglage->reglage.horloge.nb_mesures/2 - reglage->reglage.horloge.temp_mort;
562 aa = (nb_coups<<14) + (nb_coups*190) ;
563
564 int s = imesure % 2 ? 1 : -1;
565
566 return s*(((blk->data_bolo[ibolo][imesure]-aa)<<1)/nb_coups);
567}
568
569def_gains
570
571double ArcheopsFile::getMuVBolo(int ibolo, int imesure) { // microvolts, filtre avec filtre carre
572 double y = (getRawBolo(ibolo, imesure-1) + getRawBolo(ibolo, imesure))/2.;
573 block_type_reglage* reglage = lastReglage();
574 return ((1e5*y)/(65536.*gain(reglage->reglage.bolo[ibolo])));
575}
576
577
578// SST, gyros...
579// $CHECK$ TBD
580
581
582double ArcheopsFile::getAzimut(int imesure) {return imesure*360/nEchBlock();}
583double ArcheopsFile::getPendDirect(int /*imesure*/) {return 0;}
584double ArcheopsFile::getPendOrth(int /*imesure*/) {return 0;}
585double ArcheopsFile::getAlpha(int /*imesure*/) {return 0;}
586double ArcheopsFile::getDelta(int /*imesure*/) {return 0;}
Note: See TracBrowser for help on using the repository browser.