/[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.75 - (hide annotations) (download)
Mon Jul 28 15:42:07 2014 UTC (10 years, 7 months ago) by mocchiut
Branch: MAIN
Changes since 1.74: +3 -3 lines
Tracker-new bug + OrbitalInfo warnings fixed

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

  ViewVC Help
Powered by ViewVC 1.1.23