/[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.77 - (hide annotations) (download)
Tue Sep 16 19:47:34 2014 UTC (10 years, 5 months ago) by mocchiutti
Branch: MAIN
Changes since 1.76: +6 -0 lines
10RED bug fixed: crash when reprocessing without one of the extended tracks

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

  ViewVC Help
Powered by ViewVC 1.1.23