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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.84

  ViewVC Help
Powered by ViewVC 1.1.23