/[PAMELA software]/chewbacca/YodaProfiler/src/PamelaDBOperations.cpp
ViewVC logotype

Contents of /chewbacca/YodaProfiler/src/PamelaDBOperations.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.21 - (show annotations) (download)
Mon Jan 12 18:23:37 2009 UTC (15 years, 11 months ago) by mocchiut
Branch: MAIN
Changes since 1.20: +263 -60 lines
Several small bugs fixed

1 //
2 #include <iomanip>
3 #include <sstream>
4 //
5 #include <iostream>
6 #include <string>
7 #include <fstream>
8 #include <list>
9 #include <errno.h>
10 //
11 #include <TFile.h>
12 #include <TSystem.h>
13 #include <TSQLResult.h>
14 #include <TSQLRow.h>
15 #include <TTree.h>
16 #include <TGraph.h>
17 #include <TTimeStamp.h>
18 #include <TF1.h>
19 //
20 #include <EventHeader.h>
21 #include <PscuHeader.h>
22 #include <mcmd/McmdEvent.h>
23 #include <mcmd/McmdRecord.h>
24 #include <RunHeaderEvent.h>
25 #include <RunTrailerEvent.h>
26 #include <CalibCalPedEvent.h>
27 #include <CalibCalPulse1Event.h>
28 #include <CalibCalPulse2Event.h>
29 #include <CalibS4Event.h>
30 #include <CalibTrk1Event.h>
31 #include <CalibTrk2Event.h>
32 #include <varDump/VarDumpEvent.h>
33 #include <varDump/VarDumpRecord.h>
34 #include <physics/S4/S4Event.h>
35 //
36 #include <sgp4.h>
37
38 #include <PamelaDBOperations.h>
39 //
40 using namespace std;
41 using namespace pamela;
42
43 // Some function to work with cTle stuff.
44 bool compTLE(cTle* tle1, cTle *tle2);
45 float getTleJulian(cTle *);
46 string getTleDatetime(cTle*);
47
48 /**
49 * Constructor.
50 * @param host hostname for the SQL connection.
51 * @param user username for the SQL connection.
52 * @param password password for the SQL connection.
53 * @param filerawname The path and name to the raw file.
54 * @param filerootname The path and name of the raw file.
55 * @param boot file BOOT number.
56 * @param obt0 file obt0.
57 * @param tsync file timesync.
58 * @param debug debug flag.
59 * @param tlefilename ascii file with TLE 3 line elements.
60 */
61 PamelaDBOperations::PamelaDBOperations(TString host, TString user, TString password, TString filerawname, TString filerootname, UInt_t boot, UInt_t tsync, UInt_t obt0, Bool_t debug, TString tlefilename, UInt_t dwinput, Bool_t staticp, Bool_t gpamela, Bool_t keepenv){
62 //
63 RELAXED = false;
64 chewbacca = false;
65 chminentry = 0;
66 chID = 0;
67 if ( filerootname.IsDigit() ){
68 if ( debug ) printf(" => using database to process the file \n");
69 chewbacca = true;
70 chID = (UInt_t)filerootname.Atoll();
71 //
72 // are these really necessary?
73 //
74 staticp = false;
75 INSERT_RAW = false;
76 dwinput = 1;
77 //
78 };
79 //
80 KEEPENV = false;
81 if ( keepenv ) KEEPENV=true;
82 STATIC=false;
83 if ( staticp ) STATIC=true;
84 //
85 SetConnection(host,user,password);
86 //
87 SetDebugFlag(debug);
88 //
89 glrun = new GL_RUN();
90 //
91 if ( !chewbacca ){
92 if ( !boot ) SetNOBOOT(false);
93 SetTsync(tsync,gpamela);
94 SetBOOTnumber(boot,gpamela);
95 SetObt0(obt0);
96 };
97 //
98 SetTLEPath(tlefilename);
99 //
100 //
101 if ( !chewbacca ) INSERT_RAW =!filerawname.IsNull();
102 if (INSERT_RAW) SetRawName(filerawname);
103 //
104 INSERT_ROOT = !filerootname.IsNull();
105 if ( INSERT_ROOT ) this->SetRootName(filerootname);
106 this->SetOrbitNo(dwinput);
107 //
108 this->SetID_RAW(0);
109 this->SetID_ROOT(0);
110
111 VALIDATE = false;
112
113 //
114 };
115
116 /**
117 * Destructor
118 */
119 void PamelaDBOperations::Close(){
120 if( conn && conn->IsConnected() ) conn->Close();
121 delete clean_time;
122 delete glrun;
123 delete this;
124 };
125
126 //
127 // SETTERS
128 //
129
130 void PamelaDBOperations::OpenL0File(TString filerootname){
131 if( INSERT_ROOT ){
132 if ( chewbacca ){
133 //
134 // retrieve from the ROOT_TABLE the chewbacca path and filename
135 //
136 stringstream qu;
137 TSQLResult *result = 0;
138 TSQLResult *result2 = 0;
139 TSQLResult *result3 = 0;
140 TSQLRow *row = 0;
141 TSQLRow *row2 = 0;
142 TSQLRow *row3 = 0;
143 TString chpath;
144 TString chfile;
145 UInt_t ridn = 0;
146 qu.str("");
147 qu << "SELECT ROOT_ID_N,PKT_NUMBER_INIT,PKT_NUMBER_FINAL,PKT_OBT_INIT,PKT_OBT_FINAL,INSERTED_BY,REAL_TIME_INIT from ROOT_TABLE_MERGING where ID_N=" << chID << ";";
148 if ( debug ) printf(" chewbacca: query is %s \n",qu.str().c_str());
149 result = conn->Query(qu.str().c_str());
150 if ( result ){
151 row = result->Next();
152 if ( row ){
153 ridn = (UInt_t)atoll(row->GetField(0));
154 chpktmin = (UInt_t)atoll(row->GetField(1));
155 chpktmax = (UInt_t)atoll(row->GetField(2));
156 chobtmin = (UInt_t)atoll(row->GetField(3));
157 chobtmax = (UInt_t)atoll(row->GetField(4));
158 chiby = (TString)(row->GetField(5));
159 chrtinit = (UInt_t)atoll(row->GetField(6));
160 } else {
161 throw -84;
162 };
163 } else {
164 throw -84;
165 };
166 delete result;
167 qu.str("");
168 qu << "SELECT FOLDER_NAME,FILE_NAME,OBT_TIME_SYNC,LAST_TIME_SYNC_INFO,TIME_OFFSET,BOOT_NUMBER,PKT_NUMBER_INIT,PKT_NUMBER_FINAL,PKT_OBT_INIT,PKT_OBT_FINAL,REAL_TIME_INIT from ROOT_TABLE where ID_N=" << ridn << ";";
169 if ( debug ) printf(" chewbacca: query is %s \n",qu.str().c_str());
170 result2 = conn->Query(qu.str().c_str());
171 if ( result2 ){
172 row2 = result2->Next();
173 if ( row2 ){
174 if ( KEEPENV ){
175 chpath = (TString)(row2->GetField(0))+'/';
176 } else {
177 chpath = (TString)gSystem->ExpandPathName(row2->GetField(0))+'/';
178 };
179 chfile = (TString)(row2->GetField(1));
180 chobtts = (UInt_t)atoll(row2->GetField(2));
181 chlastts = (UInt_t)atoll(row2->GetField(3));
182 chresursts = (UInt_t)atoll(row2->GetField(4));
183 chboot = (UInt_t)atoll(row2->GetField(5));
184 //
185 if ( !chboot ){
186 qu.str("");
187 // qu << "SELECT BOOT_NUMBER from ROOT_TABLE where BOOT_NUMBER!=0 AND ABS(LAST_TIME_SYNC_INFO-"<< chlastts <<")<10000 AND ABS(REAL_TIME_INIT-"<< row2->GetField(10) <<")<7200 group by BOOT_NUMBER order by BOOT_NUMBER asc;";
188 qu << "SELECT BOOT_NUMBER from ROOT_TABLE where BOOT_NUMBER!=0 AND ABS(LAST_TIME_SYNC_INFO-"<< chlastts <<")<20000 AND ABS(REAL_TIME_INIT-"<< row2->GetField(10) <<")<40000 group by BOOT_NUMBER order by BOOT_NUMBER asc;"; // relax conditions... 090112 [8RED: error -29]
189 if ( debug ) printf(" chewbacca: query is %s \n",qu.str().c_str());
190 result3 = conn->Query(qu.str().c_str());
191 if ( result3 ){
192 row3 = result3->Next();
193 if ( row3 && result3->GetRowCount() == 1 ){
194 chboot = (UInt_t)atoll(row3->GetField(0));
195 if ( debug ) printf(" Found boot_number = %u \n",chboot);
196 } else {
197 if ( debug ) printf(" AGH CANNOT DETERMINE THE BOOT NUMBER... \n");
198 throw -29;
199 };
200 };
201 };
202 //
203 chpktinit = (UInt_t)atoll(row2->GetField(6));
204 chpktfinal = (UInt_t)atoll(row2->GetField(7));
205 chobtinit = (UInt_t)atoll(row2->GetField(8));
206 chobtfinal = (UInt_t)atoll(row2->GetField(9));
207 //
208 } else {
209 throw -85;
210 };
211 } else {
212 throw -85;
213 };
214 filerootname = chpath + chfile;// + ".root";
215 };
216 this->SetRootName(filerootname);
217 };
218 if ( debug ) printf(" Filename is %s \n",filerootname.Data());
219 file = TFile::Open(this->GetRootName().Data());
220 // } else {
221 // this->SetRootName("");
222 // this->SetRootName(filerootname);
223 // };
224 }
225
226 //
227 // must be out of the constructor in order to FORCE the validation of the latest runs in case you run the validation together with the latest file
228 //
229 void PamelaDBOperations::CheckValidate(Long64_t olderthan){
230 clean_time = new TDatime();
231 //
232 if(olderthan >= 0){
233 VALIDATE = true;
234 UInt_t timelim = 0;
235 timelim = (UInt_t)clean_time->Convert(true) - olderthan;
236 clean_time->Set(timelim,false);
237 };
238 };
239
240 /**
241 * Open the DB connection
242 * @param host hostname for the SQL connection.
243 * @param user username for the SQL connection.
244 * @param password password for the SQL connection.
245 */
246 void PamelaDBOperations::SetConnection(TString host, TString user, TString password){
247 if ( IsDebug() ) printf(" Connecting using host = %s user = %s password = %s \n",host.Data(),user.Data(),password.Data());
248 conn = TSQLServer::Connect(host.Data(),user.Data(),password.Data());
249 };
250
251 /**
252 * Store the ID of the ROOT file.
253 * @param idr ID of the ROOT file
254 */
255 void PamelaDBOperations::SetID_ROOT(UInt_t idr){
256 idroot=idr;
257 };
258
259 /**
260 * Store the ID of the RAW file.
261 * @param idr ID of the RAW file
262 */
263 void PamelaDBOperations::SetID_RAW(UInt_t idr){
264 id=idr;
265 };
266
267 /**
268 * Set the debug flag
269 *
270 */
271 void PamelaDBOperations::SetDebugFlag(Bool_t dbg){
272 debug = dbg;
273 };
274
275 /**
276 * Set the autoboot flag
277 *
278 */
279 void PamelaDBOperations::SetAutoBoot(Bool_t dbg){
280 AUTOBOOT = dbg;
281 };
282
283 /**
284 * Set the pedantic flag
285 *
286 */
287 void PamelaDBOperations::SetPedantic(Bool_t dbg){
288 PEDANTIC = dbg;
289 };
290
291 /**
292 * Set the nofrag flag
293 *
294 */
295 void PamelaDBOperations::SetNoFrag(Bool_t nf){
296 NOFRAG = nf;
297 };
298
299 /**
300 * Store the BOOT number of the RAW file.
301 * @param boot BOOT number of the RAW file
302 */
303 void PamelaDBOperations::SetBOOTnumber(UInt_t boot){
304 this->SetBOOTnumber(boot,false);
305 };
306
307 /**
308 * Store the BOOT number of the RAW file.
309 * @param boot BOOT number of the RAW file
310 */
311 void PamelaDBOperations::SetBOOTnumber(UInt_t boot, Bool_t gpamela){
312 BOOTNO=boot;
313 if ( gpamela ){
314 stringstream oss;
315 TSQLResult *result = 0;
316 TSQLRow *row = 0;
317 if ( !boot ){
318 //
319 BOOTNO = 1;
320 //
321 // look in the DB for the last timesync and the last run
322 //
323 oss.str("");
324 oss << "SELECT BOOT_NUMBER FROM GL_RUN order by RUNHEADER_TIME desc limit 1;";
325 result = conn->Query(oss.str().c_str());
326 if ( result ){
327 row = result->Next();
328 if ( row ){
329 BOOTNO = (UInt_t)atoll(row->GetField(0)) + 1;
330 };
331 };
332 };
333 };
334 };
335
336 /**
337 * Store the time sync of the RAW file.
338 * @param boot time sync
339 */
340 void PamelaDBOperations::SetTsync(UInt_t ts){
341 this->SetTsync(ts,false);
342 };
343
344 /**
345 * Store the time sync of the RAW file.
346 * @param boot time sync
347 */
348 void PamelaDBOperations::SetTsync(UInt_t ts, Bool_t gpamela){
349 //
350 // if not gpamela or given tsync file set ts
351 //
352 tsync=ts;
353 if ( gpamela ){
354 stringstream oss;
355 TSQLResult *result = 0;
356 TSQLRow *row = 0;
357 TSQLResult *result2 = 0;
358 TSQLRow *row2 = 0;
359 if ( !ts ){
360 //
361 tsync = 1;
362 //
363 // look in the DB for the last timesync and the last run
364 //
365 oss.str("");
366 oss << "SELECT TIMESYNC FROM GL_TIMESYNC order by TIMESYNC desc limit 1;";
367 result = conn->Query(oss.str().c_str());
368 if ( result ){
369 row = result->Next();
370 if ( row ){
371 tsync = (UInt_t)atoll(row->GetField(0)) + 1;
372 oss.str("");
373 oss << "SELECT (RUNTRAILER_TIME-RUNHEADER_TIME) FROM GL_RUN order by RUNHEADER_TIME desc limit 1;";
374 result2 = conn->Query(oss.str().c_str());
375 if ( result2 ){
376 row2 = result2->Next();
377 if ( row2 ){
378 tsync += (UInt_t)atoll(row2->GetField(0));
379 };
380 }
381 };
382 };
383 };
384 };
385 };
386
387 /**
388 * Store the time sync of the RAW file.
389 * @param boot time sync
390 */
391 void PamelaDBOperations::SetObt0(UInt_t ts){
392 obt0=ts;
393 };
394
395 /**
396 * Store the RAW filename.
397 * @param str the RAW filename.
398 */
399 void PamelaDBOperations::SetRawName(TString str){
400 filerawname=str;
401 };
402
403 /**
404 * Store the ROOT filename.
405 * @param str the ROOT filename.
406 */
407 void PamelaDBOperations::SetRootName(TString str){
408 filerootname=str;
409 };
410
411 /**
412 * Store the downlink orbit number from filename.
413 */
414 void PamelaDBOperations::SetOrbitNo(UInt_t dwinput){
415 dworbit = 0;
416 //
417 if ( dwinput ){
418 dworbit = dwinput;
419 if ( IsDebug() && !chewbacca ) printf(" Downlink orbit given by hand: %i \n",dworbit);
420 return;
421 };
422 //
423 if ( !chewbacca ){
424 TString name = this->GetRootFile();
425 Int_t nlength = name.Length();
426 if ( nlength < 5 ){
427 if ( IsDebug() ) printf(" Agh problems determining the orbit number! name = %s \n",name.Data());
428 return;
429 };
430 TString dwo = 0;
431 for (Int_t i = 0; i<5; i++){
432 dwo.Append(name[i],1);
433 };
434 if ( dwo.IsDigit() ){
435 dworbit = (UInt_t)dwo.Atoi();
436 } else {
437 dwo="";
438 for (Int_t i = 8; i<13; i++){
439 dwo.Append(name[i],1);
440 };
441 if ( dwo.IsDigit() ) dworbit = (UInt_t)dwo.Atoi();
442 };
443 if ( IsDebug() ) printf(" Downlink orbit is %i (dwo = %s) \n",dworbit,dwo.Data());
444 };
445 return;
446 };
447
448
449
450 /**
451 * Store the NOBOOT flag.
452 * @param noboot true/false.
453 */
454 void PamelaDBOperations::SetNOBOOT(Bool_t noboot){
455 NOBOOT = noboot;
456 };
457
458 /**
459 * Store path to the TLE file.
460 */
461 void PamelaDBOperations::SetTLEPath(TString str){
462 tlefilename = str;
463 };
464
465 TString PamelaDBOperations::GetRawPath(){
466 if ( STATIC ){
467 return((TString)gSystem->DirName(filerawname.Data())+'/');
468 } else {
469 return((TString)gSystem->ExpandPathName("$PAM_RAW")+'/');
470 };
471 };
472
473 TString PamelaDBOperations::GetRootPath(){
474 if ( STATIC ){
475 return((TString)gSystem->DirName(this->GetRootName().Data())+'/');
476 } else {
477 if ( KEEPENV ){
478 return((TString)gSystem->ExpandPathName(gSystem->DirName(filerootname.Data()))+'/');
479 } else {
480 return((TString)gSystem->ExpandPathName("$PAM_L0")+'/');
481 };
482 };
483 };
484
485 /**
486 * Store the olderthan variable
487 * @param olderthan
488 */
489 // void PamelaDBOperations::SetOlderThan(Long64_t oldthan){
490 // olderthan = oldthan;
491 // };
492
493 /**
494 * Retrieve the ID_RAW, if exists, returns NULL if does not exist.
495 */
496 Bool_t PamelaDBOperations::SetID_RAW(){
497 stringstream oss;
498 TSQLResult *result = 0;
499 TSQLRow *row = 0;
500 oss.str("");
501 if ( STATIC ){
502 oss << "SELECT ID FROM GL_RAW WHERE "
503 << " PATH = '" << this->GetRawPath().Data() << "' AND "
504 << " NAME = '" << this->GetRawFile().Data() << "' ";
505 } else {
506 oss << "SELECT ID FROM GL_RAW WHERE "
507 << " PATH = '$PAM_RAW' AND "
508 << " NAME = '" << this->GetRawFile().Data() << "' ";
509 }
510 result = conn->Query(oss.str().c_str());
511 if ( result == NULL ) throw -4;
512 row = result->Next();
513 if ( !row ) return(false);
514 id = (UInt_t)atoll(row->GetField(0));
515 delete result;
516 return(true);
517 }
518
519 /**
520 *
521 * Set the variables which have to be stored in the GL_RUN table and that do not depend on the RUN
522 *
523 */
524 void PamelaDBOperations::SetCommonGLRUN(UInt_t absth, UInt_t abstt){
525 glrun->SetBOOTNUMBER(BOOTNO);
526 glrun->SetRUNHEADER_TIME(absth);
527 glrun->SetRUNTRAILER_TIME(abstt);
528 glrun->SetID_ROOT_L2(0);
529 glrun->SetID_ROOT_L0(idroot);
530 glrun->SetVALIDATION(0);
531 };
532
533 /**
534 *
535 * Set the variables which belogns to physendrun tree
536 *
537 */
538 void PamelaDBOperations::SetPhysEndRunVariables(){
539 //
540 //
541 //
542 TTree *T = 0;
543 T = (TTree*)file->Get("PhysEndRun");
544 if ( !T || T->IsZombie() ) throw -90;
545 //
546 PhysEndRunEvent *pher= 0;
547 EventHeader *eh = 0;
548 T->SetBranchAddress("PhysEndRun", &pher);
549 T->SetBranchAddress("Header", &eh);
550 //
551 UInt_t phobt = 0;
552 UInt_t phpkt = 0;
553 //
554 glrun->SetPHYSENDRUN_MASK_S3S2S12(0);
555 glrun->SetPHYSENDRUN_MASK_S11CRC(0);
556 //
557 for (Int_t p=0; p<T->GetEntries(); p++){
558 //
559 T->GetEntry(p);
560 //
561 phobt = (UInt_t)eh->GetPscuHeader()->GetOrbitalTime();
562 phpkt = (UInt_t)eh->GetPscuHeader()->GetCounter();
563 //
564 if ( this->PKT(phpkt) >= this->PKT(glrun->GetRUNHEADER_PKT()) && this->PKT(phpkt) <= this->PKT(glrun->GetRUNTRAILER_PKT()) && this->OBT(phobt) >= this->OBT(glrun->GetRUNHEADER_OBT()) && this->OBT(phobt) <= this->OBT(glrun->GetRUNTRAILER_OBT()) ){
565 if ( glrun->GetPHYSENDRUN_MASK_S3S2S12() || glrun->GetPHYSENDRUN_MASK_S11CRC() ){
566 if ( IsDebug() ) printf(" WARNING while looping in physendrun: found two PhysEndRun packet for the same RUN! \n");
567 if ( IsDebug() ) printf(" Actual values: %X %X New values %X %X \n ",glrun->GetPHYSENDRUN_MASK_S3S2S12(),glrun->GetPHYSENDRUN_MASK_S11CRC(),(UInt_t)pher->TB_ENDRUN.TB_PMT_MASK_S3S2S12,(UInt_t)pher->TB_ENDRUN.TB_PMT_MASK_S11CRC);
568 if ( PEDANTIC && IsDebug() ) printf(" ERROR while looping in physendrun: found two PhysEndRun packet for the same RUN!\n ");
569 if ( PEDANTIC ) throw -91;
570 } else {
571 glrun->SetPHYSENDRUN_MASK_S3S2S12((UInt_t)pher->TB_ENDRUN.TB_PMT_MASK_S3S2S12);
572 glrun->SetPHYSENDRUN_MASK_S11CRC((UInt_t)pher->TB_ENDRUN.TB_PMT_MASK_S11CRC);
573 };
574 };
575 };
576 //
577 };
578
579 /**
580 * Patch, look for upper limits to avoid processing retransmitted data
581 */
582 Int_t PamelaDBOperations::SetUpperLimits(){
583 UInt_t nevent = 0;
584 UInt_t pktlast = 0;
585 UInt_t obtlast = 0;
586 Long64_t t_pktlast = 0LL;
587 // UInt_t t_obtlast = 0;
588 Long64_t t_obtlast = 0LL;
589 Long64_t upperpkt2 = 0LL;
590 Long64_t upperobt2 = 0LL;
591 UInt_t zomp = 0;
592 UInt_t jump = 50000; // was 5000
593 EventCounter *code=0;
594 //
595 Long64_t deltapkt = 5000LL;
596 Long64_t deltaobt = 50000LL;
597 //
598 pcksList packetsNames;
599 pcksList::iterator Iter;
600 getPacketsNames(packetsNames);
601 //
602 pktfirst = 0;
603 obtfirst = 0;
604 ppktfirst = 0;
605 pobtfirst = 0;
606 //
607 //
608 //
609 TTree *T = 0;
610 T = (TTree*)file->Get("Physics");
611 if ( !T || T->IsZombie() ) throw -16;
612 EventHeader *eh = 0;
613 PscuHeader *ph = 0;
614 T->SetBranchAddress("Header", &eh);
615 nevent = T->GetEntries();
616 //
617 T->GetEntry(0);
618 ph = eh->GetPscuHeader();
619
620 if ( chewbacca ){
621 if ( IsDebug() ) printf(" FROM CHEWBACCA: upperpkt %u upperobt %u lowerpkt %u lowerobt %u \n",chpktmax,chobtmax,chpktmin,chobtmin);
622 ppktfirst = chpktmin;
623 pobtfirst = chobtts*1000;
624 } else {
625 //
626 pktfirst = ph->GetCounter();
627 obtfirst = ph->GetOrbitalTime();
628 ppktfirst = pktfirst;
629 pobtfirst = obtfirst; // to be changed AFTER time sync determination this is a profiler bug!
630 };
631 //
632 code = eh->GetCounter();
633 UInt_t en = 0;
634 // if ( !chewbacca ){
635 for(Iter = packetsNames.begin(); Iter != packetsNames.end(); Iter++){
636 en = code->Get(GetPacketType(*Iter));
637 if ( !strcmp("CalibCalPed",*Iter) || !strcmp("CalibTrk1",*Iter) || !strcmp("CalibTrk2",*Iter) || !strcmp("CalibS4",*Iter) ){
638 if ( IsDebug() ) printf(" We have a calibration before the first physic packet: packet type is %s, entries: %i \n",*Iter,en);
639 //
640 TTree *TC = 0;
641 TC = (TTree*)file->Get("CalibCalPed");
642 if ( !TC || TC->IsZombie() ) throw -16;
643 EventHeader *ehc = 0;
644 PscuHeader *phc = 0;
645 TC->SetBranchAddress("Header", &ehc);
646 TC->GetEntry(0);
647 phc = ehc->GetPscuHeader();
648 pktfirst = phc->GetCounter();
649 obtfirst = phc->GetOrbitalTime();
650 //
651 };
652 };
653 //
654 T->GetEntry(nevent-1);
655 ph = eh->GetPscuHeader();
656 pktlast = ph->GetCounter();
657 obtlast = ph->GetOrbitalTime();
658 //
659 // paranoid check
660 //
661 if ( chewbacca ) {
662 //
663 // query the ROOT_TABLE to find upper and lower limits of the file and compare them to the given interval
664 //
665 if ( IsDebug() ) printf(" Is good if \n");
666 if ( IsDebug() ) printf("PKT(chpktfinal) >= PKT(chpktmax) && PKT(chpktinit) <= PKT(chpktmin) && OBT(chobtfinal) >= OBT(chobtmax) && OBT(chobtinit) <= OBT(chobtmin) \n");
667 if ( IsDebug() ) printf(" %llu >= %llu && %llu <= %llu && %llu >= %llu && %llu <= %llu \n",PKT(chpktfinal),PKT(chpktmax),PKT(chpktinit),PKT(chpktmin),OBT(chobtfinal),OBT(chobtmax),OBT(chobtinit),OBT(chobtmin));
668 if ( PKT(chpktfinal) >= PKT(chpktmax) && PKT(chpktinit) <= PKT(chpktmin) && OBT(chobtfinal) >= OBT(chobtmax) && OBT(chobtinit) <= OBT(chobtmin) ){
669 if ( IsDebug() ) printf(" OK, the file contains the chewbacca interval\n");
670 } else {
671 if ( IsDebug() ) printf(" Bah, the file seems to be the wrong one, the chewbacca interval is not contained in the file... is the DB correctly filled??\n");
672 if ( PEDANTIC ) throw -89;
673 };
674 };
675 //
676 nrtbef = 0;
677 nrtaf = 0;
678 nrtbef = 0;
679 nrtaf = 0;
680 //
681 if ( chewbacca ){
682 pktfirst = chpktmin;
683 obtfirst = chobtmin;
684 pktlast = chpktmax;
685 obtlast = chobtmax;
686 upperpkt = PKT(chpktmax);
687 upperobt = OBT(chobtmax);
688 pktlast = numeric_limits<UInt_t>::max();
689 Int_t it = 0;
690 UInt_t tjump = 50000;
691 //UInt_t tjump = 100;
692 while ( tjump > 0 ){
693 // pktlast = numeric_limits<UInt_t>::max();
694 pktlast = chpktmax + 1;
695 while ( PKT(pktlast) > PKT(chpktmax) && (Int_t)(nevent-1-it) >= 0 ){
696 if ( (Int_t)(nevent-1-it) >= 0 ){
697 T->GetEntry(nevent-1-it);
698 ph = eh->GetPscuHeader();
699 pktlast = ph->GetCounter();
700 } else {
701 pktlast = chpktmax + 1;
702 };
703 if ( (!(it%1000) || abs((int)(PKT(pktlast) - PKT(chpktmax)))<1000 ) && debug ) printf(" look for up %i %i %i nevent %u (nevent-1-it) %i \n",it,pktlast,chpktmax,nevent,(Int_t)(nevent-1-it));
704 it += tjump;
705 };
706 if ( tjump > 1 ) it -= 2*tjump;
707 if ( it < 0 ) it = 0;
708 //
709 if ( debug ) printf(" - look for up %i %i %i nevent %u (nevent-1-it) %i \n",it,pktlast,chpktmax,nevent,(Int_t)(nevent-1-it));
710 if ( debug ) printf(" - up , tjump was %u it was %u \n",tjump,it);
711 if ( tjump == 1 ) tjump = 0;
712 if ( tjump == 10 ) tjump = 1;
713 if ( tjump == 100 ) tjump = 10;
714 if ( tjump == 1000 ) tjump = 100;
715 if ( tjump == 5000 ) tjump = 1000;
716 if ( tjump == 50000 ) tjump = 5000;
717 //
718 };
719 Int_t tupperentry = (Int_t)nevent-1-(Int_t)it+1;//+1+1;
720 if ( tupperentry < 0 ) tupperentry = 0;
721 upperentry = tupperentry;
722 it = 0;
723 pktlast = 0;
724 tjump = 50000;
725 //tjump = 100;
726 while ( tjump > 0 ){
727 // pktlast = 0;
728 pktlast = chpktmin - 1;
729 if ( debug ) printf("LLlook for down %i %i %llu %llu \n",it,pktlast,PKT(pktlast),PKT(chpktmin));
730 while ( PKT(pktlast) < PKT(chpktmin) && it < (Int_t)nevent ){
731 if ( it < (Int_t)nevent ){
732 T->GetEntry(it);
733 ph = eh->GetPscuHeader();
734 pktlast = ph->GetCounter();
735 } else {
736 // pktlast = chpktmax - 1;
737 pktlast = chpktmin - 1;
738 };
739 if ( !(it%1000) && debug ) printf("look for down %i %i %i \n",it,pktlast,chpktmin);
740 it += tjump;
741 };
742 if ( tjump > 1 ) it -= 2*tjump;
743 if ( it < 0 ) it = 0;
744 //
745 if ( debug ) printf(" down , tjump was %u it was %u \n",tjump,it);
746 if ( tjump == 1 ) tjump = 0;
747 if ( tjump == 10 ) tjump = 1;
748 if ( tjump == 100 ) tjump = 10;
749 if ( tjump == 1000 ) tjump = 100;
750 if ( tjump == 5000 ) tjump = 1000;
751 if ( tjump == 50000 ) tjump = 5000;
752 //
753 };
754 Int_t tchminentry = (Int_t)it-1;//-1+1;
755 if ( tchminentry < 0 ) tchminentry = 0;
756 chminentry = tchminentry;
757 //
758 if ( debug ) printf(" Chewbacca: chminentry %i chmaxentry %i delta %i nevent %i \n",chminentry,upperentry,upperentry-chminentry,nevent);
759 //
760 //
761 //
762 TTree *rh=(TTree*)file->Get("RunHeader");
763 if ( !rh || rh->IsZombie() ) throw -17;
764 TTree *rt=(TTree*)file->Get("RunTrailer");
765 if ( !rt || rt->IsZombie() ) throw -18;
766 //
767 rh->SetBranchAddress("RunHeader", &runh);
768 rh->SetBranchAddress("Header", &ehh);
769 //
770 rt->SetBranchAddress("RunTrailer", &runt);
771 rt->SetBranchAddress("Header", &eht);
772 //
773 rhev = rh->GetEntries();
774 rtev = rt->GetEntries();
775 //
776 if ( IsDebug() ){
777 for (Int_t rr=0; rr<rh->GetEntries(); rr++){
778 rh->GetEntry(rr);
779 phh = ehh->GetPscuHeader();
780 printf(" RUNHEADER %i OBT %u PKT %u \n",rr,phh->GetOrbitalTime(),phh->GetCounter());
781 };
782 for (Int_t rr=0; rr<rt->GetEntries(); rr++){
783 rt->GetEntry(rr);
784 pht = eht->GetPscuHeader();
785 printf(" RUNTRAILER %i OBT %u PKT %u \n",rr,pht->GetOrbitalTime(),pht->GetCounter());
786 };
787 };
788 //
789 nrhev = 0;
790 nrhbef = 0;
791 nrhaf = 0;
792 for (Int_t rr=0; rr<rh->GetEntries(); rr++){
793 rh->GetEntry(rr);
794 phh = ehh->GetPscuHeader();
795 if ( debug ) printf(" RRRRRRR %llu %llu %llu %llu %llu %llu \n",PKT(phh->GetCounter()),PKT(pktfirst),upperpkt,OBT(obtfirst),OBT(phh->GetOrbitalTime()),upperobt);
796 if ( PKT(phh->GetCounter()) >= PKT(pktfirst) && PKT(phh->GetCounter()) <= upperpkt && OBT(phh->GetOrbitalTime()) >= OBT(obtfirst) && OBT(phh->GetOrbitalTime()) <= upperobt ){
797 nrhev++;
798 if ( debug ) printf(" ++++ RH %i \n",nrhev);
799 };
800 if ( !nrhev ) nrhbef++;
801 if ( (nrhev && (nrhev+1+nrhbef+1) == rr) || nrhaf ) nrhaf++;
802 };
803 nrtev = 0;
804 nrtbef = 0;
805 nrtaf = 0;
806 for (Int_t rr=0; rr<rt->GetEntries(); rr++){
807 rt->GetEntry(rr);
808 pht = eht->GetPscuHeader();
809 if ( debug ) printf(" TTTTTTT %llu %llu %llu %llu %llu %llu \n",PKT(pht->GetCounter()),PKT(pktfirst),upperpkt,OBT(obtfirst),OBT(pht->GetOrbitalTime()),upperobt);
810 if ( PKT(pht->GetCounter()) >= PKT(pktfirst) && PKT(pht->GetCounter()) <= upperpkt && OBT(pht->GetOrbitalTime()) >= OBT(obtfirst) && OBT(pht->GetOrbitalTime()) <= upperobt ){
811 nrtev++;
812 if ( debug ) printf(" ++++ RT %i \n",nrtev);
813 };
814 if ( !nrtev ) nrtbef++;
815 if ( (nrtev && (nrtev+1+nrtbef+1) == rr) || nrtaf ) nrtaf++;
816 };
817 if ( debug ) printf(" NUMBER OF RH %i RT %i IN THE INTERVAL, NUMBER OF TOTAL RH %i RT %i \n",nrhev,nrtev,rhev,rtev);
818 if ( debug ) printf(" RH before %i RH after %i -- RT before %i RT after %i \n",nrhbef,nrhaf,nrtbef,nrtaf);
819 //
820 T->GetEntry(upperentry);
821 ph = eh->GetPscuHeader();
822 pktlast = ph->GetCounter();
823 nevent = upperentry - chminentry;
824 if ( ((Int_t)upperentry - (Int_t)chminentry) < 0 ) nevent = 0; // nevent is UInt_t! 090112 [8RED: error -88]
825 if ( IsDebug() ) printf(" Setting nevent to %u - upperentry %i chminentry %i \n",nevent,upperentry,chminentry);
826 //
827 } else {
828 upperpkt = PKT(pktlast);
829 upperobt = OBT(obtlast);
830 upperentry = nevent-1;
831 };
832 //
833 if ( chewbacca && nevent < 1 ) {
834 if ( IsDebug() ) printf(" chewbacca and no events in the file \n");
835 pktfirst = chpktmin;
836 upperpkt = PKT(chpktmax);
837 pktlast = chpktmax;
838 obtfirst = chobtmin;
839 obtlast = chobtmax;
840 upperobt = OBT(chobtmax);
841 };
842 //
843 if ( IsDebug() ) printf(" First entries are: OBT %u pkt_num %u entry %i\n",obtfirst,pktfirst,chminentry);
844 //
845 if ( IsDebug() ) printf(" Last entries are: OBT %lld pkt_num %lld entry %i\n",upperobt,upperpkt,upperentry);
846 //
847 if ( (PKT(pktlast) < PKT(pktfirst) && OBT(obtlast) > OBT(obtfirst)) || (PKT(pktlast) > PKT(pktfirst) && OBT(obtlast) < OBT(obtfirst)) ){
848 if ( IsDebug() ) printf(" Inconsistent PKT/OBT sequence: \n (PKT(pktlast) < PKT(pktfirst) && OBT(obtlast) > OBT(obtfirst)) %llu < %llu && %llu > %llu \n OR \n (PKT(pktlast) > PKT(pktfirst) && OBT(obtlast) < OBT(obtfirst)) %llu > %llu && %llu < %llu \n",PKT(pktlast),PKT(pktfirst),OBT(obtlast),OBT(obtfirst),PKT(pktlast),PKT(pktfirst),OBT(obtlast),OBT(obtfirst));
849 if ( PEDANTIC ) throw -88;
850 return(32);
851 };
852 //
853 if ( !nevent ) return(64);
854 //
855 if ( nevent < 2 ) return(128);
856 if ( nevent < jump ) jump = 1;
857 // if ( nevent < jump ) jump = int(nevent/10);
858 // if ( !jump ) jump = 1;
859 //
860 if ( (PKT(pktlast) < PKT(pktfirst) && OBT(obtlast) < OBT(obtfirst)) || (labs(PKT(pktlast)-PKT(pktfirst))<deltapkt && labs(OBT(obtlast)-OBT(obtfirst))<deltaobt) && nevent > deltapkt ){
861 //
862 if ( IsDebug() ) printf(" starting jump %i \n",jump);
863 // if ( IsDebug() ) printf(" (PKT(pktlast) < PKT(pktfirst) && OBT(obtlast) > OBT(obtfirst)) %llu < %llu && %llu > %llu \n OR \n (PKT(pktlast) > PKT(pktfirst) && OBT(obtlast) < OBT(obtfirst)) %llu > %llu && %llu < %llu \n",PKT(pktlast),PKT(pktfirst),OBT(obtlast),OBT(obtfirst),PKT(pktlast),PKT(pktfirst),OBT(obtlast),OBT(obtfirst));
864 if ( IsDebug() ) printf(" labs(PKT(pktlast)-PKT(pktfirst) %lu < deltapkt %lld && labs(OBT(obtlast)-OBT(obtfirst)) %lu <deltaobt %lld && nevent %u > deltapkt %lld \n",(labs(PKT(pktlast)-PKT(pktfirst))),deltapkt, labs(OBT(obtlast)-OBT(obtfirst)),deltaobt, nevent, deltapkt);
865 if ( PEDANTIC ) throw -66;
866 // go back
867 zomp = nevent - 2;
868 //
869 while ( jump > 0 ){
870 //
871 t_pktlast = PKT(pktlast);
872 t_obtlast = OBT(obtlast);
873 //
874 for (UInt_t i = zomp; i>1; i-=jump){
875 //
876 if ( i >= 0 ) T->GetEntry(i);
877 ph = eh->GetPscuHeader();
878 upperpkt = PKT(ph->GetCounter());
879 upperobt = OBT(ph->GetOrbitalTime());
880 upperentry = i;
881 //
882 if ( (i-1) >= 0 ) T->GetEntry(i-1);
883 ph = eh->GetPscuHeader();
884 upperpkt2 = PKT(ph->GetCounter());
885 upperobt2 = OBT(ph->GetOrbitalTime());
886 //
887 if ( (t_pktlast < upperpkt && t_obtlast > upperobt) || (t_pktlast < upperpkt2 && t_obtlast > upperobt2) ){
888 if ( IsDebug() ) printf(" .-. upperpkt2 %lld upperobt2 %lld \n",upperpkt2,upperobt2);
889 if ( IsDebug() ) printf(" .-. upperpkt %lld t_pktlast %lld upperobt %lld t_obtlast %lld \n",upperpkt,t_pktlast,upperobt,t_obtlast);
890 if ( IsDebug() ) printf(" .-. jump %i zomp %i upperpkt %lld pktlast %u upperobt %lld obtlast %u last entry is %i \n",jump,zomp,upperpkt,pktlast,upperobt,obtlast,i);
891 throw -13;
892 };
893 //
894 if ( t_pktlast < upperpkt && t_obtlast < upperobt && t_pktlast < upperpkt2 && t_obtlast < upperobt2 ){
895 zomp = i + jump + 1;
896 if ( zomp > nevent-2 ) zomp = nevent - 2;
897 if ( IsDebug() ) printf(" .-. jump %i zomp %i upperpkt %lld pktlast %u upperobt %lld obtlast %u last entry is %i \n",jump,zomp,upperpkt,pktlast,upperobt,obtlast,i);
898 break;
899 };
900 //
901 t_pktlast = upperpkt;
902 t_obtlast = upperobt;
903 };
904 //
905 if ( jump == 1 ) jump = 0;
906 if ( jump == 10 ) jump = 1;
907 if ( jump == 100 ) jump = 10;
908 if ( jump == 1000 ) jump = 100;
909 if ( jump == 5000 ) jump = 1000;
910 if ( jump == 50000 ) jump = 5000;
911 //
912 };
913 //
914 };
915 //
916 // check if last runtrailer is within limits, if not extend limits (one should check for all packets but we need only runtrailer)
917 //
918 if ( !chewbacca ){
919 PacketType *pctp=0;
920 TTree *rh=(TTree*)file->Get("RunHeader");
921 if ( !rh || rh->IsZombie() ) throw -17;
922 TTree *rt=(TTree*)file->Get("RunTrailer");
923 if ( !rt || rt->IsZombie() ) throw -18;
924 //
925 rh->SetBranchAddress("RunHeader", &runh);
926 rh->SetBranchAddress("Header", &ehh);
927 //
928 rt->SetBranchAddress("RunTrailer", &runt);
929 rt->SetBranchAddress("Header", &eht);
930 //
931 rhev = rh->GetEntries();
932 rtev = rt->GetEntries();
933 Long64_t sobtt = 0LL;
934 Long64_t sobth = 0LL;
935 Long64_t spktt = 0LL;
936 Long64_t spkth = 0LL;
937 Long64_t pktt = 0LL;
938 Long64_t obtt = 0LL;
939 Long64_t pkth = 0LL;
940 Long64_t obth = 0LL;
941 //
942 if ( rhev || rtev ){
943
944 T->GetEntry(upperentry);
945 code = eh->GetCounter();
946 Int_t lasttrail = code->Get(pctp->RunTrailer);
947 Int_t lasthead = code->Get(pctp->RunHeader);
948 if ( lasttrail < rtev ){
949 rt->GetEntry(lasttrail);
950 pht = eht->GetPscuHeader();
951 pktt = PKT(pht->GetCounter());
952 obtt = OBT(pht->GetOrbitalTime());
953 };
954 //
955 if ( lasthead < rhev ){
956 rh->GetEntry(lasthead);
957 phh = ehh->GetPscuHeader();
958 pkth = PKT(phh->GetCounter());
959 obth = OBT(phh->GetOrbitalTime());
960 };
961 //
962 if ( IsDebug() ) printf(" rhev before %i ph %lld upperp %lld oh %lld uppero %lld \n",rhev,pkth,upperpkt,obth,upperobt);
963 if ( pkth > upperpkt && obth > upperobt ){
964 if ( IsDebug() ) printf(" Upper limits extended to include last header: ph %lld upperp %lld oh %lld uppero %lld \n",pkth,upperpkt,obth,upperobt);
965 upperpkt = pkth;
966 upperobt = obth;
967 rhev = lasthead+1;
968 } else {
969 rhev = lasthead;
970 };
971 if ( IsDebug() ) printf(" rhev after %i ph %lld upperp %lld oh %lld uppero %lld \n",rhev,pkth,upperpkt,obth,upperobt);
972 //
973 if ( IsDebug() ) printf(" rtev beforev %i pt %lld upperp %lld ot %lld uppero %lld \n",rtev,pktt,upperpkt,obtt,upperobt);
974 if ( pktt > upperpkt && obtt > upperobt ){
975 if ( IsDebug() ) printf(" Upper limits extended to include last trailer: pt %lld upperp %lld ot %lld uppero %lld \n",pktt,upperpkt,obtt,upperobt);
976 upperpkt = pktt;
977 upperobt = obtt;
978 rtev = lasttrail+1;
979 } else {
980 rtev = lasttrail;
981 };
982 if ( IsDebug() ) printf(" rtev after %i pt %lld upperp %lld ot %lld uppero %lld \n",rtev,pktt,upperpkt,obtt,upperobt);
983 // goto kikko;
984 //
985 //
986 // Check if runtrailer/runheader are within lower limits
987 //
988 //
989 pkth = 0LL;
990 obth = 0LL;
991 spkth = 0LL;
992 sobth = 0LL;
993 for (Int_t k=0; k<rhev; k++){
994 if ( k > 0 ){
995 spkth = pkth;
996 sobth = obth;
997 };
998 rh->GetEntry(k);
999 phh = ehh->GetPscuHeader();
1000 pkth = PKT(phh->GetCounter());
1001 obth = OBT(phh->GetOrbitalTime());
1002 //
1003 // if ( IsDebug() ) printf(" k %i rhev before %i ph %u upperp %u oh %u uppero %u \n",k,rhev,pkth,spkth,obth,sobth);
1004 //
1005 if ( pkth < spkth && obth < sobth ){
1006 if ( IsDebug() ) printf(" RH PROBLEMS determining the event repetition at the end of the file lasthead %i \n",rhev);
1007 if ( PEDANTIC ) throw -66;
1008 //
1009 rhev = k-1;
1010 rh->GetEntry(rhev);
1011 pkth = spkth;
1012 obth = sobth;
1013 //
1014 UInt_t evbefh = 0;
1015 code = ehh->GetCounter();
1016 evbefh = code->Get(pctp->Physics);
1017 if ( evbefh >= 0 ){
1018 T->GetEntry(evbefh);
1019 ph = eh->GetPscuHeader();
1020 t_pktlast = PKT(ph->GetCounter());
1021 t_obtlast = OBT(ph->GetOrbitalTime());
1022 if ( t_pktlast <= spkth && t_obtlast <= sobth ){ // jump
1023 upperpkt = pkth;
1024 upperobt = obth;
1025 upperentry = evbefh-1;
1026 } else {
1027 while ( t_pktlast > spkth && t_obtlast > sobth && evbefh < nevent ){
1028 evbefh++;
1029 T->GetEntry(evbefh);
1030 ph = eh->GetPscuHeader();
1031 t_pktlast = PKT(ph->GetCounter());
1032 t_obtlast = OBT(ph->GetOrbitalTime());
1033 };
1034 T->GetEntry(evbefh-1);
1035 ph = eh->GetPscuHeader();
1036 upperpkt = PKT(ph->GetCounter());
1037 upperobt = OBT(ph->GetOrbitalTime());
1038 upperentry = evbefh-1;
1039 };
1040 };
1041 if ( IsDebug() ) printf(" rhev after %i ph %lld upperp %lld oh %lld uppero %lld \n",rhev,pkth,upperpkt,obth,upperobt);
1042 goto kikko0;
1043 };
1044 };
1045 kikko0:
1046 //
1047 //
1048 //
1049 pktt = 0LL;
1050 obtt = 0LL;
1051 spktt = 0LL;
1052 sobtt = 0LL;
1053 for (Int_t k=0; k<rtev; k++){
1054 if ( k > 0 ){
1055 spktt = pktt;
1056 sobtt = obtt;
1057 };
1058 rt->GetEntry(k);
1059 pht = eht->GetPscuHeader();
1060 pktt = PKT(pht->GetCounter());
1061 obtt = OBT(pht->GetOrbitalTime());
1062 //
1063 // if ( IsDebug() ) printf(" k %i rtev beforev %i pt %i upperp %i ot %llu uppero %llu \n",k,rtev,pktt,spktt,obtt,sobtt);
1064 //
1065 if ( pktt < spktt && obtt < sobtt ){
1066 if ( IsDebug() ) printf(" RT PROBLEMS determining the event repetition at the end of the file lasttrail %i \n",rtev);
1067 if ( PEDANTIC ) throw -66;
1068 //
1069 rtev = k-1;
1070 rt->GetEntry(rtev);
1071 pktt = spktt;
1072 obtt = sobtt;
1073 if ( IsDebug() ) printf(" lasttrail %i pt %lld upperp %lld ot %lld uppero %lld \n",rtev,pktt,upperpkt,obtt,upperobt);
1074 //
1075 UInt_t evbeft = 0;
1076 code = eht->GetCounter();
1077 evbeft = code->Get(pctp->Physics);
1078 if ( evbeft >= 0 ){
1079 T->GetEntry(evbeft);
1080 ph = eh->GetPscuHeader();
1081 t_pktlast = PKT(ph->GetCounter());
1082 t_obtlast = OBT(ph->GetOrbitalTime());
1083 if ( t_pktlast <= spktt && t_obtlast <= sobtt ){ // jump
1084 upperpkt = pktt;
1085 upperobt = obtt;
1086 upperentry = evbeft-1;
1087 } else {
1088 while ( t_pktlast > spktt && t_obtlast > sobtt && evbeft < nevent ){
1089 evbeft++;
1090 T->GetEntry(evbeft);
1091 ph = eh->GetPscuHeader();
1092 t_pktlast = PKT(ph->GetCounter());
1093 t_obtlast = OBT(ph->GetOrbitalTime());
1094 };
1095 T->GetEntry(evbeft-1);
1096 ph = eh->GetPscuHeader();
1097 upperpkt = PKT(ph->GetCounter());
1098 upperobt = OBT(ph->GetOrbitalTime());
1099 upperentry = evbeft-1;
1100 };
1101 };
1102 if ( IsDebug() ) printf(" rtev after %i pt %lld upperp %lld ot %lld uppero %lld \n",rtev,pktt,upperpkt,obtt,upperobt);
1103 goto kikko;
1104 // break;
1105 //
1106 };
1107 //
1108 };
1109 //
1110 kikko:
1111 //
1112 T->GetEntry(upperentry);
1113 code = eh->GetCounter();
1114 lasttrail = code->Get(pctp->RunTrailer);
1115 lasthead = code->Get(pctp->RunHeader);
1116 if ( lasttrail < rtev ){
1117 rt->GetEntry(lasttrail);
1118 pht = eht->GetPscuHeader();
1119 pktt = PKT(pht->GetCounter());
1120 obtt = OBT(pht->GetOrbitalTime());
1121 };
1122 //
1123 if ( lasthead < rhev ){
1124 rh->GetEntry(lasthead);
1125 phh = ehh->GetPscuHeader();
1126 pkth = PKT(phh->GetCounter());
1127 obth = OBT(phh->GetOrbitalTime());
1128 };
1129 //
1130 if ( IsDebug() ) printf(" rhev before %i ph %lld upperp %lld oh %lld uppero %lld \n",rhev,pkth,upperpkt,obth,upperobt);
1131 if ( pkth > upperpkt && obth > upperobt ){
1132 if ( IsDebug() ) printf(" Upper limits extended to include last header: ph %lld upperp %lld oh %lld uppero %lld \n",pkth,upperpkt,obth,upperobt);
1133 upperpkt = pkth;
1134 upperobt = obth;
1135 rhev = lasthead+1;
1136 } else {
1137 rhev = lasthead;
1138 };
1139 if ( IsDebug() ) printf(" rhev after %i ph %lld upperp %lld oh %lld uppero %lld \n",rhev,pkth,upperpkt,obth,upperobt);
1140 //
1141 if ( IsDebug() ) printf(" rtev beforev %i pt %lld upperp %lld ot %lld uppero %lld \n",rtev,pktt,upperpkt,obtt,upperobt);
1142 if ( pktt > upperpkt && obtt > upperobt ){
1143 if ( IsDebug() ) printf(" Upper limits extended to include last trailer: pt %lld upperp %lld ot %lld uppero %lld \n",pktt,upperpkt,obtt,upperobt);
1144 upperpkt = pktt;
1145 upperobt = obtt;
1146 rtev = lasttrail+1;
1147 } else {
1148 rtev = lasttrail;
1149 };
1150 if ( IsDebug() ) printf(" rtev after %i pt %lld upperp %lld ot %lld uppero %lld \n",rtev,pktt,upperpkt,obtt,upperobt);
1151 //
1152 };
1153 };
1154 //
1155 if ( IsDebug() ) printf(" Upper limits are: OBT %lld pkt_num %lld upper entry %i \n",upperobt,upperpkt,upperentry);
1156 //
1157 return(0);
1158 }
1159
1160 /**
1161 *
1162 * Trick to have unique RUN ID numbers even when runs are deleted and mysql deamon restarted.
1163 * Entries in the _RUNID_GEN table are never deleted.
1164 *
1165 **/
1166 UInt_t PamelaDBOperations::AssignRunID(){
1167 //
1168 TSQLResult *result = 0;
1169 TSQLRow *row = 0;
1170 UInt_t runid = 0;
1171 //
1172 stringstream oss;
1173 //
1174 oss.str("");
1175 if ( chewbacca ){// if chewbacca and tag=none then use chewbacca tag (chiby = chewbacca inserted by), if chewbacca and tag!=none then use tag, if not chewbacca use tag.
1176 if ( !strcmp(tag.Data(),"NONE") ){
1177 oss << "INSERT INTO _RUNID_GEN VALUES (NULL,'"<< chiby.Data() <<"');";
1178 } else {
1179 oss << "INSERT INTO _RUNID_GEN VALUES (NULL,'"<< tag.Data() <<"');";
1180 };
1181 } else {
1182 oss << "INSERT INTO _RUNID_GEN VALUES (NULL,'"<< tag.Data() <<"');";
1183 };
1184 result = conn->Query(oss.str().c_str());
1185 if ( !result ) throw -10;
1186 oss.str("");
1187 oss << "SELECT ID FROM _RUNID_GEN ORDER BY ID DESC LIMIT 1;";
1188 result = conn->Query(oss.str().c_str());
1189 if ( !result ) throw -10;
1190 //
1191 row = result->Next();
1192 //
1193 if ( !row ) throw -28;
1194 //
1195 runid = (UInt_t)atoll(row->GetField(0));
1196 //
1197 return(runid);
1198 };
1199
1200 //
1201 // GETTERS
1202 //
1203
1204 /**
1205 *
1206 * Returns the DB absolute time needed to associate calibrations to data
1207 *
1208 */
1209 UInt_t PamelaDBOperations::GetAbsTime(UInt_t obt){
1210 //
1211 return(((UInt_t)(OBT(obt)/1000)+toffset));
1212 //
1213 };
1214
1215 /**
1216 *
1217 * List of packet types (just to make easily the loops)
1218 *
1219 */
1220 const PacketType* PamelaDBOperations::GetPacketType(const char* type){
1221 if ( !strcmp(type,"Pscu") ) return(PacketType::Pscu);
1222 if ( !strcmp(type,"PhysEndRun") ) return(PacketType::PhysEndRun);
1223 if ( !strcmp(type,"CalibCalPulse1") ) return(PacketType::CalibCalPulse1);
1224 if ( !strcmp(type,"CalibCalPulse2") ) return(PacketType::CalibCalPulse2);
1225 if ( !strcmp(type,"Physics") ) return(PacketType::Physics);
1226 if ( !strcmp(type,"CalibTrkBoth") ) return(PacketType::CalibTrkBoth);
1227 if ( !strcmp(type,"CalibTrk1") ) return(PacketType::CalibTrk1);
1228 if ( !strcmp(type,"CalibTrk2") ) return(PacketType::CalibTrk2);
1229 if ( !strcmp(type,"CalibTof") ) return(PacketType::CalibTof);
1230 if ( !strcmp(type,"CalibS4") ) return(PacketType::CalibS4);
1231 if ( !strcmp(type,"CalibCalPed") ) return(PacketType::CalibCalPed);
1232 if ( !strcmp(type,"Calib1_Ac1") ) return(PacketType::Calib1_Ac1);
1233 if ( !strcmp(type,"Calib2_Ac1") ) return(PacketType::Calib2_Ac1);
1234 if ( !strcmp(type,"Calib1_Ac2") ) return(PacketType::Calib1_Ac2);
1235 if ( !strcmp(type,"Calib2_Ac2") ) return(PacketType::Calib2_Ac2);
1236 if ( !strcmp(type,"CalibCal") ) return(PacketType::CalibCal);
1237 if ( !strcmp(type,"RunHeader") ) return(PacketType::RunHeader);
1238 if ( !strcmp(type,"RunTrailer") ) return(PacketType::RunTrailer);
1239 if ( !strcmp(type,"CalibHeader") ) return(PacketType::CalibHeader);
1240 if ( !strcmp(type,"CalibTrailer") ) return(PacketType::CalibTrailer);
1241 if ( !strcmp(type,"InitHeader") ) return(PacketType::InitHeader);
1242 if ( !strcmp(type,"InitTrailer") ) return(PacketType::InitTrailer);
1243 if ( !strcmp(type,"EventTrk") ) return(PacketType::EventTrk);
1244 if ( !strcmp(type,"Log") ) return(PacketType::Log);
1245 if ( !strcmp(type,"VarDump") ) return(PacketType::VarDump);
1246 if ( !strcmp(type,"ArrDump") ) return(PacketType::ArrDump);
1247 if ( !strcmp(type,"TabDump") ) return(PacketType::TabDump);
1248 if ( !strcmp(type,"Tmtc") ) return(PacketType::Tmtc);
1249 if ( !strcmp(type,"Mcmd") ) return(PacketType::Mcmd);
1250 if ( !strcmp(type,"ForcedFECmd") ) return(PacketType::ForcedFECmd);
1251 if ( !strcmp(type,"Ac1Init") ) return(PacketType::Ac1Init);
1252 if ( !strcmp(type,"CalInit") ) return(PacketType::CalInit);
1253 if ( !strcmp(type,"TrkInit") ) return(PacketType::TrkInit);
1254 if ( !strcmp(type,"TofInit") ) return(PacketType::TofInit);
1255 if ( !strcmp(type,"TrgInit") ) return(PacketType::TrgInit);
1256 if ( !strcmp(type,"NdInit") ) return(PacketType::NdInit);
1257 if ( !strcmp(type,"S4Init") ) return(PacketType::S4Init);
1258 if ( !strcmp(type,"Ac2Init") ) return(PacketType::Ac2Init);
1259 if ( !strcmp(type,"CalAlarm") ) return(PacketType::CalAlarm);
1260 if ( !strcmp(type,"Ac1Alarm") ) return(PacketType::Ac1Alarm);
1261 if ( !strcmp(type,"TrkAlarm") ) return(PacketType::TrkAlarm);
1262 if ( !strcmp(type,"TrgAlarm") ) return(PacketType::TrgAlarm);
1263 if ( !strcmp(type,"TofAlarm") ) return(PacketType::TofAlarm);
1264 if ( !strcmp(type,"S4Alarm") ) return(PacketType::S4Alarm);
1265 if ( !strcmp(type,"Ac2Alarm") ) return(PacketType::Ac2Alarm);
1266 if ( !strcmp(type,"TsbT") ) return(PacketType::TsbT);
1267 if ( !strcmp(type,"TsbB") ) return(PacketType::TsbB);
1268 return(PacketType::Invalid);
1269 };
1270
1271 //
1272 // PRIVATE FUNCTIONS
1273 //
1274
1275 // /**
1276 // * Open the ROOT filename for reading
1277 // */
1278 // void PamelaDBOperations::OpenFile(){
1279 // file = TFile::Open(this->GetRootName().Data());
1280 // //
1281
1282 void PamelaDBOperations::CheckFile(){
1283 if ( !file ) throw -12;
1284 };
1285
1286
1287 /**
1288 * Check if LEVEL0 file and DB connection have really be opened
1289 */
1290 void PamelaDBOperations::CheckConnection(){
1291 //
1292 // check connection
1293 //
1294 if( !conn ) throw -1;
1295 bool connect = conn->IsConnected();
1296 if( !connect ) throw -1;
1297 //
1298 if ( IsDebug() ) printf("\n DB INFORMATIONS:\n SQL: %s Version: %s Host %s Port %i \n\n",conn->GetDBMS(),conn->ServerInfo(),conn->GetHost(),conn->GetPort());
1299 //
1300 if ( !dworbit && strcmp(this->GetRootName().Data(),"") ) throw -27;
1301 //
1302 // set DB timezone to UTC
1303 //
1304 stringstream oss;
1305 //
1306 oss.str("");
1307 oss << "SET time_zone='+0:00';";
1308 TSQLResult *result = 0;
1309 result = conn->Query(oss.str().c_str());
1310 if ( !result ) throw -10;
1311 oss.str("");
1312 oss << "SET wait_timeout=173000;";
1313 conn->Query(oss.str().c_str());
1314 //
1315 }
1316
1317 /**
1318 * Lock tables
1319 */
1320 void PamelaDBOperations::LockTables(){
1321 //
1322 // check connection
1323 //
1324 if( !conn ) throw -1;
1325 bool connect = conn->IsConnected();
1326 if( !connect ) throw -1;
1327 //
1328 stringstream oss;
1329 //
1330 oss.str("");
1331 oss << "lock table GL_RUN write, GL_ROOT write, GL_RAW write, GL_TIMESYNC write, GL_RESURS_OFFSET write, GL_PARAM write, GL_TLE write, GL_RUN_FRAGMENTS write, GL_RUN_TRASH write, GL_CALO_CALIB write, GL_CALOPULSE_CALIB write, GL_TRK_CALIB write, GL_S4_CALIB write, ROOT_TABLE_MERGING write, ROOT_TABLE_BAD write, ROOT_TABLE write, _RUNID_GEN write;";
1332 TSQLResult *result = 0;
1333 result = conn->Query(oss.str().c_str());
1334 if ( !result ) throw -10;
1335 //
1336 }
1337
1338 /**
1339 * Lock tables
1340 */
1341 void PamelaDBOperations::UnLockTables(){
1342 //
1343 // check connection
1344 //
1345 if( !conn ) throw -1;
1346 bool connect = conn->IsConnected();
1347 if( !connect ) throw -1;
1348 //
1349 stringstream oss;
1350 //
1351 oss.str("");
1352 oss << "unlock tables;";
1353 TSQLResult *result = 0;
1354 result = conn->Query(oss.str().c_str());
1355 if ( !result ) throw -10;
1356 //
1357 }
1358
1359 /**
1360 * Return the correct packet number if we went back to zero
1361 */
1362 Long64_t PamelaDBOperations::PKT(UInt_t pkt_num){
1363 //
1364 // if ( IsDebug() ) printf(" pkt conversion: pkt_num is %u pktfirst is %u (UInt_t)(16777214/2)) is %u \n",pkt_num,ppktfirst,(UInt_t)(16777214/2));
1365 //
1366 if ( pkt_num < (ppktfirst/2) && ppktfirst > (16777214/2) ){
1367 // if ( IsDebug() ) printf(" rise up pktnum %lld \n",(Long64_t)pkt_num+16777215LL);
1368 return((Long64_t)pkt_num+16777215LL);
1369 };
1370 //
1371 if ( pkt_num > ((Long64_t)ppktfirst*2) && pkt_num > (16777214/2) ){
1372 // if ( IsDebug() ) printf(" rise down pktnum %lld \n",(Long64_t)pkt_num-16777215LL);
1373 return((Long64_t)pkt_num-16777215LL);
1374 };
1375 //
1376 // if ( IsDebug() ) printf(" as it is %lld \n",(Long64_t)pkt_num);
1377 return((Long64_t)pkt_num);
1378 //
1379 };
1380
1381 /**
1382 * Return the correct On Board Time if we went back to zero
1383 */
1384 Long64_t PamelaDBOperations::OBT(UInt_t obt){
1385 //
1386 // if ( IsDebug() ) printf(" obt conversion: obt is %u obtfirst is %u (numeric_limits<UInt_t>::max()/2) is %u \n",obt,pobtfirst,(UInt_t)(numeric_limits<UInt_t>::max()/2));
1387 //
1388 if ( obt < ((Long64_t)pobtfirst/2) && pobtfirst > (numeric_limits<UInt_t>::max()/2) ){
1389 // if ( IsDebug() ) printf(" rise up obt %lld \n",(Long64_t)obt+(Long64_t)numeric_limits<UInt_t>::max());
1390 return((Long64_t)obt+(Long64_t)numeric_limits<UInt_t>::max());
1391 };
1392 //
1393 if ( obt > ((Long64_t)pobtfirst*2) && obt > (numeric_limits<UInt_t>::max()/2) ){
1394 // if ( IsDebug() ) printf(" pobtfirst*2 %lld \n",((Long64_t)pobtfirst*2));
1395 // if ( IsDebug() ) printf(" rise down pktnum %lld \n", (Long64_t)obt-(Long64_t)numeric_limits<UInt_t>::max());
1396 return((Long64_t)obt-(Long64_t)numeric_limits<UInt_t>::max());
1397 };
1398 //
1399 // if ( IsDebug() ) printf(" as it is %lld \n",(Long64_t)obt);
1400 return((Long64_t)obt);
1401 };
1402
1403 /**
1404 *
1405 * Fill the glrun class with infos about the run when we have both runtrailer and runheader
1406 *
1407 */
1408 void PamelaDBOperations::FillClass(){
1409 this->FillClass(false,false,-1,-1);
1410 };
1411
1412 /**
1413 *
1414 * Fill the glrun class with infos about the run when we have both runtrailer and runheader
1415 *
1416 */
1417 void PamelaDBOperations::FillClass(Bool_t mishead, Bool_t mistrail, Int_t firstev, Int_t lastev){
1418 //
1419 TTree *T = 0;
1420 T = (TTree*)file->Get("Physics");
1421 if ( !T || T->IsZombie() ) throw -16;
1422 //
1423 EventHeader *eh = 0;
1424 PscuHeader *ph = 0;
1425 T->SetBranchAddress("Header", &eh);
1426 PacketType *pctp=0;
1427 EventCounter *codt=0;
1428 EventCounter *codh=0;
1429 UInt_t firstObt = 0;
1430 UInt_t lastObt = 0;
1431 UInt_t firstPkt = 0;
1432 UInt_t lastPkt = 0;
1433 UInt_t rhtime = 0;
1434 UInt_t rttime = 0;
1435 //
1436 if ( IsDebug() ) printf(" A firstev %i lastev %i nevents %i \n",firstev,lastev,lastev-firstev+1);
1437 //
1438 if ( !mishead ){
1439 codh = ehh->GetCounter();
1440 if ( (lastev+1 == firstev && lastev != -1) || (lastev == firstev && lastev != -1) ){
1441 if ( IsDebug() ) printf(" B firstev %i lastev %i nevents %i \n",firstev,lastev,lastev-firstev+1);
1442 firstev = 1;
1443 lastev = 0;
1444 } else {
1445 firstev = codh->Get(pctp->Physics);
1446 };
1447 rhtime = this->GetAbsTime(phh->GetOrbitalTime());
1448 glrun->Set_GL_RUNH(runh,phh);
1449 firstObt = glrun->GetRUNHEADER_OBT();
1450 firstPkt = glrun->GetRUNHEADER_PKT();
1451 };
1452 if ( !mistrail ){
1453 codt = eht->GetCounter();
1454 if ( (lastev+1 == firstev && lastev != -1) || (lastev == firstev && lastev != -1)){
1455 if ( IsDebug() ) printf(" C firstev %i lastev %i nevents %i \n",firstev,lastev,lastev-firstev+1);
1456 lastev = 0;
1457 firstev = lastev+1;
1458 } else {
1459 lastev = codt->Get(pctp->Physics)-1;
1460 };
1461 rttime = this->GetAbsTime(pht->GetOrbitalTime());
1462 glrun->Set_GL_RUNT(runt,pht);
1463 lastObt = glrun->GetRUNTRAILER_OBT();
1464 lastPkt = glrun->GetRUNTRAILER_PKT();
1465 };
1466 //
1467 if ( mishead && mistrail && lastev+1 == firstev ) throw -14; // run with no events, no runtrailer, no runheader... unsupported should never arrive here
1468 //
1469 if ( mishead ) {
1470 glrun->Set_GL_RUNH0();
1471 //
1472 if ( (lastev+1 == firstev && lastev != -1) || (lastev == firstev && lastev != -1) ){
1473 firstObt = lastObt;
1474 firstPkt = lastPkt;
1475 rhtime = rttime;
1476 } else {
1477 T->GetEntry(firstev);
1478 ph = eh->GetPscuHeader();
1479 firstObt = ph->GetOrbitalTime();
1480 rhtime = this->GetAbsTime(firstObt);
1481 firstPkt = ph->GetCounter();
1482 };
1483 //
1484 glrun->SetRUNHEADER_PKT(firstPkt);
1485 glrun->SetRUNHEADER_OBT(firstObt);
1486 //
1487 };
1488 if ( mistrail ){
1489 glrun->Set_GL_RUNT0();
1490 //
1491 if ( (lastev+1 == firstev && lastev != -1) || (lastev == firstev && lastev != -1) ){
1492 lastObt = firstObt;
1493 lastPkt = firstPkt;
1494 rttime = rhtime;
1495 } else {
1496 T->GetEntry(lastev);
1497 ph = eh->GetPscuHeader();
1498 lastObt = ph->GetOrbitalTime();
1499 rttime = this->GetAbsTime(lastObt);
1500 lastPkt = ph->GetCounter();
1501 };
1502 //
1503 glrun->SetRUNTRAILER_OBT(lastObt);
1504 glrun->SetRUNTRAILER_PKT(lastPkt);
1505 //
1506 };
1507 glrun->SetEV_FROM((UInt_t)firstev);
1508 glrun->SetEV_TO((UInt_t)lastev);
1509 glrun->SetNEVENTS((UInt_t)lastev-(UInt_t)firstev+1);
1510 //
1511 if ( IsDebug() ) printf(" firstev %i lastev %i nevents %i \n",firstev,lastev,lastev-firstev+1);
1512 //
1513 this->SetCommonGLRUN(rhtime,rttime);
1514 this->SetPhysEndRunVariables();
1515 //
1516 };
1517
1518 //
1519 // PUBLIC FUNCTIONS
1520 //
1521
1522 /**
1523 * Insert a new row into GL_RAW table.
1524 */
1525 Int_t PamelaDBOperations::insertPamelaRawFile(){
1526
1527 //
1528 Bool_t idr = this->SetID_RAW();
1529 if ( idr ) return(1);
1530
1531 GL_RAW glraw = GL_RAW();
1532
1533 glraw.PATH = GetRawPath();
1534 glraw.NAME = GetRawFile();
1535 // glraw.BOOT_NUMBER = 0;//???
1536 glraw.BOOT_NUMBER = this->GetBOOTnumber();
1537
1538 if( insertPamelaRawFile(&glraw) )return(1);
1539 //
1540 idr = this->SetID_RAW();
1541 if ( !idr ) throw -11;
1542
1543 return(0);
1544 }
1545 /**
1546 * Insert a new row into GL_RAW table.
1547 */
1548 Int_t PamelaDBOperations::insertPamelaRawFile(GL_RAW *glraw){
1549 //
1550 if(!glraw)return(1);//?? ok I think
1551 //
1552 stringstream oss;
1553 //
1554 oss.str("");
1555 if ( STATIC ){
1556 oss << "INSERT INTO GL_RAW (PATH, NAME) VALUES ('"
1557 << glraw->PATH << "', '" << glraw->NAME << "')";
1558 } else {
1559 oss << "INSERT INTO GL_RAW (PATH, NAME) VALUES ('$PAM_RAW', '" << glraw->NAME << "')";
1560 };
1561 if ( debug ) cout <<oss.str().c_str() <<endl;
1562 if ( conn->Query(oss.str().c_str()) == 0 ) throw -4;
1563 //
1564 oss.str("");
1565 oss << "SELECT ID FROM GL_RAW WHERE NAME=\""<<glraw->NAME<<"\";";
1566 if ( debug ) cout << oss.str().c_str()<<endl;
1567 if ( conn->Query(oss.str().c_str()) == 0 ) throw -4;
1568 //
1569 TSQLResult *result = 0;
1570 TSQLRow *row = 0;
1571 result = conn->Query(oss.str().c_str());
1572 if ( result == NULL ) throw -4;
1573 row = result->Next();
1574 if ( !row ) return(1);
1575 glraw->ID = (UInt_t)atoll(row->GetField(0));
1576 if ( debug ) printf(" The ID of the RAW file is %u \n",glraw->ID);
1577 delete result;
1578 delete row;
1579 //
1580 return(0);
1581 }
1582
1583
1584 /**
1585 * Look for one timesync information in the file and
1586 * fill the GL_TIMESYNC table. It will look for: 1) TS-MCMD 2) TS info in the RunHeader 3) TS info in the runtrailer, if none exists exit with error
1587 */
1588 Int_t PamelaDBOperations::insertPamelaGL_TIMESYNC(){
1589 //
1590 Int_t signal = 0;
1591 UInt_t idresof = 0;
1592 stringstream oss;
1593 TSQLResult *result = 0;
1594 TSQLRow *row = 0;
1595 UInt_t OBT = 0;
1596 UInt_t TYPE = 0;
1597 UInt_t TSYNC = 0;
1598 UInt_t t0 = 0;
1599 Bool_t existsts = false;
1600 //
1601 if ( chewbacca ){
1602 //
1603 OBT = chobtts * 1000;
1604 TSYNC = chlastts;
1605 t0 = chresursts;
1606 TYPE = 777;
1607 oss.str("");
1608 oss << "select * from GL_RESURS_OFFSET where OFFSET_DATE=FROM_UNIXTIME("<< t0 <<") limit 1;";
1609 if ( IsDebug() ) printf(" %s \n",oss.str().c_str());
1610 result = conn->Query(oss.str().c_str());
1611 if ( !result ) throw -10;
1612 row = result->Next();
1613 if ( !row ) throw -92;
1614 idresof = (UInt_t)atoll(row->GetField(0));
1615 existsts = true;
1616 goto eout;
1617 //
1618 } else {
1619 //
1620 //signal = this->SetUpperLimits();
1621 //
1622 if ( this->GetID_RAW() == 0 ) throw -11;
1623 //
1624 oss.str("");
1625 oss << "SELECT YEAR(OFFSET_DATE),MONTH(OFFSET_DATE),DAY(OFFSET_DATE),HOUR(OFFSET_DATE),MINUTE(OFFSET_DATE),SECOND(OFFSET_DATE),ID FROM GL_RESURS_OFFSET WHERE SPECIAL_FILE='"
1626 << this->GetRawFile().Data() << "';";
1627 if ( IsDebug() ) printf(" %s \n",oss.str().c_str());
1628 result = conn->Query(oss.str().c_str());
1629 if ( !result ) throw -10;
1630 row = result->Next();
1631 //
1632 if ( !row ){
1633 oss.str("");
1634 oss << "SELECT YEAR(OFFSET_DATE),MONTH(OFFSET_DATE),DAY(OFFSET_DATE),HOUR(OFFSET_DATE),MINUTE(OFFSET_DATE),SECOND(OFFSET_DATE),ID FROM GL_RESURS_OFFSET WHERE FROM_ORBIT< "
1635 << dworbit << " AND SPECIAL_FILE='' order by FROM_ORBIT desc limit 1;";
1636 if ( IsDebug() ) printf(" %s \n",oss.str().c_str());
1637 result = conn->Query(oss.str().c_str());
1638 if ( !result ) throw -10;
1639 row = result->Next();
1640 if ( !row ) throw -10;
1641 };
1642 //
1643 idresof = (UInt_t)atoll(row->GetField(6));
1644 //
1645 TTimeStamp tu = TTimeStamp((UInt_t)atoi(row->GetField(0)),(UInt_t)atoi(row->GetField(1)),(UInt_t)atoi(row->GetField(2)),(UInt_t)atoi(row->GetField(3)),(UInt_t)atoi(row->GetField(4)),(UInt_t)atoi(row->GetField(5)),0,true,0);
1646 t0 = (UInt_t)tu.GetSec();
1647 if ( IsDebug() ) printf(" t0 is %u ti is %s %s %s %s %s %s %s\n",t0,row->GetField(0),row->GetField(1),row->GetField(2),row->GetField(3),row->GetField(4),row->GetField(5),row->GetField(6));
1648 //
1649 /*
1650 * Verify that the TIMESYNC have been not already processed
1651 */
1652 oss.str("");
1653 oss << " SELECT COUNT(GL_TIMESYNC.ID),GL_TIMESYNC.OBT0,GL_TIMESYNC.TIMESYNC FROM GL_TIMESYNC "
1654 << " LEFT JOIN GL_RAW "
1655 << " ON GL_RAW.ID = GL_TIMESYNC.ID_RAW "
1656 << " WHERE GL_TIMESYNC.ID_RAW = " << this->GetID_RAW()
1657 << " GROUP BY GL_TIMESYNC.OBT0;";
1658 if ( IsDebug() ) printf(" check for old timesync: query is \n %s \n",oss.str().c_str());
1659 result = conn->Query(oss.str().c_str());
1660 if (result == NULL) throw -10;
1661 row = result->Next();
1662 if ((row != NULL) && ((UInt_t)atoll(row->GetField(0)) > 0)){
1663 if ( IsDebug() ) printf(" found a timesync t0 is %u \n",t0);
1664 toffset = (UInt_t)atoll(row->GetField(2)) - (UInt_t)(this->OBT((UInt_t)atoll(row->GetField(1)))/1000) + t0;
1665 //
1666 tsync = (UInt_t)atoll(row->GetField(2));
1667 obt0 = (UInt_t)atoll(row->GetField(1));
1668 //
1669 if ( PEDANTIC ) throw -67;
1670 return(1);
1671 };
1672 //
1673 TTree *T = 0;
1674 //
1675 UInt_t nevent = 0;
1676 UInt_t recEntries = 0;
1677 //
1678 OBT = 0;
1679 TYPE = 0;
1680 TSYNC = 0;
1681 //
1682 Double_t minimum = 0.;
1683 Double_t maximum = 0.;
1684 Double_t minimum2 = 0.;
1685 Double_t maximum2 = 0.;
1686 //
1687 //
1688 pamela::McmdEvent *mc = 0;
1689 pamela::McmdRecord *mcrc = 0;
1690 TArrayC *mcmddata = 0;
1691 //
1692 minimum = numeric_limits<Double_t>::max();
1693 maximum = numeric_limits<Double_t>::min();
1694 minimum2 = numeric_limits<Double_t>::max();
1695 maximum2 = numeric_limits<Double_t>::min();
1696 //
1697 T = (TTree*)file->Get("Mcmd");
1698 if ( !T || T->IsZombie() ) throw -19;
1699 T->SetBranchAddress("Mcmd",&mc);
1700 //
1701 nevent = T->GetEntries();
1702 //
1703 // loop over events
1704 //
1705 existsts = false;
1706 //
1707 for (UInt_t i=0; i<nevent;i++){
1708 //
1709 T->GetEntry(i);
1710 //
1711 recEntries = mc->Records->GetEntries();
1712 //
1713 for (UInt_t j = 0; j < recEntries; j++){
1714 mcrc = (pamela::McmdRecord*)mc->Records->At(j);
1715 mcmddata = mcrc->McmdData;
1716 //
1717 if (mcrc->ID1 == 0xE0){ // mcmd timesync
1718 //
1719 OBT = (Int_t)(mcrc->MCMD_RECORD_OBT);
1720 //
1721 TSYNC = (((UInt_t)mcmddata->At(0)<<24)&0xFF000000) + (((UInt_t)mcmddata->At(1)<<16)&0x00FF0000) + (((UInt_t)mcmddata->At(2)<<8)&0x0000FF00) + (((UInt_t)mcmddata->At(3))&0x000000FF);
1722 //
1723 TYPE = 55;//224;
1724 //
1725 if ( IsDebug() ) printf("mcmd tsync %i tsync %u obt %u \n",i,TSYNC,OBT);
1726 //
1727 if ( TSYNC && OBT ){
1728 existsts = true;
1729 goto eout;
1730 };
1731 //
1732 };
1733 };
1734 };
1735 if ( !existsts ) { // try with runheader and runtrailer
1736 //
1737 if ( IsDebug() ) printf(" No ts mcmd \n");
1738 signal = 2;
1739 //
1740 TTree *rh=(TTree*)file->Get("RunHeader");
1741 if ( !rh || rh->IsZombie() ) throw -17;
1742 TTree *rt=(TTree*)file->Get("RunTrailer");
1743 if ( !rt || rt->IsZombie() ) throw -18;
1744 //
1745 rh->SetBranchAddress("RunHeader", &runh);
1746 //
1747 rt->SetBranchAddress("RunTrailer", &runt);
1748 //
1749 Int_t nnrhev = rh->GetEntries();
1750 Int_t nnrtev = rt->GetEntries();
1751 if ( IsDebug() ) printf(" ou nevent %i rhev %i rtev %i \n",nevent,nnrhev,nnrtev);
1752 //
1753 if ( nnrhev > 0 ){
1754 for (Int_t i=0; i<nnrhev; i++){
1755 //
1756 rh->GetEntry(i);
1757 //
1758 TSYNC = runh->LAST_TIME_SYNC_INFO;
1759 OBT = runh->OBT_TIME_SYNC * 1000;
1760 //
1761 TYPE = 20;
1762 //
1763 if ( IsDebug() ) printf("runheader %i tsync %u obt %u \n",i,TSYNC,OBT);
1764 //
1765 if ( TSYNC && OBT ){
1766 existsts = true;
1767 goto eout;
1768 };
1769 };
1770 //
1771 };
1772 if ( nnrtev > 0 ){
1773 //
1774 if ( IsDebug() ) printf(" No runheader \n");
1775 signal = 6;
1776 //
1777 for (Int_t i=0; i<nnrtev; i++){
1778 //
1779 rt->GetEntry(i);
1780 //
1781 TSYNC = runt->LAST_TYME_SYNC_INFO;
1782 OBT = runt->OBT_TYME_SYNC * 1000;
1783 //
1784 TYPE = 21;
1785 //
1786 if ( IsDebug() ) printf("runtrailer %i tsync %u obt %u \n",i,TSYNC,OBT);
1787 //
1788 if ( TSYNC && OBT ){
1789 existsts = true;
1790 goto eout;
1791 };
1792 };
1793 //
1794 } else {
1795 if ( IsDebug() ) printf(" No runheader \n");
1796 };
1797 };
1798 //
1799 if ( !existsts ){ // try with inclination mcmd
1800 //
1801 if ( IsDebug() ) printf(" No runtrailer \n");
1802 signal = 14;
1803 //
1804 Double_t timesync = 0.;
1805 for (UInt_t i=0; i<nevent;i++){
1806 //
1807 T->GetEntry(i);
1808 //
1809 recEntries = mc->Records->GetEntries();
1810 // //
1811 for (UInt_t j = 0; j < recEntries; j++){
1812 mcrc = (pamela::McmdRecord*)mc->Records->At(j);
1813 mcmddata = mcrc->McmdData;
1814 //
1815 if (mcrc->ID1 == 0xE2){ // mcmd inclination
1816 timesync = 0.;
1817 timesync = (Double_t)(((((UInt_t)mcmddata->At(0) << 24) & 0xFF000000) + (((UInt_t)mcmddata->At(1) << 16) & 0x00FF0000) + (((UInt_t)mcmddata->At(2) << 8) & 0x0000FF00) + ((UInt_t)mcmddata->At(3) & 0x000000FF))/128.0);
1818 //
1819 if ( timesync > maximum2){
1820 maximum2 = timesync;
1821 OBT = (Int_t)(mcrc->MCMD_RECORD_OBT);
1822 };
1823 };
1824 //
1825 };
1826 };
1827 if ( maximum2 > numeric_limits<Double_t>::min() ){
1828 TSYNC = (UInt_t)(maximum2 + 0.5);
1829 TYPE = 666;
1830 if ( TSYNC && OBT ){
1831 existsts = true;
1832 goto eout;
1833 };
1834 };
1835 };
1836 //
1837 };
1838 //
1839 if ( !existsts && obt0 ){ // insert timesync by hand
1840 //
1841 if ( PEDANTIC ) throw -68;
1842 if ( IsDebug() ) printf(" No incl mcmd \n");
1843 signal = 30;
1844 //
1845 OBT = obt0;
1846 TSYNC = tsync;
1847 TYPE = 999;
1848 existsts = true;
1849 goto eout;
1850 };
1851 //
1852 eout:
1853 //
1854 if ( !existsts ) throw -3;
1855 //
1856 oss.str("");
1857 oss << "INSERT INTO GL_TIMESYNC (ID_RAW,TYPE,OBT0,TIMESYNC,ID_RESURS_OFFSET) VALUES ('"
1858 << this->GetID_RAW() << "','"//224'"
1859 << dec << (UInt_t)TYPE << "','"
1860 << dec << (UInt_t)OBT << "','"
1861 << dec << (UInt_t)TSYNC << "','"
1862 << dec << (UInt_t)idresof << "');";
1863 conn->Query(oss.str().c_str());
1864 if ( IsDebug() ) printf(" Query the GL_TIMESYNC table to fill it:\n %s \n",oss.str().c_str());
1865 if ( conn->GetErrorCode() ){
1866 printf(" OK, you got an error because the database structure you are using is not up to date\n Using backward compability code, hence you can continue safetly \n");
1867 oss.str("");
1868 oss << "INSERT INTO GL_TIMESYNC (ID_RAW,TYPE,OBT0,TIMESYNC) VALUES ('"
1869 << this->GetID_RAW() << "','"//224'"
1870 << dec << (UInt_t)TYPE << "','"
1871 << dec << (UInt_t)OBT << "','"
1872 << dec << (UInt_t)TSYNC << "');";
1873 conn->Query(oss.str().c_str());
1874 if ( IsDebug() ) printf(" Query the GL_TIMESYNC table to fill it:\n %s \n",oss.str().c_str());
1875 };
1876 //
1877 if ( IsDebug() ) printf(" found a timesync t0 is %u \n",t0);
1878 //
1879 toffset = (UInt_t)TSYNC - (UInt_t)(this->OBT(OBT)/1000) + t0;
1880 //
1881 tsync = TSYNC;
1882 obt0 = OBT;
1883 //
1884 delete result;
1885 return(signal);
1886 }
1887
1888 /**
1889 * Insert all the new rows into GL_ROOT.
1890 * The raw file indicates in the parameters should be already been stored in the database.
1891 */
1892 Int_t PamelaDBOperations::insertPamelaRootFile(){
1893
1894 stringstream oss;
1895 TSQLResult *result = 0;
1896 TSQLRow *row = 0;
1897 //
1898 // ----------------------
1899 // determine the timesync
1900 // ----------------------
1901 UInt_t idtimesync = 0;
1902 //
1903 if ( chewbacca ){
1904 oss.str("");
1905 oss << " SELECT ID FROM GL_TIMESYNC where TIMESYNC="<<chlastts<<" AND OBT0="<<chobtts*1000<<" limit 1;";
1906 if ( debug ) printf(" %s \n",oss.str().c_str());
1907 result = conn->Query(oss.str().c_str());
1908 //
1909 if ( !result ) throw -3;
1910 //
1911 row = result->Next();
1912 //
1913 if ( !row ) throw -3;
1914 idtimesync = (UInt_t)atoll(row->GetField(0));
1915 } else {
1916 oss.str("");
1917 if ( STATIC ){
1918 oss << " SELECT COUNT(GL_ROOT.ID_RAW),GL_RAW.ID,GL_ROOT.ID FROM GL_RAW "
1919 << " LEFT JOIN GL_ROOT "
1920 << " ON GL_RAW.ID = GL_ROOT.ID_RAW "
1921 << " WHERE GL_RAW.PATH = '" << this->GetRawPath().Data() << "' AND "
1922 << " GL_RAW.NAME = '" << this->GetRawFile().Data() << "' GROUP BY GL_RAW.ID ";
1923 } else {
1924 oss << " SELECT COUNT(GL_ROOT.ID_RAW),GL_RAW.ID,GL_ROOT.ID FROM GL_RAW "
1925 << " LEFT JOIN GL_ROOT "
1926 << " ON GL_RAW.ID = GL_ROOT.ID_RAW "
1927 << " WHERE GL_RAW.PATH = '$PAM_RAW' AND "
1928 << " GL_RAW.NAME = '" << this->GetRawFile().Data() << "' GROUP BY GL_RAW.ID ";
1929 };
1930 result = conn->Query(oss.str().c_str());
1931 //
1932 if ( !result ) throw -12;
1933 //
1934 row = result->Next();
1935 //
1936 if ( !row ) throw -10;
1937 if ( row != NULL && (UInt_t)atoll(row->GetField(0))>0 ){
1938 idroot = (UInt_t)atoll(row->GetField(2));
1939 delete row;
1940 delete result;
1941 return(1);
1942 };
1943 //
1944 // determine which timesync has to be used
1945 //
1946 oss.str("");
1947 oss << "SELECT GL_TIMESYNC.ID FROM GL_TIMESYNC LEFT JOIN GL_RAW ON GL_RAW.ID = GL_TIMESYNC.ID_RAW ORDER BY GL_TIMESYNC.ID DESC LIMIT 1;";
1948 result = conn->Query(oss.str().c_str());
1949 //
1950 if ( !result ) throw -3;
1951 //
1952 row = result->Next();
1953 //
1954 if ( !row ) throw -3;
1955 idtimesync = (UInt_t)atoll(row->GetField(0));
1956 };
1957
1958 delete row;
1959 delete result;
1960
1961 // ----------------------
1962 // insert root file
1963 // ----------------------
1964
1965 GL_ROOT glroot = GL_ROOT();
1966
1967 glroot.ID_RAW = GetID_RAW();
1968 glroot.ID_TIMESYNC = idtimesync;
1969 if ( STATIC ){
1970 glroot.PATH = GetRootPath();
1971 } else {
1972 if ( KEEPENV ){
1973 glroot.PATH = gSystem->DirName(filerootname.Data());
1974 } else {
1975 glroot.PATH = "$PAM_L0";
1976 };
1977 };
1978 glroot.NAME = GetRootFile();
1979
1980 if ( insertPamelaRootFile(&glroot) )return 1;
1981
1982 SetID_ROOT(glroot.ID);
1983
1984
1985 return (0);
1986 }
1987 /**
1988 * Insert all the new rows into GL_ROOT.
1989 * The raw file indicates in the parameters should be already been stored in the database.
1990 */
1991 Int_t PamelaDBOperations::insertPamelaRootFile(GL_ROOT *glroot){
1992 stringstream oss;
1993 TSQLResult *result = 0;
1994 TSQLRow *row = 0;
1995 //
1996 //
1997 oss.str("");
1998 oss << "INSERT INTO GL_ROOT (ID_RAW, ID_TIMESYNC,PATH, NAME) VALUES ('"
1999 << glroot->ID_RAW << "', '" << glroot->ID_TIMESYNC << "', '" << glroot->PATH << "', '" << glroot->NAME << "')";
2000 //
2001 if ( debug ) printf("%s \n",oss.str().c_str());
2002 if (conn->Query(oss.str().c_str()) == 0) throw -4;
2003 //
2004 delete result;
2005 //
2006 oss.str("");
2007 // oss << "SELECT ID FROM GL_ROOT WHERE ID_RAW=" << this->GetID_RAW() << ";";
2008 oss << "SELECT ID FROM GL_ROOT WHERE PATH='" << glroot->PATH << "' and NAME='"<< glroot->NAME <<"';";
2009 //
2010 if ( debug ) printf("%s \n",oss.str().c_str());
2011 result = conn->Query(oss.str().c_str());
2012 if ( !result ) throw -12;
2013 row = result->Next();
2014 if ( !row ) throw -3;
2015
2016 glroot->ID = (UInt_t)atoll(row->GetField(0));
2017
2018 if ( debug ) printf(" The ID of the ROOT file is %u \n",glroot->ID);
2019 //
2020 delete result;
2021 //
2022 return(0);
2023 }
2024
2025 /**
2026 * Assign the BOOT_NUMBER to the raw file.
2027 */
2028 Int_t PamelaDBOperations::assignBOOT_NUMBER(){
2029 Bool_t found = false;
2030 UInt_t idRaw = 0;
2031 UInt_t bn = 0;
2032 stringstream oss;
2033 TSQLResult *result = 0;
2034 TSQLRow *row = 0;
2035 if ( chewbacca ){
2036 if ( chboot == 1 ){
2037 // not found!
2038 found = false;
2039 } else {
2040 found = true;
2041 this->SetBOOTnumber(chboot);
2042 };
2043 } else {
2044 oss.str("");
2045 if ( STATIC ){
2046 oss << "SELECT ID, BOOT_NUMBER FROM GL_RAW WHERE "
2047 << " PATH = '" << this->GetRawPath().Data() << "' AND "
2048 << " NAME = '" << this->GetRawFile().Data() << "' ";
2049 } else {
2050 oss << "SELECT ID, BOOT_NUMBER FROM GL_RAW WHERE "
2051 << " PATH = '$PAM_RAW' AND "
2052 << " NAME = '" << this->GetRawFile().Data() << "' ";
2053 };
2054 result = conn->Query(oss.str().c_str());
2055 //
2056 if ( !result ) throw -4;;
2057 row = result->Next();
2058 if ( !row ) return(16);
2059 if ( row->GetField(1) ){
2060 this->SetBOOTnumber((UInt_t)atoll(row->GetField(1)));
2061 return(1);
2062 };
2063 if ( !row->GetField(0) ) throw -26;
2064 //
2065 idRaw = (UInt_t)atoll(row->GetField(0));
2066 //
2067 //
2068 //
2069 TTree *trDumpEv = 0;
2070 trDumpEv = (TTree*)file->Get("VarDump");
2071 if ( !trDumpEv || trDumpEv->IsZombie() ) throw -20;
2072 //
2073 VarDumpEvent *vde = 0;
2074 VarDumpRecord *vdr = 0;
2075 //
2076 trDumpEv->SetBranchAddress("VarDump", &vde);
2077 if ( trDumpEv->GetEntries() > 0 ){
2078 found = false;
2079 for ( Int_t i = 0; i < trDumpEv->GetEntries(); i++){
2080 trDumpEv->GetEntry(i);
2081 // vde->Records->GetEntries();
2082 if ( vde->Records->GetEntries()>5 ){
2083 found = true;
2084 goto fill;
2085 };
2086 };
2087 fill:
2088 if ( found ){
2089 //
2090 vdr = (VarDumpRecord*)vde->Records->At(6);
2091 //
2092 this->SetBOOTnumber((Int_t)vdr->VAR_VALUE);
2093 //
2094 } else {
2095 if ( !this->GetBOOTnumber() && !this->AutoBoot()) return(4);
2096 };
2097 } else {
2098 if ( !this->GetBOOTnumber() && !this->AutoBoot()) return(2);
2099 };
2100 //
2101 };
2102 //
2103 Bool_t afound = false;
2104 if ( !found && this->AutoBoot()){
2105 afound = true;
2106 //
2107 // Search for other files with similar timesync
2108 //
2109 if ( IsDebug() ) printf(" tsync %u obt0 %u \n",tsync,obt0);
2110 UInt_t upperts = tsync-(obt0/1000)+5;
2111 UInt_t lowerts = tsync-(obt0/1000)-5;
2112 if ( chewbacca ){
2113 oss.str("");
2114 oss << "select BOOT_NUMBER from ROOT_TABLE where LAST_TIME_SYNC_INFO-(OBT_TIME_SYNC)<"
2115 << upperts
2116 << " AND LAST_TIME_SYNC_INFO-(OBT_TIME_SYNC)>"
2117 << lowerts
2118 << " AND BOOT_NUMBER>1;";
2119 } else {
2120 oss.str("");
2121 oss << "select GL_RAW.BOOT_NUMBER from GL_TIMESYNC LEFT JOIN GL_RAW ON GL_RAW.ID = GL_TIMESYNC.ID_RAW where TIMESYNC-(OBT0/1000)<"
2122 << upperts
2123 << " AND TIMESYNC-(OBT0/1000)>"
2124 << lowerts
2125 << " AND GL_RAW.BOOT_NUMBER>0 GROUP BY GL_TIMESYNC.OBT0;";
2126 };
2127 result = conn->Query(oss.str().c_str());
2128 if ( IsDebug() && !chewbacca ) printf(" Query the GL_TIMESYNC table to find boot number:\n %s \n",oss.str().c_str());
2129 if ( IsDebug() && chewbacca ) printf(" Query the ROOT_TABLE table to find boot number:\n %s \n",oss.str().c_str());
2130 //
2131 if ( !result ) throw -4;;
2132 found = true;
2133 if ( result->GetRowCount()<3 ){
2134 if ( IsDebug() ) printf(" AGH! no results!\n");
2135 found = false;
2136 } else {
2137 row = result->Next();
2138 bn = (UInt_t)atoll(row->GetField(0));
2139 for ( Int_t r=1; r<result->GetRowCount() ;r++){
2140 if ( !row ) throw -4;
2141 if ( IsDebug() ) printf(" BOOT number is %s \n",row->GetField(0));
2142 if ( bn != (UInt_t)atoll(row->GetField(0)) ){
2143 if ( IsDebug() ) printf(" AGH! bn = %u here instead %u \n",bn,(UInt_t)atoll(row->GetField(0)));
2144 found = false;
2145 };
2146 row = result->Next();
2147 };
2148 };
2149 };
2150 //
2151 Int_t sgn = 0;
2152 //
2153 if ( !found && !BOOTNO ){
2154 throw -29;
2155 } else {
2156 if ( afound ){
2157 this->SetBOOTnumber(bn);
2158 sgn = 8;
2159 };
2160 };
2161 //
2162 if ( !chewbacca ){
2163 oss.str("");
2164 oss << " UPDATE GL_RAW "
2165 << " SET GL_RAW.BOOT_NUMBER = '" << dec << this->GetBOOTnumber() << "'"
2166 << " WHERE GL_RAW.ID = '" << idRaw << "'";
2167 conn->Query(oss.str().c_str());
2168 };
2169 //
2170 delete result;
2171 return(sgn);
2172 };
2173
2174 /**
2175 * Scan runtrailer packet, fill the GL_RUN table and
2176 * check for missing and truncated runs
2177 */
2178 Int_t PamelaDBOperations::insertPamelaRUN(){
2179 Int_t signal = 0;
2180 //
2181 stringstream oss;
2182 oss.str("");
2183 //
2184 // signal = this->SetUpperLimits();
2185
2186 //
2187 // loop on runheader and runtrailer events
2188 //
2189 TTree *rh=(TTree*)file->Get("RunHeader");
2190 if ( !rh || rh->IsZombie() ) throw -17;
2191 TTree *rt=(TTree*)file->Get("RunTrailer");
2192 if ( !rt || rt->IsZombie() ) throw -18;
2193 //
2194 PacketType *pctp=0;
2195 EventCounter *cod=0;
2196 //
2197 rh->SetBranchAddress("RunHeader", &runh);
2198 rh->SetBranchAddress("Header", &ehh);
2199 //
2200 rt->SetBranchAddress("RunTrailer", &runt);
2201 rt->SetBranchAddress("Header", &eht);
2202 //
2203 TTree *T = (TTree*)file->Get("Physics");
2204 if ( !T || T->IsZombie() ) throw -16;
2205 EventHeader *eh = 0;
2206 T->SetBranchAddress("Header", &eh);
2207 //
2208 if ( !(rh->GetEntries()) && !(rt->GetEntries()) && !(T->GetEntries()) ) return(16);
2209 //
2210 UInt_t obtt = 0;
2211 UInt_t obth = 0;
2212 UInt_t pktt = 0;
2213 UInt_t pkth = 0;
2214 Int_t pth = -1;
2215 Int_t ptht = -1;
2216 Int_t evbeft = 0;
2217 Int_t evbefh = 0;
2218 UInt_t tcod;
2219 //
2220 // no runtrailers in the file!
2221 //
2222 if ( !rtev ){
2223 if ( !rhev ){
2224 if ( IsDebug() ) printf(" No runheaders nor runtrailers!! \n");
2225 if ( !(upperentry-chminentry) ){
2226 if ( IsDebug() ) printf(" No physics events nor runs in the file \n"); // di nuovo potrebbe esserci un runtrailer senza eventi (riempimento MM)
2227 // throw -8;
2228 return 0; // one could check if there is any calibration no need to exit with error
2229 } else {
2230 this->HandleRunFragments(true,true,chminentry,upperentry); // no runtrailers ma potrebbe esserci un runheader ora...
2231 };
2232 } else {
2233 //
2234 // we have runheaders but not runtrailers!
2235 //
2236 if ( debug ) printf(" We have runheaders (%i) but not runtrailers (%i) ! \n",rhev,rtev);
2237 for ( pth=0; pth < rhev; pth++ ){
2238 rh->GetEntry(pth);
2239 phh = ehh->GetPscuHeader();
2240 pkth = phh->GetCounter();
2241 obth = phh->GetOrbitalTime();
2242 if ( PKT(pkth) >= PKT(pktfirst) && PKT(pkth) <= upperpkt ){
2243 cod = ehh->GetCounter();
2244 tcod = (UInt_t)cod->Get(pctp->Physics);
2245 evbefh = TMath::Max(chminentry,tcod);
2246 // if ( (UInt_t)evbefh == upperentry ) evbefh = upperentry + 1; // this does not work due to the Counter bug in chewbacca
2247 if ( (UInt_t)evbefh == upperentry || !upperentry ) evbefh = upperentry + 1;
2248 //
2249 if ( debug ) printf(" evbefh %i upperentry %u \n",evbefh,upperentry);
2250 //
2251 this->HandleRunFragments(false,true,evbefh,upperentry);
2252 //
2253 };
2254 };
2255 //
2256 };
2257 //
2258 } else {
2259 //
2260 Int_t conptt = -1;
2261 for (Int_t ptt=0; ptt<rtev; ptt++){
2262 //
2263 rt->GetEntry(ptt);
2264 pht = eht->GetPscuHeader();
2265 pktt = pht->GetCounter();
2266 obtt = pht->GetOrbitalTime();
2267 //
2268 if ( PKT(pktt) >= PKT(pktfirst) && PKT(pktt) <= upperpkt ){
2269 //
2270 conptt++;
2271 //
2272 cod = eht->GetCounter();
2273 ptht = cod->Get(pctp->RunHeader) - 1;
2274 // evbeft = cod->Get(pctp->Physics);
2275 tcod = (UInt_t)cod->Get(pctp->Physics);
2276 if ( !tcod ) tcod = 1; // IS A BUG SINCE RUNS WITH ZERO EVENTS WILL LOOK LIKE RUNS WITH ONE EVENT
2277 evbeft = TMath::Min(upperentry,(tcod-1));
2278 if ( debug ) printf(" Loop in runtrailers, evbeft is %u upperentry %u cod->getetc %u \n",evbeft,upperentry,cod->Get(pctp->Physics));
2279 //
2280 // if ( !conptt && !(ptht+1) ){ // here we assume ptht+1 = 0 at the beginning of the interval that could not be true if the interval start from middle file... it must be equal to the number of RH before the interval that is not counted anywhere
2281 if ( !conptt && (ptht+1) == nrhbef ){
2282 //
2283 if ( IsDebug() ) printf(" Piece of run at the beginning of the file %i %i %u \n",ptht,pth,ptt);
2284 //
2285 this->HandleRunFragments(true,false,chminentry,(evbeft));
2286 //
2287 pth = ptht; // ??
2288 //
2289 } else if ( pth == ptht ){
2290 //
2291 if ( IsDebug() ) printf(" Missing header %i %i %u\n",ptht,pth,ptt);
2292 //
2293 if ( (ptt-1) < 0 ) throw -15; // should never arrive here!
2294 rt->GetEntry(ptt-1);
2295 cod = eht->GetCounter();
2296 tcod = (UInt_t)cod->Get(pctp->Physics);
2297 evbefh = TMath::Max(chminentry,tcod);
2298 //evbefh = cod->Get(pctp->Physics);
2299 rt->GetEntry(ptt);
2300 pht = eht->GetPscuHeader();
2301 //
2302 if ( IsDebug() ) printf(" Try to find the beginning of a run which has only the runtrailer %i %i %u \n",ptht,pth,ptt);
2303 if ( IsDebug() ) printf(" ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %u %u %u \n",pkth,obth,obtt);
2304 //
2305 this->HandleMissingHoT(true,false,evbefh,(evbeft));
2306 //
2307 } else {
2308 //
2309 rh->GetEntry(ptht);
2310 phh = ehh->GetPscuHeader();
2311 pkth = phh->GetCounter();
2312 obth = phh->GetOrbitalTime();
2313 cod = ehh->GetCounter();
2314 tcod = (UInt_t)cod->Get(pctp->Physics);
2315 if ( !tcod ) tcod = 1; // IS A BUG SINCE RUNS WITH ZERO EVENTS WILL LOOK LIKE RUNS WITH ONE EVENT
2316 evbefh = TMath::Max(chminentry,(tcod-1));
2317 //
2318 if ( PKT(pkth) >= PKT(pktfirst) && PKT(pkth) <= upperpkt ){
2319 if ( IsDebug() ) printf(" Could be a good run, we have a runheader followed by a runtrailer %i %i %u\n",ptht,pth,ptt);
2320 //
2321 // evbefh = cod->Get(pctp->Physics);
2322 if ( IsDebug() ) printf(" ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %u %u %u \n",pkth,obth,obtt);
2323 //
2324 // handle this run
2325 //
2326 this->HandleRun();
2327 //
2328 //
2329 if ( debug ) printf(" Standard case, evbefh is %u chminentry %u cod->getetc %u \n",evbefh,chminentry,cod->Get(pctp->Physics));
2330 //
2331 } else {
2332 // missing header in the considered interval!
2333 if ( debug ) printf(" Missing header in the considered interval \n");
2334 this->HandleRunFragments(true,false,evbefh,evbeft);
2335 };
2336 //
2337 if ( PKT(pkth)>PKT(pktfirst) && OBT(obth)>OBT(obtfirst) && PKT(pkth)<=(upperpkt) && !conptt ){
2338 //
2339 if ( IsDebug() ) printf(" Piece of run at the beginning of the file WITH NO RUNTRAILER evbefh = %u \n",evbefh);
2340 //
2341 if ( evbefh == 0 ) {
2342 //
2343 if ( !chewbacca ){
2344 signal = 8;
2345 if ( IsDebug() ) printf(" Not supported yet: run with no events, no runtrailer, no runheader \n");
2346 } else {
2347 if ( debug ) printf(" The file does not start with a physics packet, no problem continue \n");
2348 };
2349 //
2350 } else {
2351 //
2352 this->HandleRunFragments(true,true,chminentry,(evbefh));
2353 //
2354 // what about pth=ptht-1
2355 };
2356 };
2357 //
2358 //
2359 if ( (ptht - pth) > 1 ){
2360 //
2361 if ( IsDebug() ) printf(" Missing runtrailers! \n");
2362 if ( IsDebug() ) printf(" Attention there is a jump in the runheader counter %i %i %u \n",ptht,pth,ptt);
2363 // is not the consecutive header
2364 while ( pth != ptht ){
2365 //
2366 // treat the header(s) in the middle and then go to the next header, repeat until you reach the correct header.
2367 //
2368 pth++;
2369 //
2370 rh->GetEntry(pth+1);
2371 phh = ehh->GetPscuHeader();
2372 pktt = phh->GetCounter();
2373 obtt = phh->GetOrbitalTime();
2374 cod = ehh->GetCounter();
2375 // evbeft = cod->Get(pctp->Physics);
2376 tcod = (UInt_t)cod->Get(pctp->Physics);
2377 if ( !tcod ) tcod = 1; // IS A BUG SINCE RUNS WITH ZERO EVENTS WILL LOOK LIKE RUNS WITH ONE EVENT
2378 evbeft = TMath::Min(upperentry,(tcod-1));
2379 rh->GetEntry(pth);
2380 phh = ehh->GetPscuHeader();
2381 cod = ehh->GetCounter();
2382 pkth = phh->GetCounter();
2383 obth = phh->GetOrbitalTime();
2384 //evbefh = cod->Get(pctp->Physics);
2385 tcod = (UInt_t)cod->Get(pctp->Physics);
2386 evbefh = TMath::Max(chminentry,tcod);
2387 //
2388 if ( PKT(pkth) >= PKT(pktfirst) && PKT(pkth) <= upperpkt && pth != ptht ){
2389 //
2390 if ( IsDebug() ) printf(" Try to find the end of a run which has only the runheader %i %i %u \n",ptht,pth,ptt);
2391 if ( IsDebug() ) printf(" ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %u %u %u \n",pkth,obth,obtt);
2392 //
2393 this->HandleMissingHoT(false,true,evbefh,evbeft);
2394 //
2395 };
2396 };
2397 //
2398 } else if ( !(ptht - pth) ){
2399 //
2400 if ( IsDebug() ) printf(" Missing runheader! \n");
2401 if ( IsDebug() ) printf(" Attention! the runheader counter did not changed %i %i %u \n",ptht,pth,ptt);
2402 if ( IsDebug() ) printf(" The run should have already been handled by HandleRun() \n");
2403 if ( PEDANTIC ) throw -87;
2404 //
2405 } else {
2406 //
2407 // go on with next header
2408 //
2409 pth = ptht;
2410 };
2411 //
2412 };
2413 //
2414 // if ( ptt+1 == rtev){
2415 if ( conptt+1 == nrtev ){
2416 // if ( conptt+1 == (nrtev+nrtbef )){
2417 if ( IsDebug() ) printf(" >>>>>>>>>>> %i %u %i %u \n",ptht,rhev,nrtev,conptt);
2418 ptht++;
2419 if ( ptht < rhev ){
2420 rh->GetEntry(ptht);
2421 //pth++;
2422 //if ( pth < rhev ){
2423 //rh->GetEntry(pth);
2424 phh = ehh->GetPscuHeader();
2425 pkth = phh->GetCounter();
2426 obth = phh->GetOrbitalTime();
2427 cod = ehh->GetCounter();
2428 tcod = (UInt_t)cod->Get(pctp->Physics);
2429 evbefh = TMath::Max(chminentry,tcod);
2430 if ( PKT(pkth) >= PKT(pktfirst) && PKT(pkth) <= upperpkt ){
2431 // evbefh = cod->Get(pctp->Physics);
2432 if ( IsDebug() ) printf(" Piece of run at the end of file %u %u %u \n",pkth,obth,obtt);
2433 if ( IsDebug() ) printf(" ''''''''''''''''''''''''''''''' %i %i %u \n",ptht,pth,ptt);
2434 if ( IsDebug() ) printf(" ''''''''''''''''''''''''''''''' %u \n",rhev);
2435 if ( IsDebug() ) printf(" evbefh %u upperentry %u \n",(UInt_t)evbefh,upperentry);
2436 //
2437 this->HandleRunFragments(false,true,evbefh,upperentry);
2438 //
2439 };
2440 } else {
2441 //
2442 // check if we have a fragment with no header
2443 //
2444 if ( (UInt_t)evbeft < upperentry-1 && upperentry>0 ){
2445 if ( IsDebug() ) printf(" Piece of run at the end of the file with NO RUNHEADER! evbeft %u upperentry-1 %u \n",(UInt_t)evbeft,upperentry-1);
2446 //
2447 // if ( (ptt-1) < 0 ) throw -15; // should never arrive here!
2448 if ( (rtev-1) < 0 || ptt < 0 ) throw -15; // should never arrive here!
2449 // rt->GetEntry(ptt-1);
2450 rt->GetEntry(rtev-1);
2451 cod = eht->GetCounter();
2452 tcod = (UInt_t)cod->Get(pctp->Physics)+1;
2453 evbefh = TMath::Max(chminentry,tcod);
2454 // evbefh = cod->Get(pctp->Physics);
2455 rt->GetEntry(ptt);
2456 pht = eht->GetPscuHeader();
2457 this->HandleRunFragments(true,true,evbefh,upperentry);
2458 };
2459 };
2460 };
2461 //
2462 };
2463 };
2464 };
2465 //
2466 return(signal);
2467 };
2468
2469 /**
2470 *
2471 * Check if the run has already been inserted
2472 *
2473 */
2474 Bool_t PamelaDBOperations::IsRunAlreadyInserted(){
2475 //
2476 TSQLResult *result = 0;
2477 TSQLRow *row = 0;
2478 //
2479 stringstream oss;
2480 oss.str("");
2481 //
2482 // the where clause is of the type: boot_number = _our_boot && (
2483 // ( runhead_time >= (_our_runhead_time-10) && runtrail_time <= (_our_runtrail_time+10) &&
2484 // ( runhead_obt >= _our_runheadobt || runhead_pkt >= _our_runheadpkt ) &&
2485 // ( runtrail_obt >= _our_runtrailobt || runtrail_pkt >= _our_runtrailpkt ) )
2486 // ||
2487 // ( runhead_time <= _our_runhead_time && runtrail_time >= _our_runtrail_time &&
2488 // ( runhead_obt <= _our_runheadobt || runhead_pkt <= _our_runheadpkt ) &&
2489 // ( runtrail_obt <= _our_runtrailobt || runtrail_pkt <= _our_runtrailpkt ) )
2490 // ||
2491 // ( runhead_time = _our_runhead_time && runtrail_time = _our_runtrail_time && nevents > 100 )
2492 // )
2493 // ||
2494 // ( runhead_time = _our_runhead_time && runtrail_time > _our_runtrail_time && nevents > 100 )
2495 // )
2496 // ||
2497 // ( runhead_time < _our_runhead_time && runtrail_time = _our_runtrail_time && nevents > 100 )
2498 // )
2499 //
2500 oss << " SELECT ID,NEVENTS,TRK_CALIB_USED,PKT_COUNTER FROM GL_RUN WHERE "
2501 << " BOOT_NUMBER=" << this->GetBOOTnumber() << " AND ("
2502 << " (RUNHEADER_TIME>=" << (UInt_t)(glrun->GetRUNHEADER_TIME()-10) << " AND "
2503 << " RUNTRAILER_TIME<=" << (UInt_t)(glrun->GetRUNTRAILER_TIME()+10) << " AND ("
2504 << " RUNHEADER_OBT>=" << glrun->GetRUNHEADER_OBT() << " OR "
2505 << " RUNHEADER_PKT>=" << glrun->GetRUNHEADER_PKT() << ") AND ("
2506 << " RUNTRAILER_OBT<=" << glrun->GetRUNTRAILER_OBT() << " OR "
2507 << " RUNTRAILER_PKT<=" << glrun->GetRUNTRAILER_PKT() << ") ) OR "
2508 << " (RUNHEADER_TIME<=" << (UInt_t)glrun->GetRUNHEADER_TIME() << " AND "
2509 << " RUNTRAILER_TIME>=" << (UInt_t)glrun->GetRUNTRAILER_TIME() <<" AND ("
2510 << " RUNHEADER_OBT<=" << glrun->GetRUNHEADER_OBT() << " OR "
2511 << " RUNHEADER_PKT<=" << glrun->GetRUNHEADER_PKT() << ") AND ("
2512 << " RUNTRAILER_OBT>=" << glrun->GetRUNTRAILER_OBT() << " OR ";
2513 if ( glrun->GetNEVENTS() < 100 ){
2514 oss<<" RUNTRAILER_PKT>=" << glrun->GetRUNTRAILER_PKT() << "))); ";
2515 } else {
2516 oss << " RUNTRAILER_PKT>=" << glrun->GetRUNTRAILER_PKT() << ")) OR "
2517 << " (RUNHEADER_TIME=" << (UInt_t)glrun->GetRUNHEADER_TIME() << " AND " // these two lines in a certain way disable the patch below...
2518 << " RUNTRAILER_TIME=" << (UInt_t)glrun->GetRUNTRAILER_TIME() <<" AND NEVENTS>100) OR" //
2519 << " (RUNHEADER_TIME=" << (UInt_t)glrun->GetRUNHEADER_TIME() << " AND " //
2520 << " RUNTRAILER_TIME>" << (UInt_t)glrun->GetRUNTRAILER_TIME() <<" AND NEVENTS>100) OR" //
2521 << " (RUNHEADER_TIME<" << (UInt_t)glrun->GetRUNHEADER_TIME() << " AND " //
2522 << " RUNTRAILER_TIME=" << (UInt_t)glrun->GetRUNTRAILER_TIME() <<" AND NEVENTS>100)" //
2523 << " );";
2524 };
2525 //
2526 if ( IsDebug() ) printf(" THIS RUN: RUNHEADER_OBT %u RUNTRAILER_OBT %u RUNHEADER_PKT %u RUNTRAILER_PKT %u NEVENTS %u\n", glrun->GetRUNHEADER_OBT(),glrun->GetRUNTRAILER_OBT(),glrun->GetRUNHEADER_PKT(),glrun->GetRUNTRAILER_PKT(),glrun->GetNEVENTS());
2527 if ( IsDebug() ) printf(" check if run has been inserted: query is \n %s \n",oss.str().c_str());
2528 result = conn->Query(oss.str().c_str());
2529 //
2530 if ( !result ) throw -4;
2531 //
2532 row = result->Next();
2533 //
2534 if ( !row ){
2535 if ( IsDebug() ) printf(" The run is new \n");
2536 if ( IsDebug() ) printf(" -> fill the DB \n");
2537 return(false); // the file has not been inserted in the DB, go on.
2538 };
2539 //
2540 Bool_t signal = true;
2541 //
2542 while ( row != NULL ){
2543 if ( IsDebug() ) printf(" A run exists with runheader and runtrailer time and packets compatible with this one \n");
2544 //
2545 // the run has already been inserted
2546 //
2547 if ( signal && IsDebug() ) printf(" The run has already been inserted\n");
2548 if ( PEDANTIC ) throw -86;
2549 return(true); //<<<<<<<<<<<<<<<<<<<<<<<< patch follows, uncomment here
2550 //
2551 // PATCH!
2552 // we keep the processing run if (in order of growing importance) 1) we have the runtrailer while the old run doesn't have it 2) we have the runheader
2553 // while the old run doesn't have it 3) we have more events than the old run
2554 //
2555 if ( glrun->GetNEVENTS() > (UInt_t)atoll(row->GetField(1)) ){
2556 //
2557 if ( IsDebug() ) printf(" The new run has more events than the old one \n");
2558 glrun->DeleteRun(conn,(UInt_t)atoll(row->GetField(0)),"GL_RUN");
2559 // oss.str("");
2560 // oss << "DELETE FROM GL_RUN WHERE ID=" << row->GetField(0) <<";";
2561 // if ( IsDebug() ) printf(" delete the run entry: query is \n %s \n",oss.str().c_str());
2562 // conn->Query(oss.str().c_str());
2563 if ( signal ) signal = false;
2564 goto gonext;
2565 //
2566 } else if ( glrun->GetNEVENTS() < (UInt_t)atoll(row->GetField(1)) ){
2567 if ( IsDebug() ) printf(" The new run has less events than the old one \n");
2568 if ( IsDebug() ) printf(" The run is already inserted \n");
2569 goto gonext;
2570 };
2571 //
2572 if ( glrun->GetTRK_CALIB() && !(UInt_t)atoll(row->GetField(2)) ){
2573 //
2574 if ( IsDebug() ) printf(" The new run has the same number of events and the runheader the old one miss the runheader \n");
2575 //
2576 glrun->DeleteRun(conn,(UInt_t)atoll(row->GetField(0)),"GL_RUN");
2577 // oss.str("");
2578 // oss << "DELETE FROM GL_RUN WHERE ID=" << row->GetField(0) <<";";
2579 // if ( IsDebug() ) printf(" delete the run entry: query is \n %s \n",oss.str().c_str());
2580 // conn->Query(oss.str().c_str());
2581 //
2582 if ( signal ) signal = false;
2583 goto gonext;
2584 } else if ( !glrun->GetTRK_CALIB() && (UInt_t)atoll(row->GetField(2)) ){
2585 if ( IsDebug() ) printf(" The new run has the same number of events but miss the runheader the old has the runheader \n");
2586 if ( IsDebug() ) printf(" The run is already inserted \n");
2587 goto gonext;
2588 };
2589 //
2590 if ( glrun->GetPKT_COUNTER() && !(UInt_t)atoll(row->GetField(3)) ){
2591 //
2592 if ( IsDebug() ) printf(" The new run has the same number of events, the runheader and the runtrailer the old one miss the runtrailer \n");
2593 //
2594 glrun->DeleteRun(conn,(UInt_t)atoll(row->GetField(0)),"GL_RUN");
2595 // oss.str("");
2596 // oss << "DELETE FROM GL_RUN WHERE ID=" << row->GetField(0) <<";";
2597 // if ( IsDebug() ) printf(" delete the run entry: query is \n %s \n",oss.str().c_str());
2598 // conn->Query(oss.str().c_str());
2599 if ( signal ) signal = false;
2600 //
2601 };
2602 //
2603 gonext:
2604 // END PATCH!
2605 //
2606 row = result->Next();
2607 //
2608 };
2609 //
2610 delete result;
2611 //
2612 if ( signal && IsDebug() ) printf(" The run has already been inserted \n");
2613 if ( !signal && IsDebug() ) printf(" The run existed and has been overridden, fill the DB \n");
2614 if ( PEDANTIC ) throw -86;
2615 return(signal);
2616 };
2617
2618 /**
2619 * Handle runs which seems to be good ones.
2620 **/
2621 void PamelaDBOperations::HandleRun(){
2622 ULong64_t chkpkt = 0;
2623 ULong64_t pktt = (ULong64_t)PKT(pht->GetCounter());
2624 ULong64_t pkth = (ULong64_t)PKT(phh->GetCounter());
2625 //
2626 chkpkt = pkth + (ULong64_t)runt->PKT_COUNTER + 1ULL + 1ULL;
2627 //
2628 if ( labs(chkpkt-pktt)<2 ){
2629 //
2630 if ( IsDebug() ) printf(" check %llu pktt %llu \n",chkpkt,pktt);
2631 //
2632 // it must be a good run, fill the db
2633 //
2634 this->FillClass();
2635 //
2636 if ( !IsRunAlreadyInserted() ){
2637 glrun->SetID(this->AssignRunID());
2638 glrun->SetID_RUN_FRAG(0);
2639 glrun->Fill_GL_RUN(conn);
2640 };
2641 } else {
2642 //
2643 if ( IsDebug() ) printf(" oh no! the distance between runheader and runtrailer seems wrong: check %llu pktt %llu \n",chkpkt,pktt);
2644 if ( IsDebug() ) printf(" try to recover run(s) without runheader and runtrailer between runheader and runtrailer\n");
2645 //
2646 this->HandleSuspiciousRun();
2647 //
2648 };
2649 //
2650 //
2651 return;
2652 };
2653
2654
2655 /**
2656 * Handle run fragments at the beginning or at the end of the file
2657 **/
2658 void PamelaDBOperations::HandleRunFragments(Bool_t mishead, Bool_t mistrail, UInt_t firstev, UInt_t lastev){
2659 //
2660 UInt_t rhfirstev = firstev;
2661 UInt_t rtlastev = lastev;
2662 Bool_t found = false;
2663 Bool_t foundinrun = false;
2664 //
2665 TSQLResult *result = 0;
2666 TSQLRow *row = 0;
2667 //
2668 stringstream oss;
2669 oss.str("");
2670 //
2671 // is the piece of run good (no other packets inside)?
2672 //
2673 if ( !this->IsRunConsistent(mishead,mistrail,firstev,lastev)){
2674 //
2675 // if not, handle other pieces and continue with the first one
2676 //
2677 if ( IsDebug() ) printf("The run is not consistent, it contains non-physics packets! The run has been handled \n");
2678 //
2679 } else {
2680 //
2681 // we have now the good first piece of a run, fill the glrun object
2682 //
2683 if ( firstev != (lastev+1) ){ // could be a problem sometimes (?)
2684 if ( rhfirstev != firstev && !mishead ) mishead = true;
2685 if ( rtlastev != lastev && !mistrail ) mistrail = true;
2686 };
2687 //
2688 if ( IsDebug() ) printf(" bhere firstev is %i lastev is %i \n",firstev,lastev);
2689 this->FillClass(mishead,mistrail,firstev,lastev);
2690 if ( IsDebug() ) printf(" chere firstev is %i lastev is %i \n",firstev,lastev);
2691 //
2692 if ( IsDebug() ) printf("The run is good, is it the other piece in the GL_RUN_FRAGMENTS table?\n");
2693 if ( IsDebug() ) printf(" C THIS RUN: RUNHEADER_OBT %u RUNTRAILER_OBT %u RUNHEADER_PKT %u RUNTRAILER_PKT %u \n", glrun->GetRUNHEADER_OBT(),glrun->GetRUNTRAILER_OBT(),glrun->GetRUNHEADER_PKT(),glrun->GetRUNTRAILER_PKT());
2694 //
2695 // First of all insert the run in the fragment table...
2696 //
2697 oss.str("");
2698 oss << " SELECT ID FROM GL_RUN_FRAGMENTS WHERE "
2699 << " BOOT_NUMBER=" << this->GetBOOTnumber() << " AND ("
2700 << " (RUNHEADER_TIME>=" << (UInt_t)(glrun->GetRUNHEADER_TIME()-10) << " AND "
2701 << " RUNTRAILER_TIME<=" << (UInt_t)(glrun->GetRUNTRAILER_TIME()+10) << " AND ("
2702 << " RUNHEADER_OBT>=" << glrun->GetRUNHEADER_OBT() << " OR "
2703 << " RUNHEADER_PKT>=" << glrun->GetRUNHEADER_PKT() << ") AND ("
2704 << " RUNTRAILER_OBT<=" << glrun->GetRUNTRAILER_OBT() << " OR "
2705 << " RUNTRAILER_PKT<=" << glrun->GetRUNTRAILER_PKT() << ") ) OR "
2706 << " (RUNHEADER_TIME<=" << (UInt_t)glrun->GetRUNHEADER_TIME() << " AND "
2707 << " RUNTRAILER_TIME>=" << (UInt_t)glrun->GetRUNTRAILER_TIME() <<" AND ("
2708 << " RUNHEADER_OBT<=" << glrun->GetRUNHEADER_OBT() << " OR "
2709 << " RUNHEADER_PKT<=" << glrun->GetRUNHEADER_PKT() << ") AND ("
2710 << " RUNTRAILER_OBT>=" << glrun->GetRUNTRAILER_OBT() << " OR "
2711 << " RUNTRAILER_PKT>=" << glrun->GetRUNTRAILER_PKT() << ") ));";
2712 //
2713 if ( IsDebug() ) printf(" check if run has been inserted: query is \n %s \n",oss.str().c_str());
2714 result = conn->Query(oss.str().c_str());
2715 //
2716 if ( !result ) throw -4;
2717 //
2718 row = result->Next();
2719 //
2720 if ( !row ){
2721 //
2722 // no, insert this run in the GL_RUN_FRAGMENTS table (check if exist before!)
2723 //
2724 if ( IsDebug() ) printf(" The run is new \n");
2725 if ( IsDebug() ) printf(" -> fill the GL_RUNFRAGMENTS table \n");
2726 //
2727 glrun->SetID(this->AssignRunID());
2728 glrun->SetID_RUN_FRAG(0);
2729 glrun->Fill_GL_RUN_FRAGMENTS(conn);
2730 //
2731 } else {
2732 if ( IsDebug() ) printf(" The run is already present in the fragment table, relaxed %u \n",RELAXED);
2733 if ( !RELAXED ){
2734 if ( PEDANTIC ) throw -69;
2735 return;
2736 } else {
2737 glrun->SetID((UInt_t)atoll(row->GetField(0)));
2738 glrun->SetID_RUN_FRAG(0);
2739 };
2740 };
2741 //
2742 if ( chewbacca && mishead && mistrail ) goto justcheck;
2743 //
2744 // can we find the other piece of the run in the GL_RUN_FRAGMENTS table?
2745 //
2746 if ( mishead && ( rhfirstev == firstev || chewbacca ) ) { // look for runheader (only when at the beginning of the file, if at the end and the runh is
2747 // missing it no way we can found a piece in the frag table
2748 //
2749 oss.str("");
2750 oss << " SELECT ID,TRK_CALIB_USED,RUNTRAILER_TIME,RUNTRAILER_OBT,RUNHEADER_PKT,RUNTRAILER_PKT FROM GL_RUN_FRAGMENTS WHERE "
2751 << " BOOT_NUMBER=" << this->GetBOOTnumber() << " AND "
2752 << " RUNHEADER_TIME <= " << (UInt_t)glrun->GetRUNHEADER_TIME() << " AND "
2753 << " ID != " << glrun->ID
2754 << " ORDER BY RUNHEADER_TIME DESC LIMIT 1;"; // DESC NOT ASC!!
2755 //
2756 if ( IsDebug() ) printf(" look for runheader in the fragments table: query is \n %s \n",oss.str().c_str());
2757 result = conn->Query(oss.str().c_str());
2758 //
2759 if ( !result ) throw -4;
2760 //
2761 row = result->Next();
2762 //
2763 if ( !row && NoFrag() ){
2764 //
2765 oss.str("");
2766 oss << " SELECT ID,TRK_CALIB_USED,RUNTRAILER_TIME,RUNTRAILER_OBT,RUNHEADER_PKT,RUNTRAILER_PKT FROM GL_RUN WHERE "
2767 << " BOOT_NUMBER=" << this->GetBOOTnumber() << " AND "
2768 << " RUNHEADER_TIME <= " << (UInt_t)glrun->GetRUNHEADER_TIME() << " AND "
2769 << " ID != " << glrun->ID
2770 << " AND ID=ID_RUN_FRAG ORDER BY RUNHEADER_TIME DESC LIMIT 1;"; // DESC NOT ASC!!
2771 //
2772 if ( IsDebug() ) printf(" look for runheader in the GL_RUN table: query is \n %s \n",oss.str().c_str());
2773 result = conn->Query(oss.str().c_str());
2774 //
2775 if ( !result ) throw -4;
2776 //
2777 foundinrun = true;
2778 //
2779 row = result->Next();
2780 //
2781 };
2782 //
2783 if ( !row ){
2784 if ( IsDebug() ) printf(" the corresponding piece has NOT been found \n");
2785 found = false;
2786 } else {
2787 //
2788 found = false; // default value
2789 //
2790 if ( IsDebug() ) printf(" A Found a possible candidate, checking if it is the good one... \n");
2791 //
2792 // if we have both runheader and runtrailer we can check with pkt_counter:
2793 //
2794 if ( !mistrail && (UInt_t)atoll(row->GetField(1)) != 0 ){
2795 ULong64_t chkpkt = 0;
2796 ULong64_t pktt = (ULong64_t)PKT(glrun->GetRUNTRAILER_PKT());
2797 ULong64_t pkth = (ULong64_t)PKT((UInt_t)atoll(row->GetField(4)));
2798 //
2799 chkpkt = pkth + (ULong64_t)glrun->GetPKT_COUNTER() + 1ULL + 1ULL;
2800 //
2801 if ( labs(chkpkt-pktt)<2 ){
2802 //
2803 if ( IsDebug() ) printf(" FOUND!!! check %llu pktt %llu \n",chkpkt,pktt);
2804 //
2805 found = true;
2806 if ( IsDebug() ) printf(" where firstev is %i lastev is %i \n",firstev,lastev);
2807 //
2808 } else {
2809 //
2810 if ( IsDebug() ) printf(" The check with pkt counter failed: check %llu pktt %llu \n",chkpkt,pktt);
2811 //
2812 found = false;
2813 //
2814 };
2815 };
2816 if ( !found && chewbacca ) goto justcheck;
2817 if ( !found ){
2818 //
2819 // if we arrive here we were not able to decide if the two pieces matches using only the pkt counter information, we must check times and obts
2820 //
2821 ULong64_t chkpkt1 = 0;
2822 ULong64_t orunh1 = (ULong64_t)PKT(glrun->GetRUNHEADER_PKT());
2823 ULong64_t dbrunt1 = (ULong64_t)PKT((UInt_t)atoll(row->GetField(5)));
2824 chkpkt1 = labs(orunh1-dbrunt1);
2825 //
2826 ULong64_t chkpkt2 = 0;
2827 ULong64_t orunh2 = (ULong64_t)OBT(glrun->GetRUNHEADER_OBT());
2828 ULong64_t dbrunt2 = (ULong64_t)OBT((UInt_t)atoll(row->GetField(3)));
2829 chkpkt2 = labs(orunh2-dbrunt2);
2830 //
2831 ULong64_t chkpkt3 = 0;
2832 ULong64_t orunh3 = (ULong64_t)(glrun->GetRUNHEADER_TIME());
2833 ULong64_t dbrunt3 = (ULong64_t)((UInt_t)atoll(row->GetField(2)));
2834 chkpkt3 = labs(orunh3-dbrunt3);
2835 //
2836 if ( (chkpkt1 < 200 || chkpkt2 < 20000) && chkpkt3 < 20 ){
2837 // if ( chkpkt1 < 100 && chkpkt2 < 30000 && chkpkt3 < 30 ){
2838 //
2839 if ( IsDebug() ) printf(" FOUND!!! check1 %llu<200 cechk2 %llu<20000 check3 %llu<20 \n",chkpkt1,chkpkt2,chkpkt3);
2840 //
2841 found = true;
2842 //
2843 } else {
2844 //
2845 if ( IsDebug() ) printf(" Check failed: check1 %llu<200? cechk2 %llu<20000? check3 %llu<20? \n",chkpkt1,chkpkt2,chkpkt3);
2846 //
2847 found = false;
2848 //
2849 };
2850 };
2851 };
2852 //
2853 if ( found ){
2854 //
2855 // we have found the missing piece, glue the two together, merge the informations, fill the gl_run table (check first runs do not exists), delete entry in frag table
2856 //
2857 if ( IsDebug() ) printf(" now you can handle the piece of the run \n ");
2858 //
2859 if ( foundinrun ){
2860 glrun->RestoreRun(conn,(UInt_t)atoll(row->GetField(0)),"GL_RUN_FRAGMENTS");
2861 glrun->DeleteRun(conn,(UInt_t)atoll(row->GetField(0)),"GL_RUN");
2862 };
2863 //
2864 GL_RUN *glrun1 = new GL_RUN();
2865 //
2866 // UInt_t idfrag = (UInt_t)atoll(row->GetField(0));
2867 //
2868 oss.str("");
2869 oss << " ID="<<row->GetField(0)<<";";
2870 //
2871 glrun1->Query_GL_RUN_FRAGMENTS(oss.str().c_str(),conn); // here we have runheader infos
2872 if ( IsDebug() ) printf(" there firstev is %i lastev is %i \n",firstev,lastev);
2873 //
2874 // merge infos
2875 //
2876 UInt_t apkt = PKT(glrun1->GetRUNTRAILER_PKT());
2877 ULong64_t aobt = OBT(glrun1->GetRUNTRAILER_OBT());
2878 UInt_t bpkt = PKT(glrun->GetRUNHEADER_PKT());
2879 ULong64_t bobt = OBT(glrun->GetRUNHEADER_OBT());
2880 if ( IsDebug() ) printf(" Check overlapping events: %u %u %llu %llu firstev is %i\n",apkt,bpkt,aobt,bobt,firstev);
2881 TTree *T= 0;
2882 T = (TTree*)file->Get("Physics");
2883 if ( !T || T->IsZombie() ) throw -16;
2884 EventHeader *eh = 0;
2885 PscuHeader *ph = 0;
2886 T->SetBranchAddress("Header", &eh);
2887 while ( apkt > bpkt && aobt > bobt && firstev < lastev ){
2888 T->GetEntry(firstev);
2889 ph = eh->GetPscuHeader();
2890 bpkt = PKT(ph->GetCounter());
2891 bobt = OBT(ph->GetOrbitalTime());
2892 firstev++;
2893 if ( PEDANTIC ) throw -71;
2894 };
2895 if ( IsDebug() ) printf(" Check overlapping events done: %u %u %llu %llu firstev is %i\n",apkt,bpkt,aobt,bobt,firstev);
2896 //
2897 glrun1->SetPKT_COUNTER(glrun->GetPKT_COUNTER());
2898 glrun1->SetPKT_READY_COUNTER(glrun->GetPKT_READY_COUNTER());
2899 glrun1->SetRUNTRAILER_TIME(glrun->GetRUNTRAILER_TIME());
2900 glrun1->SetRUNTRAILER_OBT(glrun->GetRUNTRAILER_OBT());
2901 glrun1->SetRUNTRAILER_PKT(glrun->GetRUNTRAILER_PKT());
2902 //
2903 if ( IsDebug() ) printf(" here firstev is %i lastev is %i \n",firstev,lastev);
2904 //
2905 glrun->SetEV_FROM(firstev);
2906 glrun->SetNEVENTS(lastev-firstev+1);
2907 //
2908 glrun->SetRUNHEADER_TIME(glrun1->GetRUNHEADER_TIME());
2909 glrun->SetRUNHEADER_OBT(glrun1->GetRUNHEADER_OBT());
2910 glrun->SetRUNHEADER_PKT(glrun1->GetRUNHEADER_PKT());
2911 glrun->SetCOMPILATIONTIMESTAMP(glrun1->GetCOMPILATIONTIMESTAMP());
2912 glrun->SetFAV_WRK_SCHEDULE(glrun1->GetFAV_WRK_SCHEDULE());
2913 glrun->SetEFF_WRK_SCHEDULE(glrun1->GetEFF_WRK_SCHEDULE());
2914 glrun->SetPRH_VAR_TRG_MODE_A(glrun1->GetPRH_VAR_TRG_MODE_A());
2915 glrun->SetPRH_VAR_TRG_MODE_B(glrun1->GetPRH_VAR_TRG_MODE_B());
2916 glrun->SetACQ_BUILD_INFO(glrun1->GetACQ_BUILD_INFO());
2917 glrun->SetACQ_VAR_INFO(glrun1->GetACQ_VAR_INFO());
2918 glrun->SetRM_ACQ_AFTER_CALIB(glrun1->GetRM_ACQ_AFTER_CALIB());
2919 glrun->SetRM_ACQ_SETTING_MODE(glrun1->GetRM_ACQ_SETTING_MODE());
2920 glrun->SetTRK_CALIB_USED(glrun1->GetTRK_CALIB_USED());
2921 glrun->SetCAL_DSP_MASK(glrun1->GetCAL_DSP_MASK());
2922 glrun->SetLAST_TIMESYNC(glrun1->GetLAST_TIMESYNC());
2923 glrun->SetOBT_TIMESYNC(glrun1->GetOBT_TIMESYNC());
2924 //
2925 if ( glrun1->GetPHYSENDRUN_MASK_S3S2S12() ) glrun->SetPHYSENDRUN_MASK_S3S2S12(glrun1->GetPHYSENDRUN_MASK_S3S2S12());
2926 if ( glrun1->GetPHYSENDRUN_MASK_S11CRC() ) glrun->SetPHYSENDRUN_MASK_S11CRC(glrun1->GetPHYSENDRUN_MASK_S11CRC());
2927 //
2928 if ( !IsRunAlreadyInserted() ){
2929 //
2930 // glrun->SetID(this->AssignRunID());
2931 glrun->SetID_RUN_FRAG(glrun1->GetID());
2932 glrun->Fill_GL_RUN(conn);
2933 //
2934 // set id number
2935 //
2936 glrun1->SetID_RUN_FRAG(glrun->GetID());
2937 glrun1->Fill_GL_RUN(conn);
2938 //
2939 };
2940 // delete old entry in fragment table
2941 //
2942 glrun->DeleteRun(conn,0,"GL_RUN_FRAGMENTS");
2943 glrun1->DeleteRun(conn,0,"GL_RUN_FRAGMENTS");
2944 //
2945 delete glrun1;
2946 //
2947 //
2948 return;
2949 //
2950 };
2951 //
2952 };
2953 //
2954 if ( mistrail && ( rtlastev == lastev || chewbacca )) { // look for runtrailer (only when at the end of the file, if at the beginning and the runh is
2955 // missing it no way we can found a piece in the frag table
2956 //
2957 oss.str("");
2958 oss << " SELECT ID,PKT_COUNTER,RUNHEADER_TIME,RUNHEADER_OBT,RUNTRAILER_PKT,RUNHEADER_PKT FROM GL_RUN_FRAGMENTS WHERE "
2959 << " BOOT_NUMBER=" << this->GetBOOTnumber() << " AND "
2960 << " RUNTRAILER_TIME >= " << (UInt_t)glrun->GetRUNTRAILER_TIME() << " AND "
2961 << " ID != " << glrun->ID
2962 << " ORDER BY RUNTRAILER_TIME ASC LIMIT 1;";
2963 //
2964 if ( IsDebug() ) printf(" look for runtrailer in the fragments table: query is \n %s \n",oss.str().c_str());
2965 result = conn->Query(oss.str().c_str());
2966 //
2967 if ( !result ) throw -4;
2968 //
2969 row = result->Next();
2970 //
2971 if ( !row && NoFrag() ){
2972 //
2973 oss.str("");
2974 oss << " SELECT ID,PKT_COUNTER,RUNHEADER_TIME,RUNHEADER_OBT,RUNTRAILER_PKT,RUNHEADER_PKT FROM GL_RUN WHERE "
2975 << " BOOT_NUMBER=" << this->GetBOOTnumber() << " AND "
2976 << " RUNTRAILER_TIME >= " << (UInt_t)glrun->GetRUNTRAILER_TIME() << " AND "
2977 << " ID != " << glrun->ID
2978 << " AND ID=ID_RUN_FRAG ORDER BY RUNTRAILER_TIME ASC LIMIT 1;";
2979 //
2980 if ( IsDebug() ) printf(" look for runheader in the GL_RUN table: query is \n %s \n",oss.str().c_str());
2981 result = conn->Query(oss.str().c_str());
2982 //
2983 if ( !result ) throw -4;
2984 //
2985 foundinrun = true;
2986 row = result->Next();
2987 //
2988 };
2989 //
2990 if ( !row ){
2991 if ( IsDebug() ) printf(" the corresponding piece has NOT been found \n");
2992 found = false;
2993 } else {
2994 //
2995 found = false; // default value
2996 //
2997 if ( IsDebug() ) printf(" B Found a possible candidate, checking if it is the good one... \n");
2998 //
2999 // if we have both runheader and runtrailer we can check with pkt_counter:
3000 //
3001 if ( !mishead && (UInt_t)atoll(row->GetField(1)) != 0 ){
3002 ULong64_t chkpkt = 0;
3003 ULong64_t pktt = (ULong64_t)PKT((UInt_t)atoll(row->GetField(4)));
3004 ULong64_t pkth = (ULong64_t)PKT(glrun->GetRUNHEADER_PKT());
3005 //
3006 chkpkt = pkth + (ULong64_t)((UInt_t)atoll(row->GetField(1))) + 1ULL + 1ULL;
3007 //
3008 if ( labs(chkpkt-pktt)<2 ){
3009 //
3010 if ( IsDebug() ) printf(" FOUND!!! check %llu pktt %llu \n",chkpkt,pktt);
3011 //
3012 found = true;
3013 //
3014 } else {
3015 //
3016 if ( IsDebug() ) printf(" The check with pkt counter failed: check %llu pktt %llu \n",chkpkt,pktt);
3017 //
3018 found = false;
3019 //
3020 };
3021 };
3022 if ( !found && chewbacca ) goto justcheck;
3023 if ( !found ){
3024 //
3025 // if we arrive here we were not able to decide if the two pieces matches using only the pkt counter information, we must check times and obts
3026 //
3027 ULong64_t chkpkt1 = 0;
3028 ULong64_t orunh1 = (ULong64_t)PKT(glrun->GetRUNTRAILER_PKT());
3029 ULong64_t dbrunt1 = (ULong64_t)PKT((UInt_t)atoll(row->GetField(5)));
3030 chkpkt1 = labs(orunh1-dbrunt1);
3031 //
3032 ULong64_t chkpkt2 = 0;
3033 ULong64_t orunh2 = (ULong64_t)OBT(glrun->GetRUNTRAILER_OBT());
3034 ULong64_t dbrunt2 = (ULong64_t)OBT((UInt_t)atoll(row->GetField(3)));
3035 chkpkt2 = labs(orunh2-dbrunt2);
3036 //
3037 ULong64_t chkpkt3 = 0;
3038 ULong64_t orunh3 = (ULong64_t)(glrun->GetRUNTRAILER_TIME());
3039 ULong64_t dbrunt3 = (ULong64_t)((UInt_t)atoll(row->GetField(2)));
3040 chkpkt3 = labs(orunh3-dbrunt3);
3041 //
3042 if ( (chkpkt1 < 200 || chkpkt2 < 20000) && chkpkt3 < 20 ){
3043 //
3044 if ( IsDebug() ) printf(" FOUND!!! check1 %llu<200 cechk2 %llu<20000 check3 %llu<20 \n",chkpkt1,chkpkt2,chkpkt3);
3045 //
3046 found = true;
3047 //
3048 } else {
3049 //
3050 if ( IsDebug() ) printf(" Check failed: check1 %llu<200? cechk2 %llu<20000? check3 %llu<20? \n",chkpkt1,chkpkt2,chkpkt3);
3051 //
3052 found = false;
3053 //
3054 };
3055 };
3056 };
3057 //
3058 if ( found ){
3059 //
3060 // we have found the missing piece, glue the two together, merge the informations, fill the gl_run table (check first runs do not exists), delete entry in frag table
3061 //
3062 if ( IsDebug() ) printf(" now you can handle the piece of the run \n ");
3063 //
3064 if ( foundinrun ){
3065 glrun->RestoreRun(conn,(UInt_t)atoll(row->GetField(0)),"GL_RUN_FRAGMENTS");
3066 glrun->DeleteRun(conn,(UInt_t)atoll(row->GetField(0)),"GL_RUN");
3067 };
3068 //
3069 GL_RUN *glrun1 = new GL_RUN();
3070 //
3071 // UInt_t idfrag = (UInt_t)atoll(row->GetField(0));
3072 //
3073 oss.str("");
3074 oss << " ID="<<row->GetField(0)<<";";
3075 //
3076 glrun1->Query_GL_RUN_FRAGMENTS(oss.str().c_str(),conn); // here we have runtrailer infos
3077 //
3078 // merge infos
3079 //
3080 UInt_t apkt = PKT(glrun->GetRUNTRAILER_PKT());
3081 ULong64_t aobt = OBT(glrun->GetRUNTRAILER_OBT());
3082 UInt_t bpkt = PKT(glrun1->GetRUNHEADER_PKT());
3083 ULong64_t bobt = OBT(glrun1->GetRUNHEADER_OBT());
3084 if ( IsDebug() ) printf(" Check overlapping events: %u %u %llu %llu lastev is %i\n",apkt,bpkt,aobt,bobt,lastev);
3085 TTree *T= 0;
3086 T = (TTree*)file->Get("Physics");
3087 if ( !T || T->IsZombie() ) throw -16;
3088 EventHeader *eh = 0;
3089 PscuHeader *ph = 0;
3090 T->SetBranchAddress("Header", &eh);
3091 while ( apkt > bpkt && aobt > bobt && lastev > 0 ){
3092 T->GetEntry(lastev);
3093 ph = eh->GetPscuHeader();
3094 apkt = PKT(ph->GetCounter());
3095 aobt = OBT(ph->GetOrbitalTime());
3096 lastev--;
3097 if ( PEDANTIC && !RELAXED) throw -72;
3098 };
3099 if ( IsDebug() ) printf(" Check overlapping events done: %u %u %llu %llu lastev is %i\n",apkt,bpkt,aobt,bobt,lastev);
3100 //
3101 glrun->SetEV_TO(lastev);
3102 glrun->SetNEVENTS(lastev-firstev+1);
3103 glrun->SetPKT_COUNTER(glrun1->GetPKT_COUNTER());
3104 glrun->SetPKT_READY_COUNTER(glrun1->GetPKT_READY_COUNTER());
3105 glrun->SetRUNTRAILER_TIME(glrun1->GetRUNTRAILER_TIME());
3106 glrun->SetRUNTRAILER_OBT(glrun1->GetRUNTRAILER_OBT());
3107 glrun->SetRUNTRAILER_PKT(glrun1->GetRUNTRAILER_PKT());
3108 //
3109 glrun1->SetRUNHEADER_TIME(glrun->GetRUNHEADER_TIME());
3110 glrun1->SetRUNHEADER_OBT(glrun->GetRUNHEADER_OBT());
3111 glrun1->SetRUNHEADER_PKT(glrun->GetRUNHEADER_PKT());
3112 glrun1->SetCOMPILATIONTIMESTAMP(glrun->GetCOMPILATIONTIMESTAMP());
3113 glrun1->SetFAV_WRK_SCHEDULE(glrun->GetFAV_WRK_SCHEDULE());
3114 glrun1->SetEFF_WRK_SCHEDULE(glrun->GetEFF_WRK_SCHEDULE());
3115 glrun1->SetPRH_VAR_TRG_MODE_A(glrun->GetPRH_VAR_TRG_MODE_A());
3116 glrun1->SetPRH_VAR_TRG_MODE_B(glrun->GetPRH_VAR_TRG_MODE_B());
3117 glrun1->SetACQ_BUILD_INFO(glrun->GetACQ_BUILD_INFO());
3118 glrun1->SetACQ_VAR_INFO(glrun->GetACQ_VAR_INFO());
3119 glrun1->SetRM_ACQ_AFTER_CALIB(glrun->GetRM_ACQ_AFTER_CALIB());
3120 glrun1->SetRM_ACQ_SETTING_MODE(glrun->GetRM_ACQ_SETTING_MODE());
3121 glrun1->SetTRK_CALIB_USED(glrun->GetTRK_CALIB_USED());
3122 glrun1->SetCAL_DSP_MASK(glrun->GetCAL_DSP_MASK());
3123 glrun1->SetLAST_TIMESYNC(glrun->GetLAST_TIMESYNC());
3124 glrun1->SetOBT_TIMESYNC(glrun->GetOBT_TIMESYNC());
3125 //
3126 if ( glrun->GetPHYSENDRUN_MASK_S3S2S12() ) glrun1->SetPHYSENDRUN_MASK_S3S2S12(glrun->GetPHYSENDRUN_MASK_S3S2S12());
3127 if ( glrun->GetPHYSENDRUN_MASK_S11CRC() ) glrun1->SetPHYSENDRUN_MASK_S11CRC(glrun->GetPHYSENDRUN_MASK_S11CRC());
3128 //
3129 if ( !IsRunAlreadyInserted() ){
3130 //
3131 // glrun->SetID(this->AssignRunID());
3132 //
3133 glrun->SetID_RUN_FRAG(glrun1->GetID());
3134 glrun->Fill_GL_RUN(conn);
3135 //
3136 // set id number
3137 //
3138 glrun1->SetID_RUN_FRAG(glrun->GetID());
3139 glrun1->Fill_GL_RUN(conn);
3140 //
3141 };
3142 //
3143 // delete old entries in fragment table
3144 //
3145 glrun->DeleteRun(conn,0,"GL_RUN_FRAGMENTS");
3146 glrun1->DeleteRun(conn,0,"GL_RUN_FRAGMENTS");
3147 //
3148 delete glrun1;
3149 //
3150 return;
3151 //
3152 };
3153 //
3154 };
3155 //
3156 justcheck:
3157 //
3158 if ( !found ){
3159 //
3160 if ( IsDebug() ) printf(" not found, check if we have already processed the file \n ");
3161 //
3162 // not found, has this run already inserted in the GL_RUN or in the GL_RUN_FRAGMENTS table?
3163 //
3164 oss.str("");
3165 oss << " SELECT ID,ID_ROOT_L0 FROM GL_RUN WHERE "
3166 << " BOOT_NUMBER=" << this->GetBOOTnumber() << " AND ("
3167 << " (RUNHEADER_TIME>=" << (UInt_t)(glrun->GetRUNHEADER_TIME()-10) << " AND "
3168 << " RUNTRAILER_TIME<=" << (UInt_t)(glrun->GetRUNTRAILER_TIME()+10) << " AND ("
3169 << " RUNHEADER_OBT>=" << glrun->GetRUNHEADER_OBT() << " OR "
3170 << " RUNHEADER_PKT>=" << glrun->GetRUNHEADER_PKT() << ") AND ("
3171 << " RUNTRAILER_OBT<=" << glrun->GetRUNTRAILER_OBT() << " OR "
3172 << " RUNTRAILER_PKT<=" << glrun->GetRUNTRAILER_PKT() << ") ) OR "
3173 << " (RUNHEADER_TIME<=" << (UInt_t)glrun->GetRUNHEADER_TIME() << " AND "
3174 << " RUNTRAILER_TIME>=" << (UInt_t)glrun->GetRUNTRAILER_TIME() <<" AND ("
3175 << " RUNHEADER_OBT<=" << glrun->GetRUNHEADER_OBT() << " OR "
3176 << " RUNHEADER_PKT<=" << glrun->GetRUNHEADER_PKT() << ") AND ("
3177 << " RUNTRAILER_OBT>=" << glrun->GetRUNTRAILER_OBT() << " OR "
3178 << " RUNTRAILER_PKT>=" << glrun->GetRUNTRAILER_PKT() << ") ));";
3179 //
3180 if ( IsDebug() ) printf(" check if run has been inserted: query is \n %s \n",oss.str().c_str());
3181 result = conn->Query(oss.str().c_str());
3182 //
3183 if ( !result ) throw -4;
3184 //
3185 row = result->Next();
3186 //
3187 if ( row ){
3188 //
3189 // we end up here if chewbacca and we have RH---| small gap |---RT, in this case the two pieces are attached and moved to GL_RUN. We are now processing the
3190 // "small gap" piece... we recognize this since: we have two entries from this query, the pkt number is consistent with our pkt number.
3191 //
3192 // 090112 [8RED (-70): RUN ALREADY INSERTED]
3193 //
3194 Bool_t OK = false;
3195 UInt_t IDRL2A = 0;
3196 UInt_t IDRL2B = 0;
3197 if ( chewbacca ){
3198 if ( result->GetRowCount() == 2 ){
3199 IDRL2A = (UInt_t)atoll(row->GetField(0));
3200 UInt_t IDRL0A = (UInt_t)atoll(row->GetField(1));
3201 row = result->Next();
3202 IDRL2B = (UInt_t)atoll(row->GetField(0));
3203 UInt_t IDRL0B = (UInt_t)atoll(row->GetField(1));
3204 if ( IsDebug() ) printf(" IDRL0A %u B %u IDRL2A %u B %u \n",IDRL0A,IDRL0B,IDRL2A,IDRL2B);
3205 if ( IDRL0A == IDRL0B ){
3206 TSQLResult *result2 = 0;
3207 TSQLRow *row2 = 0;
3208 oss.str("");
3209 oss << "select PKT_NUMBER_FINAL from ROOT_TABLE_MERGING where REAL_TIME_INIT<" << chrtinit << " order by REAL_TIME_INIT desc limit 1;";
3210 if ( IsDebug() ) printf(" Check if we are in the case RH---| small gap |---RT: query is \n %s \n",oss.str().c_str());
3211 result2 = conn->Query(oss.str().c_str());
3212 //
3213 if ( !result2 ) throw -4;
3214 //
3215 row2 = result2->Next();
3216 //
3217 if ( row2 ){
3218 UInt_t PKA = (UInt_t)atoll(row2->GetField(0));
3219 delete result2;
3220 oss.str("");
3221 oss << "select PKT_NUMBER_INIT from ROOT_TABLE_MERGING where REAL_TIME_INIT>" << chrtinit << " order by REAL_TIME_INIT asc limit 1;";
3222 if ( IsDebug() ) printf(" Check if we are in the case RH---| small gap |---RT: query is \n %s \n",oss.str().c_str());
3223 result2 = conn->Query(oss.str().c_str());
3224 //
3225 if ( !result2 ) throw -4;
3226 //
3227 row2 = result2->Next();
3228 //
3229 if ( row2 ){
3230 UInt_t PKB = (UInt_t)atoll(row2->GetField(0));
3231 //
3232 if ( IsDebug() ) printf(" PKT(PKA) + 1 %llu == runheaderpkt %llu && PKB = runtrailer %llu + 1 %llu \n",PKT(PKA)+1LL, PKT(glrun->GetRUNHEADER_PKT()),PKT(PKB), PKT(glrun->GetRUNTRAILER_PKT())+1LL);
3233 if ( PKT(PKA)+1LL == PKT(glrun->GetRUNHEADER_PKT()) && PKT(PKB) == PKT(glrun->GetRUNTRAILER_PKT())+1LL ){
3234 if ( IsDebug() ) printf(" Ok, we are in the case: RH---| small gap |---RT \n");
3235 OK = true;
3236 };
3237 };
3238 };
3239 };
3240 };
3241 };
3242 if ( OK ){
3243 //
3244 // this is the case in which we must insert a piece of run between two fragments in the GL_RUN table
3245 //
3246 // we have to update with runheader/trailer infos our run and we have to change the ROOT_ID_FRAG of the header piece ( 1/2 2/1 must become 1/3 3/2 2/1 )
3247 //
3248 GL_RUN *glA = new GL_RUN();
3249 glA->Query_GL_RUN(IDRL2A,conn);
3250 //
3251 if ( glA->GetACQ_BUILD_INFO() != 0 ){
3252 //
3253 // the first piece contains a good runheader we can update all the other runs with correct infos!
3254 //
3255 oss.str("");
3256 oss << "UPDATE GL_RUN_FRAGMENTS SET "
3257 << " RUNHEADER_TIME=" << glA->GetRUNHEADER_TIME()<< " , "
3258 << " RUNHEADER_OBT=" << glA->GetRUNHEADER_OBT()<< " , "
3259 << " RUNHEADER_PKT=" << glA->GetRUNHEADER_PKT()<< " , "
3260 << " COMPILATIONTIMESTAMP=" << glA->GetCOMPILATIONTIMESTAMP()<< " , "
3261 << " FAV_WRK_SCHEDULE=" << glA->GetFAV_WRK_SCHEDULE()<< " , "
3262 << " EFF_WRK_SCHEDULE=" << glA->GetEFF_WRK_SCHEDULE()<< " , "
3263 << " PRH_VAR_TRG_MODE_A=" << glA->GetPRH_VAR_TRG_MODE_A()<< " , "
3264 << " PRH_VAR_TRG_MODE_B=" << glA->GetPRH_VAR_TRG_MODE_B()<< " , "
3265 << " ACQ_BUILD_INFO=" << glA->GetACQ_BUILD_INFO()<< " , "
3266 << " ACQ_VAR_INFO=" << glA->GetACQ_VAR_INFO()<< " , "
3267 << " RM_ACQ_AFTER_CALIB=" << glA->GetRM_ACQ_AFTER_CALIB()<< " , "
3268 << " RM_ACQ_SETTING_MODE=" << glA->GetRM_ACQ_SETTING_MODE()<< " , "
3269 << " TRK_CALIB_USED=" << glA->GetTRK_CALIB_USED()<< " , "
3270 << " CAL_DSP_MASK=" << glA->GetCAL_DSP_MASK()<< " , "
3271 << " LAST_TIMESYNC=" << glA->GetLAST_TIMESYNC()<< " , ";
3272 //
3273 if ( glA->GetPHYSENDRUN_MASK_S3S2S12() )
3274 oss << " PHYSENDRUN_MASK_S3S2S12=" << glA->GetPHYSENDRUN_MASK_S3S2S12() << " , ";
3275 if ( glA->GetPHYSENDRUN_MASK_S11CRC() )
3276 oss << " PHYSENDRUN_MASK_S11CRC=" << glA->GetPHYSENDRUN_MASK_S11CRC() << " , ";
3277 //
3278 oss << " OBT_TIMESYNC=" << glA->GetOBT_TIMESYNC();
3279 oss << " WHERE ID=" << glrun->GetID() << ";";
3280 if ( IsDebug() ) printf(" update with correct infos: %s\n",oss.str().c_str());
3281 conn->Query(oss.str().c_str());
3282 //
3283 } else {
3284 //
3285 // sig no runheader, let set anyway what is possible...
3286 //
3287 oss.str("");
3288 oss << "UPDATE GL_RUN_FRAGMENTS SET "
3289 << " RUNHEADER_TIME=" << glA->GetRUNHEADER_TIME()<< " , ";
3290 //
3291 if ( glA->GetPHYSENDRUN_MASK_S3S2S12() )
3292 oss << " PHYSENDRUN_MASK_S3S2S12=" << glA->GetPHYSENDRUN_MASK_S3S2S12()<< " , ";
3293 if ( glA->GetPHYSENDRUN_MASK_S11CRC() )
3294 oss << " PHYSENDRUN_MASK_S11CRC=" << glA->GetPHYSENDRUN_MASK_S11CRC()<< " , ";
3295 //
3296 oss << " RUNHEADER_OBT=" << glA->GetRUNHEADER_OBT()<< " , "
3297 << " RUNHEADER_PKT=" << glA->GetRUNHEADER_PKT();
3298 oss << " WHERE ID=" << glrun->GetID() << ";";
3299 if ( IsDebug() ) printf(" update with correct infos2: %s\n",oss.str().c_str());
3300 conn->Query(oss.str().c_str());
3301 };
3302 //
3303 // update runheader ROOT_ID_FRAG
3304 //
3305 oss.str("");
3306 oss << "UPDATE GL_RUN SET ID_RUN_FRAG = " << glrun->GetID() << " where ID = " << IDRL2A << ";";
3307 if ( IsDebug() ) printf(" update gl_run to have cross indexing: %s\n",oss.str().c_str());
3308 conn->Query(oss.str().c_str());
3309 //
3310 // now let's look for runtrailer if any in the last run
3311 //
3312 glA->Query_GL_RUN(IDRL2B,conn);
3313 //
3314 if ( glA->GetPKT_READY_COUNTER() != 0 ){
3315 //
3316 // the first piece contains a good runtrailer we can update all the other runs with correct infos!
3317 //
3318 oss.str("");
3319 oss << "UPDATE GL_RUN_FRAGMENTS SET "
3320 << " RUNTRAILER_TIME=" << glA->GetRUNTRAILER_TIME()<< " , "
3321 << " RUNTRAILER_OBT=" << glA->GetRUNTRAILER_OBT()<< " , "
3322 << " RUNTRAILER_PKT=" << glA->GetRUNTRAILER_PKT()<< " , "
3323 << " PKT_COUNTER=" << glA->GetPKT_COUNTER()<< " , ";
3324 //
3325 if ( glA->GetPHYSENDRUN_MASK_S3S2S12() ){
3326 oss << " PHYSENDRUN_MASK_S3S2S12=" << glA->GetPHYSENDRUN_MASK_S3S2S12()<< " , "; };
3327 if ( glA->GetPHYSENDRUN_MASK_S11CRC() ) {
3328 oss << " PHYSENDRUN_MASK_S11CRC=" << glA->GetPHYSENDRUN_MASK_S11CRC()<< " , "; };
3329 //
3330 oss << " PKT_READY_COUNTER=" << glA->GetPKT_READY_COUNTER()
3331 << " WHERE ID=" << glrun->GetID() << ";";
3332 if ( IsDebug() ) printf(" update with correct trailer infos: %s\n",oss.str().c_str());
3333 conn->Query(oss.str().c_str());
3334 //
3335 } else {
3336 //
3337 // sig no runtrailer, let set anyway what is possible...
3338 //
3339 oss.str("");
3340 oss << "UPDATE GL_RUN_FRAGMENTS SET "
3341 << " RUNTRAILER_TIME=" << glA->GetRUNTRAILER_TIME()<< " , "
3342 << " RUNTRAILER_OBT=" << glA->GetRUNTRAILER_OBT()<< " , ";
3343 //
3344 if ( glA->GetPHYSENDRUN_MASK_S3S2S12() ){
3345 oss << " PHYSENDRUN_MASK_S3S2S12=" << glA->GetPHYSENDRUN_MASK_S3S2S12()<< " , "; };
3346 if ( glA->GetPHYSENDRUN_MASK_S11CRC() ){
3347 oss << " PHYSENDRUN_MASK_S11CRC=" << glA->GetPHYSENDRUN_MASK_S11CRC()<< " , "; };
3348 //
3349 oss << " RUNTRAILER_PKT=" << glrun->GetRUNTRAILER_PKT()
3350 << " WHERE ID=" << glrun->GetID() << ";";
3351 if ( IsDebug() ) printf(" update with correct trailer infos2: %s\n",oss.str().c_str());
3352 conn->Query(oss.str().c_str());
3353 };
3354 //
3355 UInt_t myi = glrun->GetID();
3356 oss.str("");
3357 oss << " ID= "<< myi;
3358 //
3359 glrun->Query_GL_RUN_FRAGMENTS(oss.str().c_str(),conn);
3360 //
3361 // fill the new run in GL_RUN
3362 //
3363 glrun->SetID_RUN_FRAG(IDRL2B);
3364 glrun->Fill_GL_RUN(conn);
3365 glrun->DeleteRun(conn,0,"GL_RUN_FRAGMENTS");
3366 //
3367 } else {
3368 //
3369 // is just a repetition
3370 //
3371 if ( IsDebug() ) printf(" The run is already present in the GL_RUN table \n");
3372 if ( PEDANTIC ) throw -70;
3373 };
3374 //
3375 } else {
3376 if ( NoFrag() ){
3377 glrun->SetID_RUN_FRAG(glrun->GetID());
3378 glrun->Fill_GL_RUN(conn);
3379 glrun->DeleteRun(conn,0,"GL_RUN_FRAGMENTS");
3380 };
3381 };
3382 };
3383 }; // EEE
3384 //
3385 return;
3386 };
3387
3388
3389 /**
3390 * Handle run without header or trailer
3391 **/
3392 void PamelaDBOperations::HandleMissingHoT(Bool_t mishead, Bool_t mistrail, UInt_t firstev, UInt_t lastev){
3393 //
3394 //
3395 // is the piece of run good (no other packets inside)?
3396 //
3397 if ( !this->IsRunConsistent(mishead,mistrail,firstev,lastev)){
3398 //
3399 // if not, handle other pieces and continue with the first one
3400 //
3401 if ( IsDebug() ) printf("The run is not consistent, it contains non-physics packets! The run has been handled \n");
3402 //
3403 } else {
3404 //
3405 this->FillClass(mishead,mistrail,firstev,lastev);
3406 //
3407 if ( !IsRunAlreadyInserted() ){
3408 glrun->SetID(this->AssignRunID());
3409 glrun->SetID_RUN_FRAG(0);
3410 glrun->Fill_GL_RUN(conn); // it'ok we arrive here only inside a file hence in the middle of the runs...
3411 };
3412 //
3413 };
3414 //
3415 return;
3416 };
3417
3418 /**
3419 *
3420 * check if we have non-physics packets inside the run
3421 *
3422 */
3423 Bool_t PamelaDBOperations::IsRunConsistent(Bool_t mishead, Bool_t mistrail, UInt_t &firstev, UInt_t &lastev){
3424 //
3425 EventCounter *code=0;
3426 //
3427 UInt_t nevent = 0;
3428 UInt_t checkfirst = 0;
3429 UInt_t checklast = 0;
3430 UInt_t firstentry = 0;
3431 UInt_t lastentry = 0;
3432 UInt_t firstTime = 0;
3433 UInt_t lastTime = 0;
3434 UInt_t firstPkt = 0;
3435 UInt_t lastPkt = 0;
3436 UInt_t firstObt = 0;
3437 UInt_t lastObt = 0;
3438 //
3439 pcksList packetsNames;
3440 pcksList::iterator Iter;
3441 getPacketsNames(packetsNames);
3442 //
3443 TTree *T= 0;
3444 T =(TTree*)file->Get("Physics");
3445 if ( !T || T->IsZombie() ) throw -16;
3446 EventHeader *eh = 0;
3447 PscuHeader *ph = 0;
3448 T->SetBranchAddress("Header", &eh);
3449 nevent = T->GetEntries();
3450 //
3451 //
3452 if ( firstev == lastev+1 || lastev == firstev ) { // no events inside the run!
3453 //if ( firstev <= lastev+1 ) { // no events inside the run!
3454 if ( IsDebug() ) printf(" Checking but no events in the run! \n");
3455 firstev = lastev+1; // this is necessary for files with no Physics entries, should have no influence on other files
3456 // return true is correct
3457 return(true);
3458 //
3459 } else {
3460 //
3461 T->GetEntry(firstev);
3462 code = eh->GetCounter();
3463 checkfirst = 0;
3464 for(Iter = packetsNames.begin(); Iter != packetsNames.end(); Iter++){
3465 if ( strcmp(*Iter,"Physics") ) checkfirst += code->Get(GetPacketType(*Iter));
3466 };
3467 if ( IsDebug() ) printf(" Check first is %i firstev is %i\n",checkfirst,firstev);
3468 //
3469 T->GetEntry(lastev);
3470 code = eh->GetCounter();
3471 checklast = 0;
3472 for(Iter = packetsNames.begin(); Iter != packetsNames.end(); Iter++){
3473 if ( strcmp(*Iter,"Physics") ) checklast += code->Get(GetPacketType(*Iter));
3474 };
3475 if ( IsDebug() ) printf(" Check last is %i lastev is %i\n",checklast,lastev);
3476 //
3477 if ( checkfirst == checklast ){
3478 //
3479 if ( IsDebug() ) printf(" No packets but physics inside the run, I will consider it as good\n");
3480 //
3481 return(true);
3482 //
3483 } else {
3484 //
3485 if ( IsDebug() ) printf(" There are no-physics packets inside the run!\n");
3486 //
3487 // HERE WE MUST HANDLE THAT RUNS AND GO BACK
3488 //
3489 // if ( IsDebug() ) printf(" Never seen this case, try to handle it anyway, it was throw -95\n");
3490 //
3491 Bool_t emptyruns = false;
3492 UInt_t check = 0;
3493 UInt_t lastevtemp = lastev;
3494 UInt_t firstevno = firstev;
3495 UInt_t rhchko=0;
3496 UInt_t rhchk=0;
3497 //
3498 for (UInt_t i=firstev; i<=lastev; i++){
3499 //
3500 T->GetEntry(i);
3501 code = eh->GetCounter();
3502 //
3503 check = 0;
3504 //
3505
3506 // if we have a runheader set lastev then exit
3507 //
3508 for(Iter = packetsNames.begin(); Iter != packetsNames.end(); Iter++){
3509 if ( strcmp(*Iter,"Physics") ) check += code->Get(GetPacketType(*Iter));
3510 };
3511 // check here if we have a runheader
3512 rhchko = rhchk;
3513 rhchk = code->Get(GetPacketType("RunHeader"));
3514 //
3515 if ( checkfirst < check || i == lastev ){
3516 //
3517 firstentry = firstevno;
3518 //
3519 if ( checkfirst < check ){
3520 lastentry = i-1;
3521 } else {
3522 lastentry = i;
3523 };
3524 //
3525 if ( IsDebug() ) printf(" Run between %i and %i entries\n",firstentry,lastentry);
3526 //
3527 glrun->SetEV_FROM(firstentry);
3528 glrun->SetEV_TO(lastentry);
3529 if ( lastentry == (firstentry-1) ){ // no physics packets inside physics run with no runheader no runtrailer
3530 if ( IsDebug() ) printf(" no physics packets inside physics run with no runheader no runtrailer\n");
3531 lastentry--;
3532 };
3533 glrun->SetNEVENTS(lastentry-firstentry+1);
3534 //
3535 glrun->Set_GL_RUNH0();
3536 glrun->Set_GL_RUNT0();
3537 //
3538 glrun->SetLAST_TIMESYNC(0);
3539 glrun->SetOBT_TIMESYNC(0);
3540 //
3541 T->GetEntry(firstentry);
3542 ph = eh->GetPscuHeader();
3543 firstObt = ph->GetOrbitalTime();
3544 firstTime = this->GetAbsTime(firstObt);
3545 firstPkt = ph->GetCounter();
3546 //
3547 T->GetEntry(lastentry);
3548 ph = eh->GetPscuHeader();
3549 lastObt = ph->GetOrbitalTime();
3550 lastTime = this->GetAbsTime(lastObt);
3551 lastPkt = ph->GetCounter();
3552 //
3553 glrun->SetRUNHEADER_PKT(firstPkt);
3554 glrun->SetRUNTRAILER_PKT(lastPkt);
3555 //
3556 glrun->SetRUNHEADER_OBT(firstObt);
3557 glrun->SetRUNTRAILER_OBT(lastObt);
3558 //
3559 if ( IsDebug() ) printf(" A THIS RUN: RUNHEADER_OBT %u RUNTRAILER_OBT %u RUNHEADER_PKT %u RUNTRAILER_PKT %u \n", glrun->GetRUNHEADER_OBT(),glrun->GetRUNTRAILER_OBT(),glrun->GetRUNHEADER_PKT(),glrun->GetRUNTRAILER_PKT());
3560 if ( firstev == firstentry && !emptyruns && !mishead ){
3561 glrun->Set_GL_RUNH(runh,phh);
3562 firstTime = this->GetAbsTime(phh->GetOrbitalTime());
3563 if ( IsDebug() ) printf(" We have the runheader \n");
3564 };
3565 if ( lastev == i && !mistrail ){
3566 glrun->Set_GL_RUNT(runt,pht);
3567 lastTime = this->GetAbsTime(pht->GetOrbitalTime());
3568 if ( IsDebug() ) printf(" We have the runtrailer \n");
3569 };
3570 //
3571 if ( IsDebug() ) printf(" B THIS RUN: RUNHEADER_OBT %u RUNTRAILER_OBT %u RUNHEADER_PKT %u RUNTRAILER_PKT %u \n", glrun->GetRUNHEADER_OBT(),glrun->GetRUNTRAILER_OBT(),glrun->GetRUNHEADER_PKT(),glrun->GetRUNTRAILER_PKT());
3572 if ( lastentry == (firstentry-2) ){ // no events in the run
3573 emptyruns = true;
3574 if ( IsDebug() ) printf(" No events in the run \n");
3575 lastTime = firstTime;
3576 if ( (UInt_t)firstTime == this->GetAbsTime(phh->GetOrbitalTime()) ){
3577 lastObt = glrun->RUNHEADER_OBT;
3578 lastPkt = glrun->RUNHEADER_PKT;
3579 } else {
3580 lastObt = firstObt;
3581 lastPkt = firstPkt;
3582 };
3583 glrun->SetRUNTRAILER_PKT(lastPkt);
3584 glrun->SetRUNTRAILER_OBT(lastObt);
3585 lastentry++;
3586 };
3587 //
3588 this->SetCommonGLRUN(firstTime,lastTime);
3589 this->SetPhysEndRunVariables();
3590 //
3591 if ( chminentry == firstentry ){ // EEE
3592 if ( IsDebug() ) printf(" Inside isrunconsistent found a fragment of run at the beginning of the file, put it in the fragment table \n");
3593 //
3594 // this->HandleRunFragments(true,mistrail,firstentry,lastentry); // cannot call it here since it enters a loop which will destroy the already stored variables if we arrive here from HandleRunFragments
3595 //
3596
3597 mishead = true;
3598
3599
3600 UInt_t rhfirstev = firstentry;
3601 // UInt_t rtlastev = lastentry;
3602 Bool_t found = false;
3603 Bool_t foundinrun = false;
3604 //
3605 TSQLResult *result = 0;
3606 TSQLRow *row = 0;
3607 //
3608 stringstream oss;
3609 oss.str("");
3610 //
3611 // we have now the good first piece of a run, fill the glrun object
3612 //
3613 // if ( rhfirstev != firstev && !mishead ) mishead = true;
3614 // if ( rtlastev != lastev && !mistrail ) mistrail = true;
3615 //
3616 // this->FillClass(mishead,mistrail,firstev,lastev);
3617 //
3618 if ( IsDebug() ) printf("zz The run is good, is it the other piece in the GL_RUN_FRAGMENTS table?\n");
3619 if ( IsDebug() ) printf("zz C THIS RUN: RUNHEADER_OBT %u RUNTRAILER_OBT %u RUNHEADER_PKT %u RUNTRAILER_PKT %u \n", glrun->GetRUNHEADER_OBT(),glrun->GetRUNTRAILER_OBT(),glrun->GetRUNHEADER_PKT(),glrun->GetRUNTRAILER_PKT());
3620 //
3621 // First of all insert the run in the fragment table...
3622 //
3623 oss.str("");
3624 oss << " SELECT ID FROM GL_RUN_FRAGMENTS WHERE "
3625 << " BOOT_NUMBER=" << this->GetBOOTnumber() << " AND ("
3626 << " (RUNHEADER_TIME>=" << (UInt_t)(glrun->GetRUNHEADER_TIME()-10) << " AND "
3627 << " RUNTRAILER_TIME<=" << (UInt_t)(glrun->GetRUNTRAILER_TIME()+10) << " AND ("
3628 << " RUNHEADER_OBT>=" << glrun->GetRUNHEADER_OBT() << " OR "
3629 << " RUNHEADER_PKT>=" << glrun->GetRUNHEADER_PKT() << ") AND ("
3630 << " RUNTRAILER_OBT<=" << glrun->GetRUNTRAILER_OBT() << " OR "
3631 << " RUNTRAILER_PKT<=" << glrun->GetRUNTRAILER_PKT() << ") ) OR "
3632 << " (RUNHEADER_TIME<=" << (UInt_t)glrun->GetRUNHEADER_TIME() << " AND "
3633 << " RUNTRAILER_TIME>=" << (UInt_t)glrun->GetRUNTRAILER_TIME() <<" AND ("
3634 << " RUNHEADER_OBT<=" << glrun->GetRUNHEADER_OBT() << " OR "
3635 << " RUNHEADER_PKT<=" << glrun->GetRUNHEADER_PKT() << ") AND ("
3636 << " RUNTRAILER_OBT>=" << glrun->GetRUNTRAILER_OBT() << " OR "
3637 << " RUNTRAILER_PKT>=" << glrun->GetRUNTRAILER_PKT() << ") ));";
3638 //
3639 if ( IsDebug() ) printf(" check if run has been inserted: query is \n %s \n",oss.str().c_str());
3640 result = conn->Query(oss.str().c_str());
3641 //
3642 if ( !result ) throw -4;
3643 //
3644 row = result->Next();
3645 //
3646 if ( !row ){
3647 //
3648 // no, insert this run in the GL_RUN_FRAGMENTS table (check if exist before!)
3649 //
3650 if ( IsDebug() ) printf(" The run is new \n");
3651 if ( IsDebug() ) printf(" -> fill the GL_RUNFRAGMENTS table \n");
3652 //
3653 glrun->SetID(this->AssignRunID());
3654 glrun->SetID_RUN_FRAG(0);
3655 glrun->Fill_GL_RUN_FRAGMENTS(conn);
3656 //
3657 } else {
3658 if ( IsDebug() ) printf(" The run is already present in the fragment table \n");
3659 if ( PEDANTIC ) throw -69;
3660 // return;
3661 };
3662 //
3663 if ( chewbacca && mishead && mistrail ) goto zjustcheck;
3664 //
3665 // can we find the other piece of the run in the GL_RUN_FRAGMENTS table?
3666 //
3667 if ( mishead && ( rhfirstev == firstev || chewbacca ) ) { // look for runheader (only when at the beginning of the file, if at the end and the runh is
3668 // missing it no way we can found a piece in the frag table
3669 //
3670 oss.str("");
3671 oss << " SELECT ID,TRK_CALIB_USED,RUNTRAILER_TIME,RUNTRAILER_OBT,RUNHEADER_PKT,RUNTRAILER_PKT FROM GL_RUN_FRAGMENTS WHERE "
3672 << " BOOT_NUMBER=" << this->GetBOOTnumber() << " AND "
3673 << " RUNHEADER_TIME <= " << (UInt_t)glrun->GetRUNHEADER_TIME() << " AND "
3674 << " ID != " << glrun->ID
3675 << " ORDER BY RUNHEADER_TIME DESC LIMIT 1;"; // DESC NOT ASC!!
3676 //
3677 if ( IsDebug() ) printf(" look for runheader in the fragments table: query is \n %s \n",oss.str().c_str());
3678 result = conn->Query(oss.str().c_str());
3679 //
3680 if ( !result ) throw -4;
3681 //
3682 row = result->Next();
3683 //
3684 if ( !row && NoFrag() ){
3685 //
3686 oss.str("");
3687 oss << " SELECT ID,TRK_CALIB_USED,RUNTRAILER_TIME,RUNTRAILER_OBT,RUNHEADER_PKT,RUNTRAILER_PKT FROM GL_RUN WHERE "
3688 << " BOOT_NUMBER=" << this->GetBOOTnumber() << " AND "
3689 << " RUNHEADER_TIME <= " << (UInt_t)glrun->GetRUNHEADER_TIME() << " AND "
3690 << " ID != " << glrun->ID
3691 << " AND ID=ID_RUN_FRAG ORDER BY RUNHEADER_TIME DESC LIMIT 1;"; // DESC NOT ASC!!
3692 //
3693 if ( IsDebug() ) printf(" look for runheader in the GL_RUN table: query is \n %s \n",oss.str().c_str());
3694 result = conn->Query(oss.str().c_str());
3695 //
3696 if ( !result ) throw -4;
3697 //
3698 foundinrun = true;
3699 //
3700 row = result->Next();
3701 //
3702 };
3703 //
3704 if ( !row ){
3705 if ( IsDebug() ) printf(" the corresponding piece has NOT been found \n");
3706 found = false;
3707 } else {
3708 //
3709 found = false; // default value
3710 //
3711 if ( IsDebug() ) printf(" C Found a possible candidate, checking if it is the good one... \n");
3712 //
3713 // if we have both runheader and runtrailer we can check with pkt_counter:
3714 //
3715 if ( !mistrail && (UInt_t)atoll(row->GetField(1)) != 0 ){
3716 ULong64_t chkpkt = 0;
3717 ULong64_t pktt = (ULong64_t)PKT(glrun->GetRUNTRAILER_PKT());
3718 ULong64_t pkth = (ULong64_t)PKT((UInt_t)atoll(row->GetField(4)));
3719 //
3720 chkpkt = pkth + (ULong64_t)glrun->GetPKT_COUNTER() + 1ULL + 1ULL;
3721 //
3722 if ( labs(chkpkt-pktt)<2 ){
3723 //
3724 if ( IsDebug() ) printf(" FOUND!!! check %llu pktt %llu \n",chkpkt,pktt);
3725 //
3726 found = true;
3727 //
3728 } else {
3729 //
3730 if ( IsDebug() ) printf(" The check with pkt counter failed: check %llu pktt %llu \n",chkpkt,pktt);
3731 //
3732 found = false;
3733 //
3734 };
3735 };
3736 if ( !found && chewbacca ) goto zjustcheck;
3737 if ( !found ){
3738 //
3739 // if we arrive here we were not able to decide if the two pieces matches using only the pkt counter information, we must check times and obts
3740 //
3741 ULong64_t chkpkt1 = 0;
3742 ULong64_t orunh1 = (ULong64_t)PKT(glrun->GetRUNHEADER_PKT());
3743 ULong64_t dbrunt1 = (ULong64_t)PKT((UInt_t)atoll(row->GetField(5)));
3744 chkpkt1 = labs(orunh1-dbrunt1);
3745 //
3746 ULong64_t chkpkt2 = 0;
3747 ULong64_t orunh2 = (ULong64_t)OBT(glrun->GetRUNHEADER_OBT());
3748 ULong64_t dbrunt2 = (ULong64_t)OBT((UInt_t)atoll(row->GetField(3)));
3749 chkpkt2 = labs(orunh2-dbrunt2);
3750 //
3751 ULong64_t chkpkt3 = 0;
3752 ULong64_t orunh3 = (ULong64_t)(glrun->GetRUNHEADER_TIME());
3753 ULong64_t dbrunt3 = (ULong64_t)((UInt_t)atoll(row->GetField(2)));
3754 chkpkt3 = labs(orunh3-dbrunt3);
3755 //
3756 if ( (chkpkt1 < 200 || chkpkt2 < 20000) && chkpkt3 < 20 ){
3757 // if ( chkpkt1 < 100 && chkpkt2 < 30000 && chkpkt3 < 30 ){
3758 //
3759 if ( IsDebug() ) printf(" FOUND!!! check1 %llu<200 cechk2 %llu<20000 check3 %llu<20 \n",chkpkt1,chkpkt2,chkpkt3);
3760 //
3761 found = true;
3762 //
3763 } else {
3764 //
3765 if ( IsDebug() ) printf(" Check failed: check1 %llu<200? cechk2 %llu<20000? check3 %llu<20? \n",chkpkt1,chkpkt2,chkpkt3);
3766 //
3767 found = false;
3768 //
3769 };
3770 };
3771 };
3772 //
3773 if ( found ){
3774 //
3775 // we have found the missing piece, glue the two together, merge the informations, fill the gl_run table (check first runs do not exists), delete entry in frag table
3776 //
3777 if ( IsDebug() ) printf(" now you can handle the piece of the run \n ");
3778 //
3779 if ( foundinrun ){
3780 glrun->RestoreRun(conn,(UInt_t)atoll(row->GetField(0)),"GL_RUN_FRAGMENTS");
3781 glrun->DeleteRun(conn,(UInt_t)atoll(row->GetField(0)),"GL_RUN");
3782 };
3783 //
3784 GL_RUN *glrun1 = new GL_RUN();
3785 //
3786 // UInt_t idfrag = (UInt_t)atoll(row->GetField(0));
3787 //
3788 oss.str("");
3789 oss << " ID="<<row->GetField(0)<<";";
3790 //
3791 glrun1->Query_GL_RUN_FRAGMENTS(oss.str().c_str(),conn); // here we have runheader infos
3792 //
3793 // merge infos
3794 //
3795 UInt_t apkt = PKT(glrun1->GetRUNTRAILER_PKT());
3796 ULong64_t aobt = OBT(glrun1->GetRUNTRAILER_OBT());
3797 UInt_t bpkt = PKT(glrun->GetRUNHEADER_PKT());
3798 ULong64_t bobt = OBT(glrun->GetRUNHEADER_OBT());
3799 if ( IsDebug() ) printf(" Check overlapping events: %u %u %llu %llu firstev is %i\n",apkt,bpkt,aobt,bobt,firstev);
3800 TTree *T= 0;
3801 T = (TTree*)file->Get("Physics");
3802 if ( !T || T->IsZombie() ) throw -16;
3803 EventHeader *eh = 0;
3804 PscuHeader *ph = 0;
3805 T->SetBranchAddress("Header", &eh);
3806 while ( apkt > bpkt && aobt > bobt && firstev < lastev ){
3807 T->GetEntry(firstev);
3808 ph = eh->GetPscuHeader();
3809 bpkt = PKT(ph->GetCounter());
3810 bobt = OBT(ph->GetOrbitalTime());
3811 firstev++;
3812 if ( PEDANTIC ) throw -71;
3813 };
3814 if ( IsDebug() ) printf(" Check overlapping events done: %u %u %llu %llu firstev is %i\n",apkt,bpkt,aobt,bobt,firstev);
3815 //
3816 glrun1->SetPKT_COUNTER(glrun->GetPKT_COUNTER());
3817 glrun1->SetPKT_READY_COUNTER(glrun->GetPKT_READY_COUNTER());
3818 glrun1->SetRUNTRAILER_TIME(glrun->GetRUNTRAILER_TIME());
3819 glrun1->SetRUNTRAILER_OBT(glrun->GetRUNTRAILER_OBT());
3820 glrun1->SetRUNTRAILER_PKT(glrun->GetRUNTRAILER_PKT());
3821 //
3822 glrun->SetEV_FROM(firstev);
3823 glrun->SetNEVENTS(lastev-firstev+1);
3824 //
3825 glrun->SetRUNHEADER_TIME(glrun1->GetRUNHEADER_TIME());
3826 glrun->SetRUNHEADER_OBT(glrun1->GetRUNHEADER_OBT());
3827 glrun->SetRUNHEADER_PKT(glrun1->GetRUNHEADER_PKT());
3828 glrun->SetCOMPILATIONTIMESTAMP(glrun1->GetCOMPILATIONTIMESTAMP());
3829 glrun->SetFAV_WRK_SCHEDULE(glrun1->GetFAV_WRK_SCHEDULE());
3830 glrun->SetEFF_WRK_SCHEDULE(glrun1->GetEFF_WRK_SCHEDULE());
3831 glrun->SetPRH_VAR_TRG_MODE_A(glrun1->GetPRH_VAR_TRG_MODE_A());
3832 glrun->SetPRH_VAR_TRG_MODE_B(glrun1->GetPRH_VAR_TRG_MODE_B());
3833 glrun->SetACQ_BUILD_INFO(glrun1->GetACQ_BUILD_INFO());
3834 glrun->SetACQ_VAR_INFO(glrun1->GetACQ_VAR_INFO());
3835 glrun->SetRM_ACQ_AFTER_CALIB(glrun1->GetRM_ACQ_AFTER_CALIB());
3836 glrun->SetRM_ACQ_SETTING_MODE(glrun1->GetRM_ACQ_SETTING_MODE());
3837 glrun->SetTRK_CALIB_USED(glrun1->GetTRK_CALIB_USED());
3838 glrun->SetCAL_DSP_MASK(glrun1->GetCAL_DSP_MASK());
3839 glrun->SetLAST_TIMESYNC(glrun1->GetLAST_TIMESYNC());
3840 glrun->SetOBT_TIMESYNC(glrun1->GetOBT_TIMESYNC());
3841 //
3842 if ( glrun1->GetPHYSENDRUN_MASK_S3S2S12() ) glrun->SetPHYSENDRUN_MASK_S3S2S12(glrun1->GetPHYSENDRUN_MASK_S3S2S12());
3843 if ( glrun1->GetPHYSENDRUN_MASK_S11CRC() ) glrun->SetPHYSENDRUN_MASK_S11CRC(glrun1->GetPHYSENDRUN_MASK_S11CRC());
3844 //
3845 if ( !IsRunAlreadyInserted() ){
3846 //
3847 // glrun->SetID(this->AssignRunID());
3848 glrun->SetID_RUN_FRAG(glrun1->GetID());
3849 glrun->Fill_GL_RUN(conn);
3850 //
3851 // set id number
3852 //
3853 glrun1->SetID_RUN_FRAG(glrun->GetID());
3854 glrun1->Fill_GL_RUN(conn);
3855 //
3856 };
3857 // delete old entry in fragment table
3858 //
3859 glrun->DeleteRun(conn,0,"GL_RUN_FRAGMENTS");
3860 glrun1->DeleteRun(conn,0,"GL_RUN_FRAGMENTS");
3861 //
3862 delete glrun1;
3863 //
3864 //
3865 // return;
3866 //
3867 };
3868 //
3869 };
3870 //
3871 //
3872 zjustcheck:
3873 //
3874 if ( !found ){
3875 //
3876 if ( IsDebug() ) printf(" not found, check if we have already processed the file \n ");
3877 //
3878 // not found, has this run already inserted in the GL_RUN or in the GL_RUN_FRAGMENTS table?
3879 //
3880 oss.str("");
3881 oss << " SELECT ID FROM GL_RUN WHERE "
3882 << " BOOT_NUMBER=" << this->GetBOOTnumber() << " AND ("
3883 << " (RUNHEADER_TIME>=" << (UInt_t)(glrun->GetRUNHEADER_TIME()-10) << " AND "
3884 << " RUNTRAILER_TIME<=" << (UInt_t)(glrun->GetRUNTRAILER_TIME()+10) << " AND ("
3885 << " RUNHEADER_OBT>=" << glrun->GetRUNHEADER_OBT() << " OR "
3886 << " RUNHEADER_PKT>=" << glrun->GetRUNHEADER_PKT() << ") AND ("
3887 << " RUNTRAILER_OBT<=" << glrun->GetRUNTRAILER_OBT() << " OR "
3888 << " RUNTRAILER_PKT<=" << glrun->GetRUNTRAILER_PKT() << ") ) OR "
3889 << " (RUNHEADER_TIME<=" << (UInt_t)glrun->GetRUNHEADER_TIME() << " AND "
3890 << " RUNTRAILER_TIME>=" << (UInt_t)glrun->GetRUNTRAILER_TIME() <<" AND ("
3891 << " RUNHEADER_OBT<=" << glrun->GetRUNHEADER_OBT() << " OR "
3892 << " RUNHEADER_PKT<=" << glrun->GetRUNHEADER_PKT() << ") AND ("
3893 << " RUNTRAILER_OBT>=" << glrun->GetRUNTRAILER_OBT() << " OR "
3894 << " RUNTRAILER_PKT>=" << glrun->GetRUNTRAILER_PKT() << ") ));";
3895 //
3896 if ( IsDebug() ) printf(" check if run has been inserted: query is \n %s \n",oss.str().c_str());
3897 result = conn->Query(oss.str().c_str());
3898 //
3899 if ( !result ) throw -4;
3900 //
3901 row = result->Next();
3902 //
3903 if ( row ){
3904 if ( IsDebug() ) printf(" The run is already present in the GL_RUN table \n");
3905 if ( PEDANTIC ) throw -70;
3906 } else {
3907 if ( NoFrag() ){
3908 glrun->SetID_RUN_FRAG(glrun->GetID());
3909 glrun->Fill_GL_RUN(conn);
3910 glrun->DeleteRun(conn,0,"GL_RUN_FRAGMENTS");
3911 };
3912 };
3913 }; // EEE
3914
3915
3916 } else {
3917 if ( !IsRunAlreadyInserted() ){
3918 glrun->SetID(this->AssignRunID());
3919 glrun->SetID_RUN_FRAG(0);
3920 glrun->Fill_GL_RUN(conn);
3921 };
3922 }; // EEE
3923 //
3924 firstevno = lastentry + 1;
3925 //
3926 checkfirst = check;
3927 //
3928 };
3929 //
3930 if ( i > firstev ){
3931 if ( rhchko != rhchk ){
3932 if ( IsDebug() ) printf("oh oh... we have a runheader! stop here and handle later the remaining piece\n");
3933 lastev = i;
3934 return(false);
3935 };
3936 };
3937 //
3938 if ( check == checklast && i != lastev ){
3939 lastevtemp = i - 1;
3940 i = lastev - 1;
3941 };
3942 //
3943 };
3944 //
3945 lastev = lastevtemp;
3946 //
3947 return(false);
3948 //
3949 };
3950 };
3951 //
3952 return(false); // should never arrive here
3953 };
3954
3955 /**
3956 *
3957 * we end up here when we have a runheader and a runtrailer but they seems not belonging to the same run since the number of events does not coincide with the
3958 * number of event written in the runtrailer. We try to split into different runs scanning the physics events from the runheader to the runtrailer and
3959 * looking for non-physics packets inside.
3960 *
3961 */
3962 void PamelaDBOperations::HandleSuspiciousRun(){
3963 //
3964 PacketType *pctp=0;
3965 EventCounter *codt=0;
3966 EventCounter *codh=0;
3967 EventCounter *code=0;
3968 UInt_t firstev = 0;
3969 UInt_t lastev = 0;
3970 UInt_t nevent = 0;
3971 UInt_t checkfirst = 0;
3972 UInt_t checklast = 0;
3973 UInt_t firstentry = 0;
3974 UInt_t lastentry = 0;
3975 UInt_t firstTime = 0;
3976 UInt_t lastTime = 0;
3977 UInt_t firstPkt = 0;
3978 UInt_t lastPkt = 0;
3979 UInt_t firstObt = 0;
3980 UInt_t lastObt = 0;
3981 //
3982 pcksList packetsNames;
3983 pcksList::iterator Iter;
3984 getPacketsNames(packetsNames);
3985 //
3986 TTree *rh=0;
3987 rh = (TTree*)file->Get("RunHeader");
3988 if ( !rh || rh->IsZombie() ) throw -17;
3989 TTree *T=0;
3990 T =(TTree*)file->Get("Physics");
3991 if ( !T || T->IsZombie() ) throw -16;
3992 EventHeader *eh = 0;
3993 PscuHeader *ph = 0;
3994 T->SetBranchAddress("Header", &eh);
3995 nevent = T->GetEntries();
3996 //
3997 codt = eht->GetCounter();
3998 codh = ehh->GetCounter();
3999 firstev = codh->Get(pctp->Physics);
4000 lastev = codt->Get(pctp->Physics)-1;
4001 if ( IsDebug() ) printf(" From the current runheader firstev is %u from the runtrailer lastev is %u \n",firstev,lastev);
4002 //
4003 if ( firstev == lastev+1 ) { // no events inside the run!
4004 if ( IsDebug() ) printf(" Checking but no events in the run! \n");
4005 //
4006 this->FillClass();
4007 if ( !IsRunAlreadyInserted() ){
4008 glrun->SetID(this->AssignRunID());
4009 glrun->SetID_RUN_FRAG(0);
4010 glrun->Fill_GL_RUN(conn);
4011 };
4012 //
4013 } else {
4014 //
4015 UInt_t nrunh = 0 + codh->Get(pctp->RunHeader);
4016 UInt_t nrunh1 = 0 + codh->Get(pctp->RunHeader);
4017 T->GetEntry(firstev);
4018 code = eh->GetCounter();
4019 checkfirst = 0;
4020 for(Iter = packetsNames.begin(); Iter != packetsNames.end(); Iter++){
4021 if ( strcmp(*Iter,"Physics") ) checkfirst += code->Get(GetPacketType(*Iter));
4022 if ( !strcmp(*Iter,"RunHeader") ) nrunh1++;
4023 };
4024 if ( IsDebug() ) printf(" Check first is %i \n",checkfirst);
4025 //
4026 T->GetEntry(lastev);
4027 code = eh->GetCounter();
4028 checklast = 0;
4029 for(Iter = packetsNames.begin(); Iter != packetsNames.end(); Iter++){
4030 if ( strcmp(*Iter,"Physics") ) checklast += code->Get(GetPacketType(*Iter));
4031 };
4032 if ( IsDebug() ) printf(" Check last is %i \n",checklast);
4033 //
4034 if ( checkfirst == checklast ){
4035 //
4036 if ( IsDebug() ) printf(" No packets but physics inside the run, I will consider it as good\n");
4037 //
4038 this->FillClass();
4039 if ( !IsRunAlreadyInserted() ){
4040 glrun->SetID(this->AssignRunID());
4041 glrun->SetID_RUN_FRAG(0);
4042 glrun->Fill_GL_RUN(conn);
4043 };
4044 //
4045 } else {
4046 //
4047 if ( IsDebug() ) printf(" There are no-physics packets inside the run, try to separate runs \n");
4048 //
4049 Bool_t emptyruns = false;
4050 UInt_t check = 0;
4051 UInt_t firstevno = firstev;
4052 //
4053 for (UInt_t i=firstev; i<=lastev; i++){
4054 //
4055 T->GetEntry(i);
4056 code = eh->GetCounter();
4057 //
4058 check = 0;
4059 //
4060 for(Iter = packetsNames.begin(); Iter != packetsNames.end(); Iter++){
4061 if ( strcmp(*Iter,"Physics") ) check += code->Get(GetPacketType(*Iter));
4062 if ( !strcmp(*Iter,"RunHeader") ) nrunh++;
4063 };
4064 //
4065 if ( checkfirst < check || i == lastev ){
4066 //
4067 firstentry = firstevno;
4068 //
4069 if ( checkfirst < check ){
4070 lastentry = i-1;
4071 } else {
4072 lastentry = i;
4073 };
4074 //
4075 if ( IsDebug() ) printf(" Run between %i and %i entries\n",firstentry,lastentry);
4076 //
4077 glrun->SetEV_FROM(firstentry);
4078 glrun->SetEV_TO(lastentry);
4079 if ( lastentry == (firstentry-1) ){ // no physics packets inside physics run with no runheader no runtrailer
4080 if ( IsDebug() ) printf(" no physics packets inside physics run with no runheader no runtrailer\n");
4081 lastentry--;
4082 };
4083 glrun->SetNEVENTS(lastentry-firstentry+1);
4084 //
4085 glrun->Set_GL_RUNH0();
4086 glrun->Set_GL_RUNT0();
4087 //
4088 glrun->SetLAST_TIMESYNC(0);
4089 glrun->SetOBT_TIMESYNC(0);
4090 //
4091 T->GetEntry(firstentry);
4092 ph = eh->GetPscuHeader();
4093 firstObt = ph->GetOrbitalTime();
4094 firstTime = this->GetAbsTime(firstObt);
4095 firstPkt = ph->GetCounter();
4096 //
4097 T->GetEntry(lastentry);
4098 ph = eh->GetPscuHeader();
4099 lastObt = ph->GetOrbitalTime();
4100 lastTime = this->GetAbsTime(lastObt);
4101 lastPkt = ph->GetCounter();
4102 //
4103 glrun->SetRUNHEADER_PKT(firstPkt);
4104 glrun->SetRUNTRAILER_PKT(lastPkt);
4105 //
4106 glrun->SetRUNHEADER_OBT(firstObt);
4107 glrun->SetRUNTRAILER_OBT(lastObt);
4108 //
4109 if ( IsDebug() ) printf(" AA THIS RUN: RUNHEADER_OBT %u RUNTRAILER_OBT %u RUNHEADER_PKT %u RUNTRAILER_PKT %u \n", glrun->GetRUNHEADER_OBT(),glrun->GetRUNTRAILER_OBT(),glrun->GetRUNHEADER_PKT(),glrun->GetRUNTRAILER_PKT());
4110 //
4111 if ( (firstev == firstentry && !emptyruns) || nrunh == (nrunh1 + 1) ){
4112 rh->GetEntry(nrunh1-1);
4113 phh = ehh->GetPscuHeader();
4114 nrunh1++;
4115 glrun->Set_GL_RUNH(runh,phh);
4116 firstTime = this->GetAbsTime(phh->GetOrbitalTime());
4117 if ( IsDebug() ) printf(" We have the runheader \n");
4118 };
4119 if ( lastev == i && checkfirst == check ){
4120 glrun->Set_GL_RUNT(runt,pht);
4121 lastTime = this->GetAbsTime(pht->GetOrbitalTime());
4122 if ( IsDebug() ) printf(" We have the runtrailer \n");
4123 };
4124 if ( IsDebug() ) printf(" BB THIS RUN: RUNHEADER_OBT %u RUNTRAILER_OBT %u RUNHEADER_PKT %u RUNTRAILER_PKT %u \n", glrun->GetRUNHEADER_OBT(),glrun->GetRUNTRAILER_OBT(),glrun->GetRUNHEADER_PKT(),glrun->GetRUNTRAILER_PKT());
4125 //
4126 if ( lastentry == (firstentry-2) ){ // no events in the run
4127 emptyruns = true;
4128 if ( IsDebug() ) printf(" No events in the run \n");
4129 lastTime = firstTime;
4130 if ( (UInt_t)firstTime == this->GetAbsTime(phh->GetOrbitalTime()) ){
4131 lastObt = glrun->RUNHEADER_OBT;
4132 lastPkt = glrun->RUNHEADER_PKT;
4133 } else {
4134 lastObt = firstObt;
4135 lastPkt = firstPkt;
4136 };
4137 glrun->SetRUNTRAILER_PKT(lastPkt);
4138 glrun->SetRUNTRAILER_OBT(lastObt);
4139 lastentry++;
4140 };
4141 //
4142 this->SetCommonGLRUN(firstTime,lastTime);
4143 this->SetPhysEndRunVariables();
4144 //
4145 if ( !IsRunAlreadyInserted() ){
4146 glrun->SetID(this->AssignRunID());
4147 glrun->SetID_RUN_FRAG(0);
4148 glrun->Fill_GL_RUN(conn);
4149 };
4150 //
4151 if ( i == lastev && checkfirst < check ){ // if the last event gives a wrong check...
4152 //
4153 firstentry = i;
4154 //
4155 lastentry = i;
4156 //
4157 if ( IsDebug() ) printf(" Run between %i and %i entries\n",firstentry,lastentry);
4158 //
4159 glrun->SetEV_FROM(firstentry);
4160 glrun->SetEV_TO(lastentry);
4161 glrun->SetNEVENTS(lastentry-firstentry+1);
4162 //
4163 glrun->Set_GL_RUNH0();
4164 //
4165 glrun->SetLAST_TIMESYNC(0);
4166 glrun->SetOBT_TIMESYNC(0);
4167 //
4168 T->GetEntry(firstentry);
4169 ph = eh->GetPscuHeader();
4170 firstObt = ph->GetOrbitalTime();
4171 firstTime = this->GetAbsTime(firstObt);
4172 firstPkt = ph->GetCounter();
4173 //
4174 glrun->SetRUNHEADER_PKT(firstPkt);
4175 //
4176 glrun->SetRUNHEADER_OBT(firstObt);
4177 //
4178 glrun->Set_GL_RUNT(runt,pht);
4179 lastTime = this->GetAbsTime(pht->GetOrbitalTime());
4180 if ( IsDebug() ) printf(" We have the runtrailer \n");
4181 //
4182 this->SetCommonGLRUN(firstTime,lastTime);
4183 this->SetPhysEndRunVariables();
4184 //
4185 if ( !IsRunAlreadyInserted() ){
4186 glrun->SetID(this->AssignRunID());
4187 glrun->SetID_RUN_FRAG(0);
4188 glrun->Fill_GL_RUN(conn);
4189 };
4190 };
4191 //
4192 firstevno = lastentry + 1;
4193 //
4194 checkfirst = check;
4195 //
4196 };
4197 //
4198 if ( check == checklast && i != lastev ) i = lastev - 1; // >>>>>>>>>>>>>>>>>>>>>>
4199 //
4200 };
4201 };
4202 };
4203 //
4204 return;
4205 };
4206
4207
4208 /**
4209 * Scan calorimeter calibrations packets, fill the GL_CALO_CALIB table
4210 */
4211 Int_t PamelaDBOperations::insertCALO_CALIB(){
4212 //
4213 TSQLResult *result = 0;
4214 TSQLRow *row = 0;
4215 //
4216 stringstream oss;
4217 oss.str("");
4218 //
4219 CalibCalPedEvent *calibCalPed = 0;
4220 TTree *tr = 0;
4221 EventHeader *eh = 0;
4222 PscuHeader *ph = 0;
4223 //
4224 UInt_t nevents = 0;
4225 UInt_t fromtime = 0;
4226 UInt_t totime = 0;
4227 UInt_t obt = 0;
4228 UInt_t pkt = 0;
4229 //
4230 tr = (TTree*)file->Get("CalibCalPed");
4231 if ( !tr || tr->IsZombie() ) throw -21;
4232 //
4233 tr->SetBranchAddress("CalibCalPed", &calibCalPed);
4234 tr->SetBranchAddress("Header", &eh);
4235 nevents = tr->GetEntries();
4236 //
4237 if ( !nevents ) return(1);
4238 //
4239 for (UInt_t i=0; i < nevents; i++){
4240 tr->GetEntry(i);
4241 for (UInt_t section = 0; section < 4; section++){
4242 //
4243 if ( calibCalPed->cstwerr[section] ){
4244 valid = 1;
4245 if ( calibCalPed->cperror[section] ) valid = 0;
4246 ph = eh->GetPscuHeader();
4247 obt = ph->GetOrbitalTime();
4248 pkt = ph->GetCounter();
4249 fromtime = this->GetAbsTime(ph->GetOrbitalTime());
4250 if ( this->PKT(pkt) >= this->PKT(pktfirst) && this->PKT(pkt) <= upperpkt && this->OBT(obt) >= this->OBT(obtfirst) && this->OBT(obt) <= upperobt ){
4251 //
4252 if ( IsDebug() ) printf(" Calo calibration for section %i at time %u obt %u pkt %u \n",section,fromtime,obt,pkt);
4253 //
4254 // check if the calibration has already been inserted
4255 //
4256 oss.str("");
4257 oss << " SELECT ID FROM GL_CALO_CALIB WHERE "
4258 << " SECTION = "<< section << " AND "
4259 << " BOOT_NUMBER = "<< this->GetBOOTnumber() << " AND "
4260 << " OBT = "<< obt << " AND "
4261 << " PKT = "<< pkt << ";";
4262 //
4263 if ( IsDebug() ) printf(" Check if the calo calibration has already been inserted: query is \n %s \n",oss.str().c_str());
4264 result = conn->Query(oss.str().c_str());
4265 //
4266 if ( !result ) throw -4;
4267 //
4268 row = result->Next();
4269 //
4270 if ( row ){
4271 //
4272 if ( IsDebug() ) printf(" Calo calibration already inserted in the DB\n");
4273 if ( PEDANTIC ) throw -73;
4274 //
4275 } else {
4276 //
4277 // we have to insert a new calibration, check where to place it
4278 //
4279 oss.str("");
4280 oss << " SELECT ID,TO_TIME FROM GL_CALO_CALIB WHERE "
4281 << " SECTION = "<< section << " AND "
4282 << " FROM_TIME < "<< fromtime << " AND "
4283 << " TO_TIME > "<< fromtime << ";";
4284 //
4285 if ( IsDebug() ) printf(" Check where to place the calo calibration: query is \n %s \n",oss.str().c_str());
4286 result = conn->Query(oss.str().c_str());
4287 //
4288 if ( !result ) throw -4;
4289 //
4290 row = result->Next();
4291 //
4292 if ( !row ){
4293 //
4294 // no calibrations in the db contain our calibration
4295 //
4296 if ( IsDebug() ) printf(" Calibration with fromtime lower than others to be inserted in the DB for section %i \n",section);
4297 if ( fromtime < 1150871000 ){ //1150866904
4298 if ( IsDebug() ) printf(" First PAMELA flight calibration at time %u \n",fromtime);
4299 fromtime = 0;// the first flight calibration was taken at about 1156429100 s, this line allow to analyze first runs in raw mode
4300 };
4301 //
4302 oss.str("");
4303 oss << " SELECT FROM_TIME FROM GL_CALO_CALIB WHERE "
4304 << " SECTION = "<< section << " AND "
4305 << " FROM_TIME > "<< fromtime << " ORDER BY FROM_TIME ASC LIMIT 1;";
4306 //
4307 if ( IsDebug() ) printf(" Check the upper limit for calibration: query is \n %s \n",oss.str().c_str());
4308 result = conn->Query(oss.str().c_str());
4309 //
4310 if ( !result ) throw -4;
4311 //
4312 row = result->Next();
4313 if ( !row ){
4314 totime = numeric_limits<UInt_t>::max();
4315 } else {
4316 totime = (UInt_t)atoll(row->GetField(0));
4317 };
4318 //
4319 } else {
4320 //
4321 // determine upper and lower limits and make space for the new calibration
4322 //
4323 totime = (UInt_t)atoll(row->GetField(1));
4324 //
4325 oss.str("");
4326 oss << " UPDATE GL_CALO_CALIB SET "
4327 << " TO_TIME = "<< fromtime << " WHERE " // NOTICE: to_time is equal to from_time of the calibration before, so the interval is: [from_time,to_time[
4328 << " ID = "<< row->GetField(0) << ";";
4329 //
4330 if ( IsDebug() ) printf(" Make space for the new calibration: query is \n %s \n",oss.str().c_str());
4331 result = conn->Query(oss.str().c_str());
4332 //
4333 if ( !result ) throw -4;
4334 //
4335 };
4336 //
4337 oss.str("");
4338 oss << " INSERT INTO GL_CALO_CALIB (ID,ID_ROOT_L0,EV_ROOT,FROM_TIME,TO_TIME,SECTION,OBT,PKT,BOOT_NUMBER,VALIDATION) "
4339 << " VALUES (NULL,' "
4340 << idroot << "','"
4341 << i << "','"
4342 << fromtime << "','"
4343 << totime << "','"
4344 << section << "','"
4345 << obt << "','"
4346 << pkt << "','"
4347 << this->GetBOOTnumber() << "','"
4348 << valid << "');";
4349 //
4350 if ( IsDebug() ) printf(" Insert the new calibration: query is \n %s \n",oss.str().c_str());
4351 //
4352 result = conn->Query(oss.str().c_str());
4353 //
4354 if ( !result ) throw -4;
4355 //
4356 };
4357 //
4358 } else {
4359 //
4360 if ( IsDebug() ) printf(" Calo calibration for section %i at time %u obt %u pkt %u OUTSIDE the considered interval \n",section,fromtime,obt,pkt);
4361 // if ( PEDANTIC ) throw -74;
4362 //
4363 };
4364 //
4365 };
4366 };
4367 };
4368 //
4369 return(0);
4370 };
4371
4372
4373 /**
4374 * Scan calorimeter calibrations packets, fill the GL_CALO_CALIB table
4375 */
4376 Int_t PamelaDBOperations::insertCALOPULSE_CALIB(){
4377 //
4378 TSQLResult *result = 0;
4379 TSQLRow *row = 0;
4380 //
4381 stringstream oss;
4382 oss.str("");
4383 //
4384 oss << " DESCRIBE GL_CALOPULSE_CALIB;";
4385 if ( IsDebug() ) printf(" Check if the GL_CALOPULSE_CALIB table exists: query is \n %s \n",oss.str().c_str());
4386 result = conn->Query(oss.str().c_str());
4387 //
4388 if ( conn->GetErrorCode() ){
4389 if ( IsDebug() ) printf(" The GL_CALOPULSE_CALIB table does not exists! \n");
4390 throw -30;
4391 };
4392 //
4393 // CaloPulse1
4394 //
4395 CalibCalPulse1Event *cp1 = 0;
4396 TTree *tr = 0;
4397 EventHeader *eh = 0;
4398 PscuHeader *ph = 0;
4399 //
4400 UInt_t nevents = 0;
4401 UInt_t fromtime = 0;
4402 UInt_t totime = 0;
4403 UInt_t obt = 0;
4404 UInt_t pkt = 0;
4405 //
4406 tr = (TTree*)file->Get("CalibCalPulse1");
4407 if ( !tr || tr->IsZombie() ) throw -31;
4408 //
4409 tr->SetBranchAddress("CalibCalPulse1", &cp1);
4410 tr->SetBranchAddress("Header", &eh);
4411 nevents = tr->GetEntries();
4412 //
4413 if ( nevents > 0 ){
4414 //
4415 for (UInt_t i=0; i < nevents; i++){
4416 tr->GetEntry(i);
4417 for (UInt_t section = 0; section < 4; section++){
4418 //
4419 if ( cp1->pstwerr[section] && cp1->unpackError == 0 ){
4420 valid = 1;
4421 if ( cp1->pperror[section] ) valid = 0;
4422 ph = eh->GetPscuHeader();
4423 obt = ph->GetOrbitalTime();
4424 pkt = ph->GetCounter();
4425 fromtime = this->GetAbsTime(ph->GetOrbitalTime());
4426 if ( this->PKT(pkt) >= this->PKT(pktfirst) && this->PKT(pkt) <= upperpkt && this->OBT(obt) >= this->OBT(obtfirst) && this->OBT(obt) <= upperobt ){
4427 // if ( this->PKT(pkt) >= this->PKT(pktfirst) && this->OBT(obt) >= this->OBT(obtfirst) ){
4428 //
4429 if ( IsDebug() ) printf(" Calo pulse1 calibration for section %i at time %u obt %u pkt %u \n",section,fromtime,obt,pkt);
4430 //
4431 // check if the calibration has already been inserted
4432 //
4433 oss.str("");
4434 oss << " SELECT ID FROM GL_CALOPULSE_CALIB WHERE "
4435 << " SECTION = "<< section << " AND "
4436 << " PULSE_AMPLITUDE = 0 AND "
4437 << " BOOT_NUMBER = "<< this->GetBOOTnumber() << " AND "
4438 << " OBT = "<< obt << " AND "
4439 << " PKT = "<< pkt << ";";
4440 //
4441 if ( IsDebug() ) printf(" Check if the calo pulse1 calibration has already been inserted: query is \n %s \n",oss.str().c_str());
4442 result = conn->Query(oss.str().c_str());
4443 //
4444 if ( !result ) throw -4;
4445 //
4446 row = result->Next();
4447 //
4448 if ( row ){
4449 //
4450 if ( IsDebug() ) printf(" Calo pulse1 calibration already inserted in the DB\n");
4451 if ( PEDANTIC ) throw -75;
4452 //
4453 } else {
4454 //
4455 // we have to insert a new calibration, check where to place it
4456 //
4457 oss.str("");
4458 oss << " SELECT ID,TO_TIME FROM GL_CALOPULSE_CALIB WHERE "
4459 << " SECTION = "<< section << " AND "
4460 << " PULSE_AMPLITUDE = 0 AND "
4461 << " SECTION = "<< section << " AND "
4462 << " FROM_TIME < "<< fromtime << " AND "
4463 << " TO_TIME > "<< fromtime << ";";
4464 //
4465 if ( IsDebug() ) printf(" Check where to place the pulse1 calo calibration: query is \n %s \n",oss.str().c_str());
4466 result = conn->Query(oss.str().c_str());
4467 //
4468 if ( !result ) throw -4;
4469 //
4470 row = result->Next();
4471 //
4472 if ( !row ){
4473 //
4474 // no calibrations in the db contain our calibration
4475 //
4476 if ( IsDebug() ) printf(" Pulse1 calibration with fromtime lower than others to be inserted in the DB for section %i \n",section);
4477 if ( fromtime < 1150871000 ){ //1150866904
4478 if ( IsDebug() ) printf(" First PAMELA flight calibration at time %u \n",fromtime);
4479 fromtime = 0;// the first flight calibration was taken at about 1156429100 s, this line allow to analyze first runs in raw mode
4480 };
4481 //
4482 oss.str("");
4483 oss << " SELECT FROM_TIME FROM GL_CALOPULSE_CALIB WHERE "
4484 << " PULSE_AMPLITUDE = 0 AND "
4485 << " SECTION = "<< section << " AND "
4486 << " FROM_TIME > "<< fromtime << " ORDER BY FROM_TIME ASC LIMIT 1;";
4487 //
4488 if ( IsDebug() ) printf(" Check the upper limit for pulse1 calibration: query is \n %s \n",oss.str().c_str());
4489 result = conn->Query(oss.str().c_str());
4490 //
4491 if ( !result ) throw -4;
4492 //
4493 row = result->Next();
4494 if ( !row ){
4495 totime = numeric_limits<UInt_t>::max();
4496 } else {
4497 totime = (UInt_t)atoll(row->GetField(0));
4498 };
4499 //
4500 } else {
4501 //
4502 // determine upper and lower limits and make space for the new calibration
4503 //
4504 totime = (UInt_t)atoll(row->GetField(1));
4505 //
4506 oss.str("");
4507 oss << " UPDATE GL_CALOPULSE_CALIB SET "
4508 << " TO_TIME = "<< fromtime << " WHERE " // NOTICE: to_time is equal to from_time of the calibration before, so the interval is: [from_time,to_time[
4509 << " ID = "<< row->GetField(0) << ";";
4510 //
4511 if ( IsDebug() ) printf(" Make space for the new pulse1 calibration: query is \n %s \n",oss.str().c_str());
4512 result = conn->Query(oss.str().c_str());
4513 //
4514 if ( !result ) throw -4;
4515 //
4516 };
4517 //
4518 oss.str("");
4519 oss << " INSERT INTO GL_CALOPULSE_CALIB (ID,ID_ROOT_L0,EV_ROOT,FROM_TIME,TO_TIME,SECTION,PULSED_STRIP,PULSE_AMPLITUDE,OBT,PKT,BOOT_NUMBER,VALIDATION) "
4520 << " VALUES (NULL,' "
4521 << idroot << "','"
4522 << i << "','"
4523 << fromtime << "','"
4524 << totime << "','"
4525 << section << "',NULL,'0','"
4526 << obt << "','"
4527 << pkt << "','"
4528 << this->GetBOOTnumber() << "','"
4529 << valid << "');";
4530 //
4531 if ( IsDebug() ) printf(" Insert the new pulse1 calibration: query is \n %s \n",oss.str().c_str());
4532 //
4533 result = conn->Query(oss.str().c_str());
4534 //
4535 if ( !result ) throw -4;
4536 //
4537 };
4538 //
4539 } else {
4540 //
4541 if ( IsDebug() ) printf(" Pulse1 calo calibration for section %i at time %u obt %u pkt %u OUTSIDE the considered time interval \n",section,fromtime,obt,pkt);
4542 // if ( PEDANTIC ) throw -76;
4543 //
4544 };
4545 //
4546 };
4547 };
4548 };
4549 };
4550 //
4551 // CaloPulse2
4552 //
4553 tr->Reset();
4554 CalibCalPulse2Event *cp2 = 0;
4555 tr = 0;
4556 //
4557 nevents = 0;
4558 fromtime = 0;
4559 totime = 0;
4560 obt = 0;
4561 pkt = 0;
4562 //
4563 tr = (TTree*)file->Get("CalibCalPulse2");
4564 if ( !tr || tr->IsZombie() ) throw -32;
4565 //
4566 tr->SetBranchAddress("CalibCalPulse2", &cp2);
4567 tr->SetBranchAddress("Header", &eh);
4568 nevents = tr->GetEntries();
4569 //
4570 if ( nevents > 0 ){
4571 //
4572 for (UInt_t i=0; i < nevents; i++){
4573 tr->GetEntry(i);
4574 for (UInt_t section = 0; section < 4; section++){
4575 //
4576 if ( cp2->pstwerr[section] && cp2->unpackError == 0 ){
4577 valid = 1;
4578 if ( cp2->pperror[section] ) valid = 0;
4579 ph = eh->GetPscuHeader();
4580 obt = ph->GetOrbitalTime();
4581 pkt = ph->GetCounter();
4582 fromtime = this->GetAbsTime(ph->GetOrbitalTime());
4583 if ( this->PKT(pkt) >= this->PKT(pktfirst) && this->PKT(pkt) <= upperpkt && this->OBT(obt) >= this->OBT(obtfirst) && this->OBT(obt) <= upperobt ){
4584 // if ( this->PKT(pkt) >= this->PKT(pktfirst) && this->OBT(obt) >= this->OBT(obtfirst) ){
4585 //
4586 if ( IsDebug() ) printf(" Calo pulse2 calibration for section %i at time %u obt %u pkt %u \n",section,fromtime,obt,pkt);
4587 //
4588 // check if the calibration has already been inserted
4589 //
4590 oss.str("");
4591 oss << " SELECT ID FROM GL_CALOPULSE_CALIB WHERE "
4592 << " SECTION = "<< section << " AND "
4593 << " PULSE_AMPLITUDE != 0 AND "
4594 << " BOOT_NUMBER = "<< this->GetBOOTnumber() << " AND "
4595 << " OBT = "<< obt << " AND "
4596 << " PKT = "<< pkt << ";";
4597 //
4598 if ( IsDebug() ) printf(" Check if the calo pulse2 calibration has already been inserted: query is \n %s \n",oss.str().c_str());
4599 result = conn->Query(oss.str().c_str());
4600 //
4601 if ( !result ) throw -4;
4602 //
4603 row = result->Next();
4604 //
4605 if ( row ){
4606 //
4607 if ( IsDebug() ) printf(" Calo pulse2 calibration already inserted in the DB\n");
4608 if ( PEDANTIC ) throw -77;
4609 //
4610 } else {
4611 //
4612 // we have to insert a new calibration
4613 //
4614 //
4615 // Determine the amplitude of the pulse
4616 //
4617 UInt_t pampli = 1;
4618 UInt_t pstrip = 0;
4619 UInt_t se = 0;
4620 if ( section == 1 ) se = 2;
4621 if ( section == 2 ) se = 3;
4622 if ( section == 3 ) se = 1;
4623 for (Int_t ii=0;ii<16;ii++){
4624 if ( cp2->calpuls[se][0][ii] > 10000. ){
4625 pampli = 2;
4626 pstrip = ii;
4627 };
4628 };
4629 if ( pampli == 1 ){
4630 Bool_t found = false;
4631 Float_t delta=0.;
4632 UInt_t cstr = 0;
4633 while ( !found && cstr < 16 ){
4634 for (Int_t ii=0;ii<16;ii++){
4635 delta = cp2->calpuls[se][0][ii] - cp2->calpuls[se][0][cstr];
4636 if ( IsDebug() ) printf(" cstr is %u ii is %i delta is %f \n",cstr,ii,delta);
4637 if ( delta > 500. ){
4638 pampli = 1;
4639 pstrip = ii;
4640 found = true;
4641 if ( IsDebug() ) printf(" FOUND cstr is %u ii is %i delta is %f \n",cstr,ii,delta);
4642 };
4643 };
4644 cstr++;
4645 };
4646 if ( !found ) pstrip = 100;
4647 };
4648 if ( IsDebug() ) printf(" The amplitude of the pulser is %u (where 1 = low pulse, 2 = high pulse), pulsed strip is %u \n",pampli,pstrip);
4649 //
4650 // we have to insert a new calibration, check where to place it
4651 //
4652 oss.str("");
4653 oss << " SELECT ID,TO_TIME FROM GL_CALOPULSE_CALIB WHERE "
4654 << " SECTION = "<< section << " AND "
4655 << " PULSE_AMPLITUDE = " << pampli << " AND "
4656 << " SECTION = "<< section << " AND "
4657 << " FROM_TIME < "<< fromtime << " AND "
4658 << " TO_TIME > "<< fromtime << ";";
4659 //
4660 if ( IsDebug() ) printf(" Check where to place the pulse2 calo calibration: query is \n %s \n",oss.str().c_str());
4661 result = conn->Query(oss.str().c_str());
4662 //
4663 if ( !result ) throw -4;
4664 //
4665 row = result->Next();
4666 //
4667 if ( !row ){
4668 //
4669 // no calibrations in the db contain our calibration
4670 //
4671 if ( IsDebug() ) printf(" Pulse2 calibration with fromtime lower than others to be inserted in the DB for section %i \n",section);
4672 if ( fromtime < 1150871000 ){ //1150866904
4673 if ( IsDebug() ) printf(" First PAMELA flight calibration at time %u \n",fromtime);
4674 fromtime = 0;// the first flight calibration was taken at about 1156429100 s, this line allow to analyze first runs in raw mode
4675 };
4676 //
4677 oss.str("");
4678 oss << " SELECT FROM_TIME FROM GL_CALOPULSE_CALIB WHERE "
4679 << " PULSE_AMPLITUDE = " << pampli << " AND "
4680 << " SECTION = "<< section << " AND "
4681 << " FROM_TIME > "<< fromtime << " ORDER BY FROM_TIME ASC LIMIT 1;";
4682 //
4683 if ( IsDebug() ) printf(" Check the upper limit for pulse2 calibration: query is \n %s \n",oss.str().c_str());
4684 result = conn->Query(oss.str().c_str());
4685 //
4686 if ( !result ) throw -4;
4687 //
4688 row = result->Next();
4689 if ( !row ){
4690 totime = numeric_limits<UInt_t>::max();
4691 } else {
4692 totime = (UInt_t)atoll(row->GetField(0));
4693 };
4694 //
4695 } else {
4696 //
4697 // determine upper and lower limits and make space for the new calibration
4698 //
4699 totime = (UInt_t)atoll(row->GetField(1));
4700 //
4701 oss.str("");
4702 oss << " UPDATE GL_CALOPULSE_CALIB SET "
4703 << " TO_TIME = "<< fromtime << " WHERE " // NOTICE: to_time is equal to from_time of the calibration before, so the interval is: [from_time,to_time[
4704 << " ID = "<< row->GetField(0) << ";";
4705 //
4706 if ( IsDebug() ) printf(" Make space for the new pulse2 calibration: query is \n %s \n",oss.str().c_str());
4707 result = conn->Query(oss.str().c_str());
4708 //
4709 if ( !result ) throw -4;
4710 //
4711 };
4712 //
4713 // Fill the DB
4714 //
4715 oss.str("");
4716 // oss << " INSERT INTO GL_CALOPULSE_CALIB (ID,ID_ROOT_L0,EV_ROOT,FROM_TIME,TO_TIME,SECTION,OBT,PKT,BOOT_NUMBER,VALIDATION) "
4717 oss << " INSERT INTO GL_CALOPULSE_CALIB (ID,ID_ROOT_L0,EV_ROOT,FROM_TIME,TO_TIME,SECTION,PULSED_STRIP,PULSE_AMPLITUDE,OBT,PKT,BOOT_NUMBER,VALIDATION) "
4718 << " VALUES (NULL,' "
4719 << idroot << "','"
4720 << i << "','"
4721 << fromtime << "','"
4722 << totime << "','"
4723 << section << "','"
4724 << pstrip << "','"
4725 << pampli << "','"
4726 << obt << "','"
4727 << pkt << "','"
4728 << this->GetBOOTnumber() << "','"
4729 << valid << "');";
4730 //
4731 if ( IsDebug() ) printf(" Insert the new pulse2 calibration: query is \n %s \n",oss.str().c_str());
4732 //
4733 result = conn->Query(oss.str().c_str());
4734 //
4735 if ( !result ) throw -4;
4736 //
4737 };
4738 //
4739 } else {
4740 //
4741 if ( IsDebug() ) printf(" Pulse2 calo calibration for section %i at time %u obt %u pkt %u OUTSIDE the considered time interval \n",section,fromtime,obt,pkt);
4742 // if ( PEDANTIC ) throw -78;
4743 //
4744 };
4745 //
4746 };
4747 };
4748 };
4749 };
4750 //
4751 return(0);
4752 };
4753
4754 /**
4755 * Fill the GL_TRK_CALIB table
4756 */
4757 void PamelaDBOperations::HandleTRK_CALIB(Bool_t pk1, Bool_t pk2){
4758
4759 GL_TRK_CALIB *glcal = new GL_TRK_CALIB();
4760 //
4761 glcal->ID = 0;
4762 glcal->ID_ROOT_L0 = GetID_ROOT();
4763 glcal->EV_ROOT_CALIBTRK1 = t1;
4764 glcal->EV_ROOT_CALIBTRK2 = t2;
4765 glcal->FROM_TIME = fromtime;
4766 glcal->TO_TIME = 0;
4767 glcal->OBT1 = obt1;
4768 glcal->OBT2 = obt2;
4769 glcal->PKT1 = pkt1;
4770 glcal->PKT2 = pkt2;
4771 glcal->BOOT_NUMBER = GetBOOTnumber();
4772 glcal->VALIDATION = valid;
4773 //
4774 HandleTRK_CALIB(glcal);
4775 //
4776 delete glcal;
4777 }
4778 /**
4779 * Fill the GL_TRK_CALIB table
4780 */
4781 void PamelaDBOperations::HandleTRK_CALIB(GL_TRK_CALIB *glcal){
4782
4783 Bool_t pk1 = (glcal->OBT1>0&&glcal->PKT1>0);
4784 Bool_t pk2 = (glcal->OBT2>0&&glcal->PKT2>0);
4785 UInt_t boot_number = glcal->BOOT_NUMBER;
4786 UInt_t obt1 = glcal->OBT1;
4787 UInt_t obt2 = glcal->OBT2;
4788 UInt_t pkt1 = glcal->PKT1;
4789 UInt_t pkt2 = glcal->PKT2;
4790 UInt_t fromtime = glcal->FROM_TIME;
4791 UInt_t totime = 0;
4792 UInt_t idroot = glcal->ID_ROOT_L0;
4793 UInt_t t1 = glcal->EV_ROOT_CALIBTRK1;
4794 UInt_t t2 = glcal->EV_ROOT_CALIBTRK2;
4795 UInt_t valid = glcal->VALIDATION;
4796 //
4797 TSQLResult *result = 0;
4798 TSQLRow *row = 0;
4799 //
4800 stringstream oss;
4801 oss.str("");
4802 //
4803 //
4804 if ( !pk1 && !pk2 ){
4805 if ( IsDebug() ) printf(" Cannot handle trk calibration with both packet missing!\n");
4806 return;
4807 };
4808 //
4809 // check if the calibration has already been inserted
4810 //
4811 oss.str("");
4812 oss << " SELECT ID FROM GL_TRK_CALIB WHERE "
4813 << " BOOT_NUMBER = "<< boot_number; //
4814 oss << " AND FROM_TIME="<<fromtime; /// NEWNEWNEW -- VA BENE ?!?!?!?!
4815 oss << " AND ( ( ";
4816 if ( pk1 ){
4817 oss << " OBT1 = "<< obt1 << " AND "
4818 << " PKT1 = "<< pkt1
4819 << " ) OR ( ";
4820 } else {
4821 oss << " PKT1 = "<< pkt2-1
4822 << " ) OR ( ";
4823 };
4824 if ( pk2 ){
4825 oss << " OBT2 = "<< obt2 << " AND "
4826 << " PKT2 = "<< pkt2;
4827 } else {
4828 oss << " PKT2 = "<< pkt1+1;
4829 };
4830 oss << " ) );";
4831 //
4832 if ( IsDebug() ) printf(" Check if the trk calibration has already been inserted: query is \n %s \n",oss.str().c_str());
4833 result = conn->Query(oss.str().c_str());
4834 //
4835 if ( !result ) throw -4;
4836 //
4837 row = result->Next();
4838 //
4839 if ( row ){
4840 //
4841 if ( IsDebug() ) printf(" Trk calibration already inserted in the DB\n");
4842 if ( PEDANTIC ) throw -80;
4843 //
4844 } else {
4845 //
4846 // we have to insert a new calibration, check where to place it
4847 //
4848 oss.str("");
4849 oss << " SELECT ID,TO_TIME FROM GL_TRK_CALIB WHERE "
4850 << " FROM_TIME < "<< fromtime << " AND "
4851 << " TO_TIME > "<< fromtime << ";";
4852 //
4853 if ( IsDebug() ) printf(" Check where to place the trk calibration: query is \n %s \n",oss.str().c_str());
4854 result = conn->Query(oss.str().c_str());
4855 //
4856 if ( !result ) throw -4;
4857 //
4858 row = result->Next();
4859 //
4860 if ( !row ){
4861 //
4862 // no calibrations in the db contain our calibration
4863 //
4864 if ( IsDebug() ) printf(" Calibration with fromtime lower than others to be inserted in the DB\n");
4865 if ( fromtime < 1150871000 ) fromtime = 0; // the first flight calibration was taken at about 1150863300 s, this line allows to analyze first runs in raw mode
4866 //
4867 oss.str("");
4868 oss << " SELECT FROM_TIME FROM GL_TRK_CALIB WHERE "
4869 << " FROM_TIME > "<< fromtime << " ORDER BY FROM_TIME ASC LIMIT 1;";
4870 //
4871 if ( IsDebug() ) printf(" Check the upper limit for calibration: query is \n %s \n",oss.str().c_str());
4872 result = conn->Query(oss.str().c_str());
4873 //
4874 if ( !result ) throw -4;
4875 //
4876 row = result->Next();
4877 if ( !row ){
4878 totime = numeric_limits<UInt_t>::max();
4879 } else {
4880 totime = (UInt_t)atoll(row->GetField(0));
4881 };
4882 //
4883 } else {
4884 //
4885 // determine upper and lower limits and make space for the new calibration
4886 //
4887 totime = (UInt_t)atoll(row->GetField(1));
4888 //
4889 oss.str("");
4890 oss << " UPDATE GL_TRK_CALIB SET "
4891 << " TO_TIME = "<< fromtime << " WHERE " // NOTICE: to_time is equal to from_time of the calibration before, so the interval is: [from_time,to_time[
4892 << " ID = "<< row->GetField(0) << ";";
4893 //
4894 if ( IsDebug() ) printf(" Make space for the new trk calibration: query is \n %s \n",oss.str().c_str());
4895 result = conn->Query(oss.str().c_str());
4896 //
4897 if ( !result ) throw -4;
4898 //
4899 };
4900 //
4901 oss.str("");
4902 oss << " INSERT INTO GL_TRK_CALIB (ID,ID_ROOT_L0,EV_ROOT_CALIBTRK1,EV_ROOT_CALIBTRK2,FROM_TIME,TO_TIME,OBT1,PKT1,OBT2,PKT2,BOOT_NUMBER,VALIDATION) "
4903 << " VALUES (NULL,' "
4904 << idroot << "',";
4905 //
4906 if ( !pk1 ){
4907 oss << "NULL,";
4908 } else {
4909 oss << "'"
4910 << t1 << "',";
4911 };
4912 //
4913 if ( !pk2 ){
4914 oss << "NULL,'";
4915 } else {
4916 oss << "'"
4917 << t2 << "','";
4918 };
4919 //
4920 oss << fromtime << "','"
4921 << totime << "','"
4922 << obt1 << "','"
4923 << pkt1 << "','"
4924 << obt2 << "','"
4925 << pkt2 << "','"
4926 << boot_number << "','"
4927 << valid << "');";
4928 //
4929 if ( IsDebug() ) printf(" Insert the new trk calibration: query is \n %s \n",oss.str().c_str());
4930 //
4931 result = conn->Query(oss.str().c_str());
4932 //
4933 if ( !result ) throw -4;
4934 //
4935 };
4936
4937 oss.str("");
4938 oss << " SELECT ID FROM GL_TRK_CALIB ORDER BY ID DESC LIMIT 1 ;";
4939 if ( IsDebug() ) cout << oss.str().c_str() << endl;
4940 result = conn->Query(oss.str().c_str());
4941 if ( !result ) throw -4;;
4942 row = result->Next();
4943 if(row)glcal->ID = (UInt_t)atoll(row->GetField(0));
4944 //
4945 delete result; // mmm... "Error in <TMySQLResult::Next>: result set closed" solved? 090112 [8RED error messages]
4946 //
4947 };
4948
4949 /**
4950 * Scan tracker calibrations packets, fill the GL_TRK_CALIB table
4951 */
4952 Int_t PamelaDBOperations::insertTRK_CALIB(){
4953 //
4954 CalibTrk1Event *caltrk1 = 0;
4955 CalibTrk2Event *caltrk2 = 0;
4956 TTree *tr1 = 0;
4957 TTree *tr2 = 0;
4958 EventHeader *eh1 = 0;
4959 PscuHeader *ph1 = 0;
4960 EventHeader *eh2 = 0;
4961 PscuHeader *ph2 = 0;
4962 //
4963 PacketType *pctp=0;
4964 EventCounter *codt2=0;
4965 //
4966 Int_t nevents1 = 0;
4967 Int_t nevents2 = 0;
4968 //
4969 fromtime = 0;
4970 //
4971 obt1 = 0;
4972 pkt1 = 0;
4973 obt2 = 0;
4974 pkt2 = 0;
4975 //
4976 tr1 = (TTree*)file->Get("CalibTrk1");
4977 if ( !tr1 || tr1->IsZombie() ) throw -22;
4978 tr2 = (TTree*)file->Get("CalibTrk2");
4979 if ( !tr2 || tr2->IsZombie() ) throw -23;
4980 //
4981 tr1->SetBranchAddress("CalibTrk1", &caltrk1);
4982 tr1->SetBranchAddress("Header", &eh1);
4983 nevents1 = tr1->GetEntries();
4984 tr2->SetBranchAddress("CalibTrk2", &caltrk2);
4985 tr2->SetBranchAddress("Header", &eh2);
4986 nevents2 = tr2->GetEntries();
4987 //
4988 if ( !nevents1 && !nevents2 ) return(1);
4989 //
4990 t2 = -1;
4991 Int_t pret2 = 0;
4992 Int_t t2t1cal = 0;
4993 //
4994 bool MISSING_pkt1 = true;
4995 bool MISSING_pkt2 = true;
4996 int ncalib = 0;
4997 bool try_to_recover = false;
4998 //
4999 for (t1=0; t1 < nevents1; t1++){//loop over packet1
5000 //
5001 pret2 = t2;
5002 tr1->GetEntry(t1);
5003 //
5004 ph1 = eh1->GetPscuHeader();
5005 obt1 = ph1->GetOrbitalTime();
5006 pkt1 = ph1->GetCounter();
5007 fromtime = GetAbsTime(ph1->GetOrbitalTime());
5008 //
5009 // chek if the packet number and obt are consistent with the other packets ???
5010 //
5011 if ( PKT(pkt1) >= PKT(pktfirst) && PKT(pkt1) <= upperpkt && OBT(obt1) >= OBT(obtfirst) && OBT(obt1) <= upperobt ){
5012 // if ( this->PKT(pkt1) >= this->PKT(pktfirst) && this->OBT(obt1) >= this->OBT(obtfirst) ){
5013 //
5014 if ( IsDebug() ) printf("\n Trk calibration1 %u at time %u obt %u pkt %u \n",t1,fromtime,obt1,pkt1);
5015 //
5016 valid = ValidateTrkCalib( caltrk1, eh1 );
5017 if ( IsDebug() ) cout << " pkt1 validation --> "<<valid<<endl;
5018 //
5019 // Do we have the second calibration packet?
5020 //
5021 if ( IsDebug() ) cout << " Loop over calibration2 to search associated calibration: "<<endl;
5022 while ( t2t1cal < t1+1 ){ // get the calibration packet2 that follows the packet1
5023 //
5024 t2++;
5025 //
5026 pret2 = t2 - 1; // EMILIANO
5027 //
5028 if ( t2 < nevents2 ){
5029 tr2->GetEntry(t2);
5030 codt2 = eh2->GetCounter();
5031 t2t1cal = codt2->Get(pctp->CalibTrk1);
5032 //
5033 ph2 = eh2->GetPscuHeader();
5034 obt2 = ph2->GetOrbitalTime();
5035 pkt2 = ph2->GetCounter();
5036 //
5037 if ( IsDebug() ) printf(" >> trk calibration2 at obt %u pkt %u t2 is %u , t2t1cal is %u \n",obt2,pkt2,t2,t2t1cal);
5038 // if ( caltrk2->unpackError != 0 || caltrk2->good0 == 0 ) valid = 0; // CONDITIONS ON THE GOODNESS OF THE CALIBRATION PKT2
5039 //
5040 } else {
5041 //
5042 // running out of vector without finding the corresponding calibration, sig
5043 //
5044 if ( IsDebug() ) printf(" t2 >= nevents2 \n");
5045 pret2 = t2;
5046 obt2 = 0;
5047 // pkt2 = pkt1+2;
5048 pkt2 = 0;
5049 t2t1cal = t1+1;
5050 };
5051 // if ( (this->PKT(pkt2) < this->PKT(pktfirst) || this->PKT(pkt2) > upperpkt) && (this->OBT(obt2) < this->OBT(obtfirst) || this->OBT(obt2) > upperobt) ){
5052
5053 // EMILIANO
5054 // if ( (this->PKT(pkt2) < this->PKT(pktfirst) || this->PKT(pkt2) > upperpkt) || (this->OBT(obt2) < this->OBT(obtfirst) || this->OBT(obt2) > upperobt) ){
5055 // // if ( this->PKT(pkt2) < this->PKT(pktfirst) && this->OBT(obt2) < this->OBT(obtfirst) ){
5056 // if ( IsDebug() ) printf(" running out of vector without finding the corresponding calibration, sig \n");
5057 // //
5058 // // running out of vector without finding the corresponding calibration, sig
5059 // //
5060 // pret2 = t2;
5061 // obt2 = 0;
5062 // // pkt2 = pkt1+2;
5063 // pkt2 = 0;
5064 // t2t1cal = t1+1;
5065 // };
5066
5067
5068 //
5069 };
5070 //
5071 if ( IsDebug() ) printf(" Check if trk calibration2 is the right one \n");
5072 //
5073 // EMILIANO
5074 if ( ( PKT(pkt2) < PKT(pktfirst) || PKT(pkt2) > upperpkt) || (OBT(obt2) < OBT(obtfirst) || OBT(obt2) > upperobt) ){
5075 // if ( this->PKT(pkt2) < this->PKT(pktfirst) && this->OBT(obt2) < this->OBT(obtfirst) ){
5076 if ( IsDebug() ) printf(" *WARNING* The calibration found is outside the interval, sig \n");
5077 //
5078 // running out of vector without finding the corresponding calibration, sig
5079 //
5080 pret2 = t2;
5081 obt2 = 0;
5082 pkt2 = 0;
5083 };
5084 if ( PKT(pkt2) == PKT(pkt1)+1 ){
5085 if ( IsDebug() ) cout << " ...OK"<<endl;
5086 // =======================
5087 // The calibration is good
5088 // =======================
5089 //
5090 // if ( IsDebug() ) printf(" Found trk calibration2 at obt %u pkt %u t2 is %u \n",obt2,pkt2,t2);
5091 // if ( IsDebug() ) printf(" Trk calibration2 at obt %u pkt %u t2 is %u is good \n",obt2,pkt2,t2);
5092 // if ( IsDebug() ) printf("\n Trk calibration2 at time %u obt %u pkt %u \n",fromtime,obt2,pkt2);
5093 if ( IsDebug() ) printf(" Trk calibration2 %u at time %u obt %u pkt %u \n",t2,fromtime,obt2,pkt2);
5094 //
5095 UInt_t valid2 = ValidateTrkCalib( caltrk2, eh2 );
5096 if ( IsDebug() ) cout << " pkt2 validation --> "<<valid2<<endl;
5097 // valid = valid & valid2;
5098 valid = valid & valid2; //QUESTO VA CAMBIATO
5099 //
5100 // Handle good calib
5101 //
5102 MISSING_pkt1 = false;
5103 MISSING_pkt2 = false;
5104 // this->HandleTRK_CALIB(!MISSING_pkt1,!MISSING_pkt2);
5105 //
5106 // Check for missing calibtrk1
5107 //
5108 if ( t2 != pret2+1 ){
5109 //
5110 if ( IsDebug() ) printf(" Missing the trk calibration1! Next one at obt %u pkt %u t2 is %u pret2 is %u \n",obt2,pkt2,t2,pret2);
5111 //
5112 while ( t2 > pret2+1 ){
5113 //
5114 // handle missing calib1
5115 //
5116 pret2++;
5117 //
5118 obt1 = 0;
5119 pkt1 = 0;
5120 //
5121 tr2->GetEntry(pret2);
5122 ph2 = eh2->GetPscuHeader();
5123 obt2 = ph2->GetOrbitalTime();
5124 pkt2 = ph2->GetCounter();
5125 //
5126 fromtime = this->GetAbsTime(ph2->GetOrbitalTime());
5127 //
5128 valid = 0;
5129 MISSING_pkt1 = true;
5130 MISSING_pkt2 = false;
5131 // this->HandleTRK_CALIB(!MISSING_pkt1,!MISSING_pkt2);
5132 //
5133 };
5134 //
5135 };
5136 //
5137 } else if ( this->PKT(pkt2) > this->PKT(pkt1)+1 ){
5138 //
5139 // Check for missing calibtrk2
5140 //
5141 if ( IsDebug() ) printf(" Missing the trk calibration2! Next one at obt %u pkt %u t2 is %u\n",obt2,pkt2,t2);
5142 t2 = pret2;
5143 //
5144 // handle missing calib2
5145 //
5146 obt2 = 0;
5147 pkt2 = 0;
5148 valid = 0;
5149 MISSING_pkt1 = false;
5150 MISSING_pkt2 = true;
5151 // this->HandleTRK_CALIB(!MISSING_pkt1,!MISSING_pkt2);
5152 //
5153 };
5154 //
5155
5156 if( !(MISSING_pkt1&MISSING_pkt2) ){
5157 this->HandleTRK_CALIB(!MISSING_pkt1,!MISSING_pkt2);
5158 ncalib++;
5159 if( MISSING_pkt1||MISSING_pkt2||!valid )try_to_recover=true;
5160 }
5161
5162
5163 } else {
5164 //
5165 if ( IsDebug() ) printf(" Trk calibration1 at time %u obt %u pkt %u OUTSIDE the considered time interval \n",fromtime,obt1,pkt1);
5166 // if ( PEDANTIC ) throw -79;
5167 //
5168 };
5169 //
5170
5171 }; //end loop on pkt1
5172
5173
5174
5175 //
5176 // we have one more calib pkt2 !
5177 //
5178 t2++;
5179 while ( t2 < nevents2 ){
5180 //
5181 // handle missing calib1
5182 //
5183 if ( IsDebug() ) printf(" t2 is %u nevents2 is %u \n",t2,nevents2);
5184 obt1 = 0;
5185 pkt1 = 0;
5186 //
5187 tr2->GetEntry(t2);
5188 ph2 = eh2->GetPscuHeader();
5189 obt2 = ph2->GetOrbitalTime();
5190 pkt2 = ph2->GetCounter();
5191 //
5192 fromtime = this->GetAbsTime(ph2->GetOrbitalTime());
5193 valid = 0;
5194 // if ( this->PKT(pkt1) >= this->PKT(pktfirst) && this->PKT(pkt1) <= upperpkt && this->OBT(obt1) >= this->OBT(obtfirst) && this->OBT(obt1) <= upperobt ){
5195 // EMILIANO
5196 if ( this->PKT(pkt2) >= this->PKT(pktfirst) && this->PKT(pkt2 <= upperpkt) && this->OBT(obt2) >= this->OBT(obtfirst) && this->OBT(obt2) <= upperobt ){
5197 // if ( this->PKT(pkt2) > this->PKT(pktfirst) || this->OBT(obt2) > this->OBT(obtfirst) ){
5198 //
5199 if ( IsDebug() ) printf(" Missing the trk calibration1! Next one at obt %u pkt %u t2 is %u\n",obt2,pkt2,t2);
5200 //
5201 MISSING_pkt1 = true;
5202 MISSING_pkt2 = false;
5203 this->HandleTRK_CALIB(!MISSING_pkt1,!MISSING_pkt2);
5204 ncalib++;
5205 if( MISSING_pkt1||MISSING_pkt2||!valid )try_to_recover=true;
5206 //
5207 };
5208 //
5209 t2++;
5210 //
5211 };
5212
5213 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5214 // -----------------------------------------------------------------
5215 // in case of corruption, check if the calibration can be recovered
5216 // from another chewbacca file
5217 // -----------------------------------------------------------------
5218 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5219
5220 // cout <<" TRY TO RECOVER ?? "<<try_to_recover<<endl;
5221
5222 if(chewbacca&&try_to_recover){
5223
5224
5225 if ( IsDebug() ) cout << endl << ">>>> TRY TO RECOVER TRACKER CALIBRATIONS <<<<"<<endl;
5226
5227 TSQLResult *result = 0;
5228 TSQLRow *row = 0;
5229 //
5230 stringstream oss;
5231 oss.str("");
5232 //
5233
5234 ////////////////////////////////////////////////////////////////////////
5235 // retrieve the name of the current file:
5236 ////////////////////////////////////////////////////////////////////////
5237 oss.str("");
5238 oss << "SELECT NAME FROM GL_ROOT where ID=" << GetID_ROOT() <<";";
5239 if ( IsDebug() ) cout << oss.str().c_str() << endl;
5240
5241 result = conn->Query(oss.str().c_str());
5242 if ( !result ) throw -4;;
5243 row = result->Next();
5244 TString thisfilename = (TString)row->GetField(0);
5245 if ( IsDebug() ) cout << "Current file ==> "<<thisfilename<<endl;
5246
5247 ////////////////////////////////////////////////////////////////////////
5248 // read all the calibrations inserted
5249 ////////////////////////////////////////////////////////////////////////
5250 oss.str("");
5251 oss << " SELECT ";
5252 oss << " ID,FROM_TIME,OBT1,PKT1,OBT2,PKT2,BOOT_NUMBER,VALIDATION,EV_ROOT_CALIBTRK1,EV_ROOT_CALIBTRK2,TO_TIME";
5253 oss << " FROM GL_TRK_CALIB ";
5254 oss << " ORDER BY ID DESC LIMIT "<<ncalib<<"; ";
5255 if ( IsDebug() ) cout << oss.str().c_str() << endl;
5256
5257 result = conn->Query(oss.str().c_str());
5258 if ( !result ) throw -4;;
5259 if ( IsDebug() ) cout <<"Rows: "<<result->GetRowCount()<<endl;
5260
5261 // -----------------------------------
5262 // loop over calibrations ...
5263 // -----------------------------------
5264 UInt_t nn=0;
5265 do {
5266 row = result->Next();
5267 if(!row)break;
5268
5269 UInt_t id = (UInt_t)atoll(row->GetField(0));
5270 UInt_t fromtime = (UInt_t)atoll(row->GetField(1));
5271 UInt_t obt1 = (UInt_t)atoll(row->GetField(2));
5272 UInt_t pkt1 = (UInt_t)atoll(row->GetField(3));
5273 UInt_t obt2 = (UInt_t)atoll(row->GetField(4));
5274 UInt_t pkt2 = (UInt_t)atoll(row->GetField(5));
5275 UInt_t boot = (UInt_t)atoll(row->GetField(6));
5276 UInt_t valid = (UInt_t)atoll(row->GetField(7));
5277 bool MISSING_pkt1 = (row->GetFieldLength(8)==0);
5278 bool MISSING_pkt2 = (row->GetFieldLength(9)==0);
5279 UInt_t totime = (UInt_t)atoll(row->GetField(10));
5280
5281 // -------------------------------------
5282 // ...check if the entry is corrupted...
5283 // -------------------------------------
5284 cout <<"*** "<< MISSING_pkt1 << MISSING_pkt2 << valid <<endl;
5285 bool CORRUPTED = (MISSING_pkt1||MISSING_pkt2||!valid);
5286
5287 if ( IsDebug() ) cout << "("<<nn<<") ID = "<<id<<" from GL_TRK_CALIB ==> corrupted ? "<<CORRUPTED<<endl;
5288
5289 // if( !CORRUPTED )continue; // nothing to do
5290
5291 /////////////////////////////////////////////////////////
5292 // if it is corrupted, ...look for ather chewbacca files
5293 // containing the same calibrations ...
5294 /////////////////////////////////////////////////////////
5295
5296 bool this_MISSING_pkt1 = false;
5297 bool this_MISSING_pkt2 = false;
5298 int this_t1=0;
5299 int this_t2=0;;
5300 UInt_t this_valid = 0;
5301
5302 TString path = "";
5303 TString name = "";
5304 TString raw = "";
5305 UInt_t obt0 = 0;
5306 UInt_t timesync = 0;
5307 UInt_t boot_number = 0;
5308 bool FOUND = false;
5309
5310 if ( IsDebug() ) cout << "------------------------------------------------------------" <<endl;
5311
5312 // for(int itable=0; itable<2; itable++){
5313 for(int itable=0; itable<1; itable++){
5314
5315 // ------------------------------------------------------
5316 // loop over both ROOT_TABLE and ROOT_TABLE_BAD
5317 // ------------------------------------------------------
5318
5319 TString table = "ROOT_TABLE";
5320 if(itable==1)table = "ROOT_TABLE_BAD";
5321
5322 oss.str("");
5323 oss << " SELECT ";
5324 oss << " FOLDER_NAME,FILE_NAME,OBT_TIME_SYNC,LAST_TIME_SYNC_INFO,BOOT_NUMBER,INPUT_NAME ";
5325 oss << " FROM "<<table;
5326 oss << " WHERE 1 " << endl;
5327 oss << " AND FILE_NAME != \""<< thisfilename<<"\"";
5328 if( !MISSING_pkt1 ){
5329 oss << " AND ";
5330 oss << " PKT_NUMBER_INIT < "<<pkt1;
5331 oss << " AND ";
5332 oss << " PKT_NUMBER_FINAL > "<<pkt1;
5333 oss << " AND ";
5334 oss << " PKT_OBT_INIT < "<<obt1;
5335 oss << " AND ";
5336 oss << " PKT_OBT_FINAL > "<<obt1;
5337 }else{
5338 if(pkt2>1) pkt1 = pkt2-1;//serve dopo
5339 }
5340 if( !MISSING_pkt2 ){
5341 oss << " AND ";
5342 oss << " PKT_NUMBER_INIT < "<<pkt2;
5343 oss << " AND ";
5344 oss << " PKT_NUMBER_FINAL > "<<pkt2;
5345 oss << " AND ";
5346 oss << " PKT_OBT_INIT < "<<obt2;
5347 oss << " AND ";
5348 oss << " PKT_OBT_FINAL > "<<obt2;
5349 }else{
5350 if(pkt1>0) pkt2 = pkt1+1;//serve dopo
5351 }
5352 if( boot> 0 ){
5353 oss << " AND ";
5354 oss << " BOOT_NUMBER = "<<boot;
5355 }else{
5356 }
5357 oss << " ORDER BY BAD_PKT_CALREAD ASC; ";
5358
5359 TSQLResult *result2 = 0;
5360 TSQLRow *row2 = 0;
5361
5362 if ( IsDebug() ) cout << oss.str().c_str() << endl;
5363 result2 = conn->Query(oss.str().c_str());
5364 if ( !result2 ) throw -4;;
5365 if ( IsDebug() ) cout <<"Rows: "<<result2->GetRowCount()<<endl;
5366
5367 // ------------------------------------------------------
5368 // loop over files containing repetition (if any)
5369 // ------------------------------------------------------
5370 do {
5371 row2 = result2->Next();
5372 if(!row2)break;
5373
5374 // ------------------------------------------------------
5375 // ... a repetition is found ...
5376 // ------------------------------------------------------
5377 path = (TString)row2->GetField(0);
5378 name = (TString)row2->GetField(1);
5379 raw = (TString)row2->GetField(5);
5380 obt0 = (UInt_t)atoll(row2->GetField(2));
5381 timesync = (UInt_t)atoll(row2->GetField(3));
5382 boot_number = (UInt_t)atoll(row2->GetField(4));
5383
5384 if ( IsDebug() ) cout << "- - - - - - - - - - -" <<endl;
5385 // cout << path <<endl;
5386 // cout << "File : " <<name <<endl;
5387 // cout << obt0 <<endl;
5388 // cout << timesync <<endl;
5389 // cout << "boot n. : "<<boot_number <<endl;
5390 // cout << raw <<endl;
5391
5392 // ------------------------------------------------------
5393 // ... retrieve the calibration packets.
5394 // ------------------------------------------------------
5395 if ( IsDebug() ) printf(" file is %s/%s \n",((TString)gSystem->ExpandPathName(path.Data())).Data(),name.Data());
5396 TFile *file = new TFile(((TString)gSystem->ExpandPathName(path.Data()))+"/"+name); // EM, path could be symbolic and we must expand it
5397 if(!file)throw -100;
5398 if(file->IsZombie())throw -100;
5399 //
5400 tr1 = (TTree*)file->Get("CalibTrk1");
5401 if ( !tr1 || tr1->IsZombie() ) throw -22;
5402 tr2 = (TTree*)file->Get("CalibTrk2");
5403 if ( !tr2 || tr2->IsZombie() ) throw -23;
5404 //
5405 tr1->SetBranchAddress("CalibTrk1", &caltrk1);
5406 tr1->SetBranchAddress("Header", &eh1);
5407 nevents1 = tr1->GetEntries();
5408 tr2->SetBranchAddress("CalibTrk2", &caltrk2);
5409 tr2->SetBranchAddress("Header", &eh2);
5410 nevents2 = tr2->GetEntries();
5411 for(this_t1=0; this_t1<nevents1; this_t1++){
5412 tr1->GetEntry(this_t1);
5413 if(
5414 (UInt_t)eh1->GetPscuHeader()->GetCounter() == pkt1 &&
5415 true) break;
5416 this_MISSING_pkt1 = true;
5417 }
5418 for(this_t2=0; this_t2<nevents2; this_t2++){
5419 tr2->GetEntry(this_t2);
5420 if(
5421 (UInt_t)eh2->GetPscuHeader()->GetCounter() == pkt2 &&
5422 true) break;
5423 this_MISSING_pkt2 = true;
5424 }
5425 this_valid =
5426 ValidateTrkCalib( caltrk1, eh1, file )
5427 *
5428 ValidateTrkCalib( caltrk2, eh2, file );
5429
5430 // ---------------------------------------------------------------------
5431 // accept the calibration if it is better than the previous:
5432 //
5433 // - if the new calibration is perfect (both valid packets)
5434 // - if the new calibration has both the packets and the previous does not
5435 // ---------------------------------------------------------------------
5436 if(
5437 ( !this_MISSING_pkt1&&!this_MISSING_pkt2&&this_valid )||
5438 ( (MISSING_pkt1||MISSING_pkt2) && (!this_MISSING_pkt1&&!this_MISSING_pkt2) )||
5439 false)FOUND=true;
5440
5441 if(file)file->Close();
5442
5443 if(FOUND)break;
5444
5445 }while(1);//endl loop over root table entries
5446
5447 if(FOUND)break;
5448
5449 }//end loop over tables
5450
5451 if(FOUND){
5452
5453 if ( IsDebug() ) cout << " >>> REPETITION FOUND :-) <<<" <<endl;
5454
5455 ////////////////////////////////////////////
5456 // insert a new entry in GL_TRK_CALIB and
5457 // modify the time-tag of the previous one
5458 ////////////////////////////////////////////
5459
5460 // ---------------------------------------------------------------------
5461 // step 1: insert a new raw file in GL_RAW
5462 // ---------------------------------------------------------------------
5463 //
5464 // check if the raw file already exist
5465 //
5466 UInt_t id_raw = 0; // EM GL_RAW is there only for backward compatibility so we do not need to fill it when in "chewbacca" mode
5467 // oss.str("");
5468 // oss << "SELECT ID FROM GL_RAW where NAME=\"" << gSystem->BaseName(raw.Data()) <<"\";";
5469 // if ( IsDebug() ) cout << oss.str().c_str() << endl;
5470
5471 // result = conn->Query(oss.str().c_str());
5472 // if ( !result ) throw -4;;
5473 // if ( IsDebug() ) cout <<"Rows: "<<result->GetRowCount()<<endl;
5474 // if( result->GetRowCount() == 0){
5475 // if ( IsDebug() ) cout << " << Insert new RAW file >> "<<endl;
5476 // // - - - - - - - - - - -
5477 // // insert new raw file
5478 // // - - - - - - - - - - -
5479 // GL_RAW glraw = GL_RAW();
5480 // glraw.PATH = gSystem->DirName(raw.Data());
5481 // glraw.NAME = gSystem->BaseName(raw.Data());
5482 // glraw.BOOT_NUMBER = boot_number;
5483 // //
5484 // insertPamelaRawFile( &glraw );
5485 // //
5486 // id_raw = glraw.ID;
5487 // }else{
5488 // row = result->Next();
5489 // id_raw = (UInt_t)atoll(row->GetField(0));
5490 // }
5491 // if ( IsDebug() ) cout << "ID_RAW = "<<id_raw<<endl;
5492
5493 // ---------------------------------------------------------------------
5494 // step 1(bis): retrieve the timesync id associated to the file
5495 // (NB, uso lo stesso associato al file iniziale)
5496 // ---------------------------------------------------------------------
5497 UInt_t idtimesync = 0;
5498 oss.str("");
5499 oss << " SELECT ID FROM GL_TIMESYNC where TIMESYNC="<<chlastts<<" AND OBT0="<<chobtts*1000<<" limit 1;";
5500 if ( debug ) printf(" %s \n",oss.str().c_str());
5501 result = conn->Query(oss.str().c_str());
5502 if ( !result ) throw -3;
5503 row = result->Next();
5504 if ( !row ) throw -3;
5505 idtimesync = (UInt_t)atoll(row->GetField(0));
5506 if ( IsDebug() ) cout << "ID_TIMESYNC = "<<idtimesync<<endl;
5507
5508 delete result;// mmm... "Error in <TMySQLResult::Next>: result set closed" solved? 090112 [8RED error messages]
5509 // ---------------------------------------------------------------------
5510 // step 2: insert a new root file in GL_ROOT
5511 // ---------------------------------------------------------------------
5512 //
5513 // check if the root file already exist
5514 //
5515 UInt_t id_root = 0;
5516 oss.str("");
5517 oss << "SELECT ID FROM GL_ROOT where NAME=\"" << gSystem->BaseName(name.Data()) <<"\";";
5518 if ( IsDebug() ) cout << oss.str().c_str() << endl;
5519
5520 result = conn->Query(oss.str().c_str());
5521 if ( !result ) throw -4;;
5522 if ( IsDebug() ) cout <<"Rows: "<<result->GetRowCount()<<endl;
5523 if( result->GetRowCount() == 0){
5524 if ( IsDebug() ) cout << " << Insert new ROOT file >> "<<endl;
5525 // - - - - - - - - - - -
5526 // insert new root file
5527 // - - - - - - - - - - -
5528 GL_ROOT glroot = GL_ROOT();
5529 glroot.ID_RAW = id_raw;
5530 glroot.ID_TIMESYNC = idtimesync;
5531 //
5532 // EM STATIC = the full expanded path must be put in the DB, KEEPENV = the path given as input (or found in ROOT_TABLE) must be used,
5533 // NOT STATIC NOT KEEPENV = $PAM_L0 must be used in the DB
5534 //
5535 if ( STATIC ){
5536 glroot.PATH = (TString)gSystem->ExpandPathName(path);
5537 } else {
5538 if ( KEEPENV ){
5539 glroot.PATH = path;
5540 } else {
5541 glroot.PATH = "$PAM_L0";
5542 };
5543 };
5544 // glroot.PATH = path;
5545 glroot.NAME = name;
5546 //
5547 insertPamelaRootFile( &glroot );
5548 //
5549 id_root = glroot.ID;
5550 }else{
5551 row = result->Next();
5552 if(row)id_root = (UInt_t)atoll(row->GetField(0));
5553 }
5554 if ( IsDebug() ) cout << "ID_ROOT = "<<id_root<<endl;
5555
5556 delete result;// mmm... "Error in <TMySQLResult::Next>: result set closed" solved? 090112 [8RED error messages]
5557 // ---------------------------------------------------------------------
5558 // step 3: modify time-tag of corrupted GL_TRK_CALIB entry
5559 // ---------------------------------------------------------------------
5560 if ( IsDebug() ) cout << " << Modify time-tag of calibration ID="<<id<<" >> "<<endl;
5561 oss.str("");
5562 oss << " UPDATE GL_TRK_CALIB SET "
5563 << " TO_TIME=0 , FROM_TIME=0 WHERE "
5564 << " ID = "<< id << ";";
5565 if ( IsDebug() ) cout << oss.str().c_str() << endl;
5566 result = conn->Query(oss.str().c_str());
5567 if ( !result ) throw -4;;
5568
5569 delete result; // mmm... "Error in <TMySQLResult::Next>: result set closed" solved? 090112 [8RED error messages]
5570
5571 // ---------------------------------------------------------------------
5572 // step 4: insert the new calibration:
5573 // ---------------------------------------------------------------------
5574 if ( IsDebug() ) cout << " << Insert new TRK calibration >> "<<endl;
5575 //
5576 GL_TRK_CALIB glcal = GL_TRK_CALIB();
5577 //
5578 glcal.ID_ROOT_L0 = id_root;
5579 glcal.EV_ROOT_CALIBTRK1 = this_t1;
5580 glcal.EV_ROOT_CALIBTRK2 = this_t2;
5581 glcal.FROM_TIME = fromtime;
5582 glcal.TO_TIME = totime;
5583 glcal.OBT1 = obt1;
5584 glcal.OBT2 = obt2;
5585 glcal.PKT1 = pkt1;
5586 glcal.PKT2 = pkt1;
5587 glcal.BOOT_NUMBER = GetBOOTnumber();
5588 glcal.VALIDATION = this_valid;
5589 //
5590 HandleTRK_CALIB(&glcal);
5591 if ( IsDebug() ) cout << "ID = "<<glcal.ID<<endl;
5592 //
5593
5594 }
5595 if ( IsDebug() ) cout << "------------------------------------------------------------" <<endl;
5596
5597 }while(1);//end loop over calibrations
5598
5599
5600 if( result )delete result;
5601 if( row )delete row;
5602
5603
5604
5605
5606
5607
5608 }
5609
5610
5611 // // ------------------------------
5612 // // try to recover the calibration
5613 // // ------------------------------
5614 // cout << "TRY TO RECOVER TRACKER CALIBRATION"<<endl;
5615 // //
5616 // ULong64_t time = 0; //absolute time
5617 // string path[100]; //mettere un limite massimo
5618 // int nrows = 0;
5619 // UInt_t pkt = 0;
5620 // UInt_t obt = 0;
5621 // char *type = "";
5622 // EventHeader *eh = new EventHeader();
5623 // CalibTrk1Event *c = new CalibTrk1Event();
5624
5625 // //
5626 // if(which_is_not_valid==1 || which_is_not_valid==3){
5627 // //
5628 // cout << "PKT1 --> missing or corrupted "<<endl;
5629 // type = "CalibTrk1";
5630 // pkt = pkt1;
5631 // obt = obt1;
5632 // time = this->GetAbsTime(obt1);
5633 // if( pkt1 == 0 ){//missing
5634 // time = this->GetAbsTime(obt2);
5635 // pkt = pkt2-1;
5636 // }
5637 // //
5638 // }else if (which_is_not_valid==2 || which_is_not_valid==3){
5639 // //
5640 // cout << "PKT2--> missing or corrupted "<<endl;
5641 // type = "CalibTrk2 ";
5642 // pkt = pkt2;
5643 // obt = obt2;
5644 // time = this->GetAbsTime(obt2);
5645 // if( pkt2 == 0 ){//missing
5646 // time = this->GetAbsTime(obt1);
5647 // pkt = pkt1+1;
5648 // }
5649 // //
5650 // }else{
5651 // cout << "this should not happen!!! "<<endl;
5652 // trow -666;
5653 // }
5654
5655 // nrows = Query_ROOT_TABLE(time,conn,path);// get the list of file which might contain the packet
5656
5657
5658 // for(int r=0; r<nrows; r++){ //loop over rows
5659 // if(path)cout << r << " >>>> "<<(path+r)->c_str() << endl;
5660 // /// verifica che il file non sia quello gia` aperto
5661 // }
5662
5663 // ////////////////////////////////////////////////////////////////////////
5664
5665 // TSQLResult *result = 0;
5666 // TSQLRow *row = 0;
5667 // //
5668 // stringstream oss;
5669 // oss.str("");
5670 // // ----------------------------------------
5671 // // read the id of last calibration inserted
5672 // // ----------------------------------------
5673 // oss.str("");
5674 // oss << " SELECT ";
5675 // oss << " (ID,ID_ROOT_L0,EV_ROOT_CALIBTRK1,EV_ROOT_CALIBTRK2,FROM_TIME,TO_TIME,OBT1,PKT1,OBT2,PKT2,BOOT_NUMBER,VALIDATION) ";
5676 // oss << " ORDER BY ID DESC LIMIT 1; ";
5677
5678 // result = conn->Query(oss.str().c_str());
5679 // row = result->Next();
5680 // if( !row )throw -666;
5681
5682 // if( result )delete result;
5683 // if( row )delete row;
5684
5685 // UInt_t id = (UInt_t)atoll(row->GetField(0));
5686
5687 // // -------------------------------------
5688 // // ...and modify it with new parameters
5689 // // -------------------------------------
5690
5691
5692 // }
5693 //
5694 return(0);
5695 };
5696
5697
5698 /**
5699 * Scan S4 calibrations packets, fill the GL_S4_CALIB table
5700 */
5701 Int_t PamelaDBOperations::insertS4_CALIB(){
5702 //
5703 TSQLResult *result = 0;
5704 TSQLRow *row = 0;
5705 //
5706 stringstream oss;
5707 oss.str("");
5708 //
5709 TTree *tr = 0;
5710 EventHeader *eh = 0;
5711 PscuHeader *ph = 0;
5712 //
5713 UInt_t nevents = 0;
5714 UInt_t fromtime = 0;
5715 UInt_t totime = 0;
5716 UInt_t obt = 0;
5717 UInt_t pkt = 0;
5718 //
5719 tr = (TTree*)file->Get("CalibS4");
5720 if ( !tr || tr->IsZombie() ) throw -24;
5721 //
5722 tr->SetBranchAddress("Header", &eh);
5723 //
5724 nevents = tr->GetEntries();
5725 //
5726 if ( !nevents ) return(1);
5727 //
5728 for (UInt_t i = 0; i < nevents; i++){
5729 //
5730 tr->GetEntry(i);
5731 //
5732 ph = eh->GetPscuHeader();
5733 obt = ph->GetOrbitalTime();
5734 pkt = ph->GetCounter();
5735 fromtime = this->GetAbsTime(ph->GetOrbitalTime());
5736 if ( this->PKT(pkt) >= this->PKT(pktfirst) && this->PKT(pkt) <= upperpkt && this->OBT(obt) >= this->OBT(obtfirst) && this->OBT(obt) <= upperobt ){
5737 // if ( this->PKT(pkt) >= this->PKT(pktfirst) && this->OBT(obt) >= this->OBT(obtfirst) ){
5738 //
5739 if ( IsDebug() ) printf(" S4 calibration at time %u obt %u pkt %u \n",fromtime,obt,pkt);
5740 //
5741 // check if the calibration has already been inserted
5742 //
5743 oss.str("");
5744 oss << " SELECT ID FROM GL_S4_CALIB WHERE "
5745 << " BOOT_NUMBER = "<< this->GetBOOTnumber() << " AND "
5746 << " OBT = "<< obt << " AND "
5747 << " PKT = "<< pkt << ";";
5748 //
5749 if ( IsDebug() ) printf(" Check if the S4 calibration has already been inserted: query is \n %s \n",oss.str().c_str());
5750 result = conn->Query(oss.str().c_str());
5751 //
5752 if ( !result ) throw -4;
5753 //
5754 row = result->Next();
5755 //
5756 if ( row ){
5757 //
5758 if ( IsDebug() ) printf(" S4 calibration already inserted in the DB\n");
5759 if ( PEDANTIC ) throw -81;
5760 //
5761 } else {
5762 //
5763 // we have to insert a new calibration, check where to place it
5764 //
5765 oss.str("");
5766 oss << " SELECT ID,TO_TIME FROM GL_S4_CALIB WHERE "
5767 << " FROM_TIME < "<< fromtime << " AND "
5768 << " TO_TIME > "<< fromtime << ";";
5769 //
5770 if ( IsDebug() ) printf(" Check where to place the S4 calibration: query is \n %s \n",oss.str().c_str());
5771 result = conn->Query(oss.str().c_str());
5772 //
5773 if ( !result ) throw -4;
5774 //
5775 row = result->Next();
5776 //
5777 if ( !row ){
5778 //
5779 // no calibrations in the db contain our calibration
5780 //
5781 if ( IsDebug() ) printf(" Calibration with fromtime lower than others to be inserted in the DB \n");
5782 if ( fromtime < 1150871000 ){
5783 if ( IsDebug() ) printf(" First PAMELA flight calibration at time %u \n",fromtime);
5784 fromtime = 0;// the first flight calibration was taken at about 1156429100 s, this line allow to analyze first runs in raw mode
5785 };
5786 //
5787 oss.str("");
5788 oss << " SELECT FROM_TIME FROM GL_S4_CALIB WHERE "
5789 << " FROM_TIME > "<< fromtime << " ORDER BY FROM_TIME ASC LIMIT 1;";
5790 //
5791 if ( IsDebug() ) printf(" Check the upper limit for calibration: query is \n %s \n",oss.str().c_str());
5792 result = conn->Query(oss.str().c_str());
5793 //
5794 if ( !result ) throw -4;
5795 //
5796 row = result->Next();
5797 if ( !row ){
5798 totime = numeric_limits<UInt_t>::max();
5799 } else {
5800 totime = (UInt_t)atoll(row->GetField(0));
5801 };
5802 //
5803 } else {
5804 //
5805 // determine upper and lower limits and make space for the new calibration
5806 //
5807 totime = (UInt_t)atoll(row->GetField(1));
5808 //
5809 oss.str("");
5810 oss << " UPDATE GL_S4_CALIB SET "
5811 << " TO_TIME = "<< fromtime << " WHERE " // NOTICE: to_time is equal to from_time of the calibration before, so the interval is: [from_time,to_time[
5812 << " ID = "<< row->GetField(0) << ";";
5813 //
5814 if ( IsDebug() ) printf(" Make space for the new calibration: query is \n %s \n",oss.str().c_str());
5815 result = conn->Query(oss.str().c_str());
5816 //
5817 if ( !result ) throw -4;
5818 //
5819 };
5820 //
5821 oss.str("");
5822 oss << " INSERT INTO GL_S4_CALIB (ID,ID_ROOT_L0,EV_ROOT,FROM_TIME,TO_TIME,OBT,PKT,BOOT_NUMBER) "
5823 << " VALUES (NULL,' "
5824 << idroot << "','"
5825 << i << "','"
5826 << fromtime << "','"
5827 << totime << "','"
5828 << obt << "','"
5829 << pkt << "','"
5830 << this->GetBOOTnumber() << "');";
5831 //
5832 if ( IsDebug() ) printf(" Insert the new calibration: query is \n %s \n",oss.str().c_str());
5833 //
5834 result = conn->Query(oss.str().c_str());
5835 //
5836 if ( !result ) throw -4;
5837 //
5838 };
5839 //
5840 } else {
5841 //
5842 if ( IsDebug() ) printf(" S4 calibration at time %u obt %u pkt %u OUTSIDE the considered time interval\n",fromtime,obt,pkt);
5843 // if ( PEDANTIC ) throw -82;
5844 //
5845 };
5846 //
5847 };
5848 //
5849 return(0);
5850 };
5851
5852 /**
5853 * Scan the fragment table and move old fragments to the GL_RUN table
5854 */
5855 Int_t PamelaDBOperations::CleanGL_RUN_FRAGMENTS(){
5856 return(this->CleanGL_RUN_FRAGMENTS(""));
5857 };
5858
5859 /**
5860 * Scan the fragment table and move old fragments to the GL_RUN table
5861 */
5862 Int_t PamelaDBOperations::CleanGL_RUN_FRAGMENTS(Bool_t runpieces){
5863 return(this->CleanGL_RUN_FRAGMENTS("",runpieces));
5864 };
5865
5866 /**
5867 * Scan the fragment table and move old fragments to the GL_RUN table
5868 */
5869 Int_t PamelaDBOperations::CleanGL_RUN_FRAGMENTS(TString fcleanfile){
5870 return(this->CleanGL_RUN_FRAGMENTS("",false));
5871 };
5872
5873 /**
5874 * Scan the fragment table and move old fragments to the GL_RUN table
5875 */
5876 Int_t PamelaDBOperations::CleanGL_RUN_FRAGMENTS(TString fcleanfile, Bool_t runpieces){
5877 //
5878 TSQLResult *nresult = 0;
5879 TSQLRow *nrow = 0;
5880 TSQLResult *nresult1 = 0;
5881 TSQLRow *nrow1 = 0;
5882 TSQLResult *result = 0;
5883 TSQLRow *row = 0;
5884 TSQLResult *result2 = 0;
5885 TSQLRow *row2 = 0;
5886 //
5887 UInt_t moved = 0;
5888 //
5889 stringstream oss;
5890 oss.str("");
5891 //
5892 // Before moving blindly the runs from GL_RUN_FRAGMENTS to GL_RUN try to find out if we have runs divided in more than two pieces (chewbacca or explicit flag only)
5893 //
5894 if ( runpieces ){
5895 //
5896 UInt_t nid = 0;
5897 UInt_t myid[500];
5898 memset(myid,0,500*sizeof(UInt_t));
5899 //
5900 oss.str("");
5901 oss << "SELECT ID,RUNTRAILER_TIME,RUNTRAILER_PKT,BOOT_NUMBER FROM GL_RUN_FRAGMENTS WHERE INSERT_TIME <= '" << clean_time->AsSQLString() << "'order BY RUNHEADER_TIME asc;";
5902 if ( IsDebug() ) printf(" Select from GL_RUN_FRAGMENTS runs older than %s : query is \n %s \n",clean_time->AsSQLString(),oss.str().c_str());
5903 nresult = conn->Query(oss.str().c_str());
5904 //
5905 if ( nresult ){
5906 //
5907 nrow = nresult->Next();
5908 //
5909 while ( nrow ){
5910 //
5911 UInt_t mbo = (UInt_t)atoll(nrow->GetField(3));
5912 UInt_t mrhp = (UInt_t)atoll(nrow->GetField(2));
5913 UInt_t mrht = (UInt_t)atoll(nrow->GetField(1));
5914 Bool_t anr = true;
5915 Bool_t runisthere = true;
5916 //
5917 for (UInt_t u=0; u<=nid; u++){
5918 if ( (UInt_t)atoll(nrow->GetField(0)) == myid[u] && (UInt_t)atoll(nrow->GetField(0)) != 0 ) runisthere = false;
5919 };
5920 //
5921 // check if the run is still in the fragment table or if we have just move it in the gl_run table!
5922 //
5923 if ( runisthere ){
5924 //
5925 memset(myid,0,500*sizeof(UInt_t));
5926 nid = 0;
5927 myid[nid] = (UInt_t)atoll(nrow->GetField(0));
5928 //
5929 while ( anr ){
5930 //
5931 oss.str("");
5932 oss << "SELECT ID,RUNTRAILER_TIME,RUNTRAILER_PKT,BOOT_NUMBER FROM GL_RUN_FRAGMENTS WHERE BOOT_NUMBER=" << mbo << " AND RUNHEADER_PKT=" << mrhp << "+1 AND ABS(RUNHEADER_TIME-"<< mrht <<")<=1 AND INSERT_TIME <= '" << clean_time->AsSQLString() << "' order BY RUNHEADER_TIME asc;";
5933 if ( IsDebug() ) printf(" In the loop searching for fragmented runs : query is \n %s \n",oss.str().c_str());
5934 //
5935 nresult1 = conn->Query(oss.str().c_str());
5936 //
5937 if ( nresult1 ){
5938 //
5939 if ( nresult1->GetRowCount() == 1 ){
5940 //
5941 // one piece is found
5942 //
5943 nrow1 = nresult1->Next();
5944 //
5945 if ( nrow1 ){
5946 //
5947 nid++;
5948 myid[nid] = (UInt_t)atoll(nrow1->GetField(0));
5949 mbo = (UInt_t)atoll(nrow1->GetField(3));
5950 mrhp = (UInt_t)atoll(nrow1->GetField(2));
5951 mrht = (UInt_t)atoll(nrow1->GetField(1));
5952 if ( debug ) printf(" FOUND A PIECE OF RUN! nid %u myid[nid] %u mbo %u mrhp %u mrht %u \n",nid,myid[nid],mbo,mrhp,mrht);
5953 //
5954 nrow1->Close();
5955 } else {
5956 throw -88;
5957 };
5958 } else {
5959 anr = false;
5960 };
5961 nresult1->Close();
5962 } else {
5963 throw -88;
5964 };
5965 };
5966 //
5967 // handle these runs which are ordered and "good". Does the first contain a valid runheader?
5968 //
5969 oss.str("");
5970 oss << " ID= "<< myid[0];
5971 //
5972 glrun->Query_GL_RUN_FRAGMENTS(oss.str().c_str(),conn);
5973 //
5974 if ( glrun->GetACQ_BUILD_INFO() != 0 ){
5975 //
5976 // the first piece contains a good runheader we can update all the other runs with correct infos!
5977 //
5978 for (UInt_t u=1; u <= nid ; u++){
5979 oss.str("");
5980 oss << "UPDATE GL_RUN_FRAGMENTS SET "
5981 << " RUNHEADER_TIME=" << glrun->GetRUNHEADER_TIME()<< " , "
5982 << " RUNHEADER_OBT=" << glrun->GetRUNHEADER_OBT()<< " , "
5983 << " RUNHEADER_PKT=" << glrun->GetRUNHEADER_PKT()<< " , "
5984 << " COMPILATIONTIMESTAMP=" << glrun->GetCOMPILATIONTIMESTAMP()<< " , "
5985 << " FAV_WRK_SCHEDULE=" << glrun->GetFAV_WRK_SCHEDULE()<< " , "
5986 << " EFF_WRK_SCHEDULE=" << glrun->GetEFF_WRK_SCHEDULE()<< " , "
5987 << " PRH_VAR_TRG_MODE_A=" << glrun->GetPRH_VAR_TRG_MODE_A()<< " , "
5988 << " PRH_VAR_TRG_MODE_B=" << glrun->GetPRH_VAR_TRG_MODE_B()<< " , "
5989 << " ACQ_BUILD_INFO=" << glrun->GetACQ_BUILD_INFO()<< " , "
5990 << " ACQ_VAR_INFO=" << glrun->GetACQ_VAR_INFO()<< " , "
5991 << " RM_ACQ_AFTER_CALIB=" << glrun->GetRM_ACQ_AFTER_CALIB()<< " , "
5992 << " RM_ACQ_SETTING_MODE=" << glrun->GetRM_ACQ_SETTING_MODE()<< " , "
5993 << " TRK_CALIB_USED=" << glrun->GetTRK_CALIB_USED()<< " , "
5994 << " CAL_DSP_MASK=" << glrun->GetCAL_DSP_MASK()<< " , "
5995 << " LAST_TIMESYNC=" << glrun->GetLAST_TIMESYNC()<< " , ";
5996 //
5997 if ( glrun->GetPHYSENDRUN_MASK_S3S2S12() )
5998 oss << " PHYSENDRUN_MASK_S3S2S12=" << glrun->GetPHYSENDRUN_MASK_S3S2S12() << " , ";
5999 if ( glrun->GetPHYSENDRUN_MASK_S11CRC() )
6000 oss << " PHYSENDRUN_MASK_S11CRC=" << glrun->GetPHYSENDRUN_MASK_S11CRC() << " , ";
6001 //
6002 oss << " OBT_TIMESYNC=" << glrun->GetOBT_TIMESYNC();
6003 oss << " WHERE ID=" << myid[u] << ";";
6004 conn->Query(oss.str().c_str());
6005 };
6006 //
6007 } else {
6008 //
6009 // sig no runheader, let set anyway what is possible...
6010 //
6011 for (UInt_t u=1; u <= nid ; u++){
6012 oss.str("");
6013 oss << "UPDATE GL_RUN_FRAGMENTS SET "
6014 << " RUNHEADER_TIME=" << glrun->GetRUNHEADER_TIME()<< " , ";
6015 //
6016 if ( glrun->GetPHYSENDRUN_MASK_S3S2S12() )
6017 oss << " PHYSENDRUN_MASK_S3S2S12=" << glrun->GetPHYSENDRUN_MASK_S3S2S12()<< " , ";
6018 if ( glrun->GetPHYSENDRUN_MASK_S11CRC() )
6019 oss << " PHYSENDRUN_MASK_S11CRC=" << glrun->GetPHYSENDRUN_MASK_S11CRC()<< " , ";
6020 //
6021 oss << " RUNHEADER_OBT=" << glrun->GetRUNHEADER_OBT()<< " , "
6022 << " RUNHEADER_PKT=" << glrun->GetRUNHEADER_PKT();
6023 oss << " WHERE ID=" << myid[u] << ";"; // BUG!!! 090112
6024 conn->Query(oss.str().c_str());
6025 };
6026 };
6027 //
6028 // now let's look for runtrailer if any in the last run
6029 //
6030 oss.str("");
6031 oss << " ID= "<< myid[nid];
6032 //
6033 glrun->Query_GL_RUN_FRAGMENTS(oss.str().c_str(),conn);
6034 //
6035 if ( glrun->GetPKT_READY_COUNTER() != 0 ){
6036 //
6037 // the first piece contains a good runtrailer we can update all the other runs with correct infos!
6038 //
6039 for (UInt_t u=0; u < nid ; u++){
6040 oss.str("");
6041 oss << "UPDATE GL_RUN_FRAGMENTS SET "
6042 << " RUNTRAILER_TIME=" << glrun->GetRUNTRAILER_TIME()<< " , "
6043 << " RUNTRAILER_OBT=" << glrun->GetRUNTRAILER_OBT()<< " , "
6044 << " RUNTRAILER_PKT=" << glrun->GetRUNTRAILER_PKT()<< " , "
6045 << " PKT_COUNTER=" << glrun->GetPKT_COUNTER()<< " , ";
6046 //
6047 if ( glrun->GetPHYSENDRUN_MASK_S3S2S12() ){
6048 oss << " PHYSENDRUN_MASK_S3S2S12=" << glrun->GetPHYSENDRUN_MASK_S3S2S12()<< " , "; };
6049 if ( glrun->GetPHYSENDRUN_MASK_S11CRC() ) {
6050 oss << " PHYSENDRUN_MASK_S11CRC=" << glrun->GetPHYSENDRUN_MASK_S11CRC()<< " , "; };
6051 //
6052 oss << " PKT_READY_COUNTER=" << glrun->GetPKT_READY_COUNTER()
6053 << " WHERE ID=" << myid[u] << ";";
6054 conn->Query(oss.str().c_str());
6055 };
6056 //
6057 } else {
6058 //
6059 // sig no runtrailer, let set anyway what is possible...
6060 //
6061 for (UInt_t u=0; u < nid ; u++){
6062 oss.str("");
6063 oss << "UPDATE GL_RUN_FRAGMENTS SET "
6064 << " RUNTRAILER_TIME=" << glrun->GetRUNTRAILER_TIME()<< " , "
6065 << " RUNTRAILER_OBT=" << glrun->GetRUNTRAILER_OBT()<< " , ";
6066 //
6067 if ( glrun->GetPHYSENDRUN_MASK_S3S2S12() ){
6068 oss << " PHYSENDRUN_MASK_S3S2S12=" << glrun->GetPHYSENDRUN_MASK_S3S2S12()<< " , "; };
6069 if ( glrun->GetPHYSENDRUN_MASK_S11CRC() ){
6070 oss << " PHYSENDRUN_MASK_S11CRC=" << glrun->GetPHYSENDRUN_MASK_S11CRC()<< " , "; };
6071 //
6072 oss << " RUNTRAILER_PKT=" << glrun->GetRUNTRAILER_PKT();
6073 oss << " WHERE ID=" << myid[u] << ";"; // BUG!!! 090112
6074 conn->Query(oss.str().c_str());
6075 };
6076 };
6077 //
6078 // Now we want to cross indexize the runs
6079 //
6080 for (UInt_t u=0; u < nid ; u++){
6081 oss.str("");
6082 oss << "UPDATE GL_RUN_FRAGMENTS SET "
6083 << " ID_RUN_FRAG=" << myid[u+1] << " where ID=" << myid[u] <<";";
6084 conn->Query(oss.str().c_str());
6085 };
6086 oss.str("");
6087 oss << "UPDATE GL_RUN_FRAGMENTS SET "
6088 << " ID_RUN_FRAG=" << myid[0] << " where ID=" << myid[nid] <<";";
6089 conn->Query(oss.str().c_str());
6090 //
6091 // and now we can move the runs in the GL_RUN table
6092 //
6093 for (UInt_t u=0; u <= nid; u++){
6094 oss.str("");
6095 oss << " ID= "<< myid[u];
6096 //
6097 glrun->Query_GL_RUN_FRAGMENTS(oss.str().c_str(),conn);
6098 //
6099 if ( u == 0 ){
6100 oss.str("");
6101 oss << " SELECT ID,NEVENTS,TRK_CALIB_USED,PKT_COUNTER FROM GL_RUN WHERE "
6102 << " BOOT_NUMBER=" << glrun->GetBOOT_NUMBER() << " AND ("
6103 << " (RUNHEADER_TIME>=" << (UInt_t)(glrun->GetRUNHEADER_TIME()-10) << " AND "
6104 << " RUNTRAILER_TIME<=" << (UInt_t)(glrun->GetRUNTRAILER_TIME()+10) << " AND ("
6105 << " RUNHEADER_OBT>=" << glrun->GetRUNHEADER_OBT() << " OR "
6106 << " RUNHEADER_PKT>=" << glrun->GetRUNHEADER_PKT() << ") AND ("
6107 << " RUNTRAILER_OBT<=" << glrun->GetRUNTRAILER_OBT() << " OR "
6108 << " RUNTRAILER_PKT<=" << glrun->GetRUNTRAILER_PKT() << ") ) OR "
6109 << " (RUNHEADER_TIME<=" << (UInt_t)glrun->GetRUNHEADER_TIME() << " AND "
6110 << " RUNTRAILER_TIME>=" << (UInt_t)glrun->GetRUNTRAILER_TIME() <<" AND ("
6111 << " RUNHEADER_OBT<=" << glrun->GetRUNHEADER_OBT() << " OR "
6112 << " RUNHEADER_PKT<=" << glrun->GetRUNHEADER_PKT() << ") AND ("
6113 << " RUNTRAILER_OBT>=" << glrun->GetRUNTRAILER_OBT() << " OR "
6114 << " RUNTRAILER_PKT>=" << glrun->GetRUNTRAILER_PKT() << ") ));";
6115 //
6116 if ( IsDebug() ) printf(" check if run has been inserted: query is \n %s \n",oss.str().c_str());
6117 result2 = conn->Query(oss.str().c_str());
6118 //
6119 if ( !result2 ) throw -4;
6120 //
6121 row2 = result2->Next();
6122 //
6123 if ( row2 ){
6124 if ( IsDebug() ) printf(" The already exist in the GL_RUN table! \n");
6125 if ( PEDANTIC ) throw -83;
6126 row2->Close();
6127 };
6128 result2->Close();
6129 };
6130 //
6131 if ( IsDebug() ) printf(" The run is new \n");
6132 if ( IsDebug() ) printf(" -> fill the DB \n");
6133 //
6134 glrun->Fill_GL_RUN(conn);
6135 //
6136 if ( IsDebug() ) printf(" Delete run %u from the GL_RUN_FRAGMENTS table \n",myid[u]);
6137 //
6138 glrun->DeleteRun(conn,myid[u],"GL_RUN_FRAGMENTS");
6139 //
6140 moved++;
6141 //
6142 };
6143 //
6144 };
6145 //
6146 nrow = nresult->Next();
6147 };
6148 };
6149
6150
6151
6152 };
6153 //
6154 if ( !strcmp(fcleanfile.Data(),"") ){
6155 //
6156 // check if there are entries older than "olderthan" seconds from now
6157 //
6158 oss.str("");
6159 oss << " SELECT ID FROM GL_RUN_FRAGMENTS WHERE"
6160 << " INSERT_TIME <= '" << clean_time->AsSQLString() << "';";
6161 //
6162 if ( IsDebug() ) printf(" Select from GL_RUN_FRAGMENTS runs older than %s : query is \n %s \n",clean_time->AsSQLString(),oss.str().c_str());
6163 result = conn->Query(oss.str().c_str());
6164 //
6165 } else {
6166 oss.str("");
6167 oss << " SELECT ID FROM GL_ROOT WHERE NAME='" << fcleanfile.Data() << "';";
6168 if ( IsDebug() ) printf(" Getting ID_ROOT_L0 query %s \n",oss.str().c_str());
6169 result = conn->Query(oss.str().c_str());
6170 //
6171 if ( result ){
6172 //
6173 row = result->Next();
6174 //
6175 if ( row ){
6176 oss.str("");
6177 oss << " SELECT ID FROM GL_RUN_FRAGMENTS WHERE"
6178 << " ID_ROOT_L0=" << row->GetField(0) << ";";
6179 //
6180 if ( IsDebug() ) printf(" Select from GL_RUN_FRAGMENTS for ROOT file query is \n %s \n",oss.str().c_str());
6181 result = conn->Query(oss.str().c_str());
6182 //
6183 };
6184 } else {
6185 return(2);
6186 };
6187 };
6188 //
6189 if ( result ){
6190 //
6191 row = result->Next();
6192 //
6193 while ( row ){
6194 //
6195 oss.str("");
6196 oss << " ID= "<< row->GetField(0);
6197 //
6198 glrun->Query_GL_RUN_FRAGMENTS(oss.str().c_str(),conn);
6199 //
6200 oss.str("");
6201 oss << " SELECT ID,NEVENTS,TRK_CALIB_USED,PKT_COUNTER FROM GL_RUN WHERE "
6202 << " BOOT_NUMBER=" << glrun->GetBOOT_NUMBER() << " AND ("
6203 << " (RUNHEADER_TIME>=" << (UInt_t)(glrun->GetRUNHEADER_TIME()-10) << " AND "
6204 << " RUNTRAILER_TIME<=" << (UInt_t)(glrun->GetRUNTRAILER_TIME()+10) << " AND ("
6205 << " RUNHEADER_OBT>=" << glrun->GetRUNHEADER_OBT() << " OR "
6206 << " RUNHEADER_PKT>=" << glrun->GetRUNHEADER_PKT() << ") AND ("
6207 << " RUNTRAILER_OBT<=" << glrun->GetRUNTRAILER_OBT() << " OR "
6208 << " RUNTRAILER_PKT<=" << glrun->GetRUNTRAILER_PKT() << ") ) OR "
6209 << " (RUNHEADER_TIME<=" << (UInt_t)glrun->GetRUNHEADER_TIME() << " AND "
6210 << " RUNTRAILER_TIME>=" << (UInt_t)glrun->GetRUNTRAILER_TIME() <<" AND ("
6211 << " RUNHEADER_OBT<=" << glrun->GetRUNHEADER_OBT() << " OR "
6212 << " RUNHEADER_PKT<=" << glrun->GetRUNHEADER_PKT() << ") AND ("
6213 << " RUNTRAILER_OBT>=" << glrun->GetRUNTRAILER_OBT() << " OR "
6214 << " RUNTRAILER_PKT>=" << glrun->GetRUNTRAILER_PKT() << ") ));";
6215 //
6216 if ( IsDebug() ) printf(" check if run has been inserted: query is \n %s \n",oss.str().c_str());
6217 result2 = conn->Query(oss.str().c_str());
6218 //
6219 if ( !result2 ) throw -4;
6220 //
6221 row2 = result2->Next();
6222 //
6223 if ( !row2 ){
6224 //
6225 if ( IsDebug() ) printf(" The run is new \n");
6226 if ( IsDebug() ) printf(" -> fill the DB \n");
6227 //
6228 // glrun->SetID(this->AssignRunID()); we use the old run number!
6229 glrun->SetID_RUN_FRAG(glrun->GetID());
6230 glrun->Fill_GL_RUN(conn);
6231 //
6232 // oss.str("");
6233 // oss << " SELECT ID FROM GL_RUN WHERE "
6234 // << " BOOT_NUMBER=" << glrun->GetBOOT_NUMBER() << " AND "
6235 // << " RUNHEADER_PKT=" << (UInt_t)glrun->GetRUNHEADER_PKT() << " AND "
6236 // << " RUNTRAILER_PKT=" << (UInt_t)glrun->GetRUNTRAILER_PKT() << " AND "
6237 // << " RUNHEADER_OBT=" << (UInt_t)glrun->GetRUNHEADER_OBT() << " AND "
6238 // << " RUNTRAILER_OBT=" << (UInt_t)glrun->GetRUNTRAILER_OBT() << "; ";
6239 // //
6240 // if ( IsDebug() ) printf(" Look for the ID of the inserted run: query is \n %s \n",oss.str().c_str());
6241 // result2 = conn->Query(oss.str().c_str());
6242 // //
6243 // if ( !result2 ) throw -4;
6244 // //
6245 // row2 = result2->Next();
6246 // //
6247 // if ( !row2 ) throw -25;
6248 // //
6249 // oss.str("");
6250 // oss << " UPDATE GL_RUN SET ID_RUN_FRAG = " << row2->GetField(0) << " WHERE ID = " << row2->GetField(0);
6251 // if ( IsDebug() ) printf(" Update the ID_RUN_FRAG of the inserted run: query is \n %s \n",oss.str().c_str());
6252 // result2 = conn->Query(oss.str().c_str());
6253 // //
6254 // if ( !result2 ) throw -4;
6255 //
6256 moved++;
6257 //
6258 } else {
6259 if ( IsDebug() ) printf(" The already exist in the GL_RUN table! \n");
6260 if ( PEDANTIC ) throw -83;
6261 };
6262 if ( IsDebug() ) printf(" Delete run %s from the GL_RUN_FRAGMENTS table \n",row->GetField(0));
6263 //
6264 //
6265 glrun->DeleteRun(conn,(UInt_t)atoll(row->GetField(0)),"GL_RUN_FRAGMENTS");
6266 // oss.str("");
6267 // oss << " DELETE from GL_RUN_FRAGMENTS where ID = " << row->GetField(0);
6268 // if ( IsDebug() ) printf(" Clean the GL_RUN_FRAGMENTS table: query is \n %s \n",oss.str().c_str());
6269 // result2 = conn->Query(oss.str().c_str());
6270 // //
6271 // if ( !result2 ) throw -4;
6272 // //
6273 row = result->Next();
6274 };
6275 };
6276 if ( IsDebug() ) printf(" Moved %u runs\n",moved);
6277 return(0);
6278 };
6279
6280 /**
6281 * Check if runs are good, i.e. if the tracker calibration is correctly associated..
6282 */
6283 Int_t PamelaDBOperations::ValidateRuns(){
6284 return(this->ValidateRuns(""));
6285 };
6286
6287 /**
6288 * Check if runs are good, i.e. if the tracker calibration is correctly associated..
6289 */
6290 Int_t PamelaDBOperations::ValidateRuns(TString valfile){
6291 //
6292 TSQLResult *result = 0;
6293 TSQLRow *row = 0;
6294 //
6295 UInt_t calibtime = 50;
6296 //
6297 stringstream oss;
6298 oss.str("");
6299 //
6300 // =======================================================
6301 // validate runs by checking missing calibrations
6302 // =======================================================
6303 UInt_t t_stop = 0;
6304 UInt_t t_start = 0;
6305 if ( !strcmp(valfile.Data(),"") ) {
6306 // --------------------------------------------------------------
6307 // 1) get the OBT of the last run inserted after clean-time limit
6308 // --------------------------------------------------------------
6309 oss.str("");
6310 oss << " SELECT * FROM GL_RUN WHERE INSERT_TIME <= '" << clean_time->AsSQLString()
6311 << "' ORDER BY RUNHEADER_TIME DESC LIMIT 1;";
6312 if ( IsDebug() ) printf(" Get start validation-time: query is \n %s \n",oss.str().c_str());
6313 result = conn->Query(oss.str().c_str());
6314 if ( !result ) throw -4;
6315 if ( !result->GetRowCount() ) {
6316 printf(" No runs to validate \n");
6317 return(1);
6318 }else{
6319 row = result->Next();
6320 t_start = (UInt_t)atoll(row->GetField(4));
6321 };
6322 // --------------------------------------------------------------
6323 // 2) get the OBT of the last validated run
6324 // --------------------------------------------------------------
6325 oss.str("");
6326 // oss << " SELECT * FROM GL_RUN WHERE VALIDATION=1 AND RUNHEADER_TIME<="<< t_start
6327 oss << " SELECT * FROM GL_RUN WHERE VALIDATION>0 AND RUNHEADER_TIME<="<< t_start
6328 <<" ORDER BY RUNHEADER_TIME DESC LIMIT 1;";
6329 if ( IsDebug() ) printf(" Get stop validation-time: query is \n %s \n",oss.str().c_str());
6330 result = conn->Query(oss.str().c_str());
6331 if ( !result ) throw -4;
6332 if ( result->GetRowCount() ){
6333 row = result->Next();
6334 t_stop = (UInt_t)atoll(row->GetField(4));
6335 };
6336 if ( IsDebug() ) printf("Validation interval: from time %u - to time %u \n\n",t_stop,t_start);
6337 // --------------------------------------------------------------
6338 // now retrieves runs to be validated
6339 // --------------------------------------------------------------
6340 oss.str("");
6341 oss << " SELECT * FROM GL_RUN WHERE RUNHEADER_TIME <=" << t_start;
6342 oss << " AND RUNHEADER_TIME >="<< t_stop;
6343 oss << " ORDER BY RUNHEADER_TIME DESC;";
6344 if ( IsDebug() )printf(" Check runs for validation: query is \n %s \n",oss.str().c_str());
6345 result = conn->Query(oss.str().c_str());
6346 } else {
6347 //
6348 stringstream myquery;
6349 UInt_t myid = 0;
6350 myquery.str("");
6351 myquery << " SELECT ID FROM GL_ROOT where NAME='"<<valfile.Data() <<"';";
6352 //
6353 result = conn->Query(myquery.str().c_str());
6354 //
6355 row = result->Next();
6356 if( !row ){
6357 if ( strcmp(valfile.Data(),GetRootName().Data()) ){
6358 if ( IsDebug() ) printf(" No file to be validated even if option \"-validate file\" was used!!\n");
6359 return(2);
6360 };
6361 if ( IsDebug() ) printf(" No file to be validated (force mode)! \n");
6362 return(0);
6363 };
6364 myid=(UInt_t)atoll(row->GetField(0));
6365 //
6366 myquery.str("");
6367 myquery << " SELECT MAX(RUNTRAILER_TIME),MIN(RUNHEADER_TIME) FROM GL_RUN WHERE ID_ROOT_L0="<< myid <<";";
6368 //
6369 result = conn->Query(myquery.str().c_str());
6370 //
6371 row = result->Next();
6372 if( !row->GetField(0) || !row->GetField(1)){
6373 //
6374 if ( IsDebug() ) printf(" NO RUN ASSOCIATED TO THIS FILE! \n");
6375 //
6376 return(0);
6377 //
6378 } else {
6379 //
6380 UInt_t runhtime = (UInt_t)atoll(row->GetField(0));
6381 UInt_t runttime = (UInt_t)atoll(row->GetField(1));
6382 UInt_t caltime = 0;
6383 //
6384 myquery.str("");
6385 myquery << " SELECT FROM_TIME FROM GL_TRK_CALIB where FROM_TIME>" <<runhtime;
6386 myquery << " order by FROM_TIME asc limit 1;";
6387 //
6388 if ( IsDebug() ) printf(" query is \n %s \n",myquery.str().c_str());
6389 //
6390 //
6391 result = conn->Query(myquery.str().c_str());
6392 //
6393 row = result->Next();
6394 if( !row ){
6395 caltime = runhtime;
6396 } else {
6397 caltime = (UInt_t)atoll(row->GetField(0));
6398 };
6399 //
6400 myquery.str("");
6401 myquery << " SELECT * from GL_RUN where RUNHEADER_TIME>="<< runttime <<" AND RUNHEADER_TIME<=" ;
6402 myquery << caltime << " order by RUNHEADER_TIME DESC";
6403 //
6404 if ( IsDebug() ) printf(" query is \n %s \n",myquery.str().c_str());
6405 //
6406 result = conn->Query(myquery.str().c_str());
6407 //
6408 };
6409 };
6410 //
6411 if ( !result ) throw -4;
6412 if ( !result->GetRowCount() && IsDebug() ) printf(" No runs to validate \n");
6413 //
6414 Int_t nrow = 0;
6415 GL_RUN* this_run = new GL_RUN();
6416 GL_RUN* next_run = new GL_RUN();
6417 Int_t nseq_max = 1000;
6418 // UInt_t* sequence = new UInt_t[100];
6419 vector<UInt_t> sequence(nseq_max);
6420 Int_t nseq = 0;
6421 Bool_t CHECK = false;
6422 Bool_t this_ONLINE = false;
6423 Bool_t next_ONLINE = false;
6424 UInt_t t1=0,t2=0;
6425 // ---------------------------------------------------------------------------------
6426 // - loop over runs, back in time,
6427 // - select sequences of runs close in time (less than calibtime s apart),
6428 // which could be preceeded by a calibration
6429 // - check if there might be a missing calibration
6430 // ---------------------------------------------------------------------------------
6431 while(1){
6432
6433 row = result->Next();
6434 if( row == NULL ) break;
6435
6436 //------------
6437 //get run info
6438 //------------
6439 this_run->Set_GL_RUN(row);
6440
6441 Bool_t this_BAD = false;
6442 if(this_run->GetTRK_CALIB_USED() == 1 || this_run->GetTRK_CALIB_USED() == 2) this_ONLINE = true;
6443 else if (this_run->GetTRK_CALIB_USED() == 104) this_ONLINE = false;
6444 else{
6445 // printf("Missing or corrupted header!! \n");
6446 this_ONLINE = false;
6447 this_BAD = true;
6448 };
6449
6450 //-----------------------------------
6451 //compare with previous(next in time)
6452 //-----------------------------------
6453 CHECK = false;
6454 UInt_t interval=0;
6455
6456 if( nrow != 0){
6457
6458
6459 t1 = this_run->GetRUNTRAILER_TIME();
6460 t2 = next_run->GetRUNHEADER_TIME();
6461 interval = (t2-t1);
6462
6463 if(this_ONLINE && next_ONLINE){ // this: ON-LINE + next: ON-LINE
6464
6465 if( this_run->ID == next_run->ID_RUN_FRAG ) interval = 0; //=> run fragments
6466
6467 if( interval >= calibtime )CHECK = true; //more than calibtime s => there might be a calibration
6468
6469 if( !CHECK && this_run->VALIDATION ){
6470 // for (Int_t irun = 0; irun < nseq; irun++)assignVALIDATION(sequence[irun],true);
6471 for (Int_t irun = 0; irun < nseq; irun++)assignVALIDATION(sequence[irun],this_run->VALIDATION);
6472 nseq=0;
6473 }
6474
6475 }else if( !this_ONLINE && next_ONLINE) { // this: DEFAULT + next:ON-LINE
6476
6477 CHECK = true;
6478
6479 }else if( !next_ONLINE ){ // this:ANY + next:DEFAULT
6480
6481 assignVALIDATION(next_run->ID,true);
6482 nseq=0;
6483 }
6484 }
6485
6486 //----------------------------
6487 //check run sequence for calib
6488 //----------------------------
6489 if( CHECK ){
6490 // check if calibration exists
6491 if ( IsDebug() )printf("DT %i ===> CHECK Missing calibration\n",interval);
6492 // Bool_t MISSING = MissingTRK_CALIB(t1,t2);
6493 UInt_t MISSING = MissingTRK_CALIB(t1,t2);
6494 UInt_t val = 0;
6495 if ( MISSING == 1 ) val = 0;
6496 if ( MISSING == 0 ) val = 1;
6497 if ( MISSING == 2 ) val = 2;
6498 for (Int_t irun = 0; irun < nseq; irun++)assignVALIDATION(sequence[irun],val);
6499 nseq=0;
6500 };
6501 //--------------
6502 //store run info
6503 //--------------
6504 *next_run = *this_run;
6505 next_ONLINE = this_ONLINE;
6506 if( !this_BAD ){
6507 if(nseq < nseq_max){
6508 sequence[nseq] = this_run->ID;
6509 nseq++;
6510 }else printf("ValidateRuns ***WARNING*** : run sequence exceed assumed size (%i) \n",nseq_max);
6511 };
6512
6513 if ( IsDebug() ) printf("%i Run %u \n",nrow,this_run->ID);
6514 nrow++;
6515
6516 };
6517 delete this_run;
6518 delete next_run;
6519 //
6520 return(0);
6521 };
6522 /**
6523 * Check if there might be a missing tracker calibration in a given time interval
6524 * @param t1 From absolute time
6525 * @param t2 To absolute time
6526 * @return true if there might be a missing calibration
6527 */
6528 //Bool_t PamelaDBOperations::MissingTRK_CALIB(UInt_t t1,UInt_t t2){
6529 UInt_t PamelaDBOperations::MissingTRK_CALIB(UInt_t t1,UInt_t t2){
6530
6531 GL_TRK_CALIB* trkcalib = new GL_TRK_CALIB();
6532
6533 // get the closest calibration before the run start (t2)
6534 // if ( trkcalib->Query_GL_TRK_CALIB(t2, conn) )return(true); //>>> missing
6535 if ( trkcalib->Query_GL_TRK_CALIB(t2, conn) )return(1); //>>> missing
6536
6537 // if ( trkcalib->TO_TIME < t2 ) return(true); //>>> missing
6538 if ( trkcalib->TO_TIME < t2 ) return(1); //>>> missing
6539
6540 //==============================================================
6541 // Check is done first on the basis of time between calibration,
6542 // which should be equal to the time between ascending-nodes.
6543 //==============================================================
6544 if ( t2 - trkcalib->FROM_TIME > 5700) {
6545 if ( IsDebug() )printf("Long time between calib and run start %u :-( ==> there might be a missing calib \n",t2 - trkcalib->FROM_TIME);
6546 //==============================================================
6547 // there might be a missing calibration, due to:
6548 // - MM full
6549 // - corrupted packets
6550 // - loss of data
6551 // There is an exception in case a download was done during ascending node
6552 //==============================================================
6553 Bool_t DOWNLOAD = false;
6554 // check if the calib was skipped becouse of download .... DA FARE!!
6555 // if(DOWNLOAD)return(false);
6556 if(DOWNLOAD)return(0);
6557
6558 // return(true); //>>> missing
6559 return(1); //>>> missing
6560
6561 };
6562
6563 //==============================================================
6564 // If the last calibration is close to the run less than this time,
6565 // it is enough to say that there are no missing calibrations
6566 //==============================================================
6567 // the long time interval bewteen runs might be due to download
6568 if ( IsDebug() )printf("Short time between calib and run start %u :-) ==> OK! \n",t2 - trkcalib->FROM_TIME);
6569 if ( trkcalib->VALIDATION ) return(0);
6570 if ( IsDebug() )printf("Calibration is not validated... :-/ ==> OK but with VALIDATION=2! \n");
6571 return(2);
6572
6573 };
6574 /**
6575 * Assign VALIDATION value to a GL_RUN entry
6576 * @param idrun Run ID
6577 * @param validation true/false
6578 */
6579 Int_t PamelaDBOperations::assignVALIDATION(UInt_t idrun, Bool_t validation){
6580 return(this->assignVALIDATION(idrun,(UInt_t)validation));
6581 }
6582
6583 Int_t PamelaDBOperations::assignVALIDATION(UInt_t idrun, UInt_t validation){
6584 TSQLResult *result = 0;
6585 stringstream oss;
6586 oss.str("");
6587 oss << " UPDATE GL_RUN SET VALIDATION="<< (UInt_t)validation <<" WHERE ID= " << idrun << ";";
6588 //
6589 // if ( IsDebug() )
6590 // printf(" Set VALIDATION = %i for run %i \n",validation,idrun);
6591 if ( IsDebug() )printf(" Query: %s \n",oss.str().c_str());
6592 result = conn->Query(oss.str().c_str());
6593 if ( !result ) throw -4;
6594 return(0);
6595 }
6596
6597
6598
6599 // Insert TLEs from file tlefilename in the table GL_TLE in the db
6600 // opened by conn, sorting them by date from older to newer, if each
6601 // TLE has not been alread inserted.
6602 Int_t PamelaDBOperations::populateTLE()//(TSQLServer *conn, char *tleFile)
6603 {
6604 fstream tlefile(tlefilename, ios::in);
6605
6606 if ( !tlefile ) throw -7;
6607
6608 vector<cTle*> ctles;
6609 vector<cTle*>::iterator iter;
6610 int present = 0;
6611
6612 // Get three lines from tlefile, create a cTle object and put it
6613 // into ctles
6614 while(1) {
6615 cTle *tlef;
6616 string str1, str2, str3;
6617
6618 getline(tlefile, str1);
6619 if(tlefile.eof()) break;
6620
6621 getline(tlefile, str2);
6622 if(tlefile.eof()) break;
6623
6624 getline(tlefile, str3);
6625 if(tlefile.eof()) break;
6626
6627 // We now have three good lines for a cTle.
6628 tlef = new cTle(str1, str2, str3);
6629 ctles.push_back(tlef);
6630 }
6631
6632 tlefile.close();
6633
6634 // Sort by date
6635 sort(ctles.begin(), ctles.end(), compTLE);
6636
6637 // Now we insert each TLE into the db
6638 for(iter = ctles.begin(); iter != ctles.end(); iter++) {
6639 cTle *tle = *iter;
6640
6641 // Do nothing if it's already present in the db. Just increase
6642 // the counter present.
6643 if (! isTlePresent(tle))
6644 {
6645 int status = insertTle(tle);
6646
6647 // Insert query failed. Return 1.
6648 if(status == EXIT_FAILURE) {
6649
6650 if( IsDebug() ) {
6651 cerr << "Error: inserting TLE:" << endl
6652 << tle->getName() << endl
6653 << tle->getLine1() << endl
6654 << tle->getLine2() << endl;
6655 }
6656
6657 throw -4;
6658 return 1;
6659 }
6660
6661 }
6662 else
6663 present++;
6664
6665 }
6666
6667 int inserted = ctles.size() - present; // Number of inserted TLE.
6668 if ( IsDebug() )
6669 cout << "\nProcessed TLEs ranging from " << getTleDatetime(ctles[0]) << " to " << getTleDatetime(ctles[ctles.size()-1]) << "." << endl
6670 << inserted << " newly inserted TLEs out of " << ctles.size() << " processed." << endl;
6671
6672 ctles.clear();
6673
6674
6675 // Return 2 if no new TLE has been inserted. 0 otherwise.
6676 if(! inserted ) return 2;
6677 return 0;
6678 }
6679
6680
6681 // Insert tle in the table GL_TLE using the connection conn.
6682 Int_t PamelaDBOperations::insertTle(cTle *tle)
6683 {
6684 stringstream oss;
6685 TSQLResult *result = 0;
6686
6687 oss.str("");
6688 oss << " INSERT INTO GL_TLE (TLE1, TLE2, TLE3, FROM_TIME)"
6689 << " VALUES ( '"
6690 << tle->getName() << "', '"
6691 << tle->getLine1() << "', '"
6692 << tle->getLine2() << "', '"
6693 << getTleDatetime(tle) << "')";
6694
6695 // cout << oss.str().c_str() << endl;
6696 result = conn->Query(oss.str().c_str());
6697 if (result == NULL)
6698 return EXIT_FAILURE;
6699
6700 return EXIT_SUCCESS;
6701 }
6702
6703
6704 // Return whether tle is already in the db connected by conn.
6705 bool PamelaDBOperations::isTlePresent(cTle *tle)
6706 {
6707 stringstream oss;
6708 TSQLResult *result = 0;
6709
6710 oss.str("");
6711 oss << "SELECT * FROM GL_TLE WHERE FROM_TIME = '"
6712 << getTleDatetime(tle) << "'";
6713
6714 result = conn->Query(oss.str().c_str());
6715 if (result == NULL) throw -4;
6716
6717 if (result->GetRowCount())
6718 return true;
6719 else
6720 return false;
6721 }
6722
6723
6724 // Return whether the first TLE is dated early than the second
6725 bool compTLE (cTle *tle1, cTle *tle2)
6726 {
6727 return getTleJulian(tle1) < getTleJulian(tle2);
6728 }
6729
6730
6731 // Return the date of the tle using the format (year-2000)*1e3 +
6732 // julian day. e.g. 6365 is the 31th Dec 2006.
6733 // It does *not* return a cJulian date.
6734 float getTleJulian(cTle *tle) {
6735 return tle->getField(cTle::FLD_EPOCHYEAR)*1e3 + tle->getField(cTle::FLD_EPOCHDAY);
6736 }
6737
6738
6739 // Return a string like YYYY-MM-DD hh:mm:ss, usable for mysql datetime
6740 // format.
6741 string getTleDatetime(cTle *tle)
6742 {
6743 int year, mon, day, hh, mm, ss;
6744 double dom; // day of month (is double!)
6745 stringstream date; // date in datetime format
6746
6747 // create a cJulian from the date in tle
6748 cJulian jdate = cJulian( 2000 + (int) tle->getField(cTle::FLD_EPOCHYEAR), tle->getField(cTle::FLD_EPOCHDAY));
6749
6750 // get year, month, day of month
6751 jdate.getComponent(&year, &mon, &dom);
6752
6753 // build a datetime YYYY-MM-DD hh:mm:ss
6754 date.str("");
6755 day = (int) floor(dom);
6756 hh = (int) floor( (dom - day) * 24);
6757 mm = (int) floor( ((dom - day) * 24 - hh) * 60);
6758 ss = (int) floor( ((((dom - day) * 24 - hh) * 60 - mm) * 60));
6759 // ms = (int) floor( (((((dom - day) * 24 - hh) * 60 - mm) * 60) - ss) * 1000);
6760
6761 date << year << "-" << mon << "-" << day << " " << hh << ":" << mm << ":" << ss;
6762
6763 return date.str();
6764 }
6765
6766 /**
6767 * Remove a file from the DB, delete on cascade all entries related to that file
6768 * rearrange GL_RUN and GL_XXX_CALIB tables, turn off validation till the following
6769 * calibration
6770 **/
6771 Int_t PamelaDBOperations::removeFile(TString remfile){
6772 //
6773 // Determine ID_ROOT_L0 and ID_RAW
6774 //
6775 TSQLResult *pResult;
6776 TSQLRow *Row;
6777 stringstream myquery;
6778 //
6779 myquery.str("");
6780 myquery << " SELECT ID,ID_RAW,ID_TIMESYNC FROM GL_ROOT where NAME='"<<remfile.Data() <<"';";
6781 //
6782 pResult = conn->Query(myquery.str().c_str());
6783 //
6784 Row = pResult->Next();
6785 if( !Row ){
6786 if ( strcmp(remfile.Data(),GetRootName().Data()) ){
6787 if ( IsDebug() ) printf(" No file to be removed even if option \"-remove file\" was used!!\n");
6788 return(1);
6789 };
6790 if ( IsDebug() ) printf(" No file to be removed (force mode)! \n");
6791 return(0);
6792 };
6793 //
6794 this->SetID_ROOT((UInt_t)atoll(Row->GetField(0)));
6795 this->SetID_RAW((UInt_t)atoll(Row->GetField(1)));
6796 UInt_t idtsy=(UInt_t)atoll(Row->GetField(2));
6797 //
6798 this->ValidationOFF();
6799 //
6800 this->RemoveCALIBS();
6801 //
6802 this->RemoveRUNS();
6803 //
6804 this->RemoveFILES(idtsy);
6805 //
6806 this->SetID_ROOT(0);
6807 this->SetID_RAW(0);
6808 //
6809 return(0);
6810 };
6811
6812 /**
6813 *
6814 * Set validation bit to zero for runs following the removing file till
6815 * 1) a run with TRK_CALIB_USED=140
6816 * 2) a run with VALIDATION = 0
6817 * 3) the next calibration
6818 *
6819 **/
6820 void PamelaDBOperations::ValidationOFF(){
6821 TSQLResult *pResult;
6822 TSQLRow *Row;
6823 stringstream myquery;
6824 Int_t unv = 0;
6825 //select ID from GL_RUN where RUNHEADER_TIME>=1152671382 AND (VALIDATION=0 OR TRK_CALIB_USED=104) order by RUNHEADER_TIME asc limit 1;
6826 myquery.str("");
6827 myquery << " SELECT MAX(RUNTRAILER_TIME) FROM GL_RUN WHERE ID_ROOT_L0="<< this->GetID_ROOT() <<";";
6828 //
6829 pResult = conn->Query(myquery.str().c_str());
6830 //
6831 Row = pResult->Next();
6832 if( !Row->GetField(0) ){
6833 //
6834 if ( IsDebug() ) printf(" NO RUN ASSOCIATED TO THIS FILE! \n");
6835 //
6836 } else {
6837 //
6838 UInt_t runhtime = (UInt_t)atoll(Row->GetField(0));
6839 UInt_t caltime = 0;
6840 //
6841 myquery.str("");
6842 myquery << " SELECT FROM_TIME FROM GL_TRK_CALIB where FROM_TIME>" <<runhtime;
6843 myquery << " order by FROM_TIME asc limit 1;";
6844 //
6845 if ( IsDebug() ) printf(" query is \n %s \n",myquery.str().c_str());
6846 //
6847 //
6848 delete pResult;
6849 pResult = conn->Query(myquery.str().c_str());
6850 //
6851 Row = pResult->Next();
6852 if( !Row ){
6853 caltime = runhtime;
6854 } else {
6855 caltime = (UInt_t)atoll(Row->GetField(0));
6856 };
6857 //
6858 myquery.str("");
6859 myquery << " SELECT ID,RUNHEADER_TIME from GL_RUN where RUNHEADER_TIME>="<< runhtime <<" AND (VALIDATION=0 OR TRK_CALIB_USED=104 OR RUNHEADER_TIME>" ;
6860 myquery << caltime << ") order by RUNHEADER_TIME asc LIMIT 1";
6861 //
6862 if ( IsDebug() ) printf(" query is \n %s \n",myquery.str().c_str());
6863 //
6864 pResult = conn->Query(myquery.str().c_str());
6865 //
6866 Row = pResult->Next();
6867 if( !Row ){
6868 //
6869 if ( IsDebug() ) printf(" NO RUN NEED TO BE UNVALIDATED \n");
6870 //
6871 } else {
6872 myquery.str("");
6873 myquery << " SELECT ID from GL_RUN where RUNHEADER_TIME<"<< Row->GetField(1) <<" AND ";
6874 myquery << " RUNHEADER_TIME>=" <<runhtime;
6875 myquery << " order by RUNHEADER_TIME asc;";
6876 //
6877 if ( IsDebug() ) printf(" query is \n %s \n",myquery.str().c_str());
6878 //
6879 pResult = conn->Query(myquery.str().c_str());
6880 //
6881 Row = pResult->Next();
6882 while ( Row ){
6883 //
6884 unv++;
6885 this->assignVALIDATION((UInt_t)atoll(Row->GetField(0)), false);
6886 Row = pResult->Next();
6887 //
6888 };
6889 };
6890 };
6891 if ( IsDebug() ) printf(" %u runs have been unvalidated \n",unv);
6892 };
6893
6894 /**
6895 *
6896 * Rearrange GL_RUN table and remove runs
6897 *
6898 **/
6899 void PamelaDBOperations::RemoveRUNS(){
6900 TSQLResult *pResult;
6901 TSQLRow *Row;
6902 stringstream myquery;
6903 UInt_t drun = 0;
6904 GL_RUN *delrun = new GL_RUN();
6905 //
6906 myquery.str("");
6907 myquery << " SELECT ID FROM GL_RUN where ID_RUN_FRAG=0 and ID_ROOT_L0=" <<this->GetID_ROOT() <<";";
6908 //
6909 if ( IsDebug() ) printf(" query is \n %s \n",myquery.str().c_str());
6910 //
6911 pResult = conn->Query(myquery.str().c_str());
6912 //
6913 Row = pResult->Next();
6914 //
6915 //
6916 if ( !Row ){
6917 if ( IsDebug() ) printf(" No run with ID_RUN_FRAG=0 belonged to this file \n");
6918 } else {
6919 if ( IsDebug() ) printf(" Deleting run from GL_RUN table \n");
6920 while ( Row ){
6921 delrun->DeleteRun(conn,(UInt_t)atoll(Row->GetField(0)),"GL_RUN");
6922 if ( IsDebug() ) printf(" del run %u \n",(UInt_t)atoll(Row->GetField(0)));
6923 drun++;
6924 Row = pResult->Next();
6925 };
6926 };
6927 //
6928 //
6929 myquery.str("");
6930 myquery << " SELECT ID,ID_RUN_FRAG FROM GL_RUN where ID_RUN_FRAG!=0 and ID_ROOT_L0=" <<this->GetID_ROOT() <<";";
6931 //
6932 if ( IsDebug() ) printf(" query is \n %s \n",myquery.str().c_str());
6933 //
6934 pResult = conn->Query(myquery.str().c_str());
6935 //
6936 Row = pResult->Next();
6937 //
6938 if ( !Row ){
6939 if ( IsDebug() ) printf(" No run with ID_RUN_FRAG!=0 belonged to this file \n");
6940 } else {
6941 if ( IsDebug() ) printf(" Deleting run fragments from GL_RUN table \n");
6942 while ( Row ){
6943 if ( IsDebug() ) printf(" restore run %u \n",(UInt_t)atoll(Row->GetField(1)));
6944 delrun->RestoreRun(conn,(UInt_t)atoll(Row->GetField(1)),"GL_RUN_FRAGMENTS");
6945 if ( IsDebug() ) printf(" del run %u \n",(UInt_t)atoll(Row->GetField(1)));
6946 delrun->DeleteRun(conn,(UInt_t)atoll(Row->GetField(1)),"GL_RUN");
6947 if ( (UInt_t)atoll(Row->GetField(1)) != (UInt_t)atoll(Row->GetField(0)) ){
6948 if ( IsDebug() ) printf(" del run %u \n",(UInt_t)atoll(Row->GetField(0)));
6949 delrun->DeleteRun(conn,(UInt_t)atoll(Row->GetField(0)),"GL_RUN");
6950 };
6951 drun++;
6952 Row = pResult->Next();
6953 };
6954 };
6955 //
6956 if ( IsDebug() ) printf(" Deleted %i run(s) from GL_RUN table \n",drun);
6957 //
6958 //
6959 //
6960 drun = 0;
6961 //
6962 myquery.str("");
6963 myquery << " SELECT ID_TRASH FROM GL_RUN_TRASH where BELONGED_TO='GL_RUN_FRAGMENTS' AND ID_ROOT_L0=" <<this->GetID_ROOT() <<";";
6964 //
6965 pResult = conn->Query(myquery.str().c_str());
6966 //
6967 Row = pResult->Next();
6968 //
6969 if ( !Row ){
6970 if ( IsDebug() ) printf(" No run from GL_RUN_FRAGMENTS table in the trash table for this file \n");
6971 } else {
6972 if ( IsDebug() ) printf(" Deleting run fragments from GL_RUN_TRASH table \n");
6973 while ( Row ){
6974 if ( IsDebug() ) printf(" del run idtrash %u \n",(UInt_t)atoll(Row->GetField(0)));
6975 myquery.str("");
6976 myquery << " DELETE FROM GL_RUN_TRASH where ID_TRASH=" << Row->GetField(0) <<";";
6977 conn->Query(myquery.str().c_str());
6978 drun++;
6979 Row = pResult->Next();
6980 };
6981 };
6982 //
6983 if ( IsDebug() ) printf(" Deleted %u run(s) from GL_RUN_TRASH table \n",drun);
6984 //
6985 //
6986 //
6987 drun = 0;
6988 //
6989 myquery.str("");
6990 myquery << " SELECT ID FROM GL_RUN_FRAGMENTS where ID_ROOT_L0=" <<this->GetID_ROOT() <<";";
6991 //
6992 pResult = conn->Query(myquery.str().c_str());
6993 //
6994 Row = pResult->Next();
6995 //
6996 if ( !Row ){
6997 if ( IsDebug() ) printf(" No run in the GL_RUN_FRAGMENTS table for this file \n");
6998 } else {
6999 if ( IsDebug() ) printf(" Deleting run fragments from GL_RUN_FRAGMENTS table \n");
7000 while ( Row ){
7001 if ( IsDebug() ) printf(" del run %u \n",(UInt_t)atoll(Row->GetField(0)));
7002 myquery.str("");
7003 myquery << " DELETE FROM GL_RUN_FRAGMENTS where ID=" << Row->GetField(0) <<";";
7004 conn->Query(myquery.str().c_str());
7005 drun++;
7006 Row = pResult->Next();
7007 };
7008 };
7009 //
7010 if ( IsDebug() ) printf(" Deleted %u run(s) from GL_RUN_FRAGMENTS table \n",drun);
7011 //
7012 //
7013 //
7014 delete delrun;
7015 //
7016 };
7017
7018
7019 /**
7020 *
7021 * Rearrange calibration tables
7022 *
7023 **/
7024 void PamelaDBOperations::RemoveFILES(UInt_t idtsy){
7025 stringstream myquery;
7026 //
7027 myquery.str("");
7028 myquery << " DELETE FROM GL_RAW WHERE ID=" <<this->GetID_RAW() <<";";
7029 //
7030 if ( IsDebug() ) printf(" query is \n %s \n",myquery.str().c_str());
7031 //
7032 conn->Query(myquery.str().c_str());
7033 //
7034 myquery.str("");
7035 myquery << " DELETE FROM GL_ROOT WHERE ID=" <<this->GetID_ROOT() <<";";
7036 //
7037 if ( IsDebug() ) printf(" query is \n %s \n",myquery.str().c_str());
7038 //
7039 conn->Query(myquery.str().c_str()); //
7040 //
7041 if ( !chewbacca ){
7042 myquery.str("");
7043 myquery << " DELETE FROM GL_TIMESYNC WHERE ID=" << idtsy <<";";
7044 //
7045 if ( IsDebug() ) printf(" query is \n %s \n",myquery.str().c_str());
7046 //
7047 conn->Query(myquery.str().c_str());
7048 };
7049 //
7050 };
7051
7052 /**
7053 *
7054 * Rearrange calibration tables
7055 *
7056 **/
7057 void PamelaDBOperations::RemoveCALIBS(){
7058 TSQLResult *pResult;
7059 TSQLRow *Row;
7060 stringstream myquery;
7061 //
7062 //
7063 // Calorimeter
7064 //
7065 for (Int_t section = 0; section < 4; section++){
7066 myquery.str("");
7067 myquery << " SELECT MIN(FROM_TIME),MAX(TO_TIME) FROM GL_CALO_CALIB WHERE ID_ROOT_L0="<< this->GetID_ROOT() <<" AND ";
7068 myquery << " SECTION=" << section << ";";
7069 //
7070 pResult = conn->Query(myquery.str().c_str());
7071 //
7072 Row = pResult->Next();
7073 if( !Row->GetField(0) || !Row->GetField(1) ){
7074 //
7075 if ( IsDebug() ) printf(" NO CALO CALIBRATION SECTION %i ASSOCIATED TO THIS FILE! \n",section);
7076 //
7077 } else {
7078 //
7079 myquery.str("");
7080 myquery << " UPDATE GL_CALO_CALIB SET TO_TIME=" << Row->GetField(1);
7081 myquery << " WHERE TO_TIME="<< Row->GetField(0) << " AND ";
7082 myquery << " SECTION=" << section << ";";
7083 //
7084 pResult = conn->Query(myquery.str().c_str());
7085 //
7086 if( !pResult ){
7087 //
7088 if ( IsDebug() ) printf(" ERROR DELETING CALO CALIBRATIONS \n");
7089 //
7090 throw -4;
7091 //
7092 };
7093 //
7094 };
7095 };
7096 Bool_t OLDDB = false;
7097 for (Int_t section = 0; section < 4; section++){
7098 myquery.str("");
7099 myquery << " SELECT MIN(FROM_TIME),MAX(TO_TIME) FROM GL_CALOPULSE_CALIB WHERE ID_ROOT_L0="<< this->GetID_ROOT() <<" AND ";
7100 myquery << " SECTION=" << section << ";";
7101 //
7102 pResult = conn->Query(myquery.str().c_str());
7103 //
7104 if ( conn->GetErrorCode() ){
7105 printf(" Section %i : warning, old databse structure no GL_CALOPULSE_CALIB table!\n",section);
7106 OLDDB=true;
7107 } else {
7108 Row = pResult->Next();
7109 if( !Row->GetField(0) || !Row->GetField(1) ){
7110 //
7111 if ( IsDebug() ) printf(" NO PULSE CALO CALIBRATION SECTION %i ASSOCIATED TO THIS FILE! \n",section);
7112 //
7113 } else {
7114 //
7115 myquery.str("");
7116 myquery << " UPDATE GL_CALOPULSE_CALIB SET TO_TIME=" << Row->GetField(1);
7117 myquery << " WHERE TO_TIME="<< Row->GetField(0) << " AND ";
7118 myquery << " SECTION=" << section << ";";
7119 //
7120 pResult = conn->Query(myquery.str().c_str());
7121 //
7122 if( !pResult ){
7123 //
7124 if ( IsDebug() ) printf(" ERROR DELETING CALO PULSE CALIBRATIONS \n");
7125 //
7126 throw -4;
7127 //
7128 };
7129 //
7130 };
7131 };
7132 };
7133 myquery.str("");
7134 myquery << " DELETE FROM GL_CALO_CALIB WHERE ID_ROOT_L0=" << this->GetID_ROOT() << ";";
7135 //
7136 pResult = conn->Query(myquery.str().c_str());
7137 //
7138 if( !pResult ){
7139 //
7140 if ( IsDebug() ) printf(" ERROR DELETING CALO CALIBRATIONS \n");
7141 //
7142 throw -4;
7143 //
7144 };
7145 //
7146 myquery.str("");
7147 myquery << " DELETE FROM GL_CALOPULSE_CALIB WHERE ID_ROOT_L0=" << this->GetID_ROOT() << ";";
7148 //
7149 pResult = conn->Query(myquery.str().c_str());
7150 if ( IsDebug() ) printf(" Delete from GL_CALOPULSE_CALIB query is %s \n",myquery.str().c_str());
7151 if ( !OLDDB ){
7152 //
7153 if( !pResult ){
7154 //
7155 if ( IsDebug() ) printf(" ERROR DELETING PULSE CALO CALIBRATIONS \n");
7156 //
7157 throw -4;
7158 //
7159 };
7160 };
7161 //
7162 // Tracker
7163 //
7164 myquery.str("");
7165 myquery << " SELECT MIN(FROM_TIME),MAX(TO_TIME) FROM GL_TRK_CALIB WHERE ID_ROOT_L0="<< this->GetID_ROOT() <<";";
7166 //
7167 pResult = conn->Query(myquery.str().c_str());
7168 //
7169 Row = pResult->Next();
7170 if( !Row->GetField(0) || !Row->GetField(1) ){
7171 //
7172 if ( IsDebug() ) printf(" NO TRK CALIBRATION ASSOCIATED TO THIS FILE! \n");
7173 //
7174 } else {
7175 //
7176 myquery.str("");
7177 myquery << " UPDATE GL_TRK_CALIB SET TO_TIME=" << Row->GetField(1);
7178 myquery << " WHERE TO_TIME="<< Row->GetField(0) << ";";
7179 //
7180 pResult = conn->Query(myquery.str().c_str());
7181 //
7182 if( !pResult ){
7183 //
7184 if ( IsDebug() ) printf(" ERROR DELETING TRK CALIBRATIONS \n");
7185 //
7186 throw -4;
7187 //
7188 };
7189 //
7190 myquery.str("");
7191 myquery << " DELETE FROM GL_TRK_CALIB WHERE ID_ROOT_L0=" << this->GetID_ROOT() << ";";
7192 //
7193 pResult = conn->Query(myquery.str().c_str());
7194 //
7195 if( !pResult ){
7196 //
7197 if ( IsDebug() ) printf(" ERROR DELETING TRK CALIBRATIONS \n");
7198 //
7199 throw -4;
7200 //
7201 };
7202 };
7203 //
7204 //
7205 // S4
7206 //
7207 myquery.str("");
7208 myquery << " SELECT MIN(FROM_TIME),MAX(TO_TIME) FROM GL_S4_CALIB WHERE ID_ROOT_L0="<< this->GetID_ROOT() <<";";
7209 //
7210 pResult = conn->Query(myquery.str().c_str());
7211 //
7212 Row = pResult->Next();
7213 if( !Row->GetField(0) || !Row->GetField(1) ){
7214 //
7215 if ( IsDebug() ) printf(" NO S4 CALIBRATION ASSOCIATED TO THIS FILE! \n");
7216 //
7217 } else {
7218 //
7219 myquery.str("");
7220 myquery << " UPDATE GL_S4_CALIB SET TO_TIME=" << Row->GetField(1);
7221 myquery << " WHERE TO_TIME="<< Row->GetField(0) << ";";
7222 //
7223 pResult = conn->Query(myquery.str().c_str());
7224 //
7225 if( !pResult ){
7226 //
7227 if ( IsDebug() ) printf(" ERROR DELETING S4 CALIBRATIONS \n");
7228 //
7229 throw -4;
7230 //
7231 };
7232 //
7233 myquery.str("");
7234 myquery << " DELETE FROM GL_S4_CALIB WHERE ID_ROOT_L0=" << this->GetID_ROOT() << ";";
7235 //
7236 pResult = conn->Query(myquery.str().c_str());
7237 //
7238 if( !pResult ){
7239 //
7240 if ( IsDebug() ) printf(" ERROR DELETING S4 CALIBRATIONS \n");
7241 //
7242 throw -4;
7243 //
7244 };
7245 //
7246 };
7247 };
7248
7249 /**
7250 *
7251 * Rearrange calibration tables
7252 *
7253 **/
7254 UInt_t PamelaDBOperations::ValidateTrkCalib( CalibTrk1Event* caltrk, EventHeader *eh , TFile *file){
7255
7256 if(!caltrk) return 0;
7257
7258 if ( IsDebug() ) cout << "ValidateTrkCalib:"<<endl;
7259
7260 UInt_t validate = 1;
7261 Int_t vorder[]={5,5,3,3,4,4,2,2,1,1,0,0};
7262 UInt_t timeaftercalib=120000; //2000;
7263 TString classname = caltrk->GetName();
7264
7265 // ----------------------------------
7266 // Check CRCs and failed calibrations
7267 // ----------------------------------
7268 for(Int_t ipkt=0; ipkt<6; ipkt++){
7269 if(caltrk->DSPnumber[ipkt]>0 && caltrk->DSPnumber[ipkt]<=12){
7270 if( caltrk->crc_hcal[ipkt] ){
7271 // if(IsDebug())cout<<"(CRC Header)";
7272 validate = 0;
7273 if(IsDebug())cout <<endl<<" *** CRC *** (header DSPn "<<caltrk->DSPnumber[ipkt]<<")";
7274
7275 }
7276 for(Int_t ilad=0; ilad<3; ilad++)if( caltrk->crc_cal[ipkt][ilad] ){
7277 // if(IsDebug())cout<<"(CRC Pkt-"<<ilad<<")";
7278 if(IsDebug())cout <<endl<<" *** CRC *** (data DSPn "<<caltrk->DSPnumber[ipkt]<<" ladder "<<ilad<<")";
7279 validate = 0;
7280 }
7281 if( !(caltrk->ncalib_event[ipkt]==0 && caltrk->cal_flag[ipkt]==0) ){
7282 if(IsDebug())cout <<endl<<" *** FAILURE *** (data DSPn "<<caltrk->DSPnumber[ipkt]<<")";
7283 validate = 0;
7284 }
7285 }else{
7286 // validate=0;
7287 if(IsDebug())cout <<endl<<" *** DSPn *** ("<< caltrk->DSPnumber[ipkt] <<" @pkt "<<ipkt<<")";
7288 }
7289 }
7290
7291 // -----------------------
7292 // Check missing packets:
7293 // -----------------------
7294 // Readout order:
7295 // ------------------
7296 // DSP packet board
7297 // ------------------
7298 // 12 0 1
7299 // 10 1 1
7300 // 8 2 1
7301 // 4 3 1
7302 // 6 4 1
7303 // 2 5 1
7304 // ------------------
7305 // 11 0 2
7306 // 9 1 2
7307 // 7 2 2
7308 // 3 3 2
7309 // 5 4 2
7310 // 1 5 2
7311 // ------------------
7312 // -------------------------------------------------
7313 // Check if it is first or second calibration packet
7314 // -------------------------------------------------
7315 UInt_t build=0;
7316 UInt_t base=0;
7317 UInt_t mask=0;
7318 if(classname.Contains("CalibTrk1Event")){
7319 base=12;
7320 mask=0x03F000;
7321 }
7322 if(classname.Contains("CalibTrk2Event")){
7323 base=18;
7324 mask=0xFC0000;
7325 }
7326 // ----------------------------------------------------
7327 // Count number of valid packets and set build variable
7328 // ----------------------------------------------------
7329 if(IsDebug())cout <<endl<< " DSP: ";
7330 Int_t npkts=0;
7331 for(Int_t ipkt=0; ipkt<6; ipkt++){
7332 if(caltrk->DSPnumber[ipkt]>0 && caltrk->DSPnumber[ipkt]<=12){
7333 if(IsDebug())cout <<" "<<caltrk->DSPnumber[ipkt];
7334 npkts++;
7335 build = build | ( 1<<(base+vorder[caltrk->DSPnumber[ipkt]-1]) );
7336 // cout << caltrk->DSPnumber[ipkt]
7337 };
7338 }
7339 if(IsDebug())cout << " ==> "<< hex << build << dec;
7340 // ----------------------------------------------------
7341 // If the number of valid packets is 6, ok exit...
7342 // ----------------------------------------------------
7343 if( npkts==6 ){
7344 return validate; // exit
7345 }
7346 ////////////////////////////////////////////////////////
7347 // ...otherwise there might be some missing packets
7348 //
7349 // In this case check the acq configuration
7350 // (some DSPs might be excluded from acquisition)
7351 ////////////////////////////////////////////////////////
7352
7353 if(!eh || !file || (file&&file->IsZombie()) ){
7354 if ( IsDebug() )cout << " *** MISSING VIEW *** eh="<<eh<<" file="<<file<<" cannot validate"<<endl;
7355 return (0);
7356 }
7357
7358 // -----------------------------------------------
7359 // retrieve the first run header after calib
7360 // -----------------------------------------------
7361
7362 PacketType *pctp;
7363 EventCounter *cod;
7364 cod = eh->GetCounter();
7365 Int_t irun = cod->Get(pctp->RunHeader);
7366 TTree *rh=(TTree*)file->Get("RunHeader");
7367 if ( !rh || rh->IsZombie() ) throw -17;
7368 if( rh->GetEntries() <= irun ){
7369 if ( IsDebug() ) cout << " *** MISSING-PKT *** no runs after calib (1) -- cannot validate :-( "<<endl;
7370 return 0; // :-(
7371 }
7372 RunHeaderEvent *run = 0;
7373 EventHeader *hrun = 0;
7374 rh->SetBranchAddress("RunHeader", &run);
7375 rh->SetBranchAddress("Header", &hrun);
7376 rh->GetEntry(irun);
7377 if( OBT(hrun->GetPscuHeader()->GetOrbitalTime()) < OBT(eh->GetPscuHeader()->GetOrbitalTime())){
7378 if ( IsDebug() ) cout << " *** MISSING-PKT *** no runs after calib (2) -- cannot validate :-( "<<endl;
7379 return 0; // :-(
7380 }
7381
7382 UInt_t dtime = OBT(hrun->GetPscuHeader()->GetOrbitalTime()) - OBT(eh->GetPscuHeader()->GetOrbitalTime());
7383 if( dtime > timeaftercalib ){
7384 if ( IsDebug() ) cout << " *** MISSING-PKT *** run after calib too far ( "<<dtime<<"ms ) -- cannot validate :-( "<<endl;
7385 return 0; // :-(
7386 }
7387
7388 if ( IsDebug() ) cout <<endl<< " ACQ_BUILD_INFO ==> "<<hex<<(run->ACQ_BUILD_INFO & mask)<<dec;
7389
7390 if( (run->ACQ_BUILD_INFO & mask) != build ){
7391 validate=0; // :-(
7392 cout <<endl<< " *** MISSING-PKT *** packet mismatch: ACQ_BUILD_INFO="<<hex<<(run->ACQ_BUILD_INFO&mask)<<" != "<<build<<dec;
7393 };
7394
7395 return validate;
7396
7397
7398 }
7399
7400 /**
7401 *
7402 * Check the DB (only for overlapping runs at the moment)
7403 *
7404 **/
7405 UInt_t PamelaDBOperations::Check(){
7406 return(this->Check(0,0));
7407 }
7408
7409 UInt_t PamelaDBOperations::Check(UInt_t from, UInt_t to){
7410 //
7411 if ( IsDebug() ) printf(" from %u to %u \n",from,to);
7412 //
7413 UInt_t test = 0;
7414 //
7415 UInt_t thisrht = 0;
7416 UInt_t thisrtt = 0;
7417 UInt_t thisid = 0;
7418 UInt_t prevrht = 0;
7419 UInt_t prevrtt = 0;
7420 UInt_t previd = 0;
7421 //
7422 UInt_t prevl0id = 0;
7423 UInt_t thisl0id = 0;
7424 //
7425 stringstream oss;
7426 TSQLResult *result = 0;
7427 TSQLRow *row = 0;
7428 TSQLResult *result2 = 0;
7429 TSQLRow *row2 = 0;
7430 TSQLResult *result3 = 0;
7431 TSQLRow *row3 = 0;
7432 oss.str("");
7433 oss << "SELECT ID,ID_ROOT_L0,RUNHEADER_TIME,RUNTRAILER_TIME,NEVENTS FROM GL_RUN order by RUNHEADER_TIME asc;";
7434 // oss << "SELECT ID,RUNHEADER_TIME,RUNTRAILER_TIME FROM GL_RUN where ID>10170 and ID<10190 order by RUNHEADER_TIME asc;";
7435 result = conn->Query(oss.str().c_str());
7436 //
7437 if ( !result ) throw -4;;
7438 //
7439 row = result->Next();
7440 UInt_t nid = 0;
7441 //
7442 while ( row ){
7443 nid++;
7444 if ( !(nid%1000) && nid ) printf(" %iK run scanned \n",nid/1000);
7445 thisid = (UInt_t)atoll(row->GetField(0));
7446 thisl0id = (UInt_t)atoll(row->GetField(1));
7447 thisrht = (UInt_t)atoll(row->GetField(2));
7448 thisrtt = (UInt_t)atoll(row->GetField(3));
7449 //
7450 if ( from > 0 && nid <= from ) goto ss;
7451 if ( to > 0 && nid >= to ) goto ss;
7452 //
7453 if ( (UInt_t)atoll(row->GetField(4)) > 1 ){
7454 //
7455 //
7456 //
7457 oss.str("");
7458 oss << "SELECT ID,ID_ROOT_L0,RUNHEADER_TIME,RUNTRAILER_TIME FROM GL_RUN WHERE ID!="
7459 << thisid << " AND ( RUNHEADER_TIME="
7460 << thisrht << " OR RUNTRAILER_TIME="
7461 << thisrtt << " ) AND NEVENTS!=0 AND NEVENTS!=1 order by RUNHEADER_TIME asc;";
7462 result3 = conn->Query(oss.str().c_str());
7463 if ( IsDebug() ) printf(" query is %s \n",oss.str().c_str());
7464 if ( result3 ){
7465 //
7466 oss.str("");
7467 oss << "SELECT ID,ID_ROOT_L0,RUNHEADER_TIME,RUNTRAILER_TIME FROM GL_RUN WHERE ID!="
7468 << thisid << " AND RUNHEADER_TIME="
7469 << thisrht << " AND RUNTRAILER_TIME!="
7470 << thisrtt << " AND NEVENTS!=0 AND NEVENTS!=1 order by RUNHEADER_TIME asc;";
7471 result3 = conn->Query(oss.str().c_str());
7472 if ( IsDebug() ) printf(" query is %s \n",oss.str().c_str());
7473 if ( result3 ){
7474 row3 = result3->Next();
7475 //
7476 while ( row3 ){
7477 //
7478 // 2 runs with same runheader
7479 //
7480 printf(" CHECK n.4 RUNs %u and %u HAVE SAME RUNHEADER \n",thisid,(UInt_t)atoll(row3->GetField(0)));
7481 row3 = result3->Next();
7482 };
7483 // delete result3;
7484
7485 };
7486 //
7487 oss.str("");
7488 oss << "SELECT ID,ID_ROOT_L0,RUNHEADER_TIME,RUNTRAILER_TIME FROM GL_RUN WHERE ID!="
7489 << thisid << " AND RUNHEADER_TIME!="
7490 << thisrht << " AND RUNTRAILER_TIME="
7491 << thisrtt << " AND NEVENTS!=0 AND NEVENTS!=1 order by RUNHEADER_TIME asc;";
7492 result3 = conn->Query(oss.str().c_str());
7493 if ( IsDebug() ) printf(" query is %s \n",oss.str().c_str());
7494 if ( result3 ){
7495 row3 = result3->Next();
7496 //
7497 while ( row3 ){
7498 //
7499 // 2 runs with same runtrailer
7500 //
7501 printf(" CHECK n.5 RUNs %u and %u HAVE SAME RUNTRAILER \n",thisid,(UInt_t)atoll(row3->GetField(0)));
7502 row3 = result3->Next();
7503 };
7504 // delete result3;
7505 };
7506 //
7507 oss.str("");
7508 oss << "SELECT ID,ID_ROOT_L0,RUNHEADER_TIME,RUNTRAILER_TIME FROM GL_RUN WHERE ID!="
7509 << thisid << " AND RUNHEADER_TIME="
7510 << thisrht << " AND RUNTRAILER_TIME="
7511 << thisrtt << " AND ID_RUN_FRAG!="
7512 << thisid << " order by RUNHEADER_TIME asc;";
7513 result3 = conn->Query(oss.str().c_str());
7514 if ( result3 ){
7515 row3 = result3->Next();
7516 //
7517 while ( row3 ){
7518 //
7519 // duplicated run
7520 //
7521 printf(" CHECK n.7 RUNs %u and %u HAVE SAME RUNTRAILER AND RUNHEADER (ARE THE SAME?) \n",thisid,(UInt_t)atoll(row3->GetField(0)));
7522 row3 = result3->Next();
7523 };
7524 // delete result3;
7525
7526 };
7527 };
7528 //
7529 oss.str("");
7530 oss << "SELECT ID,ID_ROOT_L0,RUNHEADER_TIME,RUNTRAILER_TIME FROM GL_RUN WHERE ID!="
7531 << thisid << " AND RUNHEADER_TIME>"
7532 << thisrht << " AND RUNTRAILER_TIME<"
7533 << thisrtt << " order by RUNHEADER_TIME asc;";
7534 result3 = conn->Query(oss.str().c_str());
7535 if ( result3 ){
7536 row3 = result3->Next();
7537 //
7538 while ( row3 ){
7539 //
7540 // run contained in the checked one
7541 //
7542 printf(" CHECK n.6 RUN %u CONTAINS RUN %u \n",thisid,(UInt_t)atoll(row3->GetField(0)));
7543 row3 = result3->Next();
7544 };
7545 // delete result3;
7546 };
7547 //
7548 };
7549 //
7550 // if ( thisrht < prevrtt || thisrtt < prevrht || thisrht > thisrtt && !(!prevrht && !prevrtt &&!previd) ){
7551 // if ( (thisrht < prevrtt || thisrtt < prevrht || thisrht > thisrtt) && (thisrht != prevrht) ){
7552 if ( (thisrht < prevrtt) && (thisrht != prevrht) ){
7553 if ( IsDebug() ) printf(" IDprev %u ID %u prevrht %u prevrtt %u thisrht %u thisrtt %u \n",previd,thisid,prevrht,prevrtt,thisrht,thisrtt);
7554 printf(" CHECK n.1 TIME SCREW of %i s AROUND RUNs %u and %u \n",(thisrht-prevrtt),previd,thisid);
7555 TString prevf = "";
7556 TString thisf = "";
7557 oss.str("");
7558 oss << "SELECT NAME FROM GL_ROOT where ID=" << (UInt_t)prevl0id <<";";
7559 result2 = conn->Query(oss.str().c_str());
7560 if ( !result2 ) throw -4;;
7561 row2 = result2->Next();
7562 prevf = (TString)row2->GetField(0);
7563 oss.str("");
7564 oss << "SELECT NAME FROM GL_ROOT where ID=" << (UInt_t)thisl0id <<";";
7565 result2 = conn->Query(oss.str().c_str());
7566 if ( !result2 ) throw -4;;
7567 row2 = result2->Next();
7568 thisf = (TString)row2->GetField(0);
7569 if ( IsDebug() ) printf(" ==> files %s and %s \n",prevf.Data(),thisf.Data());
7570 test = 1;
7571 // delete result2;
7572 };
7573 //
7574 if ( (thisrtt < prevrht) && (thisrht != prevrht) ){
7575 if ( IsDebug() ) printf(" IDprev %u ID %u prevrht %u prevrtt %u thisrht %u thisrtt %u \n",previd,thisid,prevrht,prevrtt,thisrht,thisrtt);
7576 printf(" CHECK n.2 TIME SCREW of %i s AROUND RUNs %u and %u \n",(thisrtt-prevrht),previd,thisid);
7577 TString prevf = "";
7578 TString thisf = "";
7579 oss.str("");
7580 oss << "SELECT NAME FROM GL_ROOT where ID=" << (UInt_t)prevl0id <<";";
7581 result2 = conn->Query(oss.str().c_str());
7582 if ( !result2 ) throw -4;
7583 row2 = result2->Next();
7584 prevf = (TString)row2->GetField(0);
7585 oss.str("");
7586 oss << "SELECT NAME FROM GL_ROOT where ID=" << (UInt_t)thisl0id <<";";
7587 result2 = conn->Query(oss.str().c_str());
7588 if ( !result2 ) throw -4;;
7589 row2 = result2->Next();
7590 thisf = (TString)row2->GetField(0);
7591 if ( IsDebug() ) printf(" ==> files %s and %s \n",prevf.Data(),thisf.Data());
7592 test = 1;
7593 // delete result2;
7594 };
7595 //
7596 if ( (thisrht > thisrtt) && (thisrht != prevrht) ){
7597 if ( IsDebug() ) printf(" IDprev %u ID %u prevrht %u prevrtt %u thisrht %u thisrtt %u \n",previd,thisid,prevrht,prevrtt,thisrht,thisrtt);
7598 printf(" CHECK n.3 TIME SCREW of %i s AROUND RUNs %u and %u \n",(thisrht-thisrtt),previd,thisid);
7599 TString prevf = "";
7600 TString thisf = "";
7601 oss.str("");
7602 oss << "SELECT NAME FROM GL_ROOT where ID=" << (UInt_t)prevl0id <<";";
7603 result2 = conn->Query(oss.str().c_str());
7604 if ( !result2 ) throw -4;;
7605 row2 = result2->Next();
7606 prevf = (TString)row2->GetField(0);
7607 oss.str("");
7608 oss << "SELECT NAME FROM GL_ROOT where ID=" << (UInt_t)thisl0id <<";";
7609 result2 = conn->Query(oss.str().c_str());
7610 if ( !result2 ) throw -4;;
7611 row2 = result2->Next();
7612 thisf = (TString)row2->GetField(0);
7613 if ( IsDebug() ) printf(" ==> files %s and %s \n",prevf.Data(),thisf.Data());
7614 test = 1;
7615 // delete result2;
7616 };
7617 ss:
7618 //
7619 prevrht = thisrht;
7620 prevrtt = thisrtt;
7621 previd = thisid;
7622 prevl0id = thisl0id;
7623 row = result->Next();
7624 // if ( result2 ) delete result2;
7625 // if ( result3 ) delete result3;
7626 };
7627 //
7628 return(test);
7629 //
7630 };

  ViewVC Help
Powered by ViewVC 1.1.23