/[PAMELA software]/DarthVader/OrbitalInfo/src/OrbitalInfoCore.cpp
ViewVC logotype

Annotation of /DarthVader/OrbitalInfo/src/OrbitalInfoCore.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.43 - (hide annotations) (download)
Fri Jan 29 05:49:26 2010 UTC (15 years, 1 month ago) by mocchiut
Branch: MAIN
Changes since 1.42: +6 -6 lines
Check I/O problems while getting entry

1 mocchiut 1.1 //
2     // C/C++ headers
3     //
4     #include <fstream>
5     #include <string.h>
6     #include <iostream>
7     #include <cstring>
8     #include <stdio.h>
9     //
10     // ROOT headers
11     //
12     #include <TTree.h>
13     #include <TClassEdit.h>
14     #include <TObject.h>
15     #include <TList.h>
16 mocchiut 1.5 #include <TArrayI.h>
17 mocchiut 1.1 #include <TSystem.h>
18     #include <TSystemDirectory.h>
19     #include <TString.h>
20     #include <TFile.h>
21     #include <TClass.h>
22     #include <TSQLServer.h>
23     #include <TSQLRow.h>
24     #include <TSQLResult.h>
25     //
26 mocchiut 1.8 // RunInfo header
27     //
28     #include <RunInfo.h>
29     #include <GLTables.h>
30     //
31 mocchiut 1.1 // YODA headers
32     //
33     #include <PamelaRun.h>
34     #include <PscuHeader.h>
35     #include <PscuEvent.h>
36     #include <EventHeader.h>
37 mocchiut 1.15 #include <mcmd/McmdEvent.h>
38     #include <mcmd/McmdRecord.h>
39 mocchiut 1.1 //
40     // This program headers
41     //
42     #include <OrbitalInfo.h>
43 mocchiut 1.7 #include <OrbitalInfoVerl2.h>
44 mocchiut 1.1 #include <OrbitalInfoCore.h>
45 mocchiut 1.15 #include <InclinationInfo.h>
46 mocchiut 1.1
47 mocchiut 1.40
48 mocchiut 1.1 using namespace std;
49    
50     //
51     // CORE ROUTINE
52     //
53     //
54 mocchiut 1.25 int OrbitalInfoCore(UInt_t run, TFile *file, GL_TABLES *glt, Int_t OrbitalInfoargc, char *OrbitalInfoargv[]){
55 mocchiut 1.15 //
56 mocchiut 1.1 Int_t i = 0;
57 mocchiut 1.25 TString host = glt->CGetHost();
58     TString user = glt->CGetUser();
59     TString psw = glt->CGetPsw();
60     TSQLServer *dbc = TSQLServer::Connect(host.Data(),user.Data(),psw.Data());
61 mocchiut 1.1 //
62 mocchiut 1.26 stringstream myquery;
63     myquery.str("");
64     myquery << "SET time_zone='+0:00'";
65     dbc->Query(myquery.str().c_str());
66     //
67 mocchiut 1.16 TString processFolder = Form("OrbitalInfoFolder_%u",run);
68 mocchiut 1.1 //
69     // Set these to true to have a very verbose output.
70     //
71     Bool_t debug = false;
72     //
73     Bool_t verbose = false;
74 mocchiut 1.30 //
75 mocchiut 1.31 Bool_t standalone = false;
76 mocchiut 1.30 //
77 mocchiut 1.1 if ( OrbitalInfoargc > 0 ){
78     i = 0;
79     while ( i < OrbitalInfoargc ){
80     if ( !strcmp(OrbitalInfoargv[i],"-processFolder") ) {
81     if ( OrbitalInfoargc < i+1 ){
82     throw -3;
83     };
84     processFolder = (TString)OrbitalInfoargv[i+1];
85     i++;
86     };
87     if ( (!strcmp(OrbitalInfoargv[i],"--debug")) || (!strcmp(OrbitalInfoargv[i],"-g")) ) {
88     verbose = true;
89 mocchiut 1.15 debug = true;
90 mocchiut 1.1 };
91     if ( (!strcmp(OrbitalInfoargv[i],"--verbose")) || (!strcmp(OrbitalInfoargv[i],"-v")) ) {
92     verbose = true;
93     };
94 mocchiut 1.30 if ( (!strcmp(OrbitalInfoargv[i],"--standalone")) ) {
95     standalone = true;
96     };
97     if ( (!strcmp(OrbitalInfoargv[i],"--calculate-pitch")) ) {
98     standalone = false;
99     };
100 mocchiut 1.1 i++;
101     };
102     };
103     //
104     const char* outDir = gSystem->DirName(gSystem->DirName(file->GetPath()));
105     //
106     TTree *OrbitalInfotr = 0;
107 mocchiut 1.5 UInt_t nevents = 0;
108 mocchiut 1.15 UInt_t neventsm = 0;
109 mocchiut 1.1 //
110     // variables needed to reprocess data
111     //
112 mocchiut 1.6 Long64_t maxsize = 10000000000LL;
113     TTree::SetMaxTreeSize(maxsize);
114     //
115 mocchiut 1.1 TString OrbitalInfoversion;
116     ItoRunInfo *runinfo = 0;
117 mocchiut 1.5 TArrayI *runlist = 0;
118 mocchiut 1.1 TTree *OrbitalInfotrclone = 0;
119     Bool_t reproc = false;
120     Bool_t reprocall = false;
121     UInt_t nobefrun = 0;
122     UInt_t noaftrun = 0;
123     UInt_t numbofrun = 0;
124     stringstream ftmpname;
125     TString fname;
126 mocchiut 1.5 UInt_t totfileentries = 0;
127 mocchiut 1.15 UInt_t idRun = 0;
128     //
129     // My variables. Vitaly.
130     //
131     // UInt_t iev = 0;
132     // UInt_t j3 = 0;
133     UInt_t oi = 0;
134     Int_t tmpSize = 0;
135 mocchiut 1.1 //
136     // variables needed to handle error signals
137     //
138     Int_t code = 0;
139     Int_t sgnl;
140     //
141     // OrbitalInfo classes
142     //
143     OrbitalInfo *orbitalinfo = new OrbitalInfo();
144     OrbitalInfo *orbitalinfoclone = new OrbitalInfo();
145     //
146     // define variables for opening and reading level0 file
147     //
148     TFile *l0File = 0;
149     TTree *l0tr = 0;
150 mocchiut 1.37 // TTree *l0trm = 0;
151     TChain *ch = 0;
152 mocchiut 1.2 // EM: open also header branch
153     TBranch *l0head = 0;
154     pamela::EventHeader *eh = 0;
155     pamela::PscuHeader *ph = 0;
156 mocchiut 1.15 pamela::McmdEvent *mcmdev = 0;
157     pamela::McmdRecord *mcmdrc = 0;
158 mocchiut 1.2 // end EM
159 mocchiut 1.15
160     // pamela::RunHeaderEvent *reh = new pamela::RunHeaderEvent;
161     // pamela::EventHeader *eH = new pamela::EventHeader;
162    
163 mocchiut 1.1 //
164     // Define other basic variables
165     //
166     UInt_t procev = 0;
167     stringstream file2;
168     stringstream file3;
169     stringstream qy;
170     Int_t totevent = 0;
171 mocchiut 1.5 UInt_t atime = 0;
172     UInt_t re = 0;
173 mocchiut 1.15 UInt_t ik = 0;
174 mocchiut 1.7
175     // Position
176     Float_t lon, lat, alt;
177    
178     //
179     // IGRF stuff
180     //
181 mocchiut 1.40 Float_t dimo = 0.0; // dipole moment (computed from dat files)
182     Float_t bnorth, beast, bdown, babs;
183     Float_t xl; // L value
184     Float_t icode; // code value for L accuracy (see fortran code)
185     Float_t bab1; // What's the difference with babs?
186     Float_t stps = 0.005; // step size for field line tracing
187     Float_t bdel = 0.01; // required accuracy
188     Float_t bequ; // equatorial b value (also called b_0)
189     Bool_t value = 0; // false if bequ is not the minimum b value
190     Float_t rr0; // equatorial radius normalized to earth radius
191 mocchiut 1.7
192 mocchiut 1.1 //
193     // Working filename
194     //
195     TString outputfile;
196     stringstream name;
197     name.str("");
198     name << outDir << "/";
199     //
200     // temporary file and folder
201     //
202     TFile *tempfile = 0;
203     TTree *tempOrbitalInfo = 0;
204     stringstream tempname;
205     stringstream OrbitalInfofolder;
206 mocchiut 1.23 Bool_t myfold = false;
207 mocchiut 1.1 tempname.str("");
208     tempname << outDir;
209     tempname << "/" << processFolder.Data();
210     OrbitalInfofolder.str("");
211     OrbitalInfofolder << tempname.str().c_str();
212     tempname << "/OrbitalInfotree_run";
213     tempname << run << ".root";
214 mocchiut 1.40 UInt_t totnorun = 0;
215 mocchiut 1.1 //
216     // DB classes
217     //
218     GL_ROOT *glroot = new GL_ROOT();
219 mocchiut 1.5 GL_TIMESYNC *dbtime = 0;
220 mocchiut 1.7 GL_TLE *gltle = new GL_TLE();
221 mocchiut 1.15 //
222     //Quaternions classes
223     //
224     Quaternions *L_QQ_Q_l_lower = new Quaternions();
225     InclinationInfo *RYPang_lower = new InclinationInfo();
226     Quaternions *L_QQ_Q_l_upper = new Quaternions();
227     InclinationInfo *RYPang_upper = new InclinationInfo();
228    
229     cEci eCi;
230    
231 mocchiut 1.7 // Initialize fortran routines!!!
232     Int_t ltp2 = 0;
233     Int_t ltp3 = 0;
234     Int_t uno = 1;
235 pam-fi 1.41 const char *niente = " ";
236 mocchiut 1.7 GL_PARAM *glparam = new GL_PARAM();
237 mocchiut 1.10 GL_PARAM *glparam2 = new GL_PARAM();
238 mocchiut 1.7 Int_t parerror=glparam->Query_GL_PARAM(1,301,dbc); // parameters stored in DB in GL_PRAM table
239 mocchiut 1.30 //
240     // Orientation variables
241     //
242     UInt_t evfrom = 0;
243     UInt_t jumped = 0;
244     Int_t itr = -1;
245     Double_t A1;
246     Double_t A2;
247     Double_t A3;
248     Double_t Px = 0;
249     Double_t Py = 0;
250     Double_t Pz = 0;
251     TTree *ttof = 0;
252     ToFLevel2 *tof = new ToFLevel2();
253     OrientationInfo *PO = new OrientationInfo();
254     Int_t nz = 6;
255     Float_t zin[6];
256     Int_t nevtofl2 = 0;
257     //
258 mocchiut 1.7 if ( parerror<0 ) {
259     code = parerror;
260     goto closeandexit;
261     };
262     ltp2 = (Int_t)(glparam->PATH+glparam->NAME).Length();
263     if ( verbose ) printf(" Reading Earth's Magnetic Field parameter file: %s \n",(glparam->PATH+glparam->NAME).Data());
264     //
265     parerror=glparam2->Query_GL_PARAM(1,302,dbc); // parameters stored in DB in GL_PRAM table
266     if ( parerror<0 ) {
267     code = parerror;
268     goto closeandexit;
269     };
270     ltp3 = (Int_t)(glparam2->PATH+glparam2->NAME).Length();
271     if ( verbose ) printf(" Reading Earth's Magnetic Field parameter file: %s \n",(glparam2->PATH+glparam2->NAME).Data());
272     //
273     initize_((char *)niente,&uno,(char *)(glparam->PATH+glparam->NAME).Data(),&ltp2,(char *)(glparam2->PATH+glparam2->NAME).Data(),&ltp3);
274     //
275     // End IGRF stuff//
276     //
277 mocchiut 1.30 for (Int_t ip=0;ip<nz;ip++){
278     zin[ip] = tof->GetZTOF(tof->GetToFPlaneID(ip));
279     };
280     //
281     if ( !standalone ){
282     //
283     // Does it contain the Tracker tree?
284     //
285     ttof = (TTree*)file->Get("ToF");
286     if ( !ttof ) {
287     if ( verbose ) printf(" OrbitalInfo - ERROR: no tof tree\n");
288     code = -900;
289     goto closeandexit;
290     };
291     ttof->SetBranchAddress("ToFLevel2",&tof);
292     nevtofl2 = ttof->GetEntries();
293     };
294 mocchiut 1.1 //
295     // Let's start!
296     //
297     // As a first thing we must check what we have to do: if run = 0 we must process all events in the file has been passed
298     // if run != 0 we must process only that run but first we have to check if the tree MyDetector2 already exist in the file
299     // if it exists we are reprocessing data and we must delete that entries, if not we must create it.
300     //
301 mocchiut 1.5 if ( run == 0 ) reproc = true;
302 mocchiut 1.1 //
303     //
304     // Output file is "outputfile"
305     //
306     if ( !file->IsOpen() ){
307     //printf(" OrbitalInfo - ERROR: cannot open file for writing\n");
308     throw -901;
309     };
310     //
311     // Retrieve GL_RUN variables from the level2 file
312     //
313     OrbitalInfoversion = OrbitalInfoInfo(false); // we should decide how to handle versioning system
314     //
315     // create an interface to RunInfo called "runinfo"
316     //
317     runinfo = new ItoRunInfo(file);
318     //
319     // open "Run" tree in level2 file, if not existing return an error (sngl != 0)
320     //
321     sgnl = 0;
322     sgnl = runinfo->Update(run, "ORB", OrbitalInfoversion);
323     //sgnl = runinfo->Read(run);
324    
325     if ( sgnl ){
326     //printf("OrbitalInfo - ERROR: RunInfo exited with non-zero status\n");
327     code = sgnl;
328     goto closeandexit;
329     } else {
330     sgnl = 0;
331     };
332     //
333     // number of events in the file BEFORE the first event of our run
334     //
335     nobefrun = runinfo->GetFirstEntry();
336     //
337     // total number of events in the file
338     //
339     totfileentries = runinfo->GetFileEntries();
340     //
341     // first file entry AFTER the last event of our run
342     //
343     noaftrun = runinfo->GetLastEntry() + 1;
344     //
345     // number of run to be processed
346     //
347     numbofrun = runinfo->GetNoRun();
348 mocchiut 1.40 totnorun = runinfo->GetRunEntries();
349 mocchiut 1.1 //
350     // Try to access the OrbitalInfo tree in the file, if it exists we are reprocessing data if not we are processing a new run
351     //
352     OrbitalInfotrclone = (TTree*)file->Get("OrbitalInfo");
353     //
354     if ( !OrbitalInfotrclone ){
355     //
356     // tree does not exist, we are not reprocessing
357     //
358     reproc = false;
359 mocchiut 1.5 if ( run == 0 ){
360 mocchiut 1.1 if (verbose) printf(" OrbitalInfo - WARNING: you are reprocessing data but OrbitalInfo tree does not exist!\n");
361     }
362 mocchiut 1.5 if ( runinfo->IsReprocessing() && run != 0 ) {
363 mocchiut 1.1 if (verbose) printf(" OrbitalInfo - WARNING: it seems you are not reprocessing data but OrbitalInfo\n versioning information already exists in RunInfo.\n");
364     }
365     } else {
366     //
367     // tree exists, we are reprocessing data. Are we reprocessing a single run or all the file?
368     //
369 mocchiut 1.6 OrbitalInfotrclone->SetAutoSave(900000000000000LL);
370 mocchiut 1.1 reproc = true;
371     //
372     //
373     if (verbose) printf("\n Preparing the pre-processing...\n");
374     //
375 mocchiut 1.22 if ( run == 0 || totnorun == 1 ){
376 mocchiut 1.1 //
377     // we are reprocessing all the file
378     // if we are reprocessing everything we don't need to copy any old event and we can just work with the new tree and delete the old one immediately
379     //
380     reprocall = true;
381     //
382     if (verbose) printf("\n OrbitalInfo - WARNING: Reprocessing all runs\n");
383     //
384     } else {
385     //
386     // we are reprocessing a single run, we must copy to the new tree the events in the file which preceed the first event of the run
387     //
388     reprocall = false;
389     //
390 mocchiut 1.5 if (verbose) printf("\n OrbitalInfo - WARNING: Reprocessing run number %u \n",run);
391 mocchiut 1.1 //
392     // copying old tree to a new file
393     //
394 mocchiut 1.23 gSystem->MakeDirectory(OrbitalInfofolder.str().c_str());
395     myfold = true;
396 mocchiut 1.1 tempfile = new TFile(tempname.str().c_str(),"RECREATE");
397     tempOrbitalInfo = OrbitalInfotrclone->CloneTree(-1,"fast");
398     tempOrbitalInfo->SetName("OrbitalInfo-old");
399     tempfile->Write();
400     tempfile->Close();
401     }
402     //
403     // Delete the old tree from old file and memory
404     //
405     OrbitalInfotrclone->Delete("all");
406     //
407     if (verbose) printf(" ...done!\n");
408     //
409     };
410     //
411     // create mydetector tree mydect
412     //
413     file->cd();
414     OrbitalInfotr = new TTree("OrbitalInfo-new","PAMELA OrbitalInfo data");
415 mocchiut 1.6 OrbitalInfotr->SetAutoSave(900000000000000LL);
416 mocchiut 1.30 orbitalinfo->Set();//ELENA **TEMPORANEO?**
417 mocchiut 1.1 OrbitalInfotr->Branch("OrbitalInfo","OrbitalInfo",&orbitalinfo);
418     //
419     if ( reproc && !reprocall ){
420     //
421     // open new file and retrieve also tree informations
422     //
423     tempfile = new TFile(tempname.str().c_str(),"READ");
424     OrbitalInfotrclone = (TTree*)tempfile->Get("OrbitalInfo-old");
425 mocchiut 1.6 OrbitalInfotrclone->SetAutoSave(900000000000000LL);
426 mocchiut 1.1 OrbitalInfotrclone->SetBranchAddress("OrbitalInfo",&orbitalinfoclone);
427     //
428     if ( nobefrun > 0 ){
429     if (verbose){
430 mocchiut 1.7 printf("\n Pre-processing: copying events from the old tree before the processed run\n");
431     printf(" Copying %u events in the file which are before the beginning of the run %u \n",nobefrun,run);
432     printf(" Start copying at event number 0, end copying at event number %u \n",nobefrun);
433 mocchiut 1.1 }
434     for (UInt_t j = 0; j < nobefrun; j++){
435     //
436 mocchiut 1.43 if ( OrbitalInfotrclone->GetEntry(j) <= 0 ) throw -36;
437 mocchiut 1.1 //
438     // copy orbitalinfoclone to mydec
439     //
440 mocchiut 1.3 orbitalinfo->Clear();
441 mocchiut 1.5 //
442 mocchiut 1.1 memcpy(&orbitalinfo,&orbitalinfoclone,sizeof(orbitalinfoclone));
443     //
444     // Fill entry in the new tree
445     //
446     OrbitalInfotr->Fill();
447     //
448     };
449     if (verbose) printf(" Finished successful copying!\n");
450     };
451     };
452     //
453     // Get the list of run to be processed, if only one run has to be processed the list will contain one entry only.
454     //
455     runlist = runinfo->GetRunList();
456     //
457     // Loop over the run to be processed
458     //
459     for (UInt_t irun=0; irun < numbofrun; irun++){
460     //
461     // retrieve the first run ID to be processed using the RunInfo list
462     //
463 mocchiut 1.15
464 mocchiut 1.1 idRun = runlist->At(irun);
465     if (verbose){
466     printf("\n\n\n ####################################################################### \n");
467     printf(" PROCESSING RUN NUMBER %i \n",(int)idRun);
468     printf(" ####################################################################### \n\n\n");
469     }
470     //
471 mocchiut 1.5 runinfo->ID_ROOT_L0 = 0;
472 mocchiut 1.1 //
473     // store in the runinfo class the GL_RUN variables for our run
474     //
475     sgnl = 0;
476     sgnl = runinfo->GetRunInfo(idRun);
477     if ( sgnl ){
478 mocchiut 1.5 if ( debug ) printf("\n OrbitalInfo - ERROR: RunInfo exited with non-zero status\n");
479 mocchiut 1.1 code = sgnl;
480     goto closeandexit;
481     } else {
482     sgnl = 0;
483     };
484     //
485     // now you can access that variables using the RunInfo class this way runinfo->ID_REG_RUN
486     //
487 mocchiut 1.5 if ( runinfo->ID_ROOT_L0 == 0 ){
488     if ( debug ) printf("\n OrbitalInfo - ERROR: no run with ID_RUN = %u \n\n Exiting... \n\n",idRun);
489 mocchiut 1.1 code = -5;
490     goto closeandexit;
491     };
492     //
493 mocchiut 1.5 // prepare the timesync for the db
494     //
495     dbtime = new GL_TIMESYNC(runinfo->ID_ROOT_L0,"ID",dbc);
496 mocchiut 1.15
497 mocchiut 1.5 //
498 mocchiut 1.1 // Search in the DB the path and name of the LEVEL0 file to be processed.
499     //
500 mocchiut 1.5 glroot->Query_GL_ROOT(runinfo->ID_ROOT_L0,dbc);
501 mocchiut 1.1 //
502     ftmpname.str("");
503     ftmpname << glroot->PATH.Data() << "/";
504     ftmpname << glroot->NAME.Data();
505     fname = ftmpname.str().c_str();
506 mocchiut 1.15 ftmpname.str("");
507 mocchiut 1.1 //
508 mocchiut 1.40 // print nout informations
509 mocchiut 1.1 //
510 mocchiut 1.5 totevent = runinfo->NEVENTS;
511 mocchiut 1.30 evfrom = runinfo->EV_FROM;
512 mocchiut 1.15 //cout<<"totevents = "<<totevent<<"\n";
513 mocchiut 1.1 if (verbose){
514     printf("\n LEVEL0 data file: %s \n",fname.Data());
515 mocchiut 1.5 printf(" RUN HEADER absolute time is: %u \n",runinfo->RUNHEADER_TIME);
516     printf(" RUN TRAILER absolute time is: %u \n",runinfo->RUNTRAILER_TIME);
517 mocchiut 1.15 printf(" %i events to be processed for run %u: from %i to %i \n\n",totevent,idRun,runinfo->EV_FROM+1,runinfo->EV_FROM+totevent);
518 mocchiut 1.1 }//
519 mocchiut 1.27 //
520 mocchiut 1.28 // if ( !totevent ) goto closeandexit;
521 mocchiut 1.1 // Open Level0 file
522     l0File = new TFile(fname.Data());
523     if ( !l0File ) {
524 mocchiut 1.5 if ( debug ) printf(" OrbitalInfo - ERROR: problems opening Level0 file\n");
525 mocchiut 1.1 code = -6;
526     goto closeandexit;
527     };
528     l0tr = (TTree*)l0File->Get("Physics");
529     if ( !l0tr ) {
530 mocchiut 1.5 if ( debug ) printf(" OrbitalInfo - ERROR: no Physics tree in Level0 file\n");
531 mocchiut 1.1 l0File->Close();
532     code = -7;
533     goto closeandexit;
534     };
535 mocchiut 1.2 // EM: open header branch as well
536     l0head = l0tr->GetBranch("Header");
537     if ( !l0head ) {
538 mocchiut 1.5 if ( debug ) printf(" OrbitalInfo - ERROR: no Header branch in Level0 tree\n");
539 mocchiut 1.2 l0File->Close();
540     code = -8;
541     goto closeandexit;
542     };
543     l0tr->SetBranchAddress("Header", &eh);
544     // end EM
545 mocchiut 1.5 nevents = l0head->GetEntries();
546 mocchiut 1.1 //
547 mocchiut 1.28 if ( nevents < 1 && totevent ) {
548 mocchiut 1.5 if ( debug ) printf(" OrbitalInfo - ERROR: Level0 file is empty\n\n");
549 mocchiut 1.1 l0File->Close();
550     code = -11;
551     goto closeandexit;
552     };
553 mocchiut 1.20 //
554 mocchiut 1.28 if ( runinfo->EV_TO > nevents-1 && totevent ) {
555 mocchiut 1.5 if ( debug ) printf(" OrbitalInfo - ERROR: too few entries in the registry tree\n");
556 mocchiut 1.1 l0File->Close();
557     code = -12;
558     goto closeandexit;
559     };
560     //
561 mocchiut 1.15 // TTree *tp = (TTree*)l0File->Get("RunHeader");
562     // tp->SetBranchAddress("Header", &eH);
563     // tp->SetBranchAddress("RunHeader", &reh);
564     // tp->GetEntry(0);
565     // ph = eH->GetPscuHeader();
566     // ULong_t TimeSync = reh->LAST_TIME_SYNC_INFO;
567     // ULong_t ObtSync = reh->OBT_TIME_SYNC;
568     // if ( debug ) printf(" 1 TimeSync %lu ObtSync %lu DeltaOBT %lu\n",TimeSync,ObtSync,TimeSync-ObtSync);
569     //
570     ULong_t TimeSync = (ULong_t)dbtime->GetTimesync();
571     ULong_t ObtSync = (ULong_t)(dbtime->GetObt0()/1000);
572     ULong_t DeltaOBT = TimeSync - ObtSync;
573    
574     if ( debug ) printf(" 2 TimeSync %lu ObtSync %lu DeltaOBT %lu\n",(ULong_t)(dbtime->GetTimesync()/1000),(ULong_t)dbtime->GetObt0(),TimeSync-ObtSync);
575 mocchiut 1.37 //
576     // Read MCMDs from up to 11 files, 5 before and 5 after the present one in order to have some kind of inclination information
577     //
578     ch = new TChain("Mcmd","Mcmd");
579     //
580     // look in the DB to find the closest files to this run
581     //
582     TSQLResult *pResult = 0;
583     TSQLRow *Row = 0;
584     stringstream myquery;
585     UInt_t l0fid[10];
586     Int_t i = 0;
587     memset(l0fid,0,10*sizeof(Int_t));
588     //
589     myquery.str("");
590     myquery << "select ID_ROOT_L0 from GL_RUN where RUNHEADER_TIME<=" << runinfo->RUNHEADER_TIME << " group by ID_ROOT_L0 order by RUNHEADER_TIME desc limit 5;";
591     //
592     pResult = dbc->Query(myquery.str().c_str());
593     //
594     i = 9;
595     if( pResult ){
596     //
597     Row = pResult->Next();
598     //
599     while ( Row ){
600     //
601     // store infos and exit
602     //
603     l0fid[i] = (UInt_t)atoll(Row->GetField(0));
604     i--;
605     Row = pResult->Next();
606     //
607     };
608     pResult->Delete();
609     };
610     //
611     myquery.str("");
612     myquery << "select ID_ROOT_L0 from GL_RUN where RUNHEADER_TIME>" << runinfo->RUNHEADER_TIME << " group by ID_ROOT_L0 order by RUNHEADER_TIME asc limit 5;";
613     //
614     pResult = dbc->Query(myquery.str().c_str());
615     //
616     i = 0;
617     if( pResult ){
618     //
619     Row = pResult->Next();
620     //
621     while ( Row ){
622     //
623     // store infos and exit
624     //
625     l0fid[i] = (UInt_t)atoll(Row->GetField(0));
626     i++;
627     Row = pResult->Next();
628     //
629     };
630     pResult->Delete();
631     };
632     //
633     i = 0;
634     UInt_t previd = 0;
635     while ( i < 10 ){
636     if ( l0fid[i] && previd != l0fid[i] ){
637     previd = l0fid[i];
638     myquery.str("");
639     myquery << "select PATH,NAME from GL_ROOT where ID=" << l0fid[i] << " ;";
640     //
641     pResult = dbc->Query(myquery.str().c_str());
642     //
643     if( pResult ){
644     //
645     Row = pResult->Next();
646     //
647     if ( debug ) printf(" Using inclination informations from file: %s \n",(((TString)gSystem->ExpandPathName(Row->GetField(0)))+"/"+(TString)Row->GetField(1)).Data());
648     ch->Add(((TString)gSystem->ExpandPathName(Row->GetField(0)))+"/"+(TString)Row->GetField(1));
649     //
650     pResult->Delete();
651     };
652     };
653     i++;
654     };
655     //
656     // l0trm = (TTree*)l0File->Get("Mcmd");
657     // ch->ls();
658     ch->SetBranchAddress("Mcmd",&mcmdev);
659     // printf(" entries %llu \n", ch->GetEntries());
660     // l0trm = ch->GetTree();
661     // neventsm = l0trm->GetEntries();
662     neventsm = ch->GetEntries();
663     if ( debug ) printf(" entries %u \n", neventsm);
664 mocchiut 1.18 // neventsm = 0;
665 mocchiut 1.15 //
666     if (neventsm == 0){
667 mocchiut 1.18 if ( debug ) printf("InclinationInfo - WARNING: No quaternions in this File");
668     // l0File->Close();
669     code = 900;
670     // goto closeandexit;
671 mocchiut 1.15 }
672     //
673    
674 mocchiut 1.37 // l0trm->SetBranchAddress("Mcmd", &mcmdev);
675 mocchiut 1.18 // l0trm->SetBranchAddress("Header", &eh);
676 mocchiut 1.15 //
677     //
678     //
679     UInt_t mctren = 0;
680     UInt_t mcreen = 0;
681     UInt_t numrec = 0;
682     //
683     Double_t upperqtime = 0;
684     Double_t lowerqtime = 0;
685    
686     Double_t incli = 0;
687     oi = 0;
688     UInt_t ooi = 0;
689     //
690     // init quaternions sync
691     //
692     Bool_t isf = true;
693     Int_t fgh = 0;
694     //
695 mocchiut 1.1 // run over all the events of the run
696     //
697     if (verbose) printf("\n Ready to start! \n\n Processed events: \n\n");
698     //
699 mocchiut 1.25 //
700 mocchiut 1.5 for ( re = runinfo->EV_FROM; re < (runinfo->EV_FROM+runinfo->NEVENTS); re++){
701 mocchiut 1.1 //
702 mocchiut 1.5 if ( procev%1000 == 0 && procev > 0 && verbose ) printf(" %iK \n",procev/1000);
703 mocchiut 1.15 if ( debug ) printf(" %i \n",procev);
704 mocchiut 1.1 //
705 mocchiut 1.43 if ( l0head->GetEntry(re) <= 0 ) throw -36;
706 mocchiut 1.1 //
707     // absolute time of this event
708     //
709 mocchiut 1.5 ph = eh->GetPscuHeader();
710 mocchiut 1.15 atime = dbtime->DBabsTime(ph->GetOrbitalTime());
711 mocchiut 1.40 if ( debug ) printf(" %i absolute time \n",procev);
712 mocchiut 1.1 //
713     // paranoid check
714     //
715 mocchiut 1.34 if ( (atime > (runinfo->RUNTRAILER_TIME+1)) || (atime < (runinfo->RUNHEADER_TIME-1)) ) {
716 mocchiut 1.1 if (verbose) printf(" OrbitalInfo - WARNING: event at time outside the run time window, skipping it\n");
717 mocchiut 1.30 jumped++;
718 mocchiut 1.19 // debug = true;
719 mocchiut 1.7 continue;
720     }
721 mocchiut 1.30
722     //
723     // retrieve tof informations
724     //
725     if ( !reprocall ){
726     itr = nobefrun + (re - evfrom - jumped);
727     //itr = re-(46438+200241);
728     } else {
729     itr = runinfo->GetFirstEntry() + (re - evfrom - jumped);
730     };
731     //
732     if ( !standalone ){
733     if ( itr > nevtofl2 ){
734     if ( verbose ) printf(" OrbitalInfo - ERROR: no tof events with entry = %i in Level2 file\n",itr);
735     if ( debug ) printf(" nobefrun %u re %u evfrom %u jumped %u reprocall %i \n",nobefrun,re,evfrom,jumped,reprocall);
736     l0File->Close();
737     code = -901;
738     goto closeandexit;
739     };
740     //
741     tof->Clear();
742     //
743 mocchiut 1.43 if ( ttof->GetEntry(itr) <= 0 ) throw -36;
744 mocchiut 1.30 //
745     };
746 mocchiut 1.1 //
747     procev++;
748     //
749     // start processing
750     //
751 mocchiut 1.40 if ( debug ) printf(" %i start processing \n",procev);
752 mocchiut 1.3 orbitalinfo->Clear();
753 mocchiut 1.5 //
754 mocchiut 1.30 OrbitalInfoTrkVar *t_orb = new OrbitalInfoTrkVar();
755     if( !(orbitalinfo->OrbitalInfoTrk) ) orbitalinfo->OrbitalInfoTrk = new TClonesArray("OrbitalInfoTrkVar",2);
756     TClonesArray &tor = *orbitalinfo->OrbitalInfoTrk;
757     //
758 mocchiut 1.15 // Fill OBT, pkt_num and absTime
759     //
760 mocchiut 1.2 orbitalinfo->pkt_num = ph->GetCounter();
761     orbitalinfo->OBT = ph->GetOrbitalTime();
762 mocchiut 1.15 orbitalinfo->absTime = atime;
763 mocchiut 1.40 if ( debug ) printf(" %i pktnum obt abstime \n",procev);
764 mocchiut 1.15 //
765     // Propagate the orbit from the tle time to atime, using SGP(D)4.
766     //
767 mocchiut 1.40 if ( debug ) printf(" %i sgp4 \n",procev);
768 mocchiut 1.15 cCoordGeo coo;
769 mocchiut 1.40 Float_t jyear=0.;
770 mocchiut 1.7 //
771     if(atime >= gltle->GetToTime()) {
772 mocchiut 1.9 if ( !gltle->Query(atime, dbc) ){
773 mocchiut 1.15 //
774 mocchiut 1.9 // Compute the magnetic dipole moment.
775 mocchiut 1.15 //
776 mocchiut 1.40 if ( debug ) printf(" %i compute magnetic dipole moment \n",procev);
777 mocchiut 1.9 UInt_t year, month, day, hour, min, sec;
778 mocchiut 1.15 //
779 mocchiut 1.9 TTimeStamp t = TTimeStamp(atime, kTRUE);
780     t.GetDate(kTRUE, 0, &year, &month, &day);
781     t.GetTime(kTRUE, 0, &hour, &min, &sec);
782     jyear = (float) year
783     + (month*31.+ (float) day)/365.
784     + (hour*3600.+min*60.+(float)sec)/(24*3600*365.);
785 mocchiut 1.15 //
786 mocchiut 1.40 if ( debug ) printf(" %i compute magnetic dipole moment get dipole moment for year\n",procev);
787 mocchiut 1.9 feldcof_(&jyear, &dimo); // get dipole moment for year
788 mocchiut 1.40 if ( debug ) printf(" %i compute magnetic dipole moment end\n",procev);
789 mocchiut 1.9 } else {
790     code = -56;
791     goto closeandexit;
792     };
793 mocchiut 1.7 }
794 mocchiut 1.15 coo = getCoo(atime, gltle->GetFromTime(), gltle->GetTle());
795     //
796     cOrbit orbits(*gltle->GetTle());
797     //
798 mocchiut 1.18 if ( debug ) printf(" I am Here \n");
799     //
800 mocchiut 1.15 // synchronize with quaternions data
801     //
802 mocchiut 1.18 if ( isf && neventsm>0 ){
803     if ( debug ) printf(" I am here \n");
804 mocchiut 1.15 //
805     // First event
806     //
807     isf = false;
808     upperqtime = atime;
809     lowerqtime = runinfo->RUNHEADER_TIME;
810     for ( ik = 0; ik < neventsm; ik++){
811 mocchiut 1.37 // l0trm->GetEntry(ik);
812 mocchiut 1.43 if ( ch->GetEntry(ik) <= 0 ) throw -36;
813 mocchiut 1.15 tmpSize = mcmdev->Records->GetEntries();
814     numrec = tmpSize;
815     for (Int_t j3 = 0;j3<tmpSize;j3++){
816 mocchiut 1.37 if ( debug ) printf(" ik %i j3 %i eh eh eh \n",ik,j3);
817 mocchiut 1.15 mcmdrc = (pamela::McmdRecord*)mcmdev->Records->At(j3);
818 mocchiut 1.38 if ( mcmdrc ){ // missing inclination bug [8RED 090116]
819 mocchiut 1.42 if ((int)mcmdrc->ID1 == 226 && mcmdrc->Mcmd_Block_crc_ok == 1){
820 mocchiut 1.38 L_QQ_Q_l_upper->fill(mcmdrc->McmdData);
821     for (UInt_t ui = 0; ui < 6; ui++){
822     if (ui>0){
823     if (L_QQ_Q_l_upper->time[ui]>L_QQ_Q_l_upper->time[0]){
824     if (dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[ui]*1000-DeltaOBT*1000))<atime){
825     upperqtime = dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[ui]*1000-DeltaOBT*1000));
826     orbits.getPosition((double) (upperqtime - gltle->GetFromTime())/60., &eCi);
827     RYPang_upper->TransAngle(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z,eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z,L_QQ_Q_l_upper->quat[ui][0],L_QQ_Q_l_upper->quat[ui][1],L_QQ_Q_l_upper->quat[ui][2],L_QQ_Q_l_upper->quat[ui][3]);
828     }else {
829     lowerqtime = upperqtime;
830     upperqtime = dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[ui]*1000-DeltaOBT*1000));
831     orbits.getPosition((double) (upperqtime - gltle->GetFromTime())/60., &eCi);
832     RYPang_upper->TransAngle(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z,eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z,L_QQ_Q_l_upper->quat[ui][0],L_QQ_Q_l_upper->quat[ui][1],L_QQ_Q_l_upper->quat[ui][2],L_QQ_Q_l_upper->quat[ui][3]);
833     mcreen = j3;
834     mctren = ik;
835     if(fgh==0){
836     CopyQ(L_QQ_Q_l_lower,L_QQ_Q_l_upper);
837     CopyAng(RYPang_lower,RYPang_upper);
838     }
839     oi=ui;
840     goto closethisloop;
841     }
842     fgh++;
843     CopyQ(L_QQ_Q_l_lower,L_QQ_Q_l_upper);
844     CopyAng(RYPang_lower,RYPang_upper);
845     }
846     }else{
847     if (dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000))<atime){
848     upperqtime = dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
849 mocchiut 1.15 orbits.getPosition((double) (upperqtime - gltle->GetFromTime())/60., &eCi);
850 mocchiut 1.38 RYPang_upper->TransAngle(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z,eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z,L_QQ_Q_l_upper->quat[0][0],L_QQ_Q_l_upper->quat[0][1],L_QQ_Q_l_upper->quat[0][2],L_QQ_Q_l_upper->quat[0][3]);
851     }
852     else {
853 mocchiut 1.15 lowerqtime = upperqtime;
854 mocchiut 1.38 upperqtime = dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
855 mocchiut 1.15 orbits.getPosition((double) (upperqtime - gltle->GetFromTime())/60., &eCi);
856 mocchiut 1.38 RYPang_upper->TransAngle(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z,eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z,L_QQ_Q_l_upper->quat[0][0],L_QQ_Q_l_upper->quat[0][1],L_QQ_Q_l_upper->quat[0][2],L_QQ_Q_l_upper->quat[0][3]);
857 mocchiut 1.15 mcreen = j3;
858     mctren = ik;
859     if(fgh==0){
860     CopyQ(L_QQ_Q_l_lower,L_QQ_Q_l_upper);
861     CopyAng(RYPang_lower,RYPang_upper);
862 mocchiut 1.38 lowerqtime = atime-1;
863 mocchiut 1.15 }
864     oi=ui;
865     goto closethisloop;
866 mocchiut 1.38 //_0 = true;
867 mocchiut 1.15 }
868     fgh++;
869     CopyQ(L_QQ_Q_l_lower,L_QQ_Q_l_upper);
870     CopyAng(RYPang_lower,RYPang_upper);
871     //_0 = true;
872 mocchiut 1.38 };
873     //cin>>grib;
874 mocchiut 1.15 };
875     };
876     };
877     };
878     };
879     };
880     closethisloop:
881     //
882 mocchiut 1.18 if ( debug ) printf(" I am There \n");
883     //
884     if (((atime>(UInt_t)upperqtime)||(atime<(UInt_t)lowerqtime)) && neventsm>0 ){
885     if ( debug ) printf(" I am there \n");
886 mocchiut 1.15 //
887     lowerqtime = upperqtime;
888 mocchiut 1.21 Long64_t maxloop = 100000000LL;
889     Long64_t mn = 0;
890 mocchiut 1.40 Bool_t gh=false;
891 mocchiut 1.15 ooi=oi;
892     if ( verbose ) printf(" OrbitalInfoCore: sync with quaternions data upperqtime %u lowerqtime %u atime %u \n",(UInt_t)upperqtime,(UInt_t)lowerqtime,atime);
893     while (!gh){
894     if ( mn > maxloop ){
895     if ( verbose ) printf(" OrbitalInfoCore: quaternions sync out of range! exiting\n");
896     gh = true;
897 mocchiut 1.21 neventsm = 0;
898 mocchiut 1.15 };
899     mn++;
900     if (oi<5) oi++;
901     else oi=0;
902 mocchiut 1.29 if (oi==0 && numrec > 0){
903     if ( debug ) printf(" mumble \n");
904 mocchiut 1.15 mcreen++;
905     if (mcreen == numrec){
906     mctren++;
907     mcreen = 0;
908 mocchiut 1.37 // l0trm->GetEntry(mctren);
909 mocchiut 1.43 if ( ch->GetEntry(mctren) <= 0 ) throw -36;
910 mocchiut 1.15 numrec = mcmdev->Records->GetEntries();
911     }
912     CopyQ(L_QQ_Q_l_lower,L_QQ_Q_l_upper);
913     CopyAng(RYPang_lower,RYPang_upper);
914     mcmdrc = (pamela::McmdRecord*)mcmdev->Records->At(mcreen);
915 mocchiut 1.38 if ( mcmdrc ){ // missing inclination bug [8RED 090116]
916 mocchiut 1.42 if ((int)mcmdrc->ID1 == 226 && mcmdrc->Mcmd_Block_crc_ok == 1){
917 mocchiut 1.38 L_QQ_Q_l_upper->fill(mcmdrc->McmdData);
918     upperqtime = dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
919     if (upperqtime<lowerqtime){
920     upperqtime=runinfo->RUNTRAILER_TIME;
921     CopyQ(L_QQ_Q_l_upper,L_QQ_Q_l_lower);
922     CopyAng(RYPang_upper,RYPang_lower);
923     }else{
924     orbits.getPosition((double) (upperqtime - gltle->GetFromTime())/60., &eCi);
925     RYPang_upper->TransAngle(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z,eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z,L_QQ_Q_l_upper->quat[0][0],L_QQ_Q_l_upper->quat[0][1],L_QQ_Q_l_upper->quat[0][2],L_QQ_Q_l_upper->quat[0][3]);
926     }
927     // re--;
928     gh=true;
929 mocchiut 1.15 }
930 mocchiut 1.38 };
931 mocchiut 1.15 }else{
932     if ((Int_t)L_QQ_Q_l_upper->time[oi]>(Int_t)L_QQ_Q_l_upper->time[0]){
933     upperqtime = dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000));
934     orbits.getPosition((double) (upperqtime - gltle->GetFromTime())/60., &eCi);
935     RYPang_upper->TransAngle(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z,eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z,L_QQ_Q_l_upper->quat[oi][0],L_QQ_Q_l_upper->quat[oi][1],L_QQ_Q_l_upper->quat[oi][2],L_QQ_Q_l_upper->quat[oi][3]);
936     orbits.getPosition((double) (lowerqtime - gltle->GetFromTime())/60., &eCi);
937     RYPang_lower->TransAngle(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z,eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z,L_QQ_Q_l_upper->quat[oi-1][0],L_QQ_Q_l_upper->quat[oi-1][1],L_QQ_Q_l_upper->quat[oi-1][2],L_QQ_Q_l_upper->quat[oi-1][3]);
938     // re--;
939     gh=true;
940     };
941     };
942     };
943     if ( verbose ) printf(" OrbitalInfoCore: sync with quaternions data now we have upperqtime %u lowerqtime %u atime %u \n",(UInt_t)upperqtime,(UInt_t)lowerqtime,atime);
944     };
945     //
946 mocchiut 1.18 if ( debug ) printf(" I am THIS \n");
947     //
948 mocchiut 1.15 // Fill in quaternions and angles
949     //
950 mocchiut 1.18 if ((atime<=(UInt_t)upperqtime)&&(atime>=(UInt_t)lowerqtime)&& neventsm>0){
951     if ( debug ) printf(" I am this \n");
952 mocchiut 1.15 UInt_t tut = holeq(lowerqtime, upperqtime, L_QQ_Q_l_lower, L_QQ_Q_l_upper, oi);
953     if (oi == 0){
954     if ((tut!=5)||(tut!=6)){
955     incli = (L_QQ_Q_l_upper->quat[0][0]-L_QQ_Q_l_lower->quat[ooi][0])/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_lower->time[ooi]*1000-DeltaOBT*1000)));
956     orbitalinfo->q0 = incli*atime+L_QQ_Q_l_upper->quat[0][0]-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
957     incli = (L_QQ_Q_l_upper->quat[0][1]-L_QQ_Q_l_lower->quat[ooi][1])/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_lower->time[ooi]*1000-DeltaOBT*1000)));
958     orbitalinfo->q1 = incli*atime+L_QQ_Q_l_upper->quat[0][1]-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
959     incli = (L_QQ_Q_l_upper->quat[0][2]-L_QQ_Q_l_lower->quat[ooi][2])/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_lower->time[ooi]*1000-DeltaOBT*1000)));
960     orbitalinfo->q2 = incli*atime+L_QQ_Q_l_upper->quat[0][2]-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
961     incli = (L_QQ_Q_l_upper->quat[0][3]-L_QQ_Q_l_lower->quat[ooi][3])/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_lower->time[ooi]*1000-DeltaOBT*1000)));
962     orbitalinfo->q3 = incli*atime+L_QQ_Q_l_upper->quat[0][3]-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
963    
964     incli = (RYPang_upper->Tangazh-RYPang_lower->Tangazh)/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_lower->time[ooi]*1000-DeltaOBT*1000)));
965     orbitalinfo->theta = incli*atime+RYPang_upper->Tangazh-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
966     incli = (RYPang_upper->Ryskanie-RYPang_lower->Ryskanie)/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_lower->time[ooi]*1000-DeltaOBT*1000)));
967     orbitalinfo->phi = incli*atime+RYPang_upper->Ryskanie-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
968     incli = (RYPang_upper->Kren-RYPang_lower->Kren)/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_lower->time[ooi]*1000)));
969     orbitalinfo->etha = incli*atime+RYPang_upper->Kren-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
970     }
971     if (tut==6){
972     if (fabs(RYPang_lower->Kren-RYPang_upper->Kren)<0.1){
973     incli = (L_QQ_Q_l_upper->quat[0][0]-L_QQ_Q_l_lower->quat[ooi][0])/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_lower->time[ooi]*1000-DeltaOBT*1000)));
974     orbitalinfo->q0 = incli*atime+L_QQ_Q_l_upper->quat[0][0]-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
975     incli = (L_QQ_Q_l_upper->quat[0][1]-L_QQ_Q_l_lower->quat[ooi][1])/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_lower->time[ooi]*1000-DeltaOBT*1000)));
976     orbitalinfo->q1 = incli*atime+L_QQ_Q_l_upper->quat[0][1]-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
977     incli = (L_QQ_Q_l_upper->quat[0][2]-L_QQ_Q_l_lower->quat[ooi][2])/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_lower->time[ooi]*1000-DeltaOBT*1000)));
978     orbitalinfo->q2 = incli*atime+L_QQ_Q_l_upper->quat[0][2]-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
979     incli = (L_QQ_Q_l_upper->quat[0][3]-L_QQ_Q_l_lower->quat[ooi][3])/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_lower->time[ooi]*1000-DeltaOBT*1000)));
980     orbitalinfo->q3 = incli*atime+L_QQ_Q_l_upper->quat[0][3]-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
981    
982     incli = (RYPang_upper->Tangazh-RYPang_lower->Tangazh)/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_lower->time[ooi]*1000-DeltaOBT*1000)));
983     orbitalinfo->theta = incli*atime+RYPang_upper->Tangazh-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
984     incli = (RYPang_upper->Ryskanie-RYPang_lower->Ryskanie)/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_lower->time[ooi]*1000-DeltaOBT*1000)));
985     orbitalinfo->phi = incli*atime+RYPang_upper->Ryskanie-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
986     //cout<<"upper = "<<RYPang_upper->Ryskanie<<" lower = "<<RYPang_lower->Ryskanie<<" timeupper[0] = "<<L_QQ_Q_l_upper->time[0]-5500000<<" timelower["<<ooi<<"] = "<<L_QQ_Q_l_lower->time[ooi]-5500000<<" Ryscanie = "<<orbitalinfo->phi<<" incli = "<<incli<<" upper-lower = "<<RYPang_upper->Ryskanie-RYPang_lower->Ryskanie<<" Dtime = "<<dbtime->DBabsTime((UInt_t)L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000)<<"-"<<dbtime->DBabsTime((UInt_t)L_QQ_Q_l_lower->time[ooi]*1000-DeltaOBT*1000)<<" atime = "<<atime<<"\n";
987     //cin>>grib;
988     incli = (RYPang_upper->Kren-RYPang_lower->Kren)/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_lower->time[ooi]*1000-DeltaOBT*1000)));
989     orbitalinfo->etha = incli*atime+RYPang_upper->Kren-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
990     }
991     }
992     } else {
993     if((tut!=6)||(tut!=7)||(tut!=9)){
994     incli = (L_QQ_Q_l_upper->quat[oi][0]-L_QQ_Q_l_upper->quat[oi-1][0])/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi-1]*1000-DeltaOBT*1000)));
995     orbitalinfo->q0 = incli*atime+L_QQ_Q_l_upper->quat[oi][0]-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000));
996     incli = (L_QQ_Q_l_upper->quat[oi][1]-L_QQ_Q_l_upper->quat[oi-1][1])/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi-1]*1000-DeltaOBT*1000)));
997     orbitalinfo->q1 = incli*atime+L_QQ_Q_l_upper->quat[oi][1]-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000));
998     incli = (L_QQ_Q_l_upper->quat[oi][2]-L_QQ_Q_l_upper->quat[oi-1][2])/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi-1]*1000-DeltaOBT*1000)));
999     orbitalinfo->q2 = incli*atime+L_QQ_Q_l_upper->quat[oi][2]-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000));
1000     incli = (L_QQ_Q_l_upper->quat[oi][3]-L_QQ_Q_l_upper->quat[oi-1][3])/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi-1]*1000-DeltaOBT*1000)));
1001     orbitalinfo->q3 = incli*atime+L_QQ_Q_l_upper->quat[oi][3]-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000));
1002    
1003     incli = (RYPang_upper->Tangazh-RYPang_lower->Tangazh)/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi-1]*1000-DeltaOBT*1000)));
1004     orbitalinfo->theta = incli*atime+RYPang_upper->Tangazh-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000));
1005     incli = (RYPang_upper->Ryskanie-RYPang_lower->Ryskanie)/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi-1]*1000-DeltaOBT*1000)));
1006     orbitalinfo->phi = incli*atime+RYPang_upper->Ryskanie-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000));
1007     //cout<<"upper = "<<RYPang_upper->Ryskanie<<" lower = "<<RYPang_lower->Ryskanie<<" timeupper["<<oi<<"] = "<<L_QQ_Q_l_upper->time[oi]-5500000<<" timelower["<<oi-1<<"] = "<<L_QQ_Q_l_lower->time[oi-1]-5500000<<" Ryscanie = "<<orbitalinfo->phi<<" incli = "<<incli<<" upper-lower = "<<RYPang_upper->Ryskanie-RYPang_lower->Ryskanie<<" Dtime = "<<dbtime->DBabsTime((UInt_t)L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000)<<"-"<<dbtime->DBabsTime((UInt_t)L_QQ_Q_l_lower->time[oi-1]*1000-DeltaOBT*1000)<<" atime = "<<atime<<"\n";
1008     //cin>>grib;
1009     incli = (RYPang_upper->Kren-RYPang_lower->Kren)/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi-1]*1000-DeltaOBT*1000)));
1010     orbitalinfo->etha = incli*atime+RYPang_upper->Kren-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000));
1011     }
1012     if (tut==6){
1013     if (fabs(RYPang_lower->Kren-RYPang_upper->Kren)<0.1){
1014     incli = (L_QQ_Q_l_upper->quat[oi][0]-L_QQ_Q_l_upper->quat[oi-1][0])/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi-1]*1000-DeltaOBT*1000)));
1015     orbitalinfo->q0 = incli*atime+L_QQ_Q_l_upper->quat[oi][0]-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000));
1016     incli = (L_QQ_Q_l_upper->quat[oi][1]-L_QQ_Q_l_upper->quat[oi-1][1])/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi-1]*1000-DeltaOBT*1000)));
1017     orbitalinfo->q1 = incli*atime+L_QQ_Q_l_upper->quat[oi][1]-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000));
1018     incli = (L_QQ_Q_l_upper->quat[oi][2]-L_QQ_Q_l_upper->quat[oi-1][2])/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi-1]*1000-DeltaOBT*1000)));
1019     orbitalinfo->q2 = incli*atime+L_QQ_Q_l_upper->quat[oi][2]-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000));
1020     incli = (L_QQ_Q_l_upper->quat[oi][3]-L_QQ_Q_l_upper->quat[oi-1][3])/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi-1]*1000-DeltaOBT*1000)));
1021     orbitalinfo->q3 = incli*atime+L_QQ_Q_l_upper->quat[oi][3]-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000));
1022    
1023     incli = (RYPang_upper->Tangazh-RYPang_lower->Tangazh)/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi-1]*1000-DeltaOBT*1000)));
1024     orbitalinfo->theta = incli*atime+RYPang_upper->Tangazh-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000));
1025     incli = (RYPang_upper->Ryskanie-RYPang_lower->Ryskanie)/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi-1]*1000-DeltaOBT*1000)));
1026     orbitalinfo->phi = incli*atime+RYPang_upper->Ryskanie-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000));
1027     //cout<<"upper = "<<RYPang_upper->Ryskanie<<" lower = "<<RYPang_lower->Ryskanie<<" timeupper["<<oi<<"] = "<<L_QQ_Q_l_upper->time[oi]-5500000<<" timelower["<<oi-1<<"] = "<<L_QQ_Q_l_lower->time[oi-1]-5500000<<" Ryscanie = "<<orbitalinfo->phi<<" incli = "<<incli<<" upper-lower = "<<RYPang_upper->Ryskanie-RYPang_lower->Ryskanie<<" Dtime = "<<dbtime->DBabsTime((UInt_t)L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000)<<"-"<<dbtime->DBabsTime((UInt_t)L_QQ_Q_l_lower->time[oi-1]*1000-DeltaOBT*1000)<<" atime = "<<atime<<"\n";
1028     //cin>>grib;
1029     incli = (RYPang_upper->Kren-RYPang_lower->Kren)/(dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000))-dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi-1]*1000-DeltaOBT*1000)));
1030     orbitalinfo->etha = incli*atime+RYPang_upper->Kren-incli*dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[oi]*1000-DeltaOBT*1000));
1031     }
1032     }
1033     }
1034 mocchiut 1.18 //
1035 mocchiut 1.15 orbitalinfo->mode = holeq(lowerqtime, upperqtime, L_QQ_Q_l_lower, L_QQ_Q_l_upper, oi);
1036 mocchiut 1.18 //
1037 mocchiut 1.15 } else {
1038 mocchiut 1.18 if ( debug ) printf(" ops no incl! \n");
1039 mocchiut 1.30 orbitalinfo->mode = 10;
1040     };
1041     //
1042     // ops no inclination information
1043     //
1044     if ( orbitalinfo->q0< -999 || orbitalinfo->q1 < -999 || orbitalinfo->q2 < -999 || orbitalinfo->q3 < -999 || orbitalinfo->q0 != orbitalinfo->q0 || orbitalinfo->q1 != orbitalinfo->q1 || orbitalinfo->q2 != orbitalinfo->q2 || orbitalinfo->q3 != orbitalinfo->q3 ){
1045     orbitalinfo->mode = 10;
1046     orbitalinfo->q0 = -1000.;
1047     orbitalinfo->q1 = -1000.;
1048     orbitalinfo->q2 = -1000.;
1049     orbitalinfo->q3 = -1000.;
1050     orbitalinfo->etha = -1000.;
1051     orbitalinfo->phi = -1000.;
1052     orbitalinfo->theta = -1000.;
1053 mocchiut 1.15 };
1054 mocchiut 1.30 //
1055     // #########################################################################################################################
1056 mocchiut 1.15 //
1057     // fill orbital positions
1058     //
1059 mocchiut 1.7 // Build coordinates in the right range. We want to convert,
1060     // longitude from (0, 2*pi) to (-180deg, 180deg). Altitude is
1061     // in meters.
1062     lon = (coo.m_Lon > M_PI) ? rad2deg(coo.m_Lon - 2*M_PI) : rad2deg(coo.m_Lon);
1063     lat = rad2deg(coo.m_Lat);
1064     alt = coo.m_Alt;
1065 mocchiut 1.15 //
1066 mocchiut 1.7 if( lon<180 && lon>-180 && lat<90 && lat>-90 && alt>0 ){
1067 mocchiut 1.15 //
1068 mocchiut 1.7 orbitalinfo->lon = lon;
1069     orbitalinfo->lat = lat;
1070     orbitalinfo->alt = alt ;
1071 mocchiut 1.15 //
1072 mocchiut 1.7 // compute mag field components and L shell.
1073 mocchiut 1.15 //
1074 mocchiut 1.7 feldg_(&lat, &lon, &alt, &bnorth, &beast, &bdown, &babs);
1075     shellg_(&lat, &lon, &alt, &dimo, &xl, &icode, &bab1);
1076     findb0_(&stps, &bdel, &value, &bequ, &rr0);
1077 mocchiut 1.15 //
1078 mocchiut 1.7 orbitalinfo->Bnorth = bnorth;
1079     orbitalinfo->Beast = beast;
1080     orbitalinfo->Bdown = bdown;
1081     orbitalinfo->Babs = babs;
1082     orbitalinfo->BB0 = babs/bequ;
1083 mocchiut 1.15 orbitalinfo->L = xl;
1084 mocchiut 1.7 // Set Stormer vertical cutoff using L shell.
1085 mocchiut 1.33 orbitalinfo->cutoffsvl = 14.9/(xl*xl);
1086 mocchiut 1.15 //
1087     };
1088 pamelaprod 1.11 //
1089 mocchiut 1.40 if ( debug ) printf(" pitch angle \n");
1090     //
1091 mocchiut 1.30 // pitch angles
1092     //
1093     if ( orbitalinfo->mode != 10 && orbitalinfo->mode != 5 && orbitalinfo->mode !=7 && orbitalinfo->mode != 9 ){
1094     //
1095     Float_t Bx = -orbitalinfo->Bdown; //don't need for PamExp ExpOnly for all geography areas
1096     Float_t By = orbitalinfo->Beast; //don't need for PamExp ExpOnly for all geography areas
1097     Float_t Bz = orbitalinfo->Bnorth; //don't need for PamExp ExpOnly for all geography areas
1098     //
1099     TMatrixD Fij = PO->ECItoGreenwich(PO->QuatoECI(orbitalinfo->q0,orbitalinfo->q1,orbitalinfo->q2,orbitalinfo->q3),orbitalinfo->absTime);
1100     TMatrixD Dij = PO->GreenwichtoGEO(orbitalinfo->lat,orbitalinfo->lon,Fij);
1101     TMatrixD Iij = PO->ColPermutation(Dij);
1102     //
1103 mocchiut 1.33 orbitalinfo->Iij.ResizeTo(Iij);
1104     orbitalinfo->Iij = Iij;
1105     //
1106 mocchiut 1.30 A1 = Iij(0,2);
1107     A2 = Iij(1,2);
1108     A3 = Iij(2,2);
1109     //
1110 mocchiut 1.33 // orbitalinfo->pamzenitangle = (Float_t)PO->GetPitchAngle(1,0,0,A1,A2,A3); // Angle between zenit and Pamela's main axiz
1111     // orbitalinfo->pamBangle = (Float_t)PO->GetPitchAngle(A1,A2,A3,Bx,By,Bz); // Angle between Pamela's main axiz and B
1112 mocchiut 1.30 //
1113     if ( !standalone && tof->ntrk() > 0 ){
1114     //
1115     Int_t nn = 0;
1116     for(Int_t nt=0; nt < tof->ntrk(); nt++){
1117     //
1118     ToFTrkVar *ptt = tof->GetToFTrkVar(nt);
1119     Double_t E11x = ptt->xtr_tof[0]; // tr->x[0];
1120     Double_t E11y = ptt->ytr_tof[0]; //tr->y[0];
1121     Double_t E11z = zin[0];
1122     Double_t E22x = ptt->xtr_tof[3];//tr->x[3];
1123     Double_t E22y = ptt->ytr_tof[3];//tr->y[3];
1124     Double_t E22z = zin[3];
1125 mocchiut 1.32 if ( (E11x < 100. && E11y < 100. && E22x < 100. && E22y < 100.) || ptt->trkseqno != -1 ){
1126 mocchiut 1.30 Double_t norm = sqrt(pow(E22x-E11x,2)+pow(E22y-E11y,2)+pow(E22z-E11z,2));
1127 mocchiut 1.39 // Double_t MyAzim = TMath::RadToDeg()*atan(TMath::Abs(E22y-E11y)/TMath::Abs(E22x-E11x));
1128     // if(E22x-E11x>=0 && E22y-E11y <0) MyAzim = 360. - MyAzim;
1129     // if(E22x-E11x>=0 && E22y-E11y >=0) MyAzim = MyAzim;
1130     // if(E22x-E11x<0 && E22y-E11y >0) MyAzim = 180. - MyAzim;
1131     // if(E22x-E11x<0 && E22y-E11y <0) MyAzim = 180. + MyAzim;
1132 mocchiut 1.30 Px = (E22x-E11x)/norm;
1133     Py = (E22y-E11y)/norm;
1134     Pz = (E22z-E11z)/norm;
1135     //
1136 mocchiut 1.33 t_orb->trkseqno = ptt->trkseqno;
1137     //
1138     TMatrixD Eij = PO->PamelatoGEO(Iij,Px,Py,Pz);
1139     t_orb->Eij.ResizeTo(Eij);
1140     t_orb->Eij = Eij;
1141     //
1142     TMatrixD Sij = PO->PamelatoGEO(Fij,Px,Py,Pz);
1143     t_orb->Sij.ResizeTo(Sij);
1144     t_orb->Sij = Sij;
1145 mocchiut 1.30 //
1146     t_orb->pitch = (Float_t)PO->GetPitchAngle(Eij(0,0),Eij(1,0),Eij(2,0),Bx,By,Bz);
1147 mocchiut 1.33 //
1148     //
1149     Double_t omega = PO->GetPitchAngle(Eij(0,0),Eij(1,0),Eij(2,0),cos(orbitalinfo->lon+TMath::Pi()/2)-sin(orbitalinfo->lon+TMath::Pi()/2),cos(orbitalinfo->lon+TMath::Pi()/2)+sin(orbitalinfo->lon+TMath::Pi()/2),1);
1150     //
1151     t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow((1+sqrt(1-pow(orbitalinfo->L,-3/2)*cos(omega))),2));
1152     //
1153 mocchiut 1.36 if ( t_orb->pitch != t_orb->pitch ) t_orb->pitch = -1000.;
1154     if ( t_orb->cutoff != t_orb->cutoff ) t_orb->cutoff = -1000.;
1155     //
1156 mocchiut 1.33 if ( debug ) printf(" orbitalinfo->cutoffsvl %f vitaly %f \n",orbitalinfo->cutoffsvl,t_orb->cutoff);
1157 mocchiut 1.30 //
1158     new(tor[nn]) OrbitalInfoTrkVar(*t_orb);
1159     nn++;
1160     //
1161     t_orb->Clear();
1162     //
1163     };
1164     //
1165     };
1166     } else {
1167     if ( debug ) printf(" mmm... mode %u standalone %i ntrk %i \n",orbitalinfo->mode,standalone,tof->ntrk());
1168     };
1169     //
1170 mocchiut 1.35 } else {
1171     if ( !standalone && tof->ntrk() > 0 ){
1172     //
1173     Int_t nn = 0;
1174     for(Int_t nt=0; nt < tof->ntrk(); nt++){
1175     //
1176     ToFTrkVar *ptt = tof->GetToFTrkVar(nt);
1177     if ( ptt->trkseqno != -1 ){
1178     //
1179     t_orb->trkseqno = ptt->trkseqno;
1180     //
1181     t_orb->Eij = 0;
1182     //
1183     t_orb->Sij = 0;
1184     //
1185     t_orb->pitch = -1000.;
1186     //
1187     t_orb->cutoff = -1000.;
1188     //
1189     new(tor[nn]) OrbitalInfoTrkVar(*t_orb);
1190     nn++;
1191     //
1192     t_orb->Clear();
1193     //
1194     };
1195     //
1196     };
1197     };
1198 mocchiut 1.30 };
1199     //
1200 mocchiut 1.15 // Fill the class
1201 pamelaprod 1.11 //
1202 mocchiut 1.1 OrbitalInfotr->Fill();
1203 mocchiut 1.15 //
1204 mocchiut 1.30 delete t_orb;
1205     //
1206 mocchiut 1.15 }; // loop over the events in the run
1207 mocchiut 1.1 //
1208     // Here you may want to clear some variables before processing another run
1209     //
1210 mocchiut 1.5 delete dbtime;
1211 mocchiut 1.18 if ( L_QQ_Q_l_upper ) delete L_QQ_Q_l_upper;
1212     if ( L_QQ_Q_l_lower ) delete L_QQ_Q_l_lower;
1213     if ( RYPang_upper ) delete RYPang_upper;
1214     if ( RYPang_lower ) delete RYPang_lower;
1215 mocchiut 1.1 }; // process all the runs
1216 mocchiut 1.15
1217 mocchiut 1.1 if (verbose) printf("\n Finished processing data \n");
1218     //
1219     closeandexit:
1220     //
1221     // we have finished processing the run(s). If we processed a single run now we must copy all the events after our run from the old tree to the new one and delete the old tree.
1222     //
1223     if ( !reprocall && reproc && code >= 0 ){
1224     if ( totfileentries > noaftrun ){
1225     if (verbose){
1226     printf("\n Post-processing: copying events from the old tree after the processed run\n");
1227     printf(" Copying %i events in the file which are after the end of the run %i \n",(int)(totfileentries-noaftrun),(int)run);
1228     printf(" Start copying at event number %i end copying at event number %i \n",(int)noaftrun,(int)totfileentries);
1229     }
1230     for (UInt_t j = noaftrun; j < totfileentries; j++ ){
1231     //
1232     // Get entry from old tree
1233     //
1234 mocchiut 1.43 if ( OrbitalInfotrclone->GetEntry(j) <= 0 ) throw -36;
1235 mocchiut 1.1 //
1236     // copy orbitalinfoclone to OrbitalInfo
1237     //
1238 mocchiut 1.3 orbitalinfo->Clear();
1239 mocchiut 1.5 //
1240 mocchiut 1.1 memcpy(&orbitalinfo,&orbitalinfoclone,sizeof(orbitalinfoclone));
1241     //
1242     // Fill entry in the new tree
1243     //
1244     OrbitalInfotr->Fill();
1245     };
1246     if (verbose) printf(" Finished successful copying!\n");
1247     };
1248     };
1249     //
1250     // Close files, delete old tree(s), write and close level2 file
1251     //
1252     if ( l0File ) l0File->Close();
1253     if ( tempfile ) tempfile->Close();
1254 mocchiut 1.23 if ( myfold ) gSystem->Unlink(tempname.str().c_str());
1255 mocchiut 1.5 //
1256 mocchiut 1.1 if ( runinfo ) runinfo->Close();
1257     if ( OrbitalInfotr ) OrbitalInfotr->SetName("OrbitalInfo");
1258 mocchiut 1.30 if ( tof ) tof->Delete();
1259     if ( ttof ) ttof->Delete();
1260     //
1261 mocchiut 1.1 if ( file ){
1262     file->cd();
1263     file->Write();
1264     };
1265     //
1266 mocchiut 1.23 if ( myfold ) gSystem->Unlink(OrbitalInfofolder.str().c_str());
1267 mocchiut 1.1 //
1268     // the end
1269     //
1270 mocchiut 1.25 if ( dbc ){
1271     dbc->Close();
1272     delete dbc;
1273     };
1274 mocchiut 1.1 if (verbose) printf("\n Exiting...\n");
1275     if(OrbitalInfotr)OrbitalInfotr->Delete();
1276 mocchiut 1.4 //
1277 mocchiut 1.30 if ( PO ) delete PO;
1278 mocchiut 1.4 if ( orbitalinfo ) delete orbitalinfo;
1279     if ( orbitalinfoclone ) delete orbitalinfoclone;
1280     if ( glroot ) delete glroot;
1281     if ( runinfo ) delete runinfo;
1282     //
1283 mocchiut 1.1 if(code < 0) throw code;
1284     return(code);
1285     }
1286    
1287 mocchiut 1.7
1288     //
1289     // Returns the cCoordGeo structure holding the geographical
1290     // coordinates for the event (see sgp4.h).
1291     //
1292     // atime is the abstime of the event in UTC unix time.
1293     // tletime is the time of the tle in UTC unix time.
1294     // tle is the previous and nearest tle (compared to atime).
1295     cCoordGeo getCoo(UInt_t atime, UInt_t tletime, cTle *tle)
1296     {
1297     cEci eci;
1298     cOrbit orbit(*tle);
1299     orbit.getPosition((double) (atime - tletime)/60., &eci);
1300    
1301     return eci.toGeo();
1302     }
1303 mocchiut 1.15
1304     // function of copyng of quatrnions classes
1305    
1306     void CopyQ(Quaternions *Q1, Quaternions *Q2){
1307     for(UInt_t i = 0; i < 6; i++){
1308     Q1->time[i]=Q2->time[i];
1309     for (UInt_t j = 0; j < 4; j++)Q1->quat[i][j]=Q2->quat[i][j];
1310     }
1311     return;
1312     }
1313    
1314     // functions of copyng InclinationInfo classes
1315    
1316     void CopyAng(InclinationInfo *A1, InclinationInfo *A2){
1317     A1->Tangazh = A2->Tangazh;
1318     A1->Ryskanie = A2->Ryskanie;
1319     A1->Kren = A2->Kren;
1320     return;
1321     }
1322    
1323     UInt_t holeq(Double_t lower,Double_t upper,Quaternions *Qlower, Quaternions *Qupper, UInt_t f){
1324    
1325     UInt_t hole = 10;
1326 mocchiut 1.40 Bool_t R10l = false; // Sign of R10 mode in lower quaternions array
1327     Bool_t R10u = false; // Sign of R10 mode in upper quaternions array
1328     Bool_t insm = false; // Sign that we inside quaternions array
1329     Bool_t mxtml = false; // Sign of mixt mode in lower quaternions array
1330     Bool_t mxtmu = false; // Sign of mixt mode in upper quaternions array
1331     Bool_t npasm = false; // Sign of normall pass between R10 and non R10 or between non R10 and R10
1332 mocchiut 1.15 UInt_t NCQl = 6; // Number of correct quaternions in lower array
1333     UInt_t NCQu = 6; // Number of correct quaternions in upper array
1334     if (f>0){
1335     insm = true;
1336     if(Qupper->time[f]-Qupper->time[f-1]==30) R10u = false;
1337     if(Qupper->time[f]-Qupper->time[f-1]<1) R10u = true;
1338     }else{
1339     insm = false;
1340     if((Qlower->time[5]-Qlower->time[0]<2)&&(Qlower->time[1]-Qlower->time[0]<2)) R10l = true;
1341     if((Qupper->time[5]-Qupper->time[0]<2)&&(Qupper->time[1]-Qupper->time[0]<2)) R10u = true;
1342     if((Qlower->time[5]-Qlower->time[0]==150)&&(Qlower->time[1]-Qlower->time[0]==30)) R10l = false;
1343     if((Qupper->time[5]-Qupper->time[0]==150)&&(Qupper->time[1]-Qupper->time[0]==30)) R10u = false;
1344     if((Qlower->time[5]-Qlower->time[0]<2)&&(Qlower->time[1]-Qlower->time[0]==30)){
1345     mxtml = true;
1346     for(UInt_t i = 1; i < 6; i++){
1347     if(Qlower->time[i]-Qlower->time[0]==30*i) NCQl=i;
1348     }
1349     }
1350     if((Qupper->time[5]-Qupper->time[0]<2)&&(Qupper->time[1]-Qupper->time[0]==30)){
1351     mxtmu = true;
1352     for(UInt_t i = 1; i < 6; i++){
1353     if(Qupper->time[i]-Qupper->time[0]==30*i) NCQu=i;
1354     }
1355     }
1356     }
1357    
1358     if(((upper-lower==1.5)||(upper-lower==3.)||(upper-lower==30.)||(upper-lower==31.5)||(upper-lower==33.)||(upper-lower==181.5)||(upper-lower==210.)||(upper-lower==211.5))&&!insm) npasm = true;
1359    
1360    
1361     if (R10u&&insm) hole=0; // best event R10
1362     if ((upper-lower<=5)&&(!insm)&&R10l&&R10u) hole = 1; // when first of 6 quaternions in array is correct
1363     if (((!R10u)&&insm)||((!insm)&&(!R10u)&&(!R10l)&&((upper-lower==210+(6-NCQl)*30)||(upper-lower==30)))) hole = 2; //non R10
1364     if (npasm&&(!insm)&&((R10l&&!R10u)||(R10u&&!R10l))) hole = 3; //normall pass from R10 to non R10 or from non R10 to R10
1365     if ((!npasm)&&(upper-lower<=300)&&(!insm)&&((R10l&&!R10u)||(R10u&&!R10l))) hole = 4; // eliminable hole between R10 and non R10 or between non R10 and R10
1366     if ((upper-lower>=300)&&(!insm)&&((R10l&&!R10u)||(R10u&&!R10l))) hole = 5; //uneliminable hole between R10 and non R10 or between non R10 and R10
1367     if ((upper-lower>5)&&(upper-lower<=300)&&R10u&&R10l) hole = 6; // eliminable hole inside R10
1368     if ((upper-lower>300)&&R10u&&R10l) hole = 7; //uneliminable hole inside R10
1369     if ((upper-lower>210)&&(upper-lower<=1200)&&(!R10u)&&(!R10l)) hole = 8; //eliminable hole inside non R10
1370     if ((upper-lower>1200)&&!R10u&&!R10l) hole = 9; // uneliminable hole inside non R10
1371     return hole;
1372     }
1373    

  ViewVC Help
Powered by ViewVC 1.1.23