/[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.79 - (hide annotations) (download)
Tue Oct 14 14:07:23 2014 UTC (10 years, 4 months ago) by mocchiut
Branch: MAIN
CVS Tags: v10RED, v10REDr01
Changes since 1.78: +2 -1 lines
10RED: lost sync bug fixed

1 mocchiut 1.1 // C/C++ headers
2     //
3     #include <fstream>
4     #include <string.h>
5     #include <iostream>
6     #include <cstring>
7     #include <stdio.h>
8     //
9     // ROOT headers
10     //
11 mocchiut 1.44 //#include <TCanvas.h>
12 pam-mep 1.60 #include <TH2F.h> //for test only. Vitaly.
13     #include <TVector3.h>
14 mocchiut 1.44 //#include <TF1.h>
15    
16 mocchiut 1.1 #include <TTree.h>
17     #include <TClassEdit.h>
18     #include <TObject.h>
19     #include <TList.h>
20 mocchiut 1.5 #include <TArrayI.h>
21 mocchiut 1.1 #include <TSystem.h>
22     #include <TSystemDirectory.h>
23     #include <TString.h>
24     #include <TFile.h>
25     #include <TClass.h>
26     #include <TSQLServer.h>
27     #include <TSQLRow.h>
28     #include <TSQLResult.h>
29     //
30 mocchiut 1.8 // RunInfo header
31     //
32     #include <RunInfo.h>
33     #include <GLTables.h>
34     //
35 mocchiut 1.1 // YODA headers
36     //
37     #include <PamelaRun.h>
38     #include <PscuHeader.h>
39     #include <PscuEvent.h>
40     #include <EventHeader.h>
41 mocchiut 1.15 #include <mcmd/McmdEvent.h>
42     #include <mcmd/McmdRecord.h>
43 mocchiut 1.1 //
44     // This program headers
45     //
46     #include <OrbitalInfo.h>
47 mocchiut 1.7 #include <OrbitalInfoVerl2.h>
48 mocchiut 1.1 #include <OrbitalInfoCore.h>
49 mocchiut 1.15 #include <InclinationInfo.h>
50 mocchiut 1.1
51 pam-mep 1.69 //
52     // Tracker and ToF classes headers and definitions
53     //
54     #include <ToFLevel2.h>
55     #include <TrkLevel2.h>
56 mocchiut 1.73 #include <ExtTrack.h> // new tracking code
57 mocchiut 1.40
58 mocchiut 1.1 using namespace std;
59    
60     //
61     // CORE ROUTINE
62     //
63     //
64 mocchiut 1.25 int OrbitalInfoCore(UInt_t run, TFile *file, GL_TABLES *glt, Int_t OrbitalInfoargc, char *OrbitalInfoargv[]){
65 mocchiut 1.15 //
66 mocchiut 1.1 Int_t i = 0;
67 mocchiut 1.25 TString host = glt->CGetHost();
68     TString user = glt->CGetUser();
69     TString psw = glt->CGetPsw();
70     TSQLServer *dbc = TSQLServer::Connect(host.Data(),user.Data(),psw.Data());
71 mocchiut 1.1 //
72 mocchiut 1.26 stringstream myquery;
73     myquery.str("");
74 mocchiut 1.79 myquery << "SET time_zone='+0:00';";
75 mocchiut 1.59 delete dbc->Query(myquery.str().c_str());
76 mocchiut 1.79 delete dbc->Query("SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';");
77 mocchiut 1.26 //
78 mocchiut 1.16 TString processFolder = Form("OrbitalInfoFolder_%u",run);
79 mocchiut 1.1 //
80     // Set these to true to have a very verbose output.
81     //
82     Bool_t debug = false;
83     //
84     Bool_t verbose = false;
85 mocchiut 1.30 //
86 mocchiut 1.31 Bool_t standalone = false;
87 mocchiut 1.30 //
88 mocchiut 1.1 if ( OrbitalInfoargc > 0 ){
89     i = 0;
90     while ( i < OrbitalInfoargc ){
91     if ( !strcmp(OrbitalInfoargv[i],"-processFolder") ) {
92     if ( OrbitalInfoargc < i+1 ){
93     throw -3;
94     };
95     processFolder = (TString)OrbitalInfoargv[i+1];
96     i++;
97     };
98     if ( (!strcmp(OrbitalInfoargv[i],"--debug")) || (!strcmp(OrbitalInfoargv[i],"-g")) ) {
99     verbose = true;
100 mocchiut 1.15 debug = true;
101 mocchiut 1.1 };
102     if ( (!strcmp(OrbitalInfoargv[i],"--verbose")) || (!strcmp(OrbitalInfoargv[i],"-v")) ) {
103     verbose = true;
104     };
105 mocchiut 1.30 if ( (!strcmp(OrbitalInfoargv[i],"--standalone")) ) {
106     standalone = true;
107     };
108     if ( (!strcmp(OrbitalInfoargv[i],"--calculate-pitch")) ) {
109     standalone = false;
110     };
111 mocchiut 1.1 i++;
112     };
113     };
114     //
115     const char* outDir = gSystem->DirName(gSystem->DirName(file->GetPath()));
116     //
117     TTree *OrbitalInfotr = 0;
118 mocchiut 1.5 UInt_t nevents = 0;
119 mocchiut 1.15 UInt_t neventsm = 0;
120 mocchiut 1.1 //
121     // variables needed to reprocess data
122     //
123 mocchiut 1.6 Long64_t maxsize = 10000000000LL;
124     TTree::SetMaxTreeSize(maxsize);
125     //
126 mocchiut 1.1 TString OrbitalInfoversion;
127     ItoRunInfo *runinfo = 0;
128 mocchiut 1.5 TArrayI *runlist = 0;
129 mocchiut 1.1 TTree *OrbitalInfotrclone = 0;
130     Bool_t reproc = false;
131     Bool_t reprocall = false;
132 mocchiut 1.66 Bool_t igrfloaded = false;
133 mocchiut 1.1 UInt_t nobefrun = 0;
134     UInt_t noaftrun = 0;
135     UInt_t numbofrun = 0;
136     stringstream ftmpname;
137     TString fname;
138 mocchiut 1.5 UInt_t totfileentries = 0;
139 mocchiut 1.15 UInt_t idRun = 0;
140 pam-fi 1.53 UInt_t anni5 = 60 * 60 * 24 * 365 * 5 ;//1576800
141 mocchiut 1.15 //
142     // My variables. Vitaly.
143     //
144 mocchiut 1.44 // UInt_t oi = 0;
145 mocchiut 1.15 Int_t tmpSize = 0;
146 mocchiut 1.1 //
147     // variables needed to handle error signals
148     //
149     Int_t code = 0;
150     Int_t sgnl;
151     //
152     // OrbitalInfo classes
153     //
154     OrbitalInfo *orbitalinfo = new OrbitalInfo();
155     OrbitalInfo *orbitalinfoclone = new OrbitalInfo();
156 mocchiut 1.44
157 mocchiut 1.1 //
158     // define variables for opening and reading level0 file
159     //
160     TFile *l0File = 0;
161     TTree *l0tr = 0;
162 mocchiut 1.37 // TTree *l0trm = 0;
163     TChain *ch = 0;
164 mocchiut 1.2 // EM: open also header branch
165     TBranch *l0head = 0;
166     pamela::EventHeader *eh = 0;
167     pamela::PscuHeader *ph = 0;
168 mocchiut 1.15 pamela::McmdEvent *mcmdev = 0;
169     pamela::McmdRecord *mcmdrc = 0;
170 mocchiut 1.2 // end EM
171 mocchiut 1.15
172     // pamela::RunHeaderEvent *reh = new pamela::RunHeaderEvent;
173     // pamela::EventHeader *eH = new pamela::EventHeader;
174    
175 mocchiut 1.1 //
176     // Define other basic variables
177     //
178     UInt_t procev = 0;
179     stringstream file2;
180     stringstream file3;
181     stringstream qy;
182     Int_t totevent = 0;
183 mocchiut 1.5 UInt_t atime = 0;
184     UInt_t re = 0;
185 mocchiut 1.15 UInt_t ik = 0;
186 mocchiut 1.7
187     // Position
188     Float_t lon, lat, alt;
189    
190     //
191     // IGRF stuff
192     //
193 mocchiut 1.64 Double_t dimo = 0.0; // dipole moment (computed from dat files) // EM GCC 4.7
194 mocchiut 1.40 Float_t bnorth, beast, bdown, babs;
195     Float_t xl; // L value
196     Float_t icode; // code value for L accuracy (see fortran code)
197     Float_t bab1; // What's the difference with babs?
198     Float_t stps = 0.005; // step size for field line tracing
199     Float_t bdel = 0.01; // required accuracy
200     Float_t bequ; // equatorial b value (also called b_0)
201     Bool_t value = 0; // false if bequ is not the minimum b value
202     Float_t rr0; // equatorial radius normalized to earth radius
203 mocchiut 1.7
204 mocchiut 1.1 //
205     // Working filename
206     //
207     TString outputfile;
208     stringstream name;
209     name.str("");
210     name << outDir << "/";
211     //
212     // temporary file and folder
213     //
214     TFile *tempfile = 0;
215     TTree *tempOrbitalInfo = 0;
216     stringstream tempname;
217     stringstream OrbitalInfofolder;
218 mocchiut 1.23 Bool_t myfold = false;
219 mocchiut 1.1 tempname.str("");
220     tempname << outDir;
221     tempname << "/" << processFolder.Data();
222     OrbitalInfofolder.str("");
223     OrbitalInfofolder << tempname.str().c_str();
224     tempname << "/OrbitalInfotree_run";
225     tempname << run << ".root";
226 mocchiut 1.40 UInt_t totnorun = 0;
227 mocchiut 1.1 //
228     // DB classes
229     //
230     GL_ROOT *glroot = new GL_ROOT();
231 mocchiut 1.5 GL_TIMESYNC *dbtime = 0;
232 mocchiut 1.7 GL_TLE *gltle = new GL_TLE();
233 mocchiut 1.15 //
234     //Quaternions classes
235     //
236 mocchiut 1.57 Quaternions *L_QQ_Q_l_lower = 0;
237     InclinationInfo *RYPang_lower = 0;
238     Quaternions *L_QQ_Q_l_upper = 0;
239     InclinationInfo *RYPang_upper = 0;
240 mocchiut 1.15
241     cEci eCi;
242    
243 mocchiut 1.7 // Initialize fortran routines!!!
244 mocchiut 1.52 Int_t ltp1 = 0;
245 mocchiut 1.7 Int_t ltp2 = 0;
246     Int_t ltp3 = 0;
247 mocchiut 1.55 // Int_t uno = 1;
248     // const char *niente = " ";
249 pam-mep 1.69 GL_PARAM *glparam0 = new GL_PARAM();
250 mocchiut 1.7 GL_PARAM *glparam = new GL_PARAM();
251 mocchiut 1.10 GL_PARAM *glparam2 = new GL_PARAM();
252 mocchiut 1.52 GL_PARAM *glparam3 = new GL_PARAM();
253 mocchiut 1.44
254 mocchiut 1.30 //
255 mocchiut 1.44 // Orientation variables. Vitaly
256 mocchiut 1.30 //
257 malakhov 1.74
258 mocchiut 1.30 UInt_t evfrom = 0;
259     UInt_t jumped = 0;
260     Int_t itr = -1;
261 mocchiut 1.64 // Double_t A1;
262     // Double_t A2;
263     // Double_t A3;
264 mocchiut 1.30 Double_t Px = 0;
265     Double_t Py = 0;
266     Double_t Pz = 0;
267     TTree *ttof = 0;
268     ToFLevel2 *tof = new ToFLevel2();
269 pam-mep 1.69 TTree *ttrke = 0;
270     TrkLevel2 *trke = new TrkLevel2();
271 mocchiut 1.30 OrientationInfo *PO = new OrientationInfo();
272     Int_t nz = 6;
273     Float_t zin[6];
274     Int_t nevtofl2 = 0;
275 pam-mep 1.69 Int_t nevtrkl2 = 0;
276 mocchiut 1.44 if ( verbose ) cout<<"Reading quaternions external file"<<endl;
277     cout.setf(ios::fixed,ios::floatfield);
278     /******Reading recovered quaternions...*********/
279     vector<Double_t> recqtime;
280     vector<Float_t> recq0;
281     vector<Float_t> recq1;
282     vector<Float_t> recq2;
283     vector<Float_t> recq3;
284     Float_t Norm = 1;
285 mocchiut 1.73
286     vector<UInt_t> RTtime1;
287     vector<UInt_t> RTtime2;
288     vector<Double_t> RTbank1;
289     vector<Double_t> RTbank2;
290 malakhov 1.74 vector<Double_t> RTbpluto1;
291     vector<Double_t> RTbpluto2;
292 mocchiut 1.73 vector<Int_t> RTazim;
293 mocchiut 1.75 vector<UInt_t> RTstart;
294     vector<UInt_t> RTpluto2;
295     vector<UInt_t> RTpluto1;
296 mocchiut 1.73 vector<Int_t> RTerrq;
297    
298     TClonesArray *tcNucleiTrk = NULL;
299     TClonesArray *tcExtNucleiTrk = NULL;
300     TClonesArray *tcExtTrk = NULL;
301     TClonesArray *tcNucleiTof = NULL;
302     TClonesArray *tcExtNucleiTof = NULL;
303     TClonesArray *tcExtTof = NULL;
304     TClonesArray *torbNucleiTrk = NULL;
305     TClonesArray *torbExtNucleiTrk = NULL;
306     TClonesArray *torbExtTrk = NULL;
307     Bool_t hasNucleiTrk = false;
308     Bool_t hasExtNucleiTrk = false;
309     Bool_t hasExtTrk = false;
310     Bool_t hasNucleiTof = false;
311     Bool_t hasExtNucleiTof = false;
312     Bool_t hasExtTof = false;
313    
314     ifstream in;
315     ifstream an;
316     // ofstream mc;
317     // TString gr;
318     Int_t parerror2=0;
319    
320 pam-mep 1.69 Int_t parerror=glparam0->Query_GL_PARAM(1,303,dbc); // parameters stored in DB in GL_PRAM table
321 mocchiut 1.72 if ( verbose ) cout<<parerror<<"\t"<<(char*)(glparam0->PATH+glparam0->NAME).Data()<<endl;
322 mocchiut 1.44 if ( parerror<0 ) {
323     code = parerror;
324 mocchiut 1.73 goto closeandexit;
325 pam-mep 1.54 }
326 mocchiut 1.73 in.open((char*)(glparam0->PATH+glparam0->NAME).Data(),ios::in);
327 mocchiut 1.44 while(!in.eof()){
328     recqtime.resize(recqtime.size()+1);
329     Int_t sizee = recqtime.size();
330     recq0.resize(sizee);
331     recq1.resize(sizee);
332     recq2.resize(sizee);
333     recq3.resize(sizee);
334     in>>recqtime[sizee-1];
335     in>>recq0[sizee-1];
336     in>>recq1[sizee-1];
337     in>>recq2[sizee-1];
338     in>>recq3[sizee-1];
339     in>>Norm;
340     }
341 pam-mep 1.69 in.close();
342 mocchiut 1.44 if ( verbose ) cout<<"We have read recovered data"<<endl;
343 pam-mep 1.69 if (debug) cout << "size of recovered quaterions data set is " << recqtime.size() << endl;
344    
345     if ( verbose ) cout<<"read Rotation Table"<<endl;
346 mocchiut 1.73
347     parerror2=glparam0->Query_GL_PARAM(1,305,dbc);
348 malakhov 1.74
349 mocchiut 1.71 if ( verbose ) cout<<parerror2<<"\t"<<(char*)(glparam0->PATH+glparam0->NAME).Data()<<endl;
350 mocchiut 1.73 if ( parerror2<0 ) {
351     code = parerror;
352     goto closeandexit;
353     }
354     an.open((char*)(glparam0->PATH+glparam0->NAME).Data(),ios::in);
355 pam-mep 1.69 while(!an.eof()){
356     RTtime1.resize(RTtime1.size()+1);
357     Int_t sizee = RTtime1.size();
358     RTbank1.resize(sizee+1);
359     RTazim.resize(sizee+1);
360     RTerrq.resize(sizee+1);
361 malakhov 1.74 RTstart.resize(sizee+1);
362     RTpluto1.resize(sizee+1);
363     RTbpluto1.resize(sizee+1);
364 pam-mep 1.69 an>>RTtime1[sizee-1];
365     an>>RTbank1[sizee-1];
366 malakhov 1.74 an>>RTstart[sizee-1];
367     an>>RTpluto1[sizee-1];
368     an>>RTbpluto1[sizee-1];
369 pam-mep 1.69 an>>RTazim[sizee-1];
370     an>>RTerrq[sizee-1];
371     if(sizee>1) {
372     RTtime2.resize(sizee+1);
373     RTbank2.resize(sizee+1);
374 malakhov 1.74 RTpluto2.resize(sizee+1);
375     RTbpluto2.resize(sizee+1);
376 pam-mep 1.69 RTtime2[sizee-2]=RTtime1[sizee-1];
377 malakhov 1.74 RTpluto2[sizee-2]=RTpluto1[sizee-1];
378 pam-mep 1.69 RTbank2[sizee-2]=RTbank1[sizee-1];
379 malakhov 1.74 RTbpluto2[sizee-2]=RTbpluto1[sizee-1];
380 pam-mep 1.69 }
381     }
382     an.close();
383     //cout<<"put some number here"<<endl;
384     //Int_t yupi;
385     //cin>>yupi;
386    
387     if ( verbose ) cout<<"We have read Rotation Table"<<endl;
388     //Geomagnetic coordinates calculations staff
389    
390     GMtype_CoordGeodetic location;
391 mocchiut 1.70 // GMtype_CoordDipole GMlocation;
392 pam-mep 1.69 GMtype_Ellipsoid Ellip;
393     GMtype_Data G0, G1, H1;
394    
395     // { // this braces is necessary to avoid jump to label 'closeandexit' error // but it is wrong since the variable "igpath" will not exist outside. To overcome the "jump to label 'closeandexit' error" it is necessary to set the "igpath" before line 276
396     // TString igpath="/data03/Malakhov/pam9Malakhov/installed10/calib/orb-param/";
397     // }
398    
399     // GM_ScanIGRF(glparam->PATH, &G0, &G1, &H1);
400     GM_ScanIGRF(dbc, &G0, &G1, &H1);
401    
402     //cout << G0.element[0] << "\t" << G1.element[0] << "\t" << H1.element[0] << endl;
403     //cout << G0.element[5] << "\t" << G1.element[5] << "\t" << H1.element[5] << endl;
404    
405     GM_SetEllipsoid(&Ellip);
406 mocchiut 1.44
407 mocchiut 1.55 // IGRF stuff moved inside run loop!
408    
409 mocchiut 1.30 for (Int_t ip=0;ip<nz;ip++){
410     zin[ip] = tof->GetZTOF(tof->GetToFPlaneID(ip));
411     };
412     //
413     if ( !standalone ){
414     //
415 mocchiut 1.73 // Does it contain the Tracker and ToF trees?
416 mocchiut 1.30 //
417     ttof = (TTree*)file->Get("ToF");
418     if ( !ttof ) {
419     if ( verbose ) printf(" OrbitalInfo - ERROR: no tof tree\n");
420     code = -900;
421     goto closeandexit;
422 pam-mep 1.69 }
423 mocchiut 1.30 ttof->SetBranchAddress("ToFLevel2",&tof);
424     nevtofl2 = ttof->GetEntries();
425 pam-mep 1.69
426 mocchiut 1.73 //
427     // Look for extended tracking algorithm
428     //
429     if ( verbose ) printf("Look for extended and nuclei tracking algorithms in ToF\n");
430     // Nuclei tracking algorithm
431     Int_t checkAlgo = 0;
432     tcNucleiTof = new TClonesArray("ToFTrkVar");
433     checkAlgo = ttof->SetBranchAddress("TrackNuclei",&tcNucleiTof);
434     if ( !checkAlgo ){
435     if ( verbose ) printf(" Nuclei tracking algorithm ToF branch found! :D \n");
436     hasNucleiTof = true;
437     } else {
438     if ( verbose ) printf(" Nuclei tracking algorithm ToF branch not found :( !\n");
439     printf(" ok, this is not a problem (it depends on tracker settings) \n");
440     delete tcNucleiTof;
441 mocchiutti 1.77 tcNucleiTof=NULL; // 10RED reprocessing bug
442 mocchiut 1.73 }
443     // Nuclei tracking algorithm using calorimeter points
444     tcExtNucleiTof = new TClonesArray("ToFTrkVar");
445     checkAlgo = ttof->SetBranchAddress("RecoveredTrackNuclei",&tcExtNucleiTof);
446     if ( !checkAlgo ){
447     if ( verbose ) printf(" Recovered nuclei tracking algorithm ToF branch found! :D \n");
448     hasExtNucleiTof = true;
449     } else {
450     if ( verbose ) printf(" Recovered nuclei tracking algorithm ToF branch not found :( !\n");
451     printf(" ok, this is not a problem (it depends on tracker settings) \n");
452     delete tcExtNucleiTof;
453 mocchiutti 1.77 tcExtNucleiTof=NULL; // 10RED reprocessing bug
454 mocchiut 1.73 }
455     // Tracking algorithm using calorimeter points
456     tcExtTof = new TClonesArray("ToFTrkVar");
457     checkAlgo = ttof->SetBranchAddress("RecoveredTrack",&tcExtTof);
458     if ( !checkAlgo ){
459     if ( verbose ) printf(" Recovered track algorithm ToF branch found! :D \n");
460     hasExtTof = true;
461     } else {
462     if ( verbose ) printf(" Recovered track algorithm ToF branch not found :( !\n");
463     printf(" ok, this is not a problem (it depends on tracker settings) \n");
464     delete tcExtTof;
465 mocchiutti 1.77 tcExtTof=NULL; // 10RED reprocessing bug
466 mocchiut 1.73 }
467    
468 pam-mep 1.69 ttrke = (TTree*)file->Get("Tracker");
469     if ( !ttrke ) {
470     if ( verbose ) printf(" OrbitalInfo - ERROR: no trk tree\n");
471     code = -903;
472     goto closeandexit;
473     }
474     ttrke->SetBranchAddress("TrkLevel2",&trke);
475     nevtrkl2 = ttrke->GetEntries();
476 mocchiut 1.73
477     //
478     // Look for extended tracking algorithm
479     //
480     if ( verbose ) printf("Look for extended and nuclei tracking algorithms\n");
481     // Nuclei tracking algorithm
482     checkAlgo = 0;
483     tcNucleiTrk = new TClonesArray("TrkTrack");
484     checkAlgo = ttrke->SetBranchAddress("TrackNuclei",&tcNucleiTrk);
485     if ( !checkAlgo ){
486     if ( verbose ) printf(" Nuclei tracking algorithm branch found! :D \n");
487     hasNucleiTrk = true;
488     } else {
489     if ( verbose ) printf(" Nuclei tracking algorithm branch not found :( !\n");
490     printf(" ok, this is not a problem (it depends on tracker settings) \n");
491     delete tcNucleiTrk;
492 mocchiutti 1.77 tcNucleiTrk=NULL; // 10RED reprocessing bug
493 mocchiut 1.73 }
494     // Nuclei tracking algorithm using calorimeter points
495     tcExtNucleiTrk = new TClonesArray("ExtTrack");
496     checkAlgo = ttrke->SetBranchAddress("RecoveredTrackNuclei",&tcExtNucleiTrk);
497     if ( !checkAlgo ){
498     if ( verbose ) printf(" Recovered nuclei tracking algorithm branch found! :D \n");
499     hasExtNucleiTrk = true;
500     } else {
501     if ( verbose ) printf(" Recovered nuclei tracking algorithm branch not found :( !\n");
502     printf(" ok, this is not a problem (it depends on tracker settings) \n");
503     delete tcExtNucleiTrk;
504 mocchiutti 1.77 tcExtNucleiTrk=NULL; // 10RED reprocessing bug
505 mocchiut 1.73 }
506     // Tracking algorithm using calorimeter points
507     tcExtTrk = new TClonesArray("ExtTrack");
508     checkAlgo = ttrke->SetBranchAddress("RecoveredTrack",&tcExtTrk);
509     if ( !checkAlgo ){
510     if ( verbose ) printf(" Recovered track algorithm branch found! :D \n");
511     hasExtTrk = true;
512     } else {
513     if ( verbose ) printf(" Recovered track algorithm branch not found :( !\n");
514     printf(" ok, this is not a problem (it depends on tracker settings) \n");
515     delete tcExtTrk;
516 mocchiutti 1.77 tcExtTrk=NULL; // 10RED reprocessing bug
517 mocchiut 1.73 }
518    
519     if ( (hasNucleiTrk && !hasNucleiTof) || (!hasNucleiTrk && hasNucleiTof) ||
520     (hasExtNucleiTrk && !hasExtNucleiTof) || (!hasExtNucleiTrk && hasExtNucleiTof) ||
521     (hasExtTrk && !hasExtTof) || (!hasExtTrk && hasExtTof)
522     ){
523     if ( verbose ) printf(" ERROR: Mismatch between tracker and tof tree branches concerning extended tracking algorithm(s)\n");
524     if ( debug ) printf("hasNucleiTrk %i hasExtNucleiTrk %i hasExtTrk %i \n",hasNucleiTrk,hasExtNucleiTrk,hasExtTrk);
525     if ( debug ) printf("hasNucleiTof %i hasExtNucleiTof %i hasExtTof %i \n",hasNucleiTof,hasExtNucleiTof,hasExtTof);
526     throw -901;
527     }
528    
529 pam-mep 1.69 }
530 mocchiut 1.1 //
531     // Let's start!
532     //
533     // 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
534     // if run != 0 we must process only that run but first we have to check if the tree MyDetector2 already exist in the file
535     // if it exists we are reprocessing data and we must delete that entries, if not we must create it.
536     //
537 mocchiut 1.5 if ( run == 0 ) reproc = true;
538 mocchiut 1.1 //
539     //
540     // Output file is "outputfile"
541     //
542     if ( !file->IsOpen() ){
543     //printf(" OrbitalInfo - ERROR: cannot open file for writing\n");
544     throw -901;
545     };
546     //
547     // Retrieve GL_RUN variables from the level2 file
548     //
549     OrbitalInfoversion = OrbitalInfoInfo(false); // we should decide how to handle versioning system
550     //
551     // create an interface to RunInfo called "runinfo"
552     //
553     runinfo = new ItoRunInfo(file);
554     //
555     // open "Run" tree in level2 file, if not existing return an error (sngl != 0)
556     //
557     sgnl = 0;
558     sgnl = runinfo->Update(run, "ORB", OrbitalInfoversion);
559     //sgnl = runinfo->Read(run);
560    
561     if ( sgnl ){
562     //printf("OrbitalInfo - ERROR: RunInfo exited with non-zero status\n");
563     code = sgnl;
564     goto closeandexit;
565     } else {
566     sgnl = 0;
567     };
568     //
569     // number of events in the file BEFORE the first event of our run
570     //
571     nobefrun = runinfo->GetFirstEntry();
572     //
573     // total number of events in the file
574     //
575     totfileentries = runinfo->GetFileEntries();
576     //
577     // first file entry AFTER the last event of our run
578     //
579     noaftrun = runinfo->GetLastEntry() + 1;
580     //
581     // number of run to be processed
582     //
583     numbofrun = runinfo->GetNoRun();
584 mocchiut 1.40 totnorun = runinfo->GetRunEntries();
585 mocchiut 1.1 //
586     // Try to access the OrbitalInfo tree in the file, if it exists we are reprocessing data if not we are processing a new run
587     //
588     OrbitalInfotrclone = (TTree*)file->Get("OrbitalInfo");
589     //
590     if ( !OrbitalInfotrclone ){
591     //
592     // tree does not exist, we are not reprocessing
593     //
594     reproc = false;
595 mocchiut 1.5 if ( run == 0 ){
596 mocchiut 1.1 if (verbose) printf(" OrbitalInfo - WARNING: you are reprocessing data but OrbitalInfo tree does not exist!\n");
597     }
598 mocchiut 1.5 if ( runinfo->IsReprocessing() && run != 0 ) {
599 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");
600     }
601     } else {
602     //
603     // tree exists, we are reprocessing data. Are we reprocessing a single run or all the file?
604     //
605 mocchiut 1.6 OrbitalInfotrclone->SetAutoSave(900000000000000LL);
606 mocchiut 1.1 reproc = true;
607     //
608     //
609     if (verbose) printf("\n Preparing the pre-processing...\n");
610     //
611 mocchiut 1.22 if ( run == 0 || totnorun == 1 ){
612 mocchiut 1.1 //
613     // we are reprocessing all the file
614     // 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
615     //
616     reprocall = true;
617     //
618 mocchiut 1.57 if (verbose) printf("\n OrbitalInfo - WARNING: Reprocessing all runs\n Deleting old tree...\n");
619 mocchiut 1.1 //
620     } else {
621     //
622     // 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
623     //
624     reprocall = false;
625     //
626 mocchiut 1.5 if (verbose) printf("\n OrbitalInfo - WARNING: Reprocessing run number %u \n",run);
627 mocchiut 1.1 //
628     // copying old tree to a new file
629     //
630 mocchiut 1.23 gSystem->MakeDirectory(OrbitalInfofolder.str().c_str());
631     myfold = true;
632 mocchiut 1.1 tempfile = new TFile(tempname.str().c_str(),"RECREATE");
633     tempOrbitalInfo = OrbitalInfotrclone->CloneTree(-1,"fast");
634     tempOrbitalInfo->SetName("OrbitalInfo-old");
635     tempfile->Write();
636 mocchiut 1.57 tempOrbitalInfo->Delete();
637 mocchiut 1.1 tempfile->Close();
638     }
639     //
640     // Delete the old tree from old file and memory
641     //
642 mocchiut 1.57 OrbitalInfotrclone->Clear();
643 mocchiut 1.1 OrbitalInfotrclone->Delete("all");
644     //
645     if (verbose) printf(" ...done!\n");
646     //
647     };
648     //
649     // create mydetector tree mydect
650     //
651     file->cd();
652     OrbitalInfotr = new TTree("OrbitalInfo-new","PAMELA OrbitalInfo data");
653 mocchiut 1.6 OrbitalInfotr->SetAutoSave(900000000000000LL);
654 mocchiut 1.30 orbitalinfo->Set();//ELENA **TEMPORANEO?**
655 mocchiut 1.1 OrbitalInfotr->Branch("OrbitalInfo","OrbitalInfo",&orbitalinfo);
656     //
657 mocchiut 1.73 // create new branches for new tracking algorithms
658     //
659     if ( hasNucleiTrk ){
660     torbNucleiTrk = new TClonesArray("OrbitalInfoTrkVar",1);
661     OrbitalInfotr->Branch("TrackNuclei",&torbNucleiTrk);
662     }
663     if ( hasExtNucleiTrk ){
664     torbExtNucleiTrk = new TClonesArray("OrbitalInfoTrkVar",1);
665     OrbitalInfotr->Branch("RecoveredTrackNuclei",&torbExtNucleiTrk);
666     }
667     if ( hasExtTrk ){
668     torbExtTrk = new TClonesArray("OrbitalInfoTrkVar",1);
669     OrbitalInfotr->Branch("RecoveredTrack",&torbExtTrk);
670     }
671    
672     //
673 mocchiut 1.1 if ( reproc && !reprocall ){
674     //
675     // open new file and retrieve also tree informations
676     //
677     tempfile = new TFile(tempname.str().c_str(),"READ");
678     OrbitalInfotrclone = (TTree*)tempfile->Get("OrbitalInfo-old");
679 mocchiut 1.6 OrbitalInfotrclone->SetAutoSave(900000000000000LL);
680 mocchiut 1.1 OrbitalInfotrclone->SetBranchAddress("OrbitalInfo",&orbitalinfoclone);
681     //
682     if ( nobefrun > 0 ){
683     if (verbose){
684 mocchiut 1.7 printf("\n Pre-processing: copying events from the old tree before the processed run\n");
685     printf(" Copying %u events in the file which are before the beginning of the run %u \n",nobefrun,run);
686     printf(" Start copying at event number 0, end copying at event number %u \n",nobefrun);
687 mocchiut 1.1 }
688     for (UInt_t j = 0; j < nobefrun; j++){
689     //
690 mocchiut 1.43 if ( OrbitalInfotrclone->GetEntry(j) <= 0 ) throw -36;
691 mocchiut 1.1 //
692     // copy orbitalinfoclone to mydec
693     //
694 mocchiut 1.76 // orbitalinfo->Clear();
695 mocchiut 1.5 //
696 mocchiut 1.1 memcpy(&orbitalinfo,&orbitalinfoclone,sizeof(orbitalinfoclone));
697     //
698     // Fill entry in the new tree
699     //
700     OrbitalInfotr->Fill();
701     //
702     };
703     if (verbose) printf(" Finished successful copying!\n");
704 mocchiut 1.57 };
705 mocchiut 1.1 };
706     //
707 mocchiut 1.44 //
708 mocchiut 1.1 // Get the list of run to be processed, if only one run has to be processed the list will contain one entry only.
709     //
710     runlist = runinfo->GetRunList();
711     //
712     // Loop over the run to be processed
713     //
714     for (UInt_t irun=0; irun < numbofrun; irun++){
715 mocchiut 1.57
716     L_QQ_Q_l_lower = new Quaternions();
717     RYPang_lower = new InclinationInfo();
718     L_QQ_Q_l_upper = new Quaternions();
719     RYPang_upper = new InclinationInfo();
720    
721 mocchiut 1.1 //
722     // retrieve the first run ID to be processed using the RunInfo list
723     //
724 mocchiut 1.15
725 mocchiut 1.1 idRun = runlist->At(irun);
726     if (verbose){
727     printf("\n\n\n ####################################################################### \n");
728     printf(" PROCESSING RUN NUMBER %i \n",(int)idRun);
729     printf(" ####################################################################### \n\n\n");
730     }
731     //
732 mocchiut 1.5 runinfo->ID_ROOT_L0 = 0;
733 mocchiut 1.1 //
734     // store in the runinfo class the GL_RUN variables for our run
735     //
736     sgnl = 0;
737     sgnl = runinfo->GetRunInfo(idRun);
738     if ( sgnl ){
739 mocchiut 1.5 if ( debug ) printf("\n OrbitalInfo - ERROR: RunInfo exited with non-zero status\n");
740 mocchiut 1.1 code = sgnl;
741     goto closeandexit;
742     } else {
743     sgnl = 0;
744     };
745     //
746     // now you can access that variables using the RunInfo class this way runinfo->ID_REG_RUN
747     //
748 mocchiut 1.5 if ( runinfo->ID_ROOT_L0 == 0 ){
749     if ( debug ) printf("\n OrbitalInfo - ERROR: no run with ID_RUN = %u \n\n Exiting... \n\n",idRun);
750 mocchiut 1.1 code = -5;
751     goto closeandexit;
752     };
753     //
754 mocchiut 1.5 // prepare the timesync for the db
755     //
756     dbtime = new GL_TIMESYNC(runinfo->ID_ROOT_L0,"ID",dbc);
757 mocchiut 1.15
758 mocchiut 1.5 //
759 mocchiut 1.1 // Search in the DB the path and name of the LEVEL0 file to be processed.
760     //
761 mocchiut 1.5 glroot->Query_GL_ROOT(runinfo->ID_ROOT_L0,dbc);
762 mocchiut 1.1 //
763     ftmpname.str("");
764     ftmpname << glroot->PATH.Data() << "/";
765     ftmpname << glroot->NAME.Data();
766     fname = ftmpname.str().c_str();
767 mocchiut 1.15 ftmpname.str("");
768 mocchiut 1.1 //
769 mocchiut 1.40 // print nout informations
770 mocchiut 1.1 //
771 mocchiut 1.5 totevent = runinfo->NEVENTS;
772 mocchiut 1.30 evfrom = runinfo->EV_FROM;
773 mocchiut 1.15 //cout<<"totevents = "<<totevent<<"\n";
774 mocchiut 1.1 if (verbose){
775     printf("\n LEVEL0 data file: %s \n",fname.Data());
776 mocchiut 1.5 printf(" RUN HEADER absolute time is: %u \n",runinfo->RUNHEADER_TIME);
777     printf(" RUN TRAILER absolute time is: %u \n",runinfo->RUNTRAILER_TIME);
778 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);
779 mocchiut 1.1 }//
780 mocchiut 1.27 //
781 mocchiut 1.28 // if ( !totevent ) goto closeandexit;
782 mocchiut 1.1 // Open Level0 file
783 mocchiut 1.59 if ( l0File ) l0File->Close();
784 mocchiut 1.1 l0File = new TFile(fname.Data());
785     if ( !l0File ) {
786 mocchiut 1.5 if ( debug ) printf(" OrbitalInfo - ERROR: problems opening Level0 file\n");
787 mocchiut 1.1 code = -6;
788     goto closeandexit;
789     };
790     l0tr = (TTree*)l0File->Get("Physics");
791     if ( !l0tr ) {
792 mocchiut 1.5 if ( debug ) printf(" OrbitalInfo - ERROR: no Physics tree in Level0 file\n");
793 mocchiut 1.1 l0File->Close();
794     code = -7;
795     goto closeandexit;
796     };
797 mocchiut 1.2 // EM: open header branch as well
798     l0head = l0tr->GetBranch("Header");
799     if ( !l0head ) {
800 mocchiut 1.5 if ( debug ) printf(" OrbitalInfo - ERROR: no Header branch in Level0 tree\n");
801 mocchiut 1.2 l0File->Close();
802     code = -8;
803     goto closeandexit;
804     };
805     l0tr->SetBranchAddress("Header", &eh);
806     // end EM
807 mocchiut 1.5 nevents = l0head->GetEntries();
808 mocchiut 1.1 //
809 mocchiut 1.28 if ( nevents < 1 && totevent ) {
810 mocchiut 1.5 if ( debug ) printf(" OrbitalInfo - ERROR: Level0 file is empty\n\n");
811 mocchiut 1.1 l0File->Close();
812     code = -11;
813     goto closeandexit;
814     };
815 mocchiut 1.20 //
816 mocchiut 1.28 if ( runinfo->EV_TO > nevents-1 && totevent ) {
817 mocchiut 1.5 if ( debug ) printf(" OrbitalInfo - ERROR: too few entries in the registry tree\n");
818 mocchiut 1.1 l0File->Close();
819     code = -12;
820     goto closeandexit;
821     };
822 mocchiut 1.55
823     //
824     // open IGRF files and do it only once if we are processing a full level2 file
825     //
826 mocchiut 1.68 if ( !igrfloaded ){
827 mocchiut 1.66
828     if ( l0head->GetEntry(runinfo->EV_FROM) > 0 ){
829     igrfloaded = true;
830 mocchiut 1.68 //
831     // absolute time of first event of the run (it should not matter a lot)
832     //
833     ph = eh->GetPscuHeader();
834     atime = dbtime->DBabsTime(ph->GetOrbitalTime());
835    
836     parerror=glparam->Query_GL_PARAM(atime-anni5,301,dbc); // parameters stored in DB in GL_PRAM table
837     if ( parerror<0 ) {
838     code = parerror;
839     goto closeandexit;
840     }
841     ltp1 = (Int_t)(glparam->PATH+glparam->NAME).Length();
842     if ( verbose ) printf(" Reading Earth's Magnetic Field parameter file: %s \n",(glparam->PATH+glparam->NAME).Data());
843     //
844     parerror=glparam2->Query_GL_PARAM(atime,301,dbc); // parameters stored in DB in GL_PRAM table
845     if ( parerror<0 ) {
846     code = parerror;
847     goto closeandexit;
848     }
849     ltp2 = (Int_t)(glparam2->PATH+glparam2->NAME).Length();
850     if ( verbose ) printf(" Reading Earth's Magnetic Field parameter file: %s \n",(glparam2->PATH+glparam2->NAME).Data());
851     //
852     parerror=glparam3->Query_GL_PARAM(atime,302,dbc); // parameters stored in DB in GL_PRAM table
853     if ( parerror<0 ) {
854     code = parerror;
855     goto closeandexit;
856     }
857     ltp3 = (Int_t)(glparam3->PATH+glparam3->NAME).Length();
858     if ( verbose ) printf(" Reading Earth's Magnetic Field parameter file: %s \n",(glparam3->PATH+glparam3->NAME).Data());
859     //
860     initize_((char *)(glparam->PATH+glparam->NAME).Data(),&ltp1,(char *)(glparam2->PATH+glparam2->NAME).Data(),&ltp2,(char *)(glparam3->PATH+glparam3->NAME).Data(),&ltp3);
861     //
862 mocchiut 1.70 if (debug) cout<<"initize: "<<(char *)(glparam->PATH+glparam->NAME).Data()<<"\t"<<(char *)(glparam2->PATH+glparam2->NAME).Data()<<"\t"<<(char *)(glparam3->PATH+glparam3->NAME).Data()<<endl;
863 mocchiut 1.66 }
864 mocchiut 1.55 }
865     //
866     // End IGRF stuff//
867     //
868    
869 mocchiut 1.15 ULong_t TimeSync = (ULong_t)dbtime->GetTimesync();
870     ULong_t ObtSync = (ULong_t)(dbtime->GetObt0()/1000);
871     ULong_t DeltaOBT = TimeSync - ObtSync;
872    
873     if ( debug ) printf(" 2 TimeSync %lu ObtSync %lu DeltaOBT %lu\n",(ULong_t)(dbtime->GetTimesync()/1000),(ULong_t)dbtime->GetObt0(),TimeSync-ObtSync);
874 mocchiut 1.37 //
875     // Read MCMDs from up to 11 files, 5 before and 5 after the present one in order to have some kind of inclination information
876     //
877     ch = new TChain("Mcmd","Mcmd");
878     //
879     // look in the DB to find the closest files to this run
880     //
881     TSQLResult *pResult = 0;
882     TSQLRow *Row = 0;
883     stringstream myquery;
884     UInt_t l0fid[10];
885     Int_t i = 0;
886     memset(l0fid,0,10*sizeof(Int_t));
887     //
888     myquery.str("");
889     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;";
890     //
891     pResult = dbc->Query(myquery.str().c_str());
892     //
893     i = 9;
894     if( pResult ){
895     //
896     Row = pResult->Next();
897     //
898     while ( Row ){
899     //
900     // store infos and exit
901     //
902     l0fid[i] = (UInt_t)atoll(Row->GetField(0));
903     i--;
904     Row = pResult->Next();
905     //
906     };
907     pResult->Delete();
908     };
909     //
910     myquery.str("");
911     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;";
912     //
913     pResult = dbc->Query(myquery.str().c_str());
914     //
915     i = 0;
916     if( pResult ){
917     //
918     Row = pResult->Next();
919     //
920     while ( Row ){
921     //
922     // store infos and exit
923     //
924     l0fid[i] = (UInt_t)atoll(Row->GetField(0));
925     i++;
926     Row = pResult->Next();
927     //
928     };
929     pResult->Delete();
930     };
931     //
932     i = 0;
933     UInt_t previd = 0;
934     while ( i < 10 ){
935     if ( l0fid[i] && previd != l0fid[i] ){
936     previd = l0fid[i];
937     myquery.str("");
938     myquery << "select PATH,NAME from GL_ROOT where ID=" << l0fid[i] << " ;";
939     //
940     pResult = dbc->Query(myquery.str().c_str());
941     //
942     if( pResult ){
943     //
944     Row = pResult->Next();
945     //
946     if ( debug ) printf(" Using inclination informations from file: %s \n",(((TString)gSystem->ExpandPathName(Row->GetField(0)))+"/"+(TString)Row->GetField(1)).Data());
947     ch->Add(((TString)gSystem->ExpandPathName(Row->GetField(0)))+"/"+(TString)Row->GetField(1));
948     //
949     pResult->Delete();
950     };
951     };
952     i++;
953     };
954     //
955     ch->SetBranchAddress("Mcmd",&mcmdev);
956     neventsm = ch->GetEntries();
957     if ( debug ) printf(" entries %u \n", neventsm);
958 mocchiut 1.15 //
959     if (neventsm == 0){
960 mocchiut 1.18 if ( debug ) printf("InclinationInfo - WARNING: No quaternions in this File");
961     code = 900;
962 mocchiut 1.15 }
963     //
964 mocchiut 1.73 Double_t lowerqtime = 0;
965 mocchiut 1.15 //
966 mocchiut 1.44 // init quaternions information from mcmd-packets
967 mocchiut 1.15 //
968     Bool_t isf = true;
969 mocchiut 1.44
970     vector<Float_t> q0;
971     vector<Float_t> q1;
972     vector<Float_t> q2;
973     vector<Float_t> q3;
974     vector<Double_t> qtime;
975     vector<Float_t> qPitch;
976     vector<Float_t> qRoll;
977     vector<Float_t> qYaw;
978     vector<Int_t> qmode;
979    
980     Int_t nt = 0;
981     UInt_t must = 0;
982    
983 mocchiut 1.15 //
984 mocchiut 1.1 // run over all the events of the run
985     //
986     if (verbose) printf("\n Ready to start! \n\n Processed events: \n\n");
987     //
988 mocchiut 1.44 //
989 mocchiut 1.5 for ( re = runinfo->EV_FROM; re < (runinfo->EV_FROM+runinfo->NEVENTS); re++){
990 mocchiut 1.1 //
991 mocchiut 1.5 if ( procev%1000 == 0 && procev > 0 && verbose ) printf(" %iK \n",procev/1000);
992 mocchiut 1.15 if ( debug ) printf(" %i \n",procev);
993 mocchiut 1.1 //
994 mocchiut 1.43 if ( l0head->GetEntry(re) <= 0 ) throw -36;
995 mocchiut 1.1 //
996     // absolute time of this event
997     //
998 mocchiut 1.5 ph = eh->GetPscuHeader();
999 mocchiut 1.15 atime = dbtime->DBabsTime(ph->GetOrbitalTime());
1000 mocchiut 1.40 if ( debug ) printf(" %i absolute time \n",procev);
1001 mocchiut 1.1 //
1002     // paranoid check
1003     //
1004 mocchiut 1.34 if ( (atime > (runinfo->RUNTRAILER_TIME+1)) || (atime < (runinfo->RUNHEADER_TIME-1)) ) {
1005 mocchiut 1.1 if (verbose) printf(" OrbitalInfo - WARNING: event at time outside the run time window, skipping it\n");
1006 mocchiut 1.30 jumped++;
1007 mocchiut 1.44 // debug = true;
1008 mocchiut 1.7 continue;
1009     }
1010 mocchiut 1.30
1011     //
1012     // retrieve tof informations
1013     //
1014     if ( !reprocall ){
1015     itr = nobefrun + (re - evfrom - jumped);
1016     //itr = re-(46438+200241);
1017     } else {
1018     itr = runinfo->GetFirstEntry() + (re - evfrom - jumped);
1019     };
1020     //
1021     if ( !standalone ){
1022     if ( itr > nevtofl2 ){
1023     if ( verbose ) printf(" OrbitalInfo - ERROR: no tof events with entry = %i in Level2 file\n",itr);
1024     if ( debug ) printf(" nobefrun %u re %u evfrom %u jumped %u reprocall %i \n",nobefrun,re,evfrom,jumped,reprocall);
1025     l0File->Close();
1026 pam-mep 1.69 code = -904;
1027 mocchiut 1.30 goto closeandexit;
1028     };
1029     //
1030     tof->Clear();
1031     //
1032 mocchiut 1.73 // Clones array must be cleared before going on
1033     //
1034     if ( hasNucleiTof ){
1035     tcNucleiTof->Delete();
1036     }
1037     if ( hasExtNucleiTof ){
1038     tcExtNucleiTof->Delete();
1039     }
1040     if ( hasExtTof ){
1041     tcExtTof->Delete();
1042     }
1043     //
1044     if ( verbose ) printf(" get tof tree entries... entry = %i in Level2 file\n",itr);
1045 emocchiutti 1.67 if ( ttof->GetEntry(itr) <= 0 ){
1046 mocchiut 1.73 if ( verbose ) printf(" problems with tof tree entries... entry = %i in Level2 file\n",itr);
1047     if ( verbose ) printf(" nobefrun %u re %u evfrom %u jumped %u reprocall %i \n",nobefrun,re,evfrom,jumped,reprocall);
1048     throw -36;
1049 emocchiutti 1.67 }
1050 mocchiut 1.73 if ( verbose ) printf(" gat0\n");
1051 mocchiut 1.30 //
1052 pam-mep 1.69 }
1053     //
1054     // retrieve tracker informations
1055     //
1056     if ( !standalone ){
1057     if ( itr > nevtrkl2 ){
1058     if ( verbose ) printf(" OrbitalInfo - ERROR: no trk events with entry = %i in Level2 file\n",itr);
1059     if ( debug ) printf(" nobefrun %u re %u evfrom %u jumped %u reprocall %i \n",nobefrun,re,evfrom,jumped,reprocall);
1060     l0File->Close();
1061     code = -905;
1062     goto closeandexit;
1063 mocchiut 1.73 }
1064 pam-mep 1.69 //
1065 mocchiut 1.73 if ( verbose ) printf(" gat1\n");
1066 pam-mep 1.69 trke->Clear();
1067     //
1068 mocchiut 1.73 // Clones array must be cleared before going on
1069     //
1070     if ( hasNucleiTrk ){
1071     if ( verbose ) printf(" gat2\n");
1072     tcNucleiTrk->Delete();
1073     if ( verbose ) printf(" gat3\n");
1074     torbNucleiTrk->Delete();
1075     }
1076     if ( hasExtNucleiTrk ){
1077     if ( verbose ) printf(" gat4\n");
1078     tcExtNucleiTrk->Delete();
1079     if ( verbose ) printf(" gat5\n");
1080     torbExtNucleiTrk->Delete();
1081     }
1082     if ( hasExtTrk ){
1083     if ( verbose ) printf(" gat6\n");
1084     tcExtTrk->Delete();
1085     if ( verbose ) printf(" gat7\n");
1086     torbExtTrk->Delete();
1087     }
1088     //
1089     if ( verbose ) printf(" get trk tree entries... entry = %i in Level2 file\n",itr);
1090 pam-mep 1.69 if ( ttrke->GetEntry(itr) <= 0 ) throw -36;
1091     //
1092     }
1093    
1094 mocchiut 1.1 //
1095     procev++;
1096     //
1097     // start processing
1098     //
1099 mocchiut 1.40 if ( debug ) printf(" %i start processing \n",procev);
1100 mocchiut 1.3 orbitalinfo->Clear();
1101 mocchiut 1.5 //
1102 mocchiut 1.30 OrbitalInfoTrkVar *t_orb = new OrbitalInfoTrkVar();
1103     if( !(orbitalinfo->OrbitalInfoTrk) ) orbitalinfo->OrbitalInfoTrk = new TClonesArray("OrbitalInfoTrkVar",2);
1104     TClonesArray &tor = *orbitalinfo->OrbitalInfoTrk;
1105 pam-mep 1.69
1106     // Geomagnetic coordinates calculation variables
1107     GMtype_CoordSpherical CoordSpherical, DipoleSpherical;
1108     GMtype_CoordCartesian CoordCartesian, DipoleCartesian;
1109     GMtype_Model Model;
1110     GMtype_Pole Pole;
1111    
1112 mocchiut 1.30 //
1113 mocchiut 1.15 // Fill OBT, pkt_num and absTime
1114     //
1115 mocchiut 1.2 orbitalinfo->pkt_num = ph->GetCounter();
1116     orbitalinfo->OBT = ph->GetOrbitalTime();
1117 mocchiut 1.15 orbitalinfo->absTime = atime;
1118 mocchiut 1.40 if ( debug ) printf(" %i pktnum obt abstime \n",procev);
1119 mocchiut 1.15 //
1120     // Propagate the orbit from the tle time to atime, using SGP(D)4.
1121     //
1122 mocchiut 1.40 if ( debug ) printf(" %i sgp4 \n",procev);
1123 mocchiut 1.15 cCoordGeo coo;
1124 mocchiut 1.40 Float_t jyear=0.;
1125 mocchiut 1.7 //
1126     if(atime >= gltle->GetToTime()) {
1127 mocchiut 1.9 if ( !gltle->Query(atime, dbc) ){
1128 mocchiut 1.15 //
1129 mocchiut 1.9 // Compute the magnetic dipole moment.
1130 mocchiut 1.15 //
1131 mocchiut 1.40 if ( debug ) printf(" %i compute magnetic dipole moment \n",procev);
1132 mocchiut 1.9 UInt_t year, month, day, hour, min, sec;
1133 mocchiut 1.15 //
1134 mocchiut 1.9 TTimeStamp t = TTimeStamp(atime, kTRUE);
1135     t.GetDate(kTRUE, 0, &year, &month, &day);
1136     t.GetTime(kTRUE, 0, &hour, &min, &sec);
1137     jyear = (float) year
1138     + (month*31.+ (float) day)/365.
1139 mocchiut 1.44 + (hour*3600.+min*60.+(float)sec)/(24.*3600.*365.);
1140 mocchiut 1.15 //
1141 pam-mep 1.69 if ( debug ) printf(" %i compute magnetic dipole moment get dipole moment for year\n",procev);
1142 mocchiut 1.70 if ( debug ) printf(" %i jyear %f dimo %f \n",procev,jyear,dimo);
1143 mocchiut 1.9 feldcof_(&jyear, &dimo); // get dipole moment for year
1144 pam-mep 1.69 if ( debug ) printf(" %i compute magnetic dipole moment end\n",procev);
1145    
1146     GM_TimeAdjustCoefs(year, jyear, G0, G1, H1, &Model);
1147     GM_PoleLocation(Model, &Pole);
1148    
1149 mocchiut 1.9 } else {
1150     code = -56;
1151     goto closeandexit;
1152     };
1153 mocchiut 1.7 }
1154 mocchiut 1.15 coo = getCoo(atime, gltle->GetFromTime(), gltle->GetTle());
1155     //
1156     cOrbit orbits(*gltle->GetTle());
1157     //
1158     // synchronize with quaternions data
1159     //
1160 mocchiut 1.18 if ( isf && neventsm>0 ){
1161 mocchiut 1.15 //
1162     // First event
1163     //
1164     isf = false;
1165 mocchiut 1.64 // upperqtime = atime;
1166 mocchiut 1.15 lowerqtime = runinfo->RUNHEADER_TIME;
1167 mocchiut 1.44 for ( ik = 0; ik < neventsm; ik++){ //number of macrocommad packets
1168 mocchiut 1.43 if ( ch->GetEntry(ik) <= 0 ) throw -36;
1169 mocchiut 1.15 tmpSize = mcmdev->Records->GetEntries();
1170 mocchiut 1.64 // numrec = tmpSize;
1171 mocchiut 1.70 if ( debug ) cout << "packet number " << ik <<"\tnumber of subpackets is " << tmpSize << endl;
1172 mocchiut 1.44 for (Int_t j3 = 0;j3<tmpSize;j3++){ //number of subpackets
1173 mocchiut 1.15 mcmdrc = (pamela::McmdRecord*)mcmdev->Records->At(j3);
1174 mocchiut 1.38 if ( mcmdrc ){ // missing inclination bug [8RED 090116]
1175 mocchiut 1.70 if ( debug ) printf(" pluto \n");
1176 mocchiut 1.44 if ((int)mcmdrc->ID1 == 226 && mcmdrc->Mcmd_Block_crc_ok == 1){ //Check that it is Inclination Packet
1177 pam-mep 1.69 L_QQ_Q_l_upper->fill(mcmdrc->McmdData);
1178 mocchiut 1.38 for (UInt_t ui = 0; ui < 6; ui++){
1179     if (ui>0){
1180     if (L_QQ_Q_l_upper->time[ui]>L_QQ_Q_l_upper->time[0]){
1181 mocchiut 1.65 if ( debug ) printf(" here1 %i \n",ui);
1182 mocchiut 1.44 Double_t u_time = dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[ui]*1000-DeltaOBT*1000));
1183     Int_t recSize = recqtime.size();
1184 pam-mep 1.54 if(lowerqtime > recqtime[recSize-1]){
1185 pam-mep 1.69 // to avoid interpolation between bad quaternions arrays
1186     if(sqrt(pow(L_QQ_Q_l_upper->quat[ui][0],2)+pow(L_QQ_Q_l_upper->quat[ui][1],2)+pow(L_QQ_Q_l_upper->quat[ui][2],2)+pow(L_QQ_Q_l_upper->quat[ui][3],2))>0.99999){
1187     Int_t sizeqmcmd = qtime.size();
1188     inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);
1189     qtime[sizeqmcmd]=u_time;
1190     q0[sizeqmcmd]=L_QQ_Q_l_upper->quat[ui][0];
1191     q1[sizeqmcmd]=L_QQ_Q_l_upper->quat[ui][1];
1192     q2[sizeqmcmd]=L_QQ_Q_l_upper->quat[ui][2];
1193     q3[sizeqmcmd]=L_QQ_Q_l_upper->quat[ui][3];
1194     qmode[sizeqmcmd]=holeq(lowerqtime,qtime[sizeqmcmd],L_QQ_Q_l_lower,L_QQ_Q_l_upper,ui);
1195     lowerqtime = u_time;
1196     orbits.getPosition((double) (u_time - gltle->GetFromTime())/60., &eCi);
1197     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]);
1198     qRoll[sizeqmcmd]=RYPang_upper->Kren;
1199     qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;
1200     qPitch[sizeqmcmd]=RYPang_upper->Tangazh;
1201     }
1202 pam-mep 1.54 }
1203 mocchiut 1.44 for(Int_t mu = nt;mu<recSize;mu++){
1204     if(recqtime[mu]>lowerqtime && recqtime[mu]<u_time){
1205 pam-mep 1.69 if(sqrt(pow(recq0[mu],2)+pow(recq1[mu],2)+pow(recq2[mu],2)+pow(recq3[mu],2))>0.99999){
1206     nt=mu;
1207     Int_t sizeqmcmd = qtime.size();
1208     inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);
1209     qtime[sizeqmcmd]=recqtime[mu];
1210     q0[sizeqmcmd]=recq0[mu];
1211     q1[sizeqmcmd]=recq1[mu];
1212     q2[sizeqmcmd]=recq2[mu];
1213     q3[sizeqmcmd]=recq3[mu];
1214     qmode[sizeqmcmd]=-10;
1215     orbits.getPosition((double) (qtime[sizeqmcmd] - gltle->GetFromTime())/60., &eCi);
1216     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,recq0[mu],recq1[mu],recq2[mu],recq3[mu]);
1217     qRoll[sizeqmcmd]=RYPang_upper->Kren;
1218     qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;
1219     qPitch[sizeqmcmd]=RYPang_upper->Tangazh;
1220     }
1221 mocchiut 1.44 }
1222     if(recqtime[mu]>=u_time){
1223 pam-mep 1.69 if(sqrt(pow(L_QQ_Q_l_upper->quat[ui][0],2)+pow(L_QQ_Q_l_upper->quat[ui][1],2)+pow(L_QQ_Q_l_upper->quat[ui][2],2)+pow(L_QQ_Q_l_upper->quat[ui][3],2))>0.99999){
1224     Int_t sizeqmcmd = qtime.size();
1225     inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);
1226     qtime[sizeqmcmd]=u_time;
1227     q0[sizeqmcmd]=L_QQ_Q_l_upper->quat[ui][0];
1228     q1[sizeqmcmd]=L_QQ_Q_l_upper->quat[ui][1];
1229     q2[sizeqmcmd]=L_QQ_Q_l_upper->quat[ui][2];
1230     q3[sizeqmcmd]=L_QQ_Q_l_upper->quat[ui][3];
1231     qmode[sizeqmcmd]=holeq(lowerqtime,qtime[sizeqmcmd],L_QQ_Q_l_lower,L_QQ_Q_l_upper,ui);
1232     lowerqtime = u_time;
1233     orbits.getPosition((double) (u_time - gltle->GetFromTime())/60., &eCi);
1234     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]);
1235     qRoll[sizeqmcmd]=RYPang_upper->Kren;
1236     qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;
1237     qPitch[sizeqmcmd]=RYPang_upper->Tangazh;
1238     break;
1239     }
1240 mocchiut 1.38 }
1241     }
1242     }
1243     }else{
1244 mocchiut 1.65 if ( debug ) printf(" here2 %i \n",ui);
1245 mocchiut 1.44 Double_t u_time = dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
1246     if(lowerqtime>u_time)nt=0;
1247     Int_t recSize = recqtime.size();
1248 pam-mep 1.54 if(lowerqtime > recqtime[recSize-1]){
1249 pam-mep 1.69 if(sqrt(pow(L_QQ_Q_l_upper->quat[ui][0],2)+pow(L_QQ_Q_l_upper->quat[ui][1],2)+pow(L_QQ_Q_l_upper->quat[ui][2],2)+pow(L_QQ_Q_l_upper->quat[ui][3],2))>0.99999){
1250     Int_t sizeqmcmd = qtime.size();
1251     inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);
1252     qtime[sizeqmcmd]=u_time;
1253     q0[sizeqmcmd]=L_QQ_Q_l_upper->quat[0][0];
1254     q1[sizeqmcmd]=L_QQ_Q_l_upper->quat[0][1];
1255     q2[sizeqmcmd]=L_QQ_Q_l_upper->quat[0][2];
1256     q3[sizeqmcmd]=L_QQ_Q_l_upper->quat[0][3];
1257     qmode[sizeqmcmd]=holeq(lowerqtime,qtime[sizeqmcmd],L_QQ_Q_l_lower,L_QQ_Q_l_upper,ui);
1258     lowerqtime = u_time;
1259     orbits.getPosition((double) (u_time - gltle->GetFromTime())/60., &eCi);
1260     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]);
1261     qRoll[sizeqmcmd]=RYPang_upper->Kren;
1262     qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;
1263     qPitch[sizeqmcmd]=RYPang_upper->Tangazh;
1264     }
1265 pam-mep 1.54 }
1266 mocchiut 1.44 for(Int_t mu = nt;mu<recSize;mu++){
1267     if(recqtime[mu]>lowerqtime && recqtime[mu]<u_time){
1268 pam-mep 1.69 if(sqrt(pow(recq0[mu],2)+pow(recq1[mu],2)+pow(recq2[mu],2)+pow(recq3[mu],2))>0.99999){
1269     nt=mu;
1270     Int_t sizeqmcmd = qtime.size();
1271     inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);
1272     qtime[sizeqmcmd]=recqtime[mu];
1273     q0[sizeqmcmd]=recq0[mu];
1274     q1[sizeqmcmd]=recq1[mu];
1275     q2[sizeqmcmd]=recq2[mu];
1276     q3[sizeqmcmd]=recq3[mu];
1277     qmode[sizeqmcmd]=-10;
1278     orbits.getPosition((double) (qtime[sizeqmcmd] - gltle->GetFromTime())/60., &eCi);
1279     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,recq0[mu],recq1[mu],recq2[mu],recq3[mu]);
1280     qRoll[sizeqmcmd]=RYPang_upper->Kren;
1281     qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;
1282     qPitch[sizeqmcmd]=RYPang_upper->Tangazh;
1283     }
1284 mocchiut 1.44 }
1285     if(recqtime[mu]>=u_time){
1286 pam-mep 1.69 if(sqrt(pow(L_QQ_Q_l_upper->quat[0][0],2)+pow(L_QQ_Q_l_upper->quat[0][1],2)+pow(L_QQ_Q_l_upper->quat[0][2],2)+pow(L_QQ_Q_l_upper->quat[0][3],2))>0.99999){
1287     Int_t sizeqmcmd = qtime.size();
1288     inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);
1289     qtime[sizeqmcmd]=u_time;
1290     q0[sizeqmcmd]=L_QQ_Q_l_upper->quat[0][0];
1291     q1[sizeqmcmd]=L_QQ_Q_l_upper->quat[0][1];
1292     q2[sizeqmcmd]=L_QQ_Q_l_upper->quat[0][2];
1293     q3[sizeqmcmd]=L_QQ_Q_l_upper->quat[0][3];
1294     qmode[sizeqmcmd]=holeq(lowerqtime,qtime[sizeqmcmd],L_QQ_Q_l_lower,L_QQ_Q_l_upper,ui);
1295     lowerqtime = u_time;
1296     orbits.getPosition((double) (u_time - gltle->GetFromTime())/60., &eCi);
1297     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]);
1298     qRoll[sizeqmcmd]=RYPang_upper->Kren;
1299     qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;
1300     qPitch[sizeqmcmd]=RYPang_upper->Tangazh;
1301     CopyQ(L_QQ_Q_l_lower,L_QQ_Q_l_upper);
1302     break;
1303     }
1304 mocchiut 1.15 }
1305     }
1306 mocchiut 1.44 }
1307 mocchiut 1.38 }
1308 mocchiut 1.15 }
1309 mocchiut 1.44 }
1310 pam-mep 1.69 //if ( debug ) cout << "subpacket " << j3 << "\t qtime = " << qtime[qtime.size()-1] << endl;
1311 mocchiut 1.15 }
1312 mocchiut 1.44 }
1313 mocchiut 1.47
1314 pam-mep 1.69 if(qtime.size()==0){ // in case if no orientation information in data
1315 mocchiut 1.70 if ( debug ) cout << "qtime.size() = 0" << endl;
1316 mocchiut 1.65 for(UInt_t my=0;my<recqtime.size();my++){
1317 mocchiut 1.70 if(sqrt(pow(recq0[my],2)+pow(recq1[my],2)+pow(recq2[my],2)+pow(recq3[my],2))>0.99999){
1318     Int_t sizeqmcmd = qtime.size();
1319     inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);
1320     qtime[sizeqmcmd]=recqtime[my];
1321     q0[sizeqmcmd]=recq0[my];
1322     q1[sizeqmcmd]=recq1[my];
1323     q2[sizeqmcmd]=recq2[my];
1324     q3[sizeqmcmd]=recq3[my];
1325     qmode[sizeqmcmd]=-10;
1326     orbits.getPosition((double) (qtime[sizeqmcmd] - gltle->GetFromTime())/60., &eCi);
1327     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,recq0[my],recq1[my],recq2[my],recq3[my]);
1328     qRoll[sizeqmcmd]=RYPang_upper->Kren;
1329     qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;
1330     qPitch[sizeqmcmd]=RYPang_upper->Tangazh;
1331     }
1332 mocchiut 1.65 }
1333 mocchiut 1.47 }
1334    
1335 mocchiut 1.49
1336 mocchiut 1.46 if ( debug ) printf(" puffi \n");
1337 mocchiut 1.44 Double_t tmin = 9999999999.;
1338     Double_t tmax = 0.;
1339     for(UInt_t tre = 0;tre<qtime.size();tre++){
1340     if(qtime[tre]>tmax)tmax = qtime[tre];
1341     if(qtime[tre]<tmin)tmin = qtime[tre];
1342     }
1343 pam-mep 1.69 // sorting quaternions by time
1344     Bool_t t = true;
1345     while(t){
1346     t=false;
1347     for(UInt_t i=0;i<qtime.size()-1;i++){
1348     if(qtime[i]>qtime[i+1]){
1349     Double_t tmpr = qtime[i];
1350     qtime[i]=qtime[i+1];
1351     qtime[i+1] = tmpr;
1352     tmpr = q0[i];
1353     q0[i]=q0[i+1];
1354     q0[i+1] = tmpr;
1355     tmpr = q1[i];
1356     q1[i]=q1[i+1];
1357     q1[i+1] = tmpr;
1358     tmpr = q2[i];
1359     q2[i]=q2[i+1];
1360     q2[i+1] = tmpr;
1361     tmpr = q3[i];
1362     q3[i]=q3[i+1];
1363     q3[i+1] = tmpr;
1364     tmpr = qRoll[i];
1365     qRoll[i]=qRoll[i+1];
1366     qRoll[i+1] = tmpr;
1367     tmpr = qYaw[i];
1368     qYaw[i]=qYaw[i+1];
1369     qYaw[i+1] = tmpr;
1370     tmpr = qPitch[i];
1371     qPitch[i]=qPitch[i+1];
1372     qPitch[i+1] = tmpr;
1373     t=true;
1374     }
1375     }
1376     }
1377    
1378     if ( debug ){
1379     cout << "we have loaded quaternions: size of quaternions set is "<< qtime.size() << endl;
1380     for(UInt_t i=0;i<qtime.size();i++) cout << qtime[i] << "\t";
1381     cout << endl << endl;
1382     Int_t lopu;
1383     cin >> lopu;
1384     }
1385 mocchiut 1.46
1386 mocchiut 1.44 } // if we processed first event
1387 pam-mep 1.60
1388 mocchiut 1.44
1389     //Filling Inclination information
1390     Double_t incli = 0;
1391 mocchiut 1.46 if ( qtime.size() > 1 ){
1392 pam-mep 1.69 if ( debug ) cout << "ok quaternions is exist and mu = " << must << endl;
1393     if ( debug ) cout << "qtimes[ " << qtime[0] << " , " << qtime[qtime.size()-1] << " ]\tatime = "<<atime<<endl;
1394 mocchiut 1.65 for(UInt_t mu = must;mu<qtime.size()-1;mu++){
1395     if ( debug ) printf(" ??grfuffi %i sixe %i must %i \n",mu,qtime.size()-1,must);
1396     if(qtime[mu+1]>qtime[mu]){
1397 mocchiut 1.70 if ( debug ) cout << "qtime[" << mu << "] = " << qtime[mu] << "\tqtime[" << mu+1 << "] = " << qtime[mu+1] << "\tatime = " << atime << endl;
1398 mocchiut 1.65 if(atime<=qtime[mu+1] && atime>=qtime[mu]){
1399 mocchiut 1.70 if ( debug ) cout << "here we have found proper quaternions for interpolation: mu = "<<mu<<endl;
1400 mocchiut 1.65 must = mu;
1401     incli = (qPitch[mu+1]-qPitch[mu])/(qtime[mu+1]-qtime[mu]);
1402     orbitalinfo->theta = incli*atime+qPitch[mu+1]-incli*qtime[mu+1];
1403     incli = (qRoll[mu+1]-qRoll[mu])/(qtime[mu+1]-qtime[mu]);
1404     orbitalinfo->etha = incli*atime+qRoll[mu+1]-incli*qtime[mu+1];
1405     incli = (qYaw[mu+1]-qYaw[mu])/(qtime[mu+1]-qtime[mu]);
1406     orbitalinfo->phi = incli*atime+qYaw[mu+1]-incli*qtime[mu+1];
1407    
1408     incli = (q0[mu+1]-q0[mu])/(qtime[mu+1]-qtime[mu]);
1409     orbitalinfo->q0 = incli*atime+q0[mu+1]-incli*qtime[mu+1];
1410     incli = (q1[mu+1]-q1[mu])/(qtime[mu+1]-qtime[mu]);
1411     orbitalinfo->q1 = incli*atime+q1[mu+1]-incli*qtime[mu+1];
1412     incli = (q2[mu+1]-q2[mu])/(qtime[mu+1]-qtime[mu]);
1413     orbitalinfo->q2 = incli*atime+q2[mu+1]-incli*qtime[mu+1];
1414     incli = (q3[mu+1]-q3[mu])/(qtime[mu+1]-qtime[mu]);
1415     orbitalinfo->q3 = incli*atime+q3[mu+1]-incli*qtime[mu+1];
1416 malakhov 1.74 Float_t tg = (qtime[mu+1]-qtime[mu])/1000.0;
1417 mocchiut 1.70 if(tg>=1) tg=0.00;
1418     orbitalinfo->TimeGap = TMath::Min(TMath::Abs(qtime[mu+1])-atime,TMath::Abs(atime-qtime[mu]))+tg;//qtime[mu+1]-qtime[mu];
1419     orbitalinfo->mode = qmode[mu+1];
1420     //if(atime==qtime[mu] || atime==qtime[mu+1]) orbitalinfo->qkind = 0; else orbitalinfo->qkind=1;
1421 mocchiut 1.65 //if(qmode[mu+1]==-10) orbitalinfo->R10r = true;else orbitalinfo->R10r = false;
1422     if ( debug ) printf(" grfuffi4 %i \n",mu);
1423     break;
1424     }
1425     }
1426     }
1427 mocchiut 1.46 }
1428 mocchiut 1.65 if ( debug ) printf(" grfuffi5 \n");
1429 mocchiut 1.30 //
1430     // ops no inclination information
1431     //
1432 mocchiut 1.65
1433 mocchiut 1.30 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 ){
1434 pam-mep 1.69 if ( debug ) cout << "ops no iclination information" << endl;
1435 mocchiut 1.30 orbitalinfo->mode = 10;
1436     orbitalinfo->q0 = -1000.;
1437     orbitalinfo->q1 = -1000.;
1438     orbitalinfo->q2 = -1000.;
1439     orbitalinfo->q3 = -1000.;
1440     orbitalinfo->etha = -1000.;
1441     orbitalinfo->phi = -1000.;
1442     orbitalinfo->theta = -1000.;
1443 pam-mep 1.69 orbitalinfo->TimeGap = -1000.;
1444     //orbitalinfo->qkind = -1000;
1445 mocchiut 1.70
1446     // if ( debug ){
1447     // Int_t lopu;
1448     // cin >> lopu;
1449     // }
1450 mocchiut 1.65 if ( debug ) printf(" grfuffi6 \n");
1451     }
1452 mocchiut 1.30 //
1453 mocchiut 1.65 if ( debug ) printf(" filling \n");
1454 mocchiut 1.30 // #########################################################################################################################
1455 mocchiut 1.15 //
1456     // fill orbital positions
1457     //
1458 mocchiut 1.7 // Build coordinates in the right range. We want to convert,
1459     // longitude from (0, 2*pi) to (-180deg, 180deg). Altitude is
1460     // in meters.
1461     lon = (coo.m_Lon > M_PI) ? rad2deg(coo.m_Lon - 2*M_PI) : rad2deg(coo.m_Lon);
1462     lat = rad2deg(coo.m_Lat);
1463     alt = coo.m_Alt;
1464 pam-mep 1.69
1465     cOrbit orbits2(*gltle->GetTle());
1466     orbits2.getPosition((double) (atime - gltle->GetFromTime())/60., &eCi);
1467 mocchiut 1.70 // Float_t x=eCi.getPos().m_x;
1468     // Float_t y=eCi.getPos().m_y;
1469     // Float_t z=eCi.getPos().m_z;
1470    
1471 pam-mep 1.69 TVector3 V(eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z);
1472     TVector3 Pos(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z);
1473 mocchiut 1.70
1474 pam-mep 1.69 Float_t dlon=Pos.Phi()*TMath::RadToDeg()-lon;
1475 mocchiut 1.70
1476 pam-mep 1.69 Pos.RotateZ(-dlon*TMath::DegToRad());
1477     V.RotateZ(-dlon*TMath::DegToRad());
1478     Float_t diro;
1479     if(V.Z()>0) diro=1; else diro=-1;
1480 mocchiut 1.70
1481     // 10REDNEW
1482 pam-mep 1.69 Int_t errq=0;
1483 malakhov 1.74 Int_t azim=0;
1484     Int_t MU=0;
1485 mocchiut 1.70 for(UInt_t mu = must;mu<RTtime2.size()-1;mu++){
1486 malakhov 1.74 if(atime<=RTstart[mu+1] && atime>=RTstart[mu]){
1487 mocchiut 1.70 errq=RTerrq[mu];
1488     azim=RTazim[mu];
1489 malakhov 1.74 MU=mu;
1490     break;
1491 mocchiut 1.70 }
1492     }
1493     orbitalinfo->errq = errq;
1494     orbitalinfo->azim = azim;
1495     orbitalinfo->qkind = 0;
1496    
1497 mocchiut 1.65 if ( debug ) printf(" coord done \n");
1498 mocchiut 1.7 if( lon<180 && lon>-180 && lat<90 && lat>-90 && alt>0 ){
1499 mocchiut 1.15 //
1500 mocchiut 1.7 orbitalinfo->lon = lon;
1501     orbitalinfo->lat = lat;
1502 pam-mep 1.69 orbitalinfo->alt = alt;
1503     orbitalinfo->V = V;
1504    
1505 mocchiut 1.70 // GMtype_CoordGeodetic location;
1506 pam-mep 1.69 location.lambda = lon;
1507     location.phi = lat;
1508     location.HeightAboveEllipsoid = alt;
1509    
1510     GM_GeodeticToSpherical(Ellip, location, &CoordSpherical);
1511     GM_SphericalToCartesian(CoordSpherical, &CoordCartesian);
1512     GM_EarthCartToDipoleCartCD(Pole, CoordCartesian, &DipoleCartesian);
1513     GM_CartesianToSpherical(DipoleCartesian, &DipoleSpherical);
1514     orbitalinfo->londip = DipoleSpherical.lambda;
1515     orbitalinfo->latdip = DipoleSpherical.phig;
1516    
1517     if(debug)cout<<"geodetic:\t"<<lon<<"\t"<<lat<<"\tgeomagnetic:\t"<<orbitalinfo->londip<<"\t"<<orbitalinfo->latdip<<endl;
1518    
1519 mocchiut 1.15 //
1520 mocchiut 1.7 // compute mag field components and L shell.
1521 mocchiut 1.15 //
1522 mocchiut 1.65 if ( debug ) printf(" call igrf feldg \n");
1523 mocchiut 1.7 feldg_(&lat, &lon, &alt, &bnorth, &beast, &bdown, &babs);
1524 mocchiut 1.65 if ( debug ) printf(" call igrf shellg \n");
1525 mocchiut 1.7 shellg_(&lat, &lon, &alt, &dimo, &xl, &icode, &bab1);
1526 mocchiut 1.65 if ( debug ) printf(" call igrf findb \n");
1527 mocchiut 1.7 findb0_(&stps, &bdel, &value, &bequ, &rr0);
1528 mocchiut 1.15 //
1529 mocchiut 1.65 if ( debug ) printf(" done igrf \n");
1530 mocchiut 1.7 orbitalinfo->Bnorth = bnorth;
1531     orbitalinfo->Beast = beast;
1532     orbitalinfo->Bdown = bdown;
1533     orbitalinfo->Babs = babs;
1534 pam-mep 1.60 orbitalinfo->M = dimo;
1535 mocchiut 1.7 orbitalinfo->BB0 = babs/bequ;
1536 mocchiut 1.15 orbitalinfo->L = xl;
1537 mocchiut 1.7 // Set Stormer vertical cutoff using L shell.
1538 mocchiut 1.57 orbitalinfo->cutoffsvl = 14.295 / (xl*xl); //
1539 pam-mep 1.69 if(debug)cout << "L = " << xl << "\tM = " << dimo << "\tvertical cutoff: "<< orbitalinfo->cutoffsvl << endl;
1540    
1541 mocchiut 1.57 /*
1542 mocchiut 1.65 ---------- Forwarded message ----------
1543     Date: Wed, 09 May 2012 12:16:47 +0200
1544     From: Alessandro Bruno <alessandro.bruno@ba.infn.it>
1545     To: Mirko Boezio <mirko.boezio@ts.infn.it>
1546     Cc: Francesco S. Cafagna <Francesco.Cafagna@ba.infn.it>
1547     Subject: Störmer vertical cutoff
1548    
1549     Ciao Mirko,
1550     volevo segnalarti che il valore dello Störmer vertical cutoff nel Level2 è
1551     sovrastimato di circa il 4%.
1552     Dopo un'approfondita analisi con l'IGRF-05 abbiamo ricavano un valore pari
1553     a: 14.295 / L^2 anzichè 14.9 / L^2, valore obsoleto in quanto riferito agli
1554     anni '50.
1555     */
1556 mocchiut 1.57 //14.9/(xl*xl);
1557 mocchiut 1.56 orbitalinfo->igrf_icode = icode;
1558 mocchiut 1.15 //
1559 mocchiut 1.65 }
1560 pamelaprod 1.11 //
1561 mocchiut 1.40 if ( debug ) printf(" pitch angle \n");
1562     //
1563 mocchiut 1.30 // pitch angles
1564     //
1565 pam-mep 1.69 if( orbitalinfo->TimeGap>0){
1566 mocchiut 1.30 //
1567 mocchiut 1.65 if ( debug ) printf(" timegap %f \n",orbitalinfo->TimeGap);
1568 mocchiut 1.49 Float_t Bx = -orbitalinfo->Bdown;
1569     Float_t By = orbitalinfo->Beast;
1570     Float_t Bz = orbitalinfo->Bnorth;
1571 pam-mep 1.69
1572     TMatrixD Qiji(3,3);
1573     TMatrixD Qij = PO->QuatoECI(orbitalinfo->q0,orbitalinfo->q1,orbitalinfo->q2,orbitalinfo->q3);
1574     TMatrixD Dij = PO->ECItoGEO(Qij,orbitalinfo->absTime,orbitalinfo->lat,orbitalinfo->lon);
1575    
1576     //10REDNEW
1577     /* If initial orientation data have reason to be inaccurate */
1578 malakhov 1.74 Float_t tg = 0.00;
1579     Float_t tmptg;
1580     if(MU!=0){
1581 pam-mep 1.69 // if(orbitalinfo->TimeGap>0 && errq==0 && azim==0){ // 10RED CHECK (comparison between three metod of recovering orientation)
1582 malakhov 1.74 if((atime>=RTstart[MU] && atime<RTstart[MU+1] && RTbank1[MU]==0 && RTbank2[MU]==0 && TMath::Abs(orbitalinfo->etha)>0.01) || ((RTbank1[MU]!=0 || RTbank2[MU]!=0) && atime>=RTstart[MU] && atime<RTstart[MU+1] && azim==0 && (errq!=0 || orbitalinfo->TimeGap>10.0 || ((modf(orbitalinfo->TimeGap,&tmptg)*1000>10 || modf(orbitalinfo->TimeGap,&tmptg)*1000==0.0) && orbitalinfo->TimeGap>2.0)))){
1583 pam-mep 1.69 /* found in Rotation Table this data for this time interval*/
1584     if(atime<RTtime1[0])
1585     orbitalinfo->azim = 5; //means that RotationTable no started yet
1586     else{
1587     // search for angle betwean velosity and direction to north in tangential to Earth surfase plane in satellite position
1588 malakhov 1.74 Double_t bank=RTstart[MU];
1589 pam-mep 1.69 Double_t tlat=orbitalinfo->lat;
1590 malakhov 1.74
1591     tg=modf(orbitalinfo->TimeGap,&tg)*1000;
1592    
1593     if(atime>=RTpluto1[MU] && atime<=RTpluto2[MU]){
1594     Double_t kar=(RTbank2[MU]-RTbank1[MU])/(RTtime2[MU]-RTtime1[MU]);
1595     Double_t bak=RTbank1[MU]-kar*RTtime1[MU];
1596     bank=kar*atime+bak;
1597     }
1598     if(atime>=RTstart[MU] && atime<RTpluto1[MU]){
1599     Double_t s_dBdt2=(RTbpluto1[MU]-RTbank1[MU])/(RTpluto1[MU]-RTstart[MU]);
1600     Double_t s_t2=((Double_t)RTpluto1[MU]+(Double_t)RTstart[MU])/2. - RTstart[MU];
1601     Double_t s_t1=RTstart[MU]-RTstart[MU];
1602     Double_t s_k=s_dBdt2/(s_t2-s_t1);
1603     Double_t s_b=-s_k*s_t1;
1604     Double_t s_t3=RTpluto1[MU]-RTstart[MU];
1605     Double_t s_b3=RTbpluto1[MU];
1606     Double_t s_c=s_b3-0.5*s_k*s_t3*s_t3 -s_b*s_t3;
1607     bank=0.5*s_k*(atime-RTstart[MU])*(atime-RTstart[MU]) + s_b*(atime-RTstart[MU]) + s_c;
1608     }
1609     if(atime>RTpluto2[MU] && atime<=RTstart[MU+1]){
1610     Double_t s_dBdt2=(RTbpluto2[MU] - RTbank2[MU])/(RTpluto2[MU]-RTstart[MU+1]);
1611     Double_t s_t2=((Double_t)RTpluto2[MU]+(Double_t)RTstart[MU+1])/2. - RTstart[MU];
1612     Double_t s_t1=RTstart[MU+1]-RTstart[MU];
1613     Double_t s_k=s_dBdt2/(s_t2-s_t1);
1614     Double_t s_b=-s_k*s_t1;
1615     Double_t s_t3=RTpluto2[MU]-RTstart[MU];
1616     Double_t s_b3=RTbpluto2[MU];
1617     Double_t s_c=s_b3-0.5*s_k*s_t3*s_t3 -s_b*s_t3;
1618     bank=0.5*s_k*(atime-RTstart[MU])*(atime-RTstart[MU]) + s_b*(atime-RTstart[MU]) + s_c;
1619     }
1620     orbitalinfo->etha=bank;
1621     Double_t spitch = 0.00001; // temprary not zero to avoid problem with tranzition from Euler angles to orientation matrix
1622 pam-mep 1.69
1623     //Estimations of pitch angle of satellite
1624     if(TMath::Abs(bank)>0.7){
1625 malakhov 1.74 Float_t spitch1=TMath::DegToRad()*0.7*diro;//RTdir1[MU];
1626     Float_t spitch2=TMath::DegToRad()*0.7*diro;//RTdir2[MU];
1627     Float_t kva=(spitch2-spitch1)/(RTtime2[MU]-RTtime1[MU]);
1628     Float_t bva=spitch1-kva*RTtime1[MU];
1629 pam-mep 1.69 spitch=kva*atime+bva;
1630     }
1631 mocchiut 1.73
1632 pam-mep 1.69 //Calculate Yaw angle accordingly with fit, see picture FitYaw.jpg
1633     Double_t yaw=0.00001; // temprary not zero to avoid problem with tranzition from Euler angles to orientation matrix
1634     if(TMath::Abs(tlat)<70)
1635 malakhov 1.74 yaw = -3.7e-8*tlat*tlat*tlat*tlat + 1.4e-7*tlat*tlat*tlat - 0.0005*tlat*tlat - 0.00025*tlat + 3.6;
1636 pam-mep 1.69 yaw = diro*yaw; //because should be different sign for ascending and descending orbits!
1637 malakhov 1.74 orbitalinfo->phi=yaw;
1638 pam-mep 1.69
1639     if(TMath::Abs(bank)>0.5 && TMath::Abs(yaw-orbitalinfo->phi)<3.0) yaw=orbitalinfo->phi;
1640    
1641     // Qiji = PO->EulertoEci(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z,eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z,bank,yaw,spitch); // 10RED CHECK
1642     Qij = PO->EulertoEci(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z,eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z,bank,yaw,spitch); // STANDARD
1643     orbitalinfo->qkind = 1;
1644    
1645     //Qij = PO->GEOtoECI(Dij,orbitalinfo->absTime,orbitalinfo->lat,orbitalinfo->lon); // to convert from Dij to Qij
1646    
1647     } // end of if(atime<RTtime1[0]
1648     } // end of f(((orbitalinfo->TimeGap>60.0 && TMath...
1649 malakhov 1.74 } // end of MU~=0
1650 pam-mep 1.69
1651     TMatrixD qij = PO->ColPermutation(Qij);
1652     TMatrixD Fij = PO->ECItoGreenwich(Qij,orbitalinfo->absTime);
1653 mocchiut 1.49 TMatrixD Gij = PO->ColPermutation(Fij);
1654 pam-mep 1.69 Dij = PO->ECItoGEO(Qij,orbitalinfo->absTime,orbitalinfo->lat,orbitalinfo->lon);
1655 mocchiut 1.30 TMatrixD Iij = PO->ColPermutation(Dij);
1656 pam-mep 1.69 TVector3 SP = PO->GetSunPosition(orbitalinfo->absTime);
1657     // go to Pamela reference frame from Resurs reference frame
1658     Float_t tmpy = SP.Y();
1659     SP.SetY(SP.Z());
1660     SP.SetZ(-tmpy);
1661     TVector3 SunZenith;
1662     SunZenith.SetMagThetaPhi(1,23.439281*TMath::DegToRad(),TMath::Pi()/2.);
1663     TVector3 SunMag = -SP;
1664     SunMag.Rotate(-45*TMath::DegToRad(),SunZenith);
1665     tmpy=SunMag.Y();
1666     SunMag.SetY(SunMag.Z());
1667     SunMag.SetZ(-tmpy);
1668    
1669 mocchiut 1.33 orbitalinfo->Iij.ResizeTo(Iij);
1670     orbitalinfo->Iij = Iij;
1671     //
1672 mocchiut 1.64 // A1 = Iij(0,2);
1673     // A2 = Iij(1,2);
1674     // A3 = Iij(2,2);
1675 mocchiut 1.49 //
1676 mocchiut 1.33 // orbitalinfo->pamzenitangle = (Float_t)PO->GetPitchAngle(1,0,0,A1,A2,A3); // Angle between zenit and Pamela's main axiz
1677     // orbitalinfo->pamBangle = (Float_t)PO->GetPitchAngle(A1,A2,A3,Bx,By,Bz); // Angle between Pamela's main axiz and B
1678 mocchiut 1.30 //
1679 mocchiut 1.65 if ( debug ) printf(" matrixes done \n");
1680 mocchiut 1.73 if ( !standalone ){
1681 mocchiut 1.65 if ( debug ) printf(" !standalone \n");
1682 mocchiut 1.30 //
1683 mocchiut 1.73 // Standard tracking algorithm
1684     //
1685 mocchiut 1.30 Int_t nn = 0;
1686 mocchiut 1.73 if ( verbose ) printf(" standard tracking \n");
1687 mocchiut 1.30 for(Int_t nt=0; nt < tof->ntrk(); nt++){
1688     //
1689     ToFTrkVar *ptt = tof->GetToFTrkVar(nt);
1690 pam-mep 1.69 if (debug) cout<<"tof->ntrk() = "<<tof->ntrk()<<"\tptt->trkseqno = "<<ptt->trkseqno<<"\ttrke->ntrk() = "<<trke->ntrk()<<endl;
1691 mocchiut 1.30 Double_t E11x = ptt->xtr_tof[0]; // tr->x[0];
1692     Double_t E11y = ptt->ytr_tof[0]; //tr->y[0];
1693     Double_t E11z = zin[0];
1694     Double_t E22x = ptt->xtr_tof[3];//tr->x[3];
1695     Double_t E22y = ptt->ytr_tof[3];//tr->y[3];
1696     Double_t E22z = zin[3];
1697 mocchiut 1.32 if ( (E11x < 100. && E11y < 100. && E22x < 100. && E22y < 100.) || ptt->trkseqno != -1 ){
1698 pam-mep 1.69 TrkTrack *mytrack = trke->GetStoredTrack(ptt->trkseqno);
1699     Float_t rig=1/mytrack->GetDeflection();
1700 mocchiut 1.30 Double_t norm = sqrt(pow(E22x-E11x,2)+pow(E22y-E11y,2)+pow(E22z-E11z,2));
1701 mocchiut 1.73 //
1702 mocchiut 1.30 Px = (E22x-E11x)/norm;
1703     Py = (E22y-E11y)/norm;
1704     Pz = (E22z-E11z)/norm;
1705     //
1706 mocchiut 1.33 t_orb->trkseqno = ptt->trkseqno;
1707     //
1708     TMatrixD Eij = PO->PamelatoGEO(Iij,Px,Py,Pz);
1709     t_orb->Eij.ResizeTo(Eij);
1710     t_orb->Eij = Eij;
1711     //
1712 pam-mep 1.51 TMatrixD Sij = PO->PamelatoGEO(Gij,Px,Py,Pz);
1713 mocchiut 1.33 t_orb->Sij.ResizeTo(Sij);
1714     t_orb->Sij = Sij;
1715 mocchiut 1.30 //
1716     t_orb->pitch = (Float_t)PO->GetPitchAngle(Eij(0,0),Eij(1,0),Eij(2,0),Bx,By,Bz);
1717 mocchiut 1.33 //
1718 mocchiut 1.73 // SunPosition in instrumental reference frame
1719 pam-mep 1.69 TMatrixD Kij = PO->PamelatoGEO(qij,Px,Py,Pz);
1720     TMatrixD Lij = PO->PamelatoGEO(qij,0,0,1);
1721     t_orb->sunangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),-SP.X(),-SP.Y(),-SP.Z());
1722     t_orb->sunmagangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),SunMag.X(),SunMag.Y(),SunMag.Z());
1723 mocchiut 1.33 //
1724     //
1725 pam-mep 1.69 Double_t omega = PO->GetPitchAngle(-Eij(0,0),-Eij(1,0),-Eij(2,0),1,0,0) * TMath::DegToRad();
1726     TVector3 Bxy(0,By,Bz);
1727     TVector3 Exy(0,-Eij(1,0),-Eij(2,0));
1728     Double_t dzeta=Bxy.Angle(Exy);
1729     if (-Eij(1,0) < 0) dzeta=2.0*TMath::Pi() - dzeta;
1730 mocchiut 1.73
1731     if(debug) cout << "omega = "<<omega*TMath::RadToDeg()<<"\tdzeta = "<<dzeta*TMath::RadToDeg()<<endl;
1732 pam-mep 1.69
1733 mocchiut 1.73 // Formula from D.F. Smart *, M.A. Shea [2005]; A review of geomagnetic cutoff rigidities for earth-orbiting spacecraft
1734 pam-mep 1.69 if(rig>=0) t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow(1+sqrt(1-sin(omega)*sin(dzeta)*pow(cos(orbitalinfo->lat*TMath::DegToRad()),3)),2));
1735 mocchiut 1.73 else t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow(1+sqrt(1-sin(omega)*sin(TMath::Pi()+dzeta)*pow(cos(orbitalinfo->lat*TMath::DegToRad()),3)),2));
1736 pam-mep 1.69 if (debug) cout << "R = " << rig << "\tcutoff = " << t_orb->cutoff << endl;
1737    
1738 mocchiut 1.33 //
1739 mocchiut 1.36 if ( t_orb->pitch != t_orb->pitch ) t_orb->pitch = -1000.;
1740     if ( t_orb->cutoff != t_orb->cutoff ) t_orb->cutoff = -1000.;
1741 pam-mep 1.69 if ( t_orb->sunangle != t_orb->sunangle ) t_orb->sunangle = -1000.;
1742     if ( t_orb->sunmagangle != t_orb->sunmagangle ) t_orb->sunmagangle = -1000.;
1743 mocchiut 1.36 //
1744 mocchiut 1.33 if ( debug ) printf(" orbitalinfo->cutoffsvl %f vitaly %f \n",orbitalinfo->cutoffsvl,t_orb->cutoff);
1745 mocchiut 1.30 //
1746     new(tor[nn]) OrbitalInfoTrkVar(*t_orb);
1747     nn++;
1748     //
1749     t_orb->Clear();
1750     //
1751 mocchiut 1.73 }
1752 mocchiut 1.30 //
1753 mocchiut 1.73 } // end standard tracking algorithm
1754    
1755     //
1756     // Code for extended tracking algorithm:
1757     //
1758     if ( hasNucleiTrk ){
1759     Int_t ttentry = 0;
1760     if ( verbose ) printf(" hasNucleiTrk \n");
1761     for(Int_t nt=0; nt < tcNucleiTof->GetEntries() ; nt++){
1762     //
1763     if ( verbose ) printf(" got1\n");
1764     ToFTrkVar *ptt = (ToFTrkVar*)(tcNucleiTof->At(nt));
1765     if (verbose) cout<<" tcNucleiTof->GetEntries() = "<<tcNucleiTof->GetEntries()<<"\tptt->trkseqno = "<<ptt->trkseqno<<endl;
1766     Double_t E11x = ptt->xtr_tof[0]; // tr->x[0];
1767     Double_t E11y = ptt->ytr_tof[0]; //tr->y[0];
1768     Double_t E11z = zin[0];
1769     Double_t E22x = ptt->xtr_tof[3];//tr->x[3];
1770     Double_t E22y = ptt->ytr_tof[3];//tr->y[3];
1771     Double_t E22z = zin[3];
1772     if ( (E11x < 100. && E11y < 100. && E22x < 100. && E22y < 100.) || ptt->trkseqno != -1 ){
1773     TrkTrack *mytrack = (TrkTrack*)(tcNucleiTrk->At(ptt->trkseqno));
1774     if ( verbose ) printf(" got tcNucleiTrk \n");
1775     Float_t rig=1/mytrack->GetDeflection();
1776     Double_t norm = sqrt(pow(E22x-E11x,2)+pow(E22y-E11y,2)+pow(E22z-E11z,2));
1777     //
1778     Px = (E22x-E11x)/norm;
1779     Py = (E22y-E11y)/norm;
1780     Pz = (E22z-E11z)/norm;
1781     //
1782     t_orb->trkseqno = ptt->trkseqno;
1783     //
1784     TMatrixD Eij = PO->PamelatoGEO(Iij,Px,Py,Pz);
1785     t_orb->Eij.ResizeTo(Eij);
1786     t_orb->Eij = Eij;
1787     //
1788     TMatrixD Sij = PO->PamelatoGEO(Gij,Px,Py,Pz);
1789     t_orb->Sij.ResizeTo(Sij);
1790     t_orb->Sij = Sij;
1791     //
1792     t_orb->pitch = (Float_t)PO->GetPitchAngle(Eij(0,0),Eij(1,0),Eij(2,0),Bx,By,Bz);
1793     //
1794     // SunPosition in instrumental reference frame
1795     TMatrixD Kij = PO->PamelatoGEO(qij,Px,Py,Pz);
1796     TMatrixD Lij = PO->PamelatoGEO(qij,0,0,1);
1797     t_orb->sunangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),-SP.X(),-SP.Y(),-SP.Z());
1798     t_orb->sunmagangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),SunMag.X(),SunMag.Y(),SunMag.Z());
1799     //
1800     //
1801     Double_t omega = PO->GetPitchAngle(-Eij(0,0),-Eij(1,0),-Eij(2,0),1,0,0) * TMath::DegToRad();
1802     TVector3 Bxy(0,By,Bz);
1803     TVector3 Exy(0,-Eij(1,0),-Eij(2,0));
1804     Double_t dzeta=Bxy.Angle(Exy);
1805     if (-Eij(1,0) < 0) dzeta=2.0*TMath::Pi() - dzeta;
1806    
1807     if(debug) cout << "omega = "<<omega*TMath::RadToDeg()<<"\tdzeta = "<<dzeta*TMath::RadToDeg()<<endl;
1808    
1809     // Formula from D.F. Smart *, M.A. Shea [2005]; A review of geomagnetic cutoff rigidities for earth-orbiting spacecraft
1810     if(rig>=0) t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow(1+sqrt(1-sin(omega)*sin(dzeta)*pow(cos(orbitalinfo->lat*TMath::DegToRad()),3)),2));
1811     else t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow(1+sqrt(1-sin(omega)*sin(TMath::Pi()+dzeta)*pow(cos(orbitalinfo->lat*TMath::DegToRad()),3)),2));
1812     if (debug) cout << "R = " << rig << "\tcutoff = " << t_orb->cutoff << endl;
1813    
1814     //
1815     if ( t_orb->pitch != t_orb->pitch ) t_orb->pitch = -1000.;
1816     if ( t_orb->cutoff != t_orb->cutoff ) t_orb->cutoff = -1000.;
1817     if ( t_orb->sunangle != t_orb->sunangle ) t_orb->sunangle = -1000.;
1818     if ( t_orb->sunmagangle != t_orb->sunmagangle ) t_orb->sunmagangle = -1000.;
1819     //
1820     if ( debug ) printf(" orbitalinfo->cutoffsvl %f vitaly %f \n",orbitalinfo->cutoffsvl,t_orb->cutoff);
1821     //
1822     TClonesArray &tt1 = *torbNucleiTrk;
1823     new(tt1[ttentry]) OrbitalInfoTrkVar(*t_orb);
1824     ttentry++;
1825     //
1826     t_orb->Clear();
1827     //
1828     }
1829     //
1830     }
1831     } // end standard tracking algorithm: nuclei
1832     if ( hasExtNucleiTrk ){
1833     Int_t ttentry = 0;
1834     if ( verbose ) printf(" hasExtNucleiTrk \n");
1835     for(Int_t nt=0; nt < tcExtNucleiTof->GetEntries() ; nt++){
1836     //
1837     if ( verbose ) printf(" got2\n");
1838     ToFTrkVar *ptt = (ToFTrkVar*)(tcExtNucleiTof->At(nt));
1839     if (verbose) cout<<" tcExtNucleiTof->GetEntries() = "<<tcExtNucleiTof->GetEntries()<<"\tptt->trkseqno = "<<ptt->trkseqno<<endl;
1840     Double_t E11x = ptt->xtr_tof[0]; // tr->x[0];
1841     Double_t E11y = ptt->ytr_tof[0]; //tr->y[0];
1842     Double_t E11z = zin[0];
1843     Double_t E22x = ptt->xtr_tof[3];//tr->x[3];
1844     Double_t E22y = ptt->ytr_tof[3];//tr->y[3];
1845     Double_t E22z = zin[3];
1846     if ( (E11x < 100. && E11y < 100. && E22x < 100. && E22y < 100.) || ptt->trkseqno != -1 ){
1847     ExtTrack *mytrack = (ExtTrack*)(tcExtNucleiTrk->At(ptt->trkseqno));
1848     if ( verbose ) printf(" got tcExtNucleiTrk \n");
1849     Float_t rig=1/mytrack->GetDeflection();
1850     Double_t norm = sqrt(pow(E22x-E11x,2)+pow(E22y-E11y,2)+pow(E22z-E11z,2));
1851     //
1852     Px = (E22x-E11x)/norm;
1853     Py = (E22y-E11y)/norm;
1854     Pz = (E22z-E11z)/norm;
1855     //
1856     t_orb->trkseqno = ptt->trkseqno;
1857     //
1858     TMatrixD Eij = PO->PamelatoGEO(Iij,Px,Py,Pz);
1859     t_orb->Eij.ResizeTo(Eij);
1860     t_orb->Eij = Eij;
1861     //
1862     TMatrixD Sij = PO->PamelatoGEO(Gij,Px,Py,Pz);
1863     t_orb->Sij.ResizeTo(Sij);
1864     t_orb->Sij = Sij;
1865     //
1866     t_orb->pitch = (Float_t)PO->GetPitchAngle(Eij(0,0),Eij(1,0),Eij(2,0),Bx,By,Bz);
1867     //
1868     // SunPosition in instrumental reference frame
1869     TMatrixD Kij = PO->PamelatoGEO(qij,Px,Py,Pz);
1870     TMatrixD Lij = PO->PamelatoGEO(qij,0,0,1);
1871     t_orb->sunangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),-SP.X(),-SP.Y(),-SP.Z());
1872     t_orb->sunmagangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),SunMag.X(),SunMag.Y(),SunMag.Z());
1873     //
1874     //
1875     Double_t omega = PO->GetPitchAngle(-Eij(0,0),-Eij(1,0),-Eij(2,0),1,0,0) * TMath::DegToRad();
1876     TVector3 Bxy(0,By,Bz);
1877     TVector3 Exy(0,-Eij(1,0),-Eij(2,0));
1878     Double_t dzeta=Bxy.Angle(Exy);
1879     if (-Eij(1,0) < 0) dzeta=2.0*TMath::Pi() - dzeta;
1880    
1881     if(debug) cout << "omega = "<<omega*TMath::RadToDeg()<<"\tdzeta = "<<dzeta*TMath::RadToDeg()<<endl;
1882    
1883     // Formula from D.F. Smart *, M.A. Shea [2005]; A review of geomagnetic cutoff rigidities for earth-orbiting spacecraft
1884     if(rig>=0) t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow(1+sqrt(1-sin(omega)*sin(dzeta)*pow(cos(orbitalinfo->lat*TMath::DegToRad()),3)),2));
1885     else t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow(1+sqrt(1-sin(omega)*sin(TMath::Pi()+dzeta)*pow(cos(orbitalinfo->lat*TMath::DegToRad()),3)),2));
1886     if (debug) cout << "R = " << rig << "\tcutoff = " << t_orb->cutoff << endl;
1887    
1888     //
1889     if ( t_orb->pitch != t_orb->pitch ) t_orb->pitch = -1000.;
1890     if ( t_orb->cutoff != t_orb->cutoff ) t_orb->cutoff = -1000.;
1891     if ( t_orb->sunangle != t_orb->sunangle ) t_orb->sunangle = -1000.;
1892     if ( t_orb->sunmagangle != t_orb->sunmagangle ) t_orb->sunmagangle = -1000.;
1893     //
1894     if ( debug ) printf(" orbitalinfo->cutoffsvl %f vitaly %f \n",orbitalinfo->cutoffsvl,t_orb->cutoff);
1895     //
1896     TClonesArray &tt2 = *torbExtNucleiTrk;
1897     new(tt2[ttentry]) OrbitalInfoTrkVar(*t_orb);
1898     ttentry++;
1899     //
1900     t_orb->Clear();
1901     //
1902     }
1903     //
1904     }
1905     } // end standard tracking algorithm: nuclei extended
1906     if ( hasExtTrk ){
1907     Int_t ttentry = 0;
1908     if ( verbose ) printf(" hasExtTrk \n");
1909     for(Int_t nt=0; nt < tcExtTof->GetEntries() ; nt++){
1910     //
1911     if ( verbose ) printf(" got3\n");
1912     ToFTrkVar *ptt = (ToFTrkVar*)(tcExtTof->At(nt));
1913     if (verbose) cout<<" tcExtTof->GetEntries() = "<<tcExtTof->GetEntries()<<"\tptt->trkseqno = "<<ptt->trkseqno<<endl;
1914     Double_t E11x = ptt->xtr_tof[0]; // tr->x[0];
1915     Double_t E11y = ptt->ytr_tof[0]; //tr->y[0];
1916     Double_t E11z = zin[0];
1917     Double_t E22x = ptt->xtr_tof[3];//tr->x[3];
1918     Double_t E22y = ptt->ytr_tof[3];//tr->y[3];
1919     Double_t E22z = zin[3];
1920     if ( (E11x < 100. && E11y < 100. && E22x < 100. && E22y < 100.) || ptt->trkseqno != -1 ){
1921     ExtTrack *mytrack = (ExtTrack*)(tcExtTrk->At(ptt->trkseqno));
1922     if ( verbose ) printf(" got tcExtTrk \n");
1923     Float_t rig=1/mytrack->GetDeflection();
1924     Double_t norm = sqrt(pow(E22x-E11x,2)+pow(E22y-E11y,2)+pow(E22z-E11z,2));
1925     //
1926     Px = (E22x-E11x)/norm;
1927     Py = (E22y-E11y)/norm;
1928     Pz = (E22z-E11z)/norm;
1929     //
1930     t_orb->trkseqno = ptt->trkseqno;
1931     //
1932     TMatrixD Eij = PO->PamelatoGEO(Iij,Px,Py,Pz);
1933     t_orb->Eij.ResizeTo(Eij);
1934     t_orb->Eij = Eij;
1935     //
1936     TMatrixD Sij = PO->PamelatoGEO(Gij,Px,Py,Pz);
1937     t_orb->Sij.ResizeTo(Sij);
1938     t_orb->Sij = Sij;
1939     //
1940     t_orb->pitch = (Float_t)PO->GetPitchAngle(Eij(0,0),Eij(1,0),Eij(2,0),Bx,By,Bz);
1941     //
1942     // SunPosition in instrumental reference frame
1943     TMatrixD Kij = PO->PamelatoGEO(qij,Px,Py,Pz);
1944     TMatrixD Lij = PO->PamelatoGEO(qij,0,0,1);
1945     t_orb->sunangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),-SP.X(),-SP.Y(),-SP.Z());
1946     t_orb->sunmagangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),SunMag.X(),SunMag.Y(),SunMag.Z());
1947     //
1948     //
1949     Double_t omega = PO->GetPitchAngle(-Eij(0,0),-Eij(1,0),-Eij(2,0),1,0,0) * TMath::DegToRad();
1950     TVector3 Bxy(0,By,Bz);
1951     TVector3 Exy(0,-Eij(1,0),-Eij(2,0));
1952     Double_t dzeta=Bxy.Angle(Exy);
1953     if (-Eij(1,0) < 0) dzeta=2.0*TMath::Pi() - dzeta;
1954    
1955     if(debug) cout << "omega = "<<omega*TMath::RadToDeg()<<"\tdzeta = "<<dzeta*TMath::RadToDeg()<<endl;
1956    
1957     // Formula from D.F. Smart *, M.A. Shea [2005]; A review of geomagnetic cutoff rigidities for earth-orbiting spacecraft
1958     if(rig>=0) t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow(1+sqrt(1-sin(omega)*sin(dzeta)*pow(cos(orbitalinfo->lat*TMath::DegToRad()),3)),2));
1959     else t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow(1+sqrt(1-sin(omega)*sin(TMath::Pi()+dzeta)*pow(cos(orbitalinfo->lat*TMath::DegToRad()),3)),2));
1960     if (debug) cout << "R = " << rig << "\tcutoff = " << t_orb->cutoff << endl;
1961    
1962     //
1963     if ( t_orb->pitch != t_orb->pitch ) t_orb->pitch = -1000.;
1964     if ( t_orb->cutoff != t_orb->cutoff ) t_orb->cutoff = -1000.;
1965     if ( t_orb->sunangle != t_orb->sunangle ) t_orb->sunangle = -1000.;
1966     if ( t_orb->sunmagangle != t_orb->sunmagangle ) t_orb->sunmagangle = -1000.;
1967     //
1968     if ( debug ) printf(" orbitalinfo->cutoffsvl %f vitaly %f \n",orbitalinfo->cutoffsvl,t_orb->cutoff);
1969     //
1970     TClonesArray &tt3 = *torbExtTrk;
1971     new(tt3[ttentry]) OrbitalInfoTrkVar(*t_orb);
1972     ttentry++;
1973     //
1974     t_orb->Clear();
1975     //
1976     }
1977     //
1978     }
1979     } // end standard tracking algorithm: extended
1980    
1981 mocchiut 1.30 } else {
1982 mocchiut 1.65 if ( debug ) printf(" mmm... mode %u standalone \n",orbitalinfo->mode);
1983     }
1984 mocchiut 1.30 //
1985 mocchiut 1.73 } else { // HERE IT MISS ALL CODE FOR EXTENDED TRACKING!
1986     if ( !standalone ){
1987 mocchiut 1.35 //
1988 mocchiut 1.73 if ( verbose ) printf(" no orb info for tracks \n");
1989 mocchiut 1.35 Int_t nn = 0;
1990     for(Int_t nt=0; nt < tof->ntrk(); nt++){
1991     //
1992     ToFTrkVar *ptt = tof->GetToFTrkVar(nt);
1993     if ( ptt->trkseqno != -1 ){
1994     //
1995     t_orb->trkseqno = ptt->trkseqno;
1996     //
1997     t_orb->Eij = 0;
1998     //
1999     t_orb->Sij = 0;
2000     //
2001     t_orb->pitch = -1000.;
2002     //
2003 pam-mep 1.69 t_orb->sunangle = -1000.;
2004     //
2005     t_orb->sunmagangle = -1000;
2006     //
2007 mocchiut 1.35 t_orb->cutoff = -1000.;
2008     //
2009     new(tor[nn]) OrbitalInfoTrkVar(*t_orb);
2010     nn++;
2011     //
2012     t_orb->Clear();
2013     //
2014 mocchiut 1.73 }
2015 mocchiut 1.35 //
2016 mocchiut 1.73 }
2017     //
2018     // Code for extended tracking algorithm:
2019     //
2020     if ( hasNucleiTrk ){
2021     Int_t ttentry = 0;
2022     if ( verbose ) printf(" hasNucleiTrk \n");
2023     for(Int_t nt=0; nt < tcNucleiTof->GetEntries() ; nt++){
2024     //
2025     ToFTrkVar *ptt = (ToFTrkVar*)(tcNucleiTof->At(nt));
2026     if ( ptt->trkseqno != -1 ){
2027     //
2028     t_orb->trkseqno = ptt->trkseqno;
2029     //
2030     t_orb->Eij = 0;
2031     //
2032     t_orb->Sij = 0;
2033     //
2034     t_orb->pitch = -1000.;
2035     //
2036     t_orb->sunangle = -1000.;
2037     //
2038     t_orb->sunmagangle = -1000;
2039     //
2040     t_orb->cutoff = -1000.;
2041     //
2042     TClonesArray &tz1 = *torbNucleiTrk;
2043     new(tz1[ttentry]) OrbitalInfoTrkVar(*t_orb);
2044     ttentry++;
2045     //
2046     t_orb->Clear();
2047     //
2048     }
2049     //
2050     }
2051     }
2052     if ( hasExtNucleiTrk ){
2053     Int_t ttentry = 0;
2054     if ( verbose ) printf(" hasExtNucleiTrk \n");
2055     for(Int_t nt=0; nt < tcExtNucleiTof->GetEntries() ; nt++){
2056     //
2057     if ( verbose ) printf(" got2\n");
2058     ToFTrkVar *ptt = (ToFTrkVar*)(tcExtNucleiTof->At(nt));
2059     if ( ptt->trkseqno != -1 ){
2060     //
2061     t_orb->trkseqno = ptt->trkseqno;
2062     //
2063     t_orb->Eij = 0;
2064     //
2065     t_orb->Sij = 0;
2066     //
2067     t_orb->pitch = -1000.;
2068     //
2069     t_orb->sunangle = -1000.;
2070     //
2071     t_orb->sunmagangle = -1000;
2072     //
2073     t_orb->cutoff = -1000.;
2074     //
2075     TClonesArray &tz2 = *torbExtNucleiTrk;
2076     new(tz2[ttentry]) OrbitalInfoTrkVar(*t_orb);
2077     ttentry++;
2078     //
2079     t_orb->Clear();
2080     //
2081     }
2082     //
2083     }
2084     }
2085     if ( hasExtTrk ){
2086     Int_t ttentry = 0;
2087     if ( verbose ) printf(" hasExtTrk \n");
2088     for(Int_t nt=0; nt < tcExtTof->GetEntries() ; nt++){
2089     //
2090     if ( verbose ) printf(" got3\n");
2091     ToFTrkVar *ptt = (ToFTrkVar*)(tcExtTof->At(nt));
2092     if ( ptt->trkseqno != -1 ){
2093     //
2094     t_orb->trkseqno = ptt->trkseqno;
2095     //
2096     t_orb->Eij = 0;
2097     //
2098     t_orb->Sij = 0;
2099     //
2100     t_orb->pitch = -1000.;
2101     //
2102     t_orb->sunangle = -1000.;
2103     //
2104     t_orb->sunmagangle = -1000;
2105     //
2106     t_orb->cutoff = -1000.;
2107     //
2108     TClonesArray &tz3 = *torbExtNucleiTrk;
2109     new(tz3[ttentry]) OrbitalInfoTrkVar(*t_orb);
2110     ttentry++;
2111     //
2112     t_orb->Clear();
2113     //
2114     }
2115     //
2116     }
2117     }
2118     }
2119     } // if( orbitalinfo->TimeGap>0){
2120 mocchiut 1.30 //
2121 mocchiut 1.15 // Fill the class
2122 pamelaprod 1.11 //
2123 mocchiut 1.1 OrbitalInfotr->Fill();
2124 mocchiut 1.15 //
2125 mocchiut 1.30 delete t_orb;
2126     //
2127 mocchiut 1.15 }; // loop over the events in the run
2128 mocchiut 1.1 //
2129     // Here you may want to clear some variables before processing another run
2130     //
2131 mocchiut 1.44
2132 mocchiut 1.57 if ( verbose ) printf(" Clear before new run \n");
2133 mocchiut 1.5 delete dbtime;
2134 mocchiut 1.57
2135 mocchiut 1.62 if ( mcmdrc ) mcmdrc->Clear();
2136 mocchiut 1.57 mcmdrc = 0;
2137    
2138     if ( verbose ) printf(" Clear before new run1 \n");
2139     if ( L_QQ_Q_l_lower ) delete L_QQ_Q_l_lower;
2140     if ( verbose ) printf(" Clear before new run2 \n");
2141 mocchiut 1.18 if ( L_QQ_Q_l_upper ) delete L_QQ_Q_l_upper;
2142 mocchiut 1.57 if ( verbose ) printf(" Clear before new run3 \n");
2143 mocchiut 1.18 if ( RYPang_upper ) delete RYPang_upper;
2144 mocchiut 1.57 if ( verbose ) printf(" Clear before new run4 \n");
2145 mocchiut 1.18 if ( RYPang_lower ) delete RYPang_lower;
2146 mocchiut 1.57
2147     if ( l0tr ) l0tr->Delete();
2148    
2149     if ( verbose ) printf(" End run \n");
2150    
2151 mocchiut 1.1 }; // process all the runs
2152 mocchiut 1.15
2153 mocchiut 1.1 if (verbose) printf("\n Finished processing data \n");
2154     //
2155     closeandexit:
2156     //
2157     // 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.
2158     //
2159     if ( !reprocall && reproc && code >= 0 ){
2160     if ( totfileentries > noaftrun ){
2161     if (verbose){
2162     printf("\n Post-processing: copying events from the old tree after the processed run\n");
2163     printf(" Copying %i events in the file which are after the end of the run %i \n",(int)(totfileentries-noaftrun),(int)run);
2164     printf(" Start copying at event number %i end copying at event number %i \n",(int)noaftrun,(int)totfileentries);
2165     }
2166     for (UInt_t j = noaftrun; j < totfileentries; j++ ){
2167     //
2168     // Get entry from old tree
2169     //
2170 mocchiut 1.43 if ( OrbitalInfotrclone->GetEntry(j) <= 0 ) throw -36;
2171 mocchiut 1.1 //
2172     // copy orbitalinfoclone to OrbitalInfo
2173     //
2174 mocchiut 1.76 // orbitalinfo->Clear();
2175 mocchiut 1.5 //
2176 mocchiut 1.1 memcpy(&orbitalinfo,&orbitalinfoclone,sizeof(orbitalinfoclone));
2177     //
2178     // Fill entry in the new tree
2179     //
2180     OrbitalInfotr->Fill();
2181     };
2182     if (verbose) printf(" Finished successful copying!\n");
2183     };
2184 mocchiut 1.57 //if ( OrbitalInfotrclone ) OrbitalInfotrclone->Clear();
2185     //if ( OrbitalInfotrclone ) OrbitalInfotrclone->Delete();
2186 mocchiut 1.1 };
2187     //
2188     // Close files, delete old tree(s), write and close level2 file
2189     //
2190 pam-mep 1.69
2191 mocchiut 1.1 if ( l0File ) l0File->Close();
2192 mocchiut 1.23 if ( myfold ) gSystem->Unlink(tempname.str().c_str());
2193 mocchiut 1.5 //
2194 mocchiut 1.1 if ( OrbitalInfotr ) OrbitalInfotr->SetName("OrbitalInfo");
2195 mocchiut 1.30 //
2196 mocchiut 1.1 if ( file ){
2197     file->cd();
2198 mocchiut 1.63 if ( OrbitalInfotr ) OrbitalInfotr->Write("OrbitalInfo", TObject::kOverwrite); // 10 RED bug fixed
2199 mocchiut 1.1 };
2200     //
2201 mocchiut 1.57 if (verbose) printf("\n Exiting...\n");
2202    
2203 mocchiut 1.23 if ( myfold ) gSystem->Unlink(OrbitalInfofolder.str().c_str());
2204 mocchiut 1.1 //
2205     // the end
2206     //
2207 mocchiut 1.25 if ( dbc ){
2208     dbc->Close();
2209     delete dbc;
2210     };
2211 mocchiut 1.57 //
2212 mocchiut 1.1 if (verbose) printf("\n Exiting...\n");
2213 mocchiut 1.57 if ( tempfile ) tempfile->Close();
2214    
2215 mocchiut 1.30 if ( PO ) delete PO;
2216 mocchiut 1.57 if ( gltle ) delete gltle;
2217     if ( glparam ) delete glparam;
2218     if ( glparam2 ) delete glparam2;
2219     if ( glparam3 ) delete glparam3;
2220     if (verbose) printf("\n Exiting3...\n");
2221 mocchiut 1.4 if ( glroot ) delete glroot;
2222 mocchiut 1.57 if (verbose) printf("\n Exiting4...\n");
2223     if ( runinfo ) runinfo->Close();
2224 mocchiut 1.4 if ( runinfo ) delete runinfo;
2225 mocchiut 1.58
2226 mocchiut 1.73 if ( tcNucleiTrk ){
2227     tcNucleiTrk->Delete();
2228     delete tcNucleiTrk;
2229     tcNucleiTrk = NULL;
2230     }
2231     if ( tcExtNucleiTrk ){
2232     tcExtNucleiTrk->Delete();
2233     delete tcExtNucleiTrk;
2234     tcExtNucleiTrk = NULL;
2235     }
2236     if ( tcExtTrk ){
2237     tcExtTrk->Delete();
2238     delete tcExtTrk;
2239     tcExtTrk = NULL;
2240     }
2241    
2242     if ( tcNucleiTof ){
2243     tcNucleiTof->Delete();
2244     delete tcNucleiTof;
2245     tcNucleiTof = NULL;
2246     }
2247     if ( tcExtNucleiTof ){
2248     tcExtNucleiTof->Delete();
2249     delete tcExtNucleiTof;
2250     tcExtNucleiTof = NULL;
2251     }
2252     if ( tcExtTof ){
2253     tcExtTof->Delete();
2254     delete tcExtTof;
2255     tcExtTrk = NULL;
2256     }
2257    
2258    
2259 pam-mep 1.69 if ( tof ) delete tof;
2260     if ( trke ) delete trke;
2261    
2262 mocchiut 1.58 if ( debug ){
2263 mocchiut 1.57 cout << "1 0x" << OrbitalInfotr << endl;
2264     cout << "2 0x" << OrbitalInfotrclone << endl;
2265     cout << "3 0x" << l0tr << endl;
2266     cout << "4 0x" << tempOrbitalInfo << endl;
2267     cout << "5 0x" << ttof << endl;
2268 mocchiut 1.58 }
2269 mocchiut 1.57 //
2270 mocchiut 1.58 if ( debug ) file->ls();
2271 mocchiut 1.4 //
2272 mocchiut 1.1 if(code < 0) throw code;
2273     return(code);
2274     }
2275    
2276 mocchiut 1.7
2277     //
2278     // Returns the cCoordGeo structure holding the geographical
2279     // coordinates for the event (see sgp4.h).
2280     //
2281     // atime is the abstime of the event in UTC unix time.
2282     // tletime is the time of the tle in UTC unix time.
2283     // tle is the previous and nearest tle (compared to atime).
2284     cCoordGeo getCoo(UInt_t atime, UInt_t tletime, cTle *tle)
2285     {
2286     cEci eci;
2287     cOrbit orbit(*tle);
2288     orbit.getPosition((double) (atime - tletime)/60., &eci);
2289    
2290     return eci.toGeo();
2291     }
2292 mocchiut 1.15
2293     // function of copyng of quatrnions classes
2294    
2295     void CopyQ(Quaternions *Q1, Quaternions *Q2){
2296     for(UInt_t i = 0; i < 6; i++){
2297     Q1->time[i]=Q2->time[i];
2298     for (UInt_t j = 0; j < 4; j++)Q1->quat[i][j]=Q2->quat[i][j];
2299     }
2300     return;
2301     }
2302    
2303     // functions of copyng InclinationInfo classes
2304    
2305     void CopyAng(InclinationInfo *A1, InclinationInfo *A2){
2306     A1->Tangazh = A2->Tangazh;
2307     A1->Ryskanie = A2->Ryskanie;
2308     A1->Kren = A2->Kren;
2309     return;
2310     }
2311    
2312     UInt_t holeq(Double_t lower,Double_t upper,Quaternions *Qlower, Quaternions *Qupper, UInt_t f){
2313    
2314     UInt_t hole = 10;
2315 mocchiut 1.40 Bool_t R10l = false; // Sign of R10 mode in lower quaternions array
2316     Bool_t R10u = false; // Sign of R10 mode in upper quaternions array
2317     Bool_t insm = false; // Sign that we inside quaternions array
2318 mocchiut 1.64 // Bool_t mxtml = false; // Sign of mixt mode in lower quaternions array
2319     // Bool_t mxtmu = false; // Sign of mixt mode in upper quaternions array
2320 mocchiut 1.40 Bool_t npasm = false; // Sign of normall pass between R10 and non R10 or between non R10 and R10
2321 mocchiut 1.15 UInt_t NCQl = 6; // Number of correct quaternions in lower array
2322 mocchiut 1.64 // UInt_t NCQu = 6; // Number of correct quaternions in upper array
2323 mocchiut 1.15 if (f>0){
2324     insm = true;
2325     if(Qupper->time[f]-Qupper->time[f-1]==30) R10u = false;
2326     if(Qupper->time[f]-Qupper->time[f-1]<1) R10u = true;
2327     }else{
2328     insm = false;
2329     if((Qlower->time[5]-Qlower->time[0]<2)&&(Qlower->time[1]-Qlower->time[0]<2)) R10l = true;
2330     if((Qupper->time[5]-Qupper->time[0]<2)&&(Qupper->time[1]-Qupper->time[0]<2)) R10u = true;
2331     if((Qlower->time[5]-Qlower->time[0]==150)&&(Qlower->time[1]-Qlower->time[0]==30)) R10l = false;
2332     if((Qupper->time[5]-Qupper->time[0]==150)&&(Qupper->time[1]-Qupper->time[0]==30)) R10u = false;
2333     if((Qlower->time[5]-Qlower->time[0]<2)&&(Qlower->time[1]-Qlower->time[0]==30)){
2334 mocchiut 1.64 // mxtml = true;
2335 mocchiut 1.15 for(UInt_t i = 1; i < 6; i++){
2336     if(Qlower->time[i]-Qlower->time[0]==30*i) NCQl=i;
2337     }
2338     }
2339 mocchiut 1.64 // if((Qupper->time[5]-Qupper->time[0]<2)&&(Qupper->time[1]-Qupper->time[0]==30)){
2340     // mxtmu = true;
2341     // for(UInt_t i = 1; i < 6; i++){
2342     // if(Qupper->time[i]-Qupper->time[0]==30*i) NCQu=i;
2343     // }
2344     // }
2345 mocchiut 1.15 }
2346    
2347     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;
2348    
2349    
2350     if (R10u&&insm) hole=0; // best event R10
2351     if ((upper-lower<=5)&&(!insm)&&R10l&&R10u) hole = 1; // when first of 6 quaternions in array is correct
2352     if (((!R10u)&&insm)||((!insm)&&(!R10u)&&(!R10l)&&((upper-lower==210+(6-NCQl)*30)||(upper-lower==30)))) hole = 2; //non R10
2353     if (npasm&&(!insm)&&((R10l&&!R10u)||(R10u&&!R10l))) hole = 3; //normall pass from R10 to non R10 or from non R10 to R10
2354     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
2355     if ((upper-lower>=300)&&(!insm)&&((R10l&&!R10u)||(R10u&&!R10l))) hole = 5; //uneliminable hole between R10 and non R10 or between non R10 and R10
2356     if ((upper-lower>5)&&(upper-lower<=300)&&R10u&&R10l) hole = 6; // eliminable hole inside R10
2357     if ((upper-lower>300)&&R10u&&R10l) hole = 7; //uneliminable hole inside R10
2358     if ((upper-lower>210)&&(upper-lower<=1200)&&(!R10u)&&(!R10l)) hole = 8; //eliminable hole inside non R10
2359     if ((upper-lower>1200)&&!R10u&&!R10l) hole = 9; // uneliminable hole inside non R10
2360     return hole;
2361     }
2362    
2363 mocchiut 1.44 void inclresize(vector<Double_t>& t,vector<Float_t>& q0,vector<Float_t>& q1,vector<Float_t>& q2,vector<Float_t>& q3,vector<Int_t>& mode,vector<Float_t>& Roll,vector<Float_t>& Pitch,vector<Float_t>& Yaw){
2364     Int_t sizee = t.size()+1;
2365     t.resize(sizee);
2366     q0.resize(sizee);
2367     q1.resize(sizee);
2368     q2.resize(sizee);
2369     q3.resize(sizee);
2370     mode.resize(sizee);
2371     Roll.resize(sizee);
2372     Pitch.resize(sizee);
2373     Yaw.resize(sizee);
2374     }
2375    
2376 pam-mep 1.69 // geomagnetic calculation staff
2377    
2378     //void GM_ScanIGRF(TString PATH, GMtype_Data *G0, GMtype_Data *G1, GMtype_Data *H1)
2379     void GM_ScanIGRF(TSQLServer *dbc, GMtype_Data *G0, GMtype_Data *G1, GMtype_Data *H1)
2380     {
2381     GL_PARAM *glp = new GL_PARAM();
2382     Int_t parerror=glp->Query_GL_PARAM(1,304,dbc); // parameters stored in DB in GL_PRAM table
2383     if ( parerror<0 ) {
2384     throw -902;
2385     }
2386     /*This function scans inputs G0, G1, and H1 of the IGRF table into 3 data arrays*/
2387     // TString SATH="/data03/Malakhov/pam9Malakhov/installed10/calib/orb-param/";
2388     int i;
2389     double temp;
2390     char buffer[200];
2391     FILE *IGRF;
2392     IGRF = fopen((glp->PATH+glp->NAME).Data(), "r");
2393     // IGRF = fopen(PATH+"IGRF.tab", "r");
2394     G0->size = 25;
2395     G1->size = 25;
2396     H1->size = 25;
2397     for( i = 0; i < 4; i++)
2398     {
2399     fgets(buffer, 200, IGRF);
2400 mocchiut 1.44 }
2401 pam-mep 1.69 fscanf(IGRF, "g 1 0 %lf ", &G0->element[0]);
2402     for(i = 1; i <= 22; i++)
2403     {
2404     fscanf(IGRF ,"%lf ", &G0->element[i]);
2405 mocchiut 1.44 }
2406 pam-mep 1.69 fscanf(IGRF ,"%lf\n", &temp);
2407     G0->element[23] = temp * 5 + G0->element[22];
2408     G0->element[24] = G0->element[23] + 5 * temp;
2409     fscanf(IGRF, "g 1 1 %lf ", &G1->element[0]);
2410     for(i = 1; i <= 22; i++)
2411     {
2412     fscanf( IGRF, "%lf ", &G1->element[i]);
2413 mocchiut 1.44 }
2414 pam-mep 1.69 fscanf(IGRF, "%lf\n", &temp);
2415     G1->element[23] = temp * 5 + G1->element[22];
2416     G1->element[24] = temp * 5 + G1->element[23];
2417     fscanf(IGRF, "h 1 1 %lf ", &H1->element[0]);
2418     for(i = 1; i <= 22; i++)
2419     {
2420     fscanf( IGRF, "%lf ", &H1->element[i]);
2421 mocchiut 1.44 }
2422 pam-mep 1.69 fscanf(IGRF, "%lf\n", &temp);
2423     H1->element[23] = temp * 5 + H1->element[22];
2424     H1->element[24] = temp * 5 + H1->element[23];
2425     if ( glp ) delete glp;
2426     } /*GM_ScanIGRF*/
2427    
2428     void GM_SetEllipsoid(GMtype_Ellipsoid *Ellip)
2429     {
2430     /*This function sets the WGS84 reference ellipsoid to its default values*/
2431     Ellip->a = 6378.137; /*semi-major axis of the ellipsoid in */
2432     Ellip->b = 6356.7523142;/*semi-minor axis of the ellipsoid in */
2433     Ellip->fla = 1/298.257223563;/* flattening */
2434     Ellip->eps = sqrt(1- ( Ellip->b * Ellip->b) / (Ellip->a * Ellip->a )); /*first eccentricity */
2435     Ellip->epssq = (Ellip->eps * Ellip->eps); /*first eccentricity squared */
2436     Ellip->re = 6371.2;/* Earth's radius */
2437     } /*GM_SetEllipsoid*/
2438    
2439    
2440     void GM_EarthCartToDipoleCartCD(GMtype_Pole Pole, GMtype_CoordCartesian EarthCoord, GMtype_CoordCartesian *DipoleCoords)
2441     {
2442     /*This function converts from Earth centered cartesian coordinates to dipole centered cartesian coordinates*/
2443     double X, Y, Z, CosPhi, SinPhi, CosLambda, SinLambda;
2444     CosPhi = cos(TMath::DegToRad()*Pole.phi);
2445     SinPhi = sin(TMath::DegToRad()*Pole.phi);
2446     CosLambda = cos(TMath::DegToRad()*Pole.lambda);
2447     SinLambda = sin(TMath::DegToRad()*Pole.lambda);
2448     X = EarthCoord.x;
2449     Y = EarthCoord.y;
2450     Z = EarthCoord.z;
2451    
2452     /*These equations are taken from a document by Wallace H. Campbell*/
2453     DipoleCoords->x = X * CosPhi * CosLambda + Y * CosPhi * SinLambda - Z * SinPhi;
2454     DipoleCoords->y = -X * SinLambda + Y * CosLambda;
2455     DipoleCoords->z = X * SinPhi * CosLambda + Y * SinPhi * SinLambda + Z * CosPhi;
2456     } /*GM_EarthCartToDipoleCartCD*/
2457    
2458     void GM_GeodeticToSpherical(GMtype_Ellipsoid Ellip, GMtype_CoordGeodetic CoordGeodetic, GMtype_CoordSpherical *CoordSpherical)
2459     {
2460     double CosLat, SinLat, rc, xp, zp; /*all local variables */
2461     /*
2462     ** Convert geodetic coordinates, (defined by the WGS-84
2463     ** reference ellipsoid), to Earth Centered Earth Fixed Cartesian
2464     ** coordinates, and then to spherical coordinates.
2465     */
2466    
2467     CosLat = cos(TMath::DegToRad()*CoordGeodetic.phi);
2468     SinLat = sin(TMath::DegToRad()*CoordGeodetic.phi);
2469    
2470     /* compute the local radius of curvature on the WGS-84 reference ellipsoid */
2471    
2472     rc = Ellip.a / sqrt(1.0 - Ellip.epssq * SinLat * SinLat);
2473    
2474     /* compute ECEF Cartesian coordinates of specified point (for longitude=0) */
2475    
2476     xp = (rc + CoordGeodetic.HeightAboveEllipsoid) * CosLat;
2477     zp = (rc*(1.0 - Ellip.epssq) + CoordGeodetic.HeightAboveEllipsoid) * SinLat;
2478    
2479     /* compute spherical radius and angle lambda and phi of specified point */
2480    
2481     CoordSpherical->r = sqrt(xp * xp + zp * zp);
2482     CoordSpherical->phig = TMath::RadToDeg()*asin(zp / CoordSpherical->r); /* geocentric latitude */
2483     CoordSpherical->lambda = CoordGeodetic.lambda; /* longitude */
2484     } /*GM_GeodeticToSpherical*/
2485    
2486     void GM_PoleLocation(GMtype_Model Model, GMtype_Pole *Pole)
2487     {
2488     /*This function finds the location of the north magnetic pole in spherical coordinates. The equations are
2489     **from Wallace H. Campbell's Introduction to Geomagnetic Fields*/
2490    
2491     Pole->phi = TMath::RadToDeg()*-atan(sqrt(Model.h1 * Model.h1 + Model.g1 * Model.g1)/Model.g0);
2492     Pole->lambda = TMath::RadToDeg()*atan(Model.h1/Model.g1);
2493     } /*GM_PoleLocation*/
2494    
2495     void GM_SphericalToCartesian(GMtype_CoordSpherical CoordSpherical, GMtype_CoordCartesian *CoordCartesian)
2496     {
2497     /*This function converts spherical coordinates into Cartesian coordinates*/
2498     double CosPhi = cos(TMath::DegToRad()*CoordSpherical.phig);
2499     double SinPhi = sin(TMath::DegToRad()*CoordSpherical.phig);
2500     double CosLambda = cos(TMath::DegToRad()*CoordSpherical.lambda);
2501     double SinLambda = sin(TMath::DegToRad()*CoordSpherical.lambda);
2502    
2503     CoordCartesian->x = CoordSpherical.r * CosPhi * CosLambda;
2504     CoordCartesian->y = CoordSpherical.r * CosPhi * SinLambda;
2505     CoordCartesian->z = CoordSpherical.r * SinPhi;
2506     } /*GM_SphericalToCartesian*/
2507    
2508     void GM_TimeAdjustCoefs(Float_t year, Float_t jyear, GMtype_Data g0d, GMtype_Data g1d, GMtype_Data h1d, GMtype_Model *Model)
2509     {
2510     /*This function calls GM_LinearInterpolation for the coefficients to estimate the value of the
2511     **coefficient for the given date*/
2512     int index;
2513     double x;
2514     index = (year - GM_STARTYEAR) / 5;
2515     x = (jyear - GM_STARTYEAR) / 5;
2516     Model->g0 = GM_LinearInterpolation(index, index+1, g0d.element[index], g0d.element[index+1], x);
2517     Model->g1 = GM_LinearInterpolation(index, index+1, g1d.element[index], g1d.element[index+1], x);
2518     Model->h1 = GM_LinearInterpolation(index, index+1, h1d.element[index], h1d.element[index+1], x);
2519     } /*GM_TimeAdjustCoefs*/
2520    
2521     double GM_LinearInterpolation(double x1, double x2, double y1, double y2, double x)
2522     {
2523     /*This function takes a linear interpolation between two given points for x*/
2524     double weight, y;
2525     weight = (x - x1) / (x2 - x1);
2526     y = y1 * (1 - weight) + y2 * weight;
2527     return y;
2528     }/*GM_LinearInterpolation*/
2529 mocchiut 1.44
2530 pam-mep 1.69 void GM_CartesianToSpherical(GMtype_CoordCartesian CoordCartesian, GMtype_CoordSpherical *CoordSpherical)
2531     {
2532     /*This function converts a point from Cartesian coordinates into spherical coordinates*/
2533     double X, Y, Z;
2534    
2535     X = CoordCartesian.x;
2536     Y = CoordCartesian.y;
2537     Z = CoordCartesian.z;
2538    
2539     CoordSpherical->r = sqrt(X * X + Y * Y + Z * Z);
2540     CoordSpherical->phig = TMath::RadToDeg()*asin(Z / (CoordSpherical->r));
2541     CoordSpherical->lambda = TMath::RadToDeg()*atan2(Y, X);
2542     } /*GM_CartesianToSpherical*/

  ViewVC Help
Powered by ViewVC 1.1.23