/[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.60 by pam-mep, Thu Jun 7 14:04:00 2012 UTC revision 1.77 by mocchiutti, Tue Sep 16 19:47:34 2014 UTC
# Line 48  Line 48 
48  #include <OrbitalInfoCore.h>  #include <OrbitalInfoCore.h>
49  #include <InclinationInfo.h>  #include <InclinationInfo.h>
50    
51    //
52    // Tracker and ToF classes headers and definitions
53    //
54    #include <ToFLevel2.h>
55    #include <TrkLevel2.h>
56    #include <ExtTrack.h> // new tracking code
57    
58  using namespace std;  using namespace std;
59    
# Line 122  int OrbitalInfoCore(UInt_t run, TFile *f Line 128  int OrbitalInfoCore(UInt_t run, TFile *f
128    TTree *OrbitalInfotrclone = 0;    TTree *OrbitalInfotrclone = 0;
129    Bool_t reproc = false;    Bool_t reproc = false;
130    Bool_t reprocall = false;    Bool_t reprocall = false;
131      Bool_t igrfloaded = false;
132    UInt_t nobefrun = 0;    UInt_t nobefrun = 0;
133    UInt_t noaftrun = 0;    UInt_t noaftrun = 0;
134    UInt_t numbofrun = 0;    UInt_t numbofrun = 0;
# Line 182  int OrbitalInfoCore(UInt_t run, TFile *f Line 189  int OrbitalInfoCore(UInt_t run, TFile *f
189    //    //
190    // IGRF stuff    // IGRF stuff
191    //    //
192    Float_t dimo = 0.0; // dipole moment (computed from dat files)    Double_t dimo = 0.0; // dipole moment (computed from dat files) // EM GCC 4.7
193    Float_t bnorth, beast, bdown, babs;    Float_t bnorth, beast, bdown, babs;
194    Float_t xl; // L value    Float_t xl; // L value
195    Float_t icode; // code value for L accuracy (see fortran code)    Float_t icode; // code value for L accuracy (see fortran code)
# Line 238  int OrbitalInfoCore(UInt_t run, TFile *f Line 245  int OrbitalInfoCore(UInt_t run, TFile *f
245    Int_t ltp3 = 0;    Int_t ltp3 = 0;
246    //  Int_t uno = 1;    //  Int_t uno = 1;
247    //  const char *niente = " ";    //  const char *niente = " ";
248      GL_PARAM *glparam0 = new GL_PARAM();
249    GL_PARAM *glparam = new GL_PARAM();    GL_PARAM *glparam = new GL_PARAM();
250    GL_PARAM *glparam2 = new GL_PARAM();    GL_PARAM *glparam2 = new GL_PARAM();
251    GL_PARAM *glparam3 = new GL_PARAM();    GL_PARAM *glparam3 = new GL_PARAM();
# Line 245  int OrbitalInfoCore(UInt_t run, TFile *f Line 253  int OrbitalInfoCore(UInt_t run, TFile *f
253    //    //
254    // Orientation variables. Vitaly    // Orientation variables. Vitaly
255    //    //
256    
257    UInt_t evfrom = 0;    UInt_t evfrom = 0;
258    UInt_t jumped = 0;    UInt_t jumped = 0;
259    Int_t itr = -1;        Int_t itr = -1;    
260    Double_t A1;    //  Double_t A1;
261    Double_t A2;    //  Double_t A2;
262    Double_t A3;    //  Double_t A3;
263    Double_t Px = 0;    Double_t Px = 0;
264    Double_t Py = 0;          Double_t Py = 0;      
265    Double_t Pz = 0;      Double_t Pz = 0;  
266    TTree *ttof = 0;    TTree *ttof = 0;
267    ToFLevel2 *tof = new ToFLevel2();    ToFLevel2 *tof = new ToFLevel2();
268      TTree *ttrke = 0;
269      TrkLevel2 *trke = new TrkLevel2();
270    OrientationInfo *PO = new OrientationInfo();    OrientationInfo *PO = new OrientationInfo();
271    Int_t nz = 6;    Int_t nz = 6;
272    Float_t zin[6];    Float_t zin[6];
273    Int_t nevtofl2 = 0;    Int_t nevtofl2 = 0;
274      Int_t nevtrkl2 = 0;
275    if ( verbose ) cout<<"Reading quaternions external file"<<endl;    if ( verbose ) cout<<"Reading quaternions external file"<<endl;
276    cout.setf(ios::fixed,ios::floatfield);      cout.setf(ios::fixed,ios::floatfield);  
277    /******Reading recovered quaternions...*********/    /******Reading recovered quaternions...*********/
# Line 269  int OrbitalInfoCore(UInt_t run, TFile *f Line 281  int OrbitalInfoCore(UInt_t run, TFile *f
281    vector<Float_t> recq2;    vector<Float_t> recq2;
282    vector<Float_t> recq3;    vector<Float_t> recq3;
283    Float_t Norm = 1;    Float_t Norm = 1;
284    Int_t parerror=glparam->Query_GL_PARAM(1,303,dbc); // parameters stored in DB in GL_PRAM table    
285    ifstream in((glparam->PATH+glparam->NAME).Data(),ios::in);    vector<UInt_t> RTtime1;
286      vector<UInt_t> RTtime2;
287      vector<Double_t> RTbank1;
288      vector<Double_t> RTbank2;
289      vector<Double_t> RTbpluto1;
290      vector<Double_t> RTbpluto2;
291      vector<Int_t> RTazim;
292      vector<UInt_t> RTstart;
293      vector<UInt_t> RTpluto2;
294      vector<UInt_t> RTpluto1;
295      vector<Int_t> RTerrq;
296    
297      TClonesArray *tcNucleiTrk = NULL;
298      TClonesArray *tcExtNucleiTrk = NULL;
299      TClonesArray *tcExtTrk = NULL;
300      TClonesArray *tcNucleiTof = NULL;
301      TClonesArray *tcExtNucleiTof = NULL;
302      TClonesArray *tcExtTof = NULL;
303      TClonesArray *torbNucleiTrk = NULL;
304      TClonesArray *torbExtNucleiTrk = NULL;
305      TClonesArray *torbExtTrk = NULL;
306      Bool_t hasNucleiTrk = false;
307      Bool_t hasExtNucleiTrk = false;
308      Bool_t hasExtTrk = false;
309      Bool_t hasNucleiTof = false;
310      Bool_t hasExtNucleiTof = false;
311      Bool_t hasExtTof = false;
312    
313      ifstream in;
314      ifstream an;
315      //  ofstream mc;
316      //  TString gr;
317      Int_t parerror2=0;
318    
319      Int_t parerror=glparam0->Query_GL_PARAM(1,303,dbc); // parameters stored in DB in GL_PRAM table
320      if ( verbose ) cout<<parerror<<"\t"<<(char*)(glparam0->PATH+glparam0->NAME).Data()<<endl;
321    if ( parerror<0 ) {    if ( parerror<0 ) {
322      code = parerror;      code = parerror;
323      goto closeandexit;      goto closeandexit;
324    }    }
325      in.open((char*)(glparam0->PATH+glparam0->NAME).Data(),ios::in);
326    while(!in.eof()){    while(!in.eof()){
327      recqtime.resize(recqtime.size()+1);      recqtime.resize(recqtime.size()+1);
328      Int_t sizee = recqtime.size();      Int_t sizee = recqtime.size();
# Line 289  int OrbitalInfoCore(UInt_t run, TFile *f Line 337  int OrbitalInfoCore(UInt_t run, TFile *f
337      in>>recq3[sizee-1];      in>>recq3[sizee-1];
338      in>>Norm;      in>>Norm;
339    }    }
340      in.close();
341    if ( verbose ) cout<<"We have read recovered data"<<endl;    if ( verbose ) cout<<"We have read recovered data"<<endl;
342      if (debug) cout << "size of recovered quaterions data set is " << recqtime.size() << endl;
343    
344      if ( verbose ) cout<<"read Rotation Table"<<endl;
345      
346      parerror2=glparam0->Query_GL_PARAM(1,305,dbc);
347    
348      if ( verbose ) cout<<parerror2<<"\t"<<(char*)(glparam0->PATH+glparam0->NAME).Data()<<endl;
349      if ( parerror2<0 ) {
350        code = parerror;
351        goto closeandexit;
352      }
353      an.open((char*)(glparam0->PATH+glparam0->NAME).Data(),ios::in);
354      while(!an.eof()){
355        RTtime1.resize(RTtime1.size()+1);
356        Int_t sizee = RTtime1.size();
357        RTbank1.resize(sizee+1);
358        RTazim.resize(sizee+1);
359        RTerrq.resize(sizee+1);
360        RTstart.resize(sizee+1);
361        RTpluto1.resize(sizee+1);
362        RTbpluto1.resize(sizee+1);
363        an>>RTtime1[sizee-1];
364        an>>RTbank1[sizee-1];
365        an>>RTstart[sizee-1];
366        an>>RTpluto1[sizee-1];
367        an>>RTbpluto1[sizee-1];
368        an>>RTazim[sizee-1];
369        an>>RTerrq[sizee-1];
370        if(sizee>1) {
371          RTtime2.resize(sizee+1);
372          RTbank2.resize(sizee+1);
373          RTpluto2.resize(sizee+1);
374          RTbpluto2.resize(sizee+1);
375          RTtime2[sizee-2]=RTtime1[sizee-1];
376          RTpluto2[sizee-2]=RTpluto1[sizee-1];
377          RTbank2[sizee-2]=RTbank1[sizee-1];
378          RTbpluto2[sizee-2]=RTbpluto1[sizee-1];
379        }
380      }
381      an.close();
382      //cout<<"put some number here"<<endl;
383      //Int_t yupi;
384      //cin>>yupi;
385      
386      if ( verbose ) cout<<"We have read Rotation Table"<<endl;
387        //Geomagnetic coordinates calculations staff
388    
389      GMtype_CoordGeodetic location;
390      //  GMtype_CoordDipole GMlocation;
391      GMtype_Ellipsoid Ellip;
392      GMtype_Data G0, G1, H1;
393            
394      //  { // this braces is necessary to avoid jump to label 'closeandexit'  error   // but it is wrong since the variable "igpath" will not exist outside. To overcome the "jump to label 'closeandexit'  error" it is necessary to set the "igpath" before line 276
395      //    TString igpath="/data03/Malakhov/pam9Malakhov/installed10/calib/orb-param/";
396      //  }
397    
398      //  GM_ScanIGRF(glparam->PATH, &G0, &G1, &H1);
399      GM_ScanIGRF(dbc, &G0, &G1, &H1);
400    
401      //cout << G0.element[0] << "\t" << G1.element[0] << "\t" << H1.element[0] << endl;
402      //cout << G0.element[5] << "\t" << G1.element[5] << "\t" << H1.element[5] << endl;
403    
404      GM_SetEllipsoid(&Ellip);
405    
406    // IGRF stuff moved inside run loop!      // IGRF stuff moved inside run loop!  
407    
# Line 299  int OrbitalInfoCore(UInt_t run, TFile *f Line 411  int OrbitalInfoCore(UInt_t run, TFile *f
411    //    //
412    if ( !standalone ){    if ( !standalone ){
413      //      //
414      // Does it contain the Tracker tree?      // Does it contain the Tracker and ToF trees?
415      //      //
416      ttof = (TTree*)file->Get("ToF");      ttof = (TTree*)file->Get("ToF");
417      if ( !ttof ) {      if ( !ttof ) {
418        if ( verbose ) printf(" OrbitalInfo - ERROR: no tof tree\n");        if ( verbose ) printf(" OrbitalInfo - ERROR: no tof tree\n");
419        code = -900;        code = -900;
420        goto closeandexit;        goto closeandexit;
421      };      }
422      ttof->SetBranchAddress("ToFLevel2",&tof);        ttof->SetBranchAddress("ToFLevel2",&tof);  
423      nevtofl2 = ttof->GetEntries();      nevtofl2 = ttof->GetEntries();
424    };  
425        //
426        // Look for extended tracking algorithm
427        //
428        if ( verbose ) printf("Look for extended and nuclei tracking algorithms in ToF\n");
429        // Nuclei tracking algorithm
430        Int_t checkAlgo = 0;
431        tcNucleiTof =  new TClonesArray("ToFTrkVar");
432        checkAlgo = ttof->SetBranchAddress("TrackNuclei",&tcNucleiTof);    
433        if ( !checkAlgo ){
434          if ( verbose ) printf(" Nuclei tracking algorithm ToF branch found! :D \n");
435          hasNucleiTof = true;
436        } else {
437          if ( verbose ) printf(" Nuclei tracking algorithm ToF branch not found :( !\n");
438          printf(" ok, this is not a problem (it depends on tracker settings) \n");
439          delete tcNucleiTof;
440          tcNucleiTof=NULL; // 10RED reprocessing bug  
441        }
442        // Nuclei tracking algorithm using calorimeter points
443        tcExtNucleiTof =  new TClonesArray("ToFTrkVar");
444        checkAlgo = ttof->SetBranchAddress("RecoveredTrackNuclei",&tcExtNucleiTof);    
445        if ( !checkAlgo ){
446          if ( verbose ) printf(" Recovered nuclei tracking algorithm ToF branch found! :D \n");
447          hasExtNucleiTof = true;
448        } else {
449          if ( verbose ) printf(" Recovered nuclei tracking algorithm ToF branch not found :( !\n");
450          printf(" ok, this is not a problem (it depends on tracker settings) \n");
451          delete tcExtNucleiTof;
452          tcExtNucleiTof=NULL; // 10RED reprocessing bug  
453        }
454        // Tracking algorithm using calorimeter points
455        tcExtTof =  new TClonesArray("ToFTrkVar");
456        checkAlgo = ttof->SetBranchAddress("RecoveredTrack",&tcExtTof);
457        if ( !checkAlgo ){
458          if ( verbose ) printf(" Recovered track algorithm ToF branch found! :D \n");
459          hasExtTof = true;
460        } else {
461          if ( verbose ) printf(" Recovered track algorithm ToF branch not found :( !\n");
462          printf(" ok, this is not a problem (it depends on tracker settings) \n");
463          delete tcExtTof;
464          tcExtTof=NULL; // 10RED reprocessing bug  
465        }
466    
467        ttrke = (TTree*)file->Get("Tracker");
468        if ( !ttrke ) {
469          if ( verbose ) printf(" OrbitalInfo - ERROR: no trk tree\n");
470          code = -903;
471          goto closeandexit;
472        }
473        ttrke->SetBranchAddress("TrkLevel2",&trke);  
474        nevtrkl2 = ttrke->GetEntries();
475    
476        //
477        // Look for extended tracking algorithm
478        //
479        if ( verbose ) printf("Look for extended and nuclei tracking algorithms\n");
480        // Nuclei tracking algorithm
481        checkAlgo = 0;
482        tcNucleiTrk =  new TClonesArray("TrkTrack");
483        checkAlgo = ttrke->SetBranchAddress("TrackNuclei",&tcNucleiTrk);    
484        if ( !checkAlgo ){
485          if ( verbose ) printf(" Nuclei tracking algorithm branch found! :D \n");
486          hasNucleiTrk = true;
487        } else {
488          if ( verbose ) printf(" Nuclei tracking algorithm branch not found :( !\n");
489          printf(" ok, this is not a problem (it depends on tracker settings) \n");
490          delete tcNucleiTrk;
491          tcNucleiTrk=NULL; // 10RED reprocessing bug  
492        }
493        // Nuclei tracking algorithm using calorimeter points
494        tcExtNucleiTrk =  new TClonesArray("ExtTrack");
495        checkAlgo = ttrke->SetBranchAddress("RecoveredTrackNuclei",&tcExtNucleiTrk);    
496        if ( !checkAlgo ){
497          if ( verbose ) printf(" Recovered nuclei tracking algorithm branch found! :D \n");
498          hasExtNucleiTrk = true;
499        } else {
500          if ( verbose ) printf(" Recovered nuclei tracking algorithm branch not found :( !\n");
501          printf(" ok, this is not a problem (it depends on tracker settings) \n");
502          delete tcExtNucleiTrk;
503          tcExtNucleiTrk=NULL; // 10RED reprocessing bug  
504        }
505        // Tracking algorithm using calorimeter points
506        tcExtTrk =  new TClonesArray("ExtTrack");
507        checkAlgo = ttrke->SetBranchAddress("RecoveredTrack",&tcExtTrk);
508        if ( !checkAlgo ){
509          if ( verbose ) printf(" Recovered track algorithm branch found! :D \n");
510          hasExtTrk = true;
511        } else {
512          if ( verbose ) printf(" Recovered track algorithm branch not found :( !\n");
513          printf(" ok, this is not a problem (it depends on tracker settings) \n");
514          delete tcExtTrk;
515          tcExtTrk=NULL; // 10RED reprocessing bug  
516        }
517    
518        if ( (hasNucleiTrk && !hasNucleiTof) || (!hasNucleiTrk && hasNucleiTof) ||
519             (hasExtNucleiTrk && !hasExtNucleiTof) || (!hasExtNucleiTrk && hasExtNucleiTof) ||
520             (hasExtTrk && !hasExtTof) || (!hasExtTrk && hasExtTof)
521             ){
522          if ( verbose ) printf(" ERROR: Mismatch between tracker and tof tree branches concerning extended tracking algorithm(s)\n");
523          if ( debug ) printf("hasNucleiTrk %i hasExtNucleiTrk %i hasExtTrk %i \n",hasNucleiTrk,hasExtNucleiTrk,hasExtTrk);
524          if ( debug ) printf("hasNucleiTof %i hasExtNucleiTof %i hasExtTof %i \n",hasNucleiTof,hasExtNucleiTof,hasExtTof);
525          throw -901;
526        }
527    
528      }
529    //    //
530    // Let's start!    // Let's start!
531    //    //
# Line 437  int OrbitalInfoCore(UInt_t run, TFile *f Line 653  int OrbitalInfoCore(UInt_t run, TFile *f
653    orbitalinfo->Set();//ELENA **TEMPORANEO?**    orbitalinfo->Set();//ELENA **TEMPORANEO?**
654    OrbitalInfotr->Branch("OrbitalInfo","OrbitalInfo",&orbitalinfo);    OrbitalInfotr->Branch("OrbitalInfo","OrbitalInfo",&orbitalinfo);
655    //    //
656      // create new branches for new tracking algorithms
657      //
658      if ( hasNucleiTrk ){
659        torbNucleiTrk = new TClonesArray("OrbitalInfoTrkVar",1);
660        OrbitalInfotr->Branch("TrackNuclei",&torbNucleiTrk);
661      }
662      if ( hasExtNucleiTrk ){
663        torbExtNucleiTrk = new TClonesArray("OrbitalInfoTrkVar",1);
664        OrbitalInfotr->Branch("RecoveredTrackNuclei",&torbExtNucleiTrk);
665      }
666      if ( hasExtTrk ){
667        torbExtTrk = new TClonesArray("OrbitalInfoTrkVar",1);
668        OrbitalInfotr->Branch("RecoveredTrack",&torbExtTrk);
669      }
670    
671      //
672    if ( reproc && !reprocall ){    if ( reproc && !reprocall ){
673      //      //
674      //  open new file and retrieve also tree informations      //  open new file and retrieve also tree informations
# Line 458  int OrbitalInfoCore(UInt_t run, TFile *f Line 690  int OrbitalInfoCore(UInt_t run, TFile *f
690          //          //
691          // copy orbitalinfoclone to mydec          // copy orbitalinfoclone to mydec
692          //          //
693          orbitalinfo->Clear();          //      orbitalinfo->Clear();
694          //          //
695          memcpy(&orbitalinfo,&orbitalinfoclone,sizeof(orbitalinfoclone));          memcpy(&orbitalinfo,&orbitalinfoclone,sizeof(orbitalinfoclone));
696          //          //
# Line 590  int OrbitalInfoCore(UInt_t run, TFile *f Line 822  int OrbitalInfoCore(UInt_t run, TFile *f
822      //      //
823      // open IGRF files and do it only once if we are processing a full level2 file      // open IGRF files and do it only once if we are processing a full level2 file
824      //      //
825      if ( irun == 0 ){      if ( !igrfloaded ){
826        if ( l0head->GetEntry(runinfo->EV_FROM) <= 0 ) throw -36;  
827        //        if ( l0head->GetEntry(runinfo->EV_FROM) > 0 ){
828        // absolute time of first event of the run (it should not matter a lot)          igrfloaded = true;
829        //          //
830        ph = eh->GetPscuHeader();          // absolute time of first event of the run (it should not matter a lot)
831        atime = dbtime->DBabsTime(ph->GetOrbitalTime());          //
832                  ph = eh->GetPscuHeader();
833        parerror=glparam->Query_GL_PARAM(atime-anni5,301,dbc); // parameters stored in DB in GL_PRAM table            atime = dbtime->DBabsTime(ph->GetOrbitalTime());
834        if ( parerror<0 ) {          
835          code = parerror;          parerror=glparam->Query_GL_PARAM(atime-anni5,301,dbc); // parameters stored in DB in GL_PRAM table  
836          goto closeandexit;          if ( parerror<0 ) {
837      };            code = parerror;
838        ltp1 = (Int_t)(glparam->PATH+glparam->NAME).Length();            goto closeandexit;
839        if ( verbose ) printf(" Reading Earth's Magnetic Field parameter file: %s \n",(glparam->PATH+glparam->NAME).Data());          }
840        //          ltp1 = (Int_t)(glparam->PATH+glparam->NAME).Length();
841        parerror=glparam2->Query_GL_PARAM(atime,301,dbc); // parameters stored in DB in GL_PRAM table            if ( verbose ) printf(" Reading Earth's Magnetic Field parameter file: %s \n",(glparam->PATH+glparam->NAME).Data());
842        if ( parerror<0 ) {          //
843          code = parerror;          parerror=glparam2->Query_GL_PARAM(atime,301,dbc); // parameters stored in DB in GL_PRAM table  
844          goto closeandexit;          if ( parerror<0 ) {
845        };            code = parerror;
846        ltp2 = (Int_t)(glparam2->PATH+glparam->NAME).Length();            goto closeandexit;
847        if ( verbose ) printf(" Reading Earth's Magnetic Field parameter file: %s \n",(glparam2->PATH+glparam2->NAME).Data());          }
848        //          ltp2 = (Int_t)(glparam2->PATH+glparam2->NAME).Length();
849        parerror=glparam3->Query_GL_PARAM(atime,302,dbc); // parameters stored in DB in GL_PRAM table          if ( verbose ) printf(" Reading Earth's Magnetic Field parameter file: %s \n",(glparam2->PATH+glparam2->NAME).Data());
850        if ( parerror<0 ) {          //
851          code = parerror;          parerror=glparam3->Query_GL_PARAM(atime,302,dbc); // parameters stored in DB in GL_PRAM table
852          goto closeandexit;          if ( parerror<0 ) {
853        };            code = parerror;
854        ltp3 = (Int_t)(glparam3->PATH+glparam2->NAME).Length();            goto closeandexit;
855        if ( verbose ) printf(" Reading Earth's Magnetic Field parameter file: %s \n",(glparam3->PATH+glparam3->NAME).Data());          }
856        //          ltp3 = (Int_t)(glparam3->PATH+glparam3->NAME).Length();
857        initize_((char *)(glparam->PATH+glparam->NAME).Data(),&ltp1,(char *)(glparam2->PATH+glparam2->NAME).Data(),&ltp2,(char *)(glparam3->PATH+glparam3->NAME).Data(),&ltp3);          if ( verbose ) printf(" Reading Earth's Magnetic Field parameter file: %s \n",(glparam3->PATH+glparam3->NAME).Data());
858        //          //
859            initize_((char *)(glparam->PATH+glparam->NAME).Data(),&ltp1,(char *)(glparam2->PATH+glparam2->NAME).Data(),&ltp2,(char *)(glparam3->PATH+glparam3->NAME).Data(),&ltp3);
860            //
861            if (debug) cout<<"initize: "<<(char *)(glparam->PATH+glparam->NAME).Data()<<"\t"<<(char *)(glparam2->PATH+glparam2->NAME).Data()<<"\t"<<(char *)(glparam3->PATH+glparam3->NAME).Data()<<endl;
862          }
863      }      }
864      //      //
865      // End IGRF stuff//      // End IGRF stuff//
866      //      //
867    
     //  
     //     TTree *tp = (TTree*)l0File->Get("RunHeader");  
     //     tp->SetBranchAddress("Header", &eH);  
     //     tp->SetBranchAddress("RunHeader", &reh);  
     //     tp->GetEntry(0);  
     //     ph = eH->GetPscuHeader();  
     //     ULong_t TimeSync = reh->LAST_TIME_SYNC_INFO;  
     //     ULong_t ObtSync = reh->OBT_TIME_SYNC;      
     //     if ( debug ) printf(" 1 TimeSync %lu ObtSync %lu DeltaOBT %lu\n",TimeSync,ObtSync,TimeSync-ObtSync);  
     //  
868      ULong_t TimeSync = (ULong_t)dbtime->GetTimesync();      ULong_t TimeSync = (ULong_t)dbtime->GetTimesync();
869      ULong_t ObtSync = (ULong_t)(dbtime->GetObt0()/1000);      ULong_t ObtSync = (ULong_t)(dbtime->GetObt0()/1000);
870      ULong_t DeltaOBT = TimeSync - ObtSync;      ULong_t DeltaOBT = TimeSync - ObtSync;
# Line 725  int OrbitalInfoCore(UInt_t run, TFile *f Line 951  int OrbitalInfoCore(UInt_t run, TFile *f
951        i++;        i++;
952      };      };
953      //      //
     //    l0trm = (TTree*)l0File->Get("Mcmd");  
     //    ch->ls();  
954      ch->SetBranchAddress("Mcmd",&mcmdev);      ch->SetBranchAddress("Mcmd",&mcmdev);
     //    printf(" entries %llu \n", ch->GetEntries());  
     //    l0trm = ch->GetTree();  
     //    neventsm = l0trm->GetEntries();  
955      neventsm = ch->GetEntries();      neventsm = ch->GetEntries();
956      if ( debug ) printf(" entries %u \n", neventsm);      if ( debug ) printf(" entries %u \n", neventsm);
     //    neventsm = 0;  
957      //      //
958      if (neventsm == 0){      if (neventsm == 0){
959        if ( debug ) printf("InclinationInfo - WARNING: No quaternions in this File");        if ( debug ) printf("InclinationInfo - WARNING: No quaternions in this File");
       //      l0File->Close();  
960        code = 900;        code = 900;
       //      goto closeandexit;  
961      }      }
962      //      //
963            Double_t lowerqtime = 0;    
     //    l0trm->SetBranchAddress("Mcmd", &mcmdev);  
     //    l0trm->SetBranchAddress("Header", &eh);  
     //  
     //  
     //  
   
 //    UInt_t mctren = 0;      
 //    UInt_t mcreen = 0;          
     UInt_t numrec = 0;  
     //  
     Double_t upperqtime = 0;  
     Double_t lowerqtime = 0;  
       
 //    Double_t incli = 0;  
 //    oi = 0;  
 //    UInt_t ooi = 0;  
964      //      //
965      // init quaternions information from mcmd-packets      // init quaternions information from mcmd-packets
966      //      //
967      Bool_t isf = true;      Bool_t isf = true;
 //    Int_t fgh = 0;  
968    
969      vector<Float_t> q0;      vector<Float_t> q0;
970      vector<Float_t> q1;      vector<Float_t> q1;
# Line 776  int OrbitalInfoCore(UInt_t run, TFile *f Line 977  int OrbitalInfoCore(UInt_t run, TFile *f
977      vector<Int_t> qmode;      vector<Int_t> qmode;
978    
979      Int_t nt = 0;      Int_t nt = 0;
       
     //init sine-function interpolation  
       
     //cout<<"Sine coeficient initialisation..."<<endl;  
     vector<Sine> q0sine;  
     vector<Sine> q1sine;  
     vector<Sine> q2sine;  
     vector<Sine> q3sine;  
     vector<Sine> Yawsine;  
   
     /*TH2F* q0testing = new TH2F();  
       TH2F* q1testing = new TH2F();  
       TH2F* q2testing = new TH2F();  
       TH2F* q3testing = new TH2F();  
       TH2F* Pitchtesting = new TH2F();  
     */  
980      UInt_t must = 0;      UInt_t must = 0;
981    
982      //      //
# Line 837  int OrbitalInfoCore(UInt_t run, TFile *f Line 1022  int OrbitalInfoCore(UInt_t run, TFile *f
1022            if ( verbose ) printf(" OrbitalInfo - ERROR: no tof events with entry = %i in Level2 file\n",itr);            if ( verbose ) printf(" OrbitalInfo - ERROR: no tof events with entry = %i in Level2 file\n",itr);
1023            if ( debug ) printf(" nobefrun %u re %u evfrom %u jumped %u reprocall %i \n",nobefrun,re,evfrom,jumped,reprocall);            if ( debug ) printf(" nobefrun %u re %u evfrom %u jumped %u reprocall %i \n",nobefrun,re,evfrom,jumped,reprocall);
1024            l0File->Close();            l0File->Close();
1025            code = -901;            code = -904;
1026            goto closeandexit;            goto closeandexit;
1027          };          };
1028          //          //
1029          tof->Clear();          tof->Clear();
1030          //          //
1031          if ( ttof->GetEntry(itr) <= 0 ) throw -36;          // Clones array must be cleared before going on
1032            //
1033            if ( hasNucleiTof ){
1034              tcNucleiTof->Delete();
1035            }
1036            if ( hasExtNucleiTof ){
1037              tcExtNucleiTof->Delete();
1038            }          
1039            if ( hasExtTof ){
1040              tcExtTof->Delete();
1041            }
1042            //
1043            if ( verbose ) printf(" get tof tree entries... entry = %i in Level2 file\n",itr);
1044            if ( ttof->GetEntry(itr) <= 0 ){
1045              if ( verbose ) printf(" problems with tof tree entries... entry = %i in Level2 file\n",itr);
1046              if ( verbose ) printf(" nobefrun %u re %u evfrom %u jumped %u reprocall %i \n",nobefrun,re,evfrom,jumped,reprocall);
1047              throw -36;
1048            }
1049            if ( verbose ) printf(" gat0\n");
1050          //          //
1051        };        }
1052          //
1053          // retrieve tracker informations
1054          //
1055          if ( !standalone ){
1056            if ( itr > nevtrkl2 ){  
1057              if ( verbose ) printf(" OrbitalInfo - ERROR: no trk events with entry = %i in Level2 file\n",itr);
1058              if ( debug ) printf(" nobefrun %u re %u evfrom %u jumped %u reprocall %i \n",nobefrun,re,evfrom,jumped,reprocall);
1059              l0File->Close();
1060              code = -905;
1061              goto closeandexit;
1062            }
1063            //
1064            if ( verbose ) printf(" gat1\n");
1065            trke->Clear();
1066            //
1067            // Clones array must be cleared before going on
1068            //
1069            if ( hasNucleiTrk ){
1070              if ( verbose ) printf(" gat2\n");
1071              tcNucleiTrk->Delete();
1072              if ( verbose ) printf(" gat3\n");
1073              torbNucleiTrk->Delete();
1074            }
1075            if ( hasExtNucleiTrk ){
1076              if ( verbose ) printf(" gat4\n");
1077              tcExtNucleiTrk->Delete();
1078              if ( verbose ) printf(" gat5\n");
1079              torbExtNucleiTrk->Delete();
1080            }          
1081            if ( hasExtTrk ){
1082              if ( verbose ) printf(" gat6\n");
1083              tcExtTrk->Delete();
1084              if ( verbose ) printf(" gat7\n");
1085              torbExtTrk->Delete();
1086            }
1087            //
1088            if ( verbose ) printf(" get trk tree entries... entry = %i in Level2 file\n",itr);
1089            if ( ttrke->GetEntry(itr) <= 0 ) throw -36;
1090            //
1091          }
1092    
1093        //        //
1094        procev++;        procev++;
1095        //        //
# Line 857  int OrbitalInfoCore(UInt_t run, TFile *f Line 1101  int OrbitalInfoCore(UInt_t run, TFile *f
1101        OrbitalInfoTrkVar *t_orb = new OrbitalInfoTrkVar();        OrbitalInfoTrkVar *t_orb = new OrbitalInfoTrkVar();
1102        if( !(orbitalinfo->OrbitalInfoTrk) ) orbitalinfo->OrbitalInfoTrk = new TClonesArray("OrbitalInfoTrkVar",2);        if( !(orbitalinfo->OrbitalInfoTrk) ) orbitalinfo->OrbitalInfoTrk = new TClonesArray("OrbitalInfoTrkVar",2);
1103        TClonesArray &tor = *orbitalinfo->OrbitalInfoTrk;        TClonesArray &tor = *orbitalinfo->OrbitalInfoTrk;
1104    
1105          // Geomagnetic coordinates calculation variables
1106          GMtype_CoordSpherical CoordSpherical, DipoleSpherical;
1107          GMtype_CoordCartesian CoordCartesian, DipoleCartesian;
1108          GMtype_Model Model;
1109          GMtype_Pole Pole;
1110    
1111        //        //
1112        // Fill OBT, pkt_num and absTime        // Fill OBT, pkt_num and absTime
1113        //              //      
# Line 886  int OrbitalInfoCore(UInt_t run, TFile *f Line 1137  int OrbitalInfoCore(UInt_t run, TFile *f
1137              + (month*31.+ (float) day)/365.              + (month*31.+ (float) day)/365.
1138              + (hour*3600.+min*60.+(float)sec)/(24.*3600.*365.);              + (hour*3600.+min*60.+(float)sec)/(24.*3600.*365.);
1139            //            //
1140            if ( debug ) printf(" %i compute magnetic dipole moment get dipole moment for year\n",procev);                  if ( debug ) printf(" %i compute magnetic dipole moment get dipole moment for year\n",procev);            
1141            if ( debug ) printf(" %i jyear %f dimo %f \n",procev,jyear,dimo);                  if ( debug ) printf(" %i jyear %f dimo %f \n",procev,jyear,dimo);
1142            feldcof_(&jyear, &dimo); // get dipole moment for year            feldcof_(&jyear, &dimo); // get dipole moment for year
1143            if ( debug ) printf(" %i compute magnetic dipole moment end\n",procev);                  if ( debug ) printf(" %i compute magnetic dipole moment end\n",procev);
1144    
1145              GM_TimeAdjustCoefs(year, jyear, G0, G1, H1, &Model);
1146              GM_PoleLocation(Model, &Pole);
1147              
1148          } else {          } else {
1149            code = -56;            code = -56;
1150            goto closeandexit;            goto closeandexit;
# Line 899  int OrbitalInfoCore(UInt_t run, TFile *f Line 1154  int OrbitalInfoCore(UInt_t run, TFile *f
1154        //        //
1155        cOrbit orbits(*gltle->GetTle());        cOrbit orbits(*gltle->GetTle());
1156        //        //
       if ( debug ) printf(" I am Here \n");  
       //  
1157        // synchronize with quaternions data        // synchronize with quaternions data
1158        //        //
1159        if ( isf && neventsm>0 ){        if ( isf && neventsm>0 ){
# Line 908  int OrbitalInfoCore(UInt_t run, TFile *f Line 1161  int OrbitalInfoCore(UInt_t run, TFile *f
1161          // First event          // First event
1162          //          //
1163          isf = false;          isf = false;
1164          upperqtime = atime;          //      upperqtime = atime;
1165          lowerqtime = runinfo->RUNHEADER_TIME;          lowerqtime = runinfo->RUNHEADER_TIME;
1166          for ( ik = 0; ik < neventsm; ik++){  //number of macrocommad packets          for ( ik = 0; ik < neventsm; ik++){  //number of macrocommad packets
1167            if ( ch->GetEntry(ik) <= 0 ) throw -36;            if ( ch->GetEntry(ik) <= 0 ) throw -36;
1168            tmpSize = mcmdev->Records->GetEntries();            tmpSize = mcmdev->Records->GetEntries();
1169            numrec = tmpSize;            //      numrec = tmpSize;
1170              if ( debug ) cout << "packet number " << ik <<"\tnumber of subpackets is " << tmpSize << endl;
1171            for (Int_t j3 = 0;j3<tmpSize;j3++){  //number of subpackets            for (Int_t j3 = 0;j3<tmpSize;j3++){  //number of subpackets
             if ( debug ) printf(" ik %i j3 %i eh eh eh \n",ik,j3);  
1172              mcmdrc = (pamela::McmdRecord*)mcmdev->Records->At(j3);              mcmdrc = (pamela::McmdRecord*)mcmdev->Records->At(j3);
1173              if ( mcmdrc ){ // missing inclination bug [8RED 090116]              if ( mcmdrc ){ // missing inclination bug [8RED 090116]
1174                if ( debug ) printf(" pluto \n");                if ( debug ) printf(" pluto \n");
1175                if ((int)mcmdrc->ID1 == 226 && mcmdrc->Mcmd_Block_crc_ok == 1){ //Check that it is Inclination Packet                if ((int)mcmdrc->ID1 == 226 && mcmdrc->Mcmd_Block_crc_ok == 1){ //Check that it is Inclination Packet
1176                  L_QQ_Q_l_upper->fill(mcmdrc->McmdData);                 L_QQ_Q_l_upper->fill(mcmdrc->McmdData);
1177                  for (UInt_t ui = 0; ui < 6; ui++){                  for (UInt_t ui = 0; ui < 6; ui++){
1178                    if (ui>0){                    if (ui>0){
1179                      if (L_QQ_Q_l_upper->time[ui]>L_QQ_Q_l_upper->time[0]){                      if (L_QQ_Q_l_upper->time[ui]>L_QQ_Q_l_upper->time[0]){
1180                          if ( debug ) printf(" here1 %i \n",ui);                        if ( debug ) printf(" here1 %i \n",ui);
1181                        Double_t u_time = dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[ui]*1000-DeltaOBT*1000));                        Double_t u_time = dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[ui]*1000-DeltaOBT*1000));
1182                        Int_t recSize = recqtime.size();                        Int_t recSize = recqtime.size();
1183                        if(lowerqtime > recqtime[recSize-1]){                        if(lowerqtime > recqtime[recSize-1]){
1184                             // to avoid interpolation between bad quaternions arrays
1185                             if(sqrt(pow(L_QQ_Q_l_upper->quat[ui][0],2)+pow(L_QQ_Q_l_upper->quat[ui][1],2)+pow(L_QQ_Q_l_upper->quat[ui][2],2)+pow(L_QQ_Q_l_upper->quat[ui][3],2))>0.99999){
1186                            Int_t sizeqmcmd = qtime.size();                            Int_t sizeqmcmd = qtime.size();
1187                            inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);                            inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);
1188                            qtime[sizeqmcmd]=u_time;                            qtime[sizeqmcmd]=u_time;
# Line 942  int OrbitalInfoCore(UInt_t run, TFile *f Line 1197  int OrbitalInfoCore(UInt_t run, TFile *f
1197                            qRoll[sizeqmcmd]=RYPang_upper->Kren;                            qRoll[sizeqmcmd]=RYPang_upper->Kren;
1198                            qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;                            qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;
1199                            qPitch[sizeqmcmd]=RYPang_upper->Tangazh;                            qPitch[sizeqmcmd]=RYPang_upper->Tangazh;
1200                             }
1201                        }                        }
1202                        for(Int_t mu = nt;mu<recSize;mu++){                        for(Int_t mu = nt;mu<recSize;mu++){
1203                          if(recqtime[mu]>lowerqtime && recqtime[mu]<u_time){                          if(recqtime[mu]>lowerqtime && recqtime[mu]<u_time){
1204                            nt=mu;                            if(sqrt(pow(recq0[mu],2)+pow(recq1[mu],2)+pow(recq2[mu],2)+pow(recq3[mu],2))>0.99999){
1205                            Int_t sizeqmcmd = qtime.size();                              nt=mu;
1206                            inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);                              Int_t sizeqmcmd = qtime.size();
1207                            qtime[sizeqmcmd]=recqtime[mu];                              inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);
1208                            q0[sizeqmcmd]=recq0[mu];                              qtime[sizeqmcmd]=recqtime[mu];
1209                            q1[sizeqmcmd]=recq1[mu];                              q0[sizeqmcmd]=recq0[mu];
1210                            q2[sizeqmcmd]=recq2[mu];                              q1[sizeqmcmd]=recq1[mu];
1211                            q3[sizeqmcmd]=recq3[mu];                              q2[sizeqmcmd]=recq2[mu];
1212                            qmode[sizeqmcmd]=-10;                              q3[sizeqmcmd]=recq3[mu];
1213                            orbits.getPosition((double) (qtime[sizeqmcmd] - gltle->GetFromTime())/60., &eCi);                              qmode[sizeqmcmd]=-10;
1214                            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]);                              orbits.getPosition((double) (qtime[sizeqmcmd] - gltle->GetFromTime())/60., &eCi);
1215                            qRoll[sizeqmcmd]=RYPang_upper->Kren;                              RYPang_upper->TransAngle(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z,eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z,recq0[mu],recq1[mu],recq2[mu],recq3[mu]);
1216                            qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;                              qRoll[sizeqmcmd]=RYPang_upper->Kren;
1217                            qPitch[sizeqmcmd]=RYPang_upper->Tangazh;                              qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;
1218                                qPitch[sizeqmcmd]=RYPang_upper->Tangazh;
1219                              }
1220                          }                          }
1221                          if(recqtime[mu]>=u_time){                          if(recqtime[mu]>=u_time){
1222                            Int_t sizeqmcmd = qtime.size();                            if(sqrt(pow(L_QQ_Q_l_upper->quat[ui][0],2)+pow(L_QQ_Q_l_upper->quat[ui][1],2)+pow(L_QQ_Q_l_upper->quat[ui][2],2)+pow(L_QQ_Q_l_upper->quat[ui][3],2))>0.99999){
1223                            inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);                              Int_t sizeqmcmd = qtime.size();
1224                            qtime[sizeqmcmd]=u_time;                              inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);
1225                            q0[sizeqmcmd]=L_QQ_Q_l_upper->quat[ui][0];                              qtime[sizeqmcmd]=u_time;
1226                            q1[sizeqmcmd]=L_QQ_Q_l_upper->quat[ui][1];                              q0[sizeqmcmd]=L_QQ_Q_l_upper->quat[ui][0];
1227                            q2[sizeqmcmd]=L_QQ_Q_l_upper->quat[ui][2];                              q1[sizeqmcmd]=L_QQ_Q_l_upper->quat[ui][1];
1228                            q3[sizeqmcmd]=L_QQ_Q_l_upper->quat[ui][3];                              q2[sizeqmcmd]=L_QQ_Q_l_upper->quat[ui][2];
1229                            qmode[sizeqmcmd]=holeq(lowerqtime,qtime[sizeqmcmd],L_QQ_Q_l_lower,L_QQ_Q_l_upper,ui);                              q3[sizeqmcmd]=L_QQ_Q_l_upper->quat[ui][3];
1230                            lowerqtime = u_time;                              qmode[sizeqmcmd]=holeq(lowerqtime,qtime[sizeqmcmd],L_QQ_Q_l_lower,L_QQ_Q_l_upper,ui);
1231                            orbits.getPosition((double) (u_time - gltle->GetFromTime())/60., &eCi);                              lowerqtime = u_time;
1232                            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]);                              orbits.getPosition((double) (u_time - gltle->GetFromTime())/60., &eCi);
1233                            qRoll[sizeqmcmd]=RYPang_upper->Kren;                              RYPang_upper->TransAngle(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z,eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z,L_QQ_Q_l_upper->quat[ui][0],L_QQ_Q_l_upper->quat[ui][1],L_QQ_Q_l_upper->quat[ui][2],L_QQ_Q_l_upper->quat[ui][3]);
1234                            qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;                              qRoll[sizeqmcmd]=RYPang_upper->Kren;
1235                            qPitch[sizeqmcmd]=RYPang_upper->Tangazh;                              qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;
1236                            break;                              qPitch[sizeqmcmd]=RYPang_upper->Tangazh;
1237                                break;
1238                              }
1239                          }                          }
1240                        }                        }
1241                      }                      }
1242                    }else{                    }else{
1243                          if ( debug ) printf(" here2 %i \n",ui);                      if ( debug ) printf(" here2 %i \n",ui);
1244                      Double_t u_time = dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));                      Double_t u_time = dbtime->DBabsTime((UInt_t)(L_QQ_Q_l_upper->time[0]*1000-DeltaOBT*1000));
1245                      if(lowerqtime>u_time)nt=0;                      if(lowerqtime>u_time)nt=0;
1246                      Int_t recSize = recqtime.size();                      Int_t recSize = recqtime.size();
1247                      if(lowerqtime > recqtime[recSize-1]){                      if(lowerqtime > recqtime[recSize-1]){
1248                          if(sqrt(pow(L_QQ_Q_l_upper->quat[ui][0],2)+pow(L_QQ_Q_l_upper->quat[ui][1],2)+pow(L_QQ_Q_l_upper->quat[ui][2],2)+pow(L_QQ_Q_l_upper->quat[ui][3],2))>0.99999){
1249                          Int_t sizeqmcmd = qtime.size();                          Int_t sizeqmcmd = qtime.size();
1250                          inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);                          inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);
1251                          qtime[sizeqmcmd]=u_time;                          qtime[sizeqmcmd]=u_time;
# Line 999  int OrbitalInfoCore(UInt_t run, TFile *f Line 1260  int OrbitalInfoCore(UInt_t run, TFile *f
1260                          qRoll[sizeqmcmd]=RYPang_upper->Kren;                          qRoll[sizeqmcmd]=RYPang_upper->Kren;
1261                          qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;                          qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;
1262                          qPitch[sizeqmcmd]=RYPang_upper->Tangazh;                          qPitch[sizeqmcmd]=RYPang_upper->Tangazh;
1263                          }
1264                      }                      }
1265                      for(Int_t mu = nt;mu<recSize;mu++){                      for(Int_t mu = nt;mu<recSize;mu++){
1266                        if(recqtime[mu]>lowerqtime && recqtime[mu]<u_time){                        if(recqtime[mu]>lowerqtime && recqtime[mu]<u_time){
1267                          nt=mu;                           if(sqrt(pow(recq0[mu],2)+pow(recq1[mu],2)+pow(recq2[mu],2)+pow(recq3[mu],2))>0.99999){
1268                          Int_t sizeqmcmd = qtime.size();                             nt=mu;
1269                          inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);                             Int_t sizeqmcmd = qtime.size();
1270                          qtime[sizeqmcmd]=recqtime[mu];                             inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);
1271                          q0[sizeqmcmd]=recq0[mu];                             qtime[sizeqmcmd]=recqtime[mu];
1272                          q1[sizeqmcmd]=recq1[mu];                             q0[sizeqmcmd]=recq0[mu];
1273                          q2[sizeqmcmd]=recq2[mu];                             q1[sizeqmcmd]=recq1[mu];
1274                          q3[sizeqmcmd]=recq3[mu];                             q2[sizeqmcmd]=recq2[mu];
1275                          qmode[sizeqmcmd]=-10;                             q3[sizeqmcmd]=recq3[mu];
1276                          orbits.getPosition((double) (qtime[sizeqmcmd] - gltle->GetFromTime())/60., &eCi);                             qmode[sizeqmcmd]=-10;
1277                          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]);                             orbits.getPosition((double) (qtime[sizeqmcmd] - gltle->GetFromTime())/60., &eCi);
1278                          qRoll[sizeqmcmd]=RYPang_upper->Kren;                             RYPang_upper->TransAngle(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z,eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z,recq0[mu],recq1[mu],recq2[mu],recq3[mu]);
1279                          qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;                             qRoll[sizeqmcmd]=RYPang_upper->Kren;
1280                          qPitch[sizeqmcmd]=RYPang_upper->Tangazh;                             qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;
1281                               qPitch[sizeqmcmd]=RYPang_upper->Tangazh;
1282                             }
1283                        }                        }
1284                        if(recqtime[mu]>=u_time){                        if(recqtime[mu]>=u_time){
1285                          Int_t sizeqmcmd = qtime.size();                           if(sqrt(pow(L_QQ_Q_l_upper->quat[0][0],2)+pow(L_QQ_Q_l_upper->quat[0][1],2)+pow(L_QQ_Q_l_upper->quat[0][2],2)+pow(L_QQ_Q_l_upper->quat[0][3],2))>0.99999){
1286                          inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);                             Int_t sizeqmcmd = qtime.size();
1287                          qtime[sizeqmcmd]=u_time;                             inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);
1288                          q0[sizeqmcmd]=L_QQ_Q_l_upper->quat[0][0];                             qtime[sizeqmcmd]=u_time;
1289                          q1[sizeqmcmd]=L_QQ_Q_l_upper->quat[0][1];                             q0[sizeqmcmd]=L_QQ_Q_l_upper->quat[0][0];
1290                          q2[sizeqmcmd]=L_QQ_Q_l_upper->quat[0][2];                             q1[sizeqmcmd]=L_QQ_Q_l_upper->quat[0][1];
1291                          q3[sizeqmcmd]=L_QQ_Q_l_upper->quat[0][3];                             q2[sizeqmcmd]=L_QQ_Q_l_upper->quat[0][2];
1292                          qmode[sizeqmcmd]=holeq(lowerqtime,qtime[sizeqmcmd],L_QQ_Q_l_lower,L_QQ_Q_l_upper,ui);                             q3[sizeqmcmd]=L_QQ_Q_l_upper->quat[0][3];
1293                          lowerqtime = u_time;                             qmode[sizeqmcmd]=holeq(lowerqtime,qtime[sizeqmcmd],L_QQ_Q_l_lower,L_QQ_Q_l_upper,ui);
1294                          orbits.getPosition((double) (u_time - gltle->GetFromTime())/60., &eCi);                             lowerqtime = u_time;
1295                          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]);                             orbits.getPosition((double) (u_time - gltle->GetFromTime())/60., &eCi);
1296                          qRoll[sizeqmcmd]=RYPang_upper->Kren;                             RYPang_upper->TransAngle(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z,eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z,L_QQ_Q_l_upper->quat[0][0],L_QQ_Q_l_upper->quat[0][1],L_QQ_Q_l_upper->quat[0][2],L_QQ_Q_l_upper->quat[0][3]);
1297                          qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;                             qRoll[sizeqmcmd]=RYPang_upper->Kren;
1298                          qPitch[sizeqmcmd]=RYPang_upper->Tangazh;                             qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;
1299                          CopyQ(L_QQ_Q_l_lower,L_QQ_Q_l_upper);                             qPitch[sizeqmcmd]=RYPang_upper->Tangazh;
1300                          break;                             CopyQ(L_QQ_Q_l_lower,L_QQ_Q_l_upper);
1301                               break;
1302                             }
1303                        }                        }
1304                      }                      }
1305                    }                    }
1306                  }                  }
1307                }                }
1308              }              }
1309              if ( debug ) printf(" ciccio \n");              //if ( debug ) cout << "subpacket " << j3 << "\t qtime = " << qtime[qtime.size()-1] << endl;
1310            }            }
1311          }          }
1312                    
1313          if(qtime.size()==0){          if(qtime.size()==0){                            // in case if no orientation information in data
1314              for(UInt_t my=0;my<recqtime.size();my++){            if ( debug ) cout << "qtime.size() = 0" << endl;
1315                  Int_t sizeqmcmd = qtime.size();            for(UInt_t my=0;my<recqtime.size();my++){
1316                  inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);              if(sqrt(pow(recq0[my],2)+pow(recq1[my],2)+pow(recq2[my],2)+pow(recq3[my],2))>0.99999){
1317                  qtime[sizeqmcmd]=recqtime[my];                Int_t sizeqmcmd = qtime.size();
1318                  q0[sizeqmcmd]=recq0[my];                inclresize(qtime,q0,q1,q2,q3,qmode,qRoll,qPitch,qYaw);
1319                  q1[sizeqmcmd]=recq1[my];                qtime[sizeqmcmd]=recqtime[my];
1320                  q2[sizeqmcmd]=recq2[my];                q0[sizeqmcmd]=recq0[my];
1321                  q3[sizeqmcmd]=recq3[my];                q1[sizeqmcmd]=recq1[my];
1322                  qmode[sizeqmcmd]=-10;                q2[sizeqmcmd]=recq2[my];
1323                  orbits.getPosition((double) (qtime[sizeqmcmd] - gltle->GetFromTime())/60., &eCi);                q3[sizeqmcmd]=recq3[my];
1324                  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]);                qmode[sizeqmcmd]=-10;
1325                  qRoll[sizeqmcmd]=RYPang_upper->Kren;                orbits.getPosition((double) (qtime[sizeqmcmd] - gltle->GetFromTime())/60., &eCi);
1326                  qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;                RYPang_upper->TransAngle(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z,eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z,recq0[my],recq1[my],recq2[my],recq3[my]);
1327                  qPitch[sizeqmcmd]=RYPang_upper->Tangazh;                qRoll[sizeqmcmd]=RYPang_upper->Kren;
1328              }                qYaw[sizeqmcmd]=RYPang_upper->Ryskanie;
1329                  qPitch[sizeqmcmd]=RYPang_upper->Tangazh;
1330                }
1331              }
1332          }          }
1333                    
         if ( debug ) printf(" fuffi \n");  
1334    
1335          if ( debug ) printf(" puffi \n");          if ( debug ) printf(" puffi \n");
1336          Double_t tmin = 9999999999.;          Double_t tmin = 9999999999.;
# Line 1071  int OrbitalInfoCore(UInt_t run, TFile *f Line 1339  int OrbitalInfoCore(UInt_t run, TFile *f
1339            if(qtime[tre]>tmax)tmax = qtime[tre];            if(qtime[tre]>tmax)tmax = qtime[tre];
1340            if(qtime[tre]<tmin)tmin = qtime[tre];            if(qtime[tre]<tmin)tmin = qtime[tre];
1341          }          }
1342          if ( debug ) printf(" gnfuffi \n");          // sorting quaternions by time
1343           Bool_t t = true;
1344            while(t){
1345             t=false;
1346              for(UInt_t i=0;i<qtime.size()-1;i++){
1347                if(qtime[i]>qtime[i+1]){
1348                  Double_t tmpr = qtime[i];
1349                  qtime[i]=qtime[i+1];
1350                  qtime[i+1] = tmpr;
1351                  tmpr = q0[i];
1352                  q0[i]=q0[i+1];
1353                  q0[i+1] = tmpr;
1354                  tmpr = q1[i];
1355                  q1[i]=q1[i+1];
1356                  q1[i+1] = tmpr;
1357                  tmpr = q2[i];
1358                  q2[i]=q2[i+1];
1359                  q2[i+1] = tmpr;
1360                  tmpr = q3[i];
1361                  q3[i]=q3[i+1];
1362                  q3[i+1] = tmpr;
1363                  tmpr = qRoll[i];
1364                  qRoll[i]=qRoll[i+1];
1365                  qRoll[i+1] = tmpr;
1366                  tmpr = qYaw[i];
1367                  qYaw[i]=qYaw[i+1];
1368                  qYaw[i+1] = tmpr;
1369                  tmpr = qPitch[i];
1370                  qPitch[i]=qPitch[i+1];
1371                  qPitch[i+1] = tmpr;
1372                    t=true;
1373                }
1374              }
1375            }
1376    
1377            if ( debug ){
1378              cout << "we have loaded quaternions: size of quaternions set is "<< qtime.size() << endl;
1379             for(UInt_t i=0;i<qtime.size();i++) cout << qtime[i] << "\t";
1380              cout << endl << endl;
1381              Int_t lopu;
1382              cin >> lopu;
1383           }
1384    
1385        } // if we processed first event        } // if we processed first event
1386    
# Line 1079  int OrbitalInfoCore(UInt_t run, TFile *f Line 1388  int OrbitalInfoCore(UInt_t run, TFile *f
1388        //Filling Inclination information        //Filling Inclination information
1389        Double_t incli = 0;        Double_t incli = 0;
1390        if ( qtime.size() > 1 ){        if ( qtime.size() > 1 ){
1391        for(UInt_t mu = must;mu<qtime.size()-1;mu++){          if ( debug ) cout << "ok quaternions is exist and mu = " << must << endl;
1392          if ( debug ) printf(" ??grfuffi %i sixe %i must %i \n",mu,qtime.size()-1,must);          if ( debug ) cout << "qtimes[ " << qtime[0] << " , " << qtime[qtime.size()-1] << " ]\tatime = "<<atime<<endl;
1393          if(qtime[mu+1]>qtime[mu]){          for(UInt_t mu = must;mu<qtime.size()-1;mu++){
1394            if ( debug ) printf(" grfuffi2 %i \n",mu);            if ( debug ) printf(" ??grfuffi %i sixe %i must %i \n",mu,qtime.size()-1,must);
1395            if(atime<=qtime[mu+1] && atime>=qtime[mu]){            if(qtime[mu+1]>qtime[mu]){
1396              must = mu;              if ( debug ) cout << "qtime[" << mu << "] = " << qtime[mu] << "\tqtime[" << mu+1 << "] = " << qtime[mu+1] << "\tatime = " << atime << endl;
1397              incli = (qPitch[mu+1]-qPitch[mu])/(qtime[mu+1]-qtime[mu]);              if(atime<=qtime[mu+1] && atime>=qtime[mu]){
1398              orbitalinfo->theta =  incli*atime+qPitch[mu+1]-incli*qtime[mu+1];                if ( debug ) cout << "here we have found proper quaternions for interpolation: mu = "<<mu<<endl;
1399              incli = (qRoll[mu+1]-qRoll[mu])/(qtime[mu+1]-qtime[mu]);                must = mu;
1400              orbitalinfo->etha =  incli*atime+qRoll[mu+1]-incli*qtime[mu+1];                incli = (qPitch[mu+1]-qPitch[mu])/(qtime[mu+1]-qtime[mu]);
1401              incli = (qYaw[mu+1]-qYaw[mu])/(qtime[mu+1]-qtime[mu]);                orbitalinfo->theta =  incli*atime+qPitch[mu+1]-incli*qtime[mu+1];
1402              orbitalinfo->phi =  incli*atime+qYaw[mu+1]-incli*qtime[mu+1];                incli = (qRoll[mu+1]-qRoll[mu])/(qtime[mu+1]-qtime[mu]);
1403                              orbitalinfo->etha =  incli*atime+qRoll[mu+1]-incli*qtime[mu+1];
1404              incli = (q0[mu+1]-q0[mu])/(qtime[mu+1]-qtime[mu]);                incli = (qYaw[mu+1]-qYaw[mu])/(qtime[mu+1]-qtime[mu]);
1405              orbitalinfo->q0 =  incli*atime+q0[mu+1]-incli*qtime[mu+1];                orbitalinfo->phi =  incli*atime+qYaw[mu+1]-incli*qtime[mu+1];
1406              incli = (q1[mu+1]-q1[mu])/(qtime[mu+1]-qtime[mu]);                
1407              orbitalinfo->q1 =  incli*atime+q1[mu+1]-incli*qtime[mu+1];                incli = (q0[mu+1]-q0[mu])/(qtime[mu+1]-qtime[mu]);
1408              incli = (q2[mu+1]-q2[mu])/(qtime[mu+1]-qtime[mu]);                orbitalinfo->q0 =  incli*atime+q0[mu+1]-incli*qtime[mu+1];
1409              orbitalinfo->q2 =  incli*atime+q2[mu+1]-incli*qtime[mu+1];                incli = (q1[mu+1]-q1[mu])/(qtime[mu+1]-qtime[mu]);
1410              incli = (q3[mu+1]-q3[mu])/(qtime[mu+1]-qtime[mu]);                orbitalinfo->q1 =  incli*atime+q1[mu+1]-incli*qtime[mu+1];
1411              orbitalinfo->q3 =  incli*atime+q3[mu+1]-incli*qtime[mu+1];                incli = (q2[mu+1]-q2[mu])/(qtime[mu+1]-qtime[mu]);
1412                              orbitalinfo->q2 =  incli*atime+q2[mu+1]-incli*qtime[mu+1];
1413              orbitalinfo->TimeGap = qtime[mu+1]-qtime[mu];                incli = (q3[mu+1]-q3[mu])/(qtime[mu+1]-qtime[mu]);
1414              orbitalinfo->mode = qmode[mu+1];                orbitalinfo->q3 =  incli*atime+q3[mu+1]-incli*qtime[mu+1];
1415              //if(qmode[mu+1]==-10) orbitalinfo->R10r = true;else orbitalinfo->R10r = false;                Float_t tg = (qtime[mu+1]-qtime[mu])/1000.0;
1416              //reserved for next versions Vitaly.                if(tg>=1) tg=0.00;
1417              /*if(qmode[mu+1]==-10 || qmode[mu+1]==0 || qmode[mu+1]==1 || qmode[mu+1]==3 || qmode[mu+1]==4 || qmode[mu+1]==6){                orbitalinfo->TimeGap = TMath::Min(TMath::Abs(qtime[mu+1])-atime,TMath::Abs(atime-qtime[mu]))+tg;//qtime[mu+1]-qtime[mu];
1418                //linear interpolation                orbitalinfo->mode = qmode[mu+1];
1419                incli = (q0[mu+1]-q0[mu])/(qtime[mu+1]-qtime[mu]);                //if(atime==qtime[mu] || atime==qtime[mu+1]) orbitalinfo->qkind = 0; else orbitalinfo->qkind=1;
1420                orbitalinfo->q0 =  incli*atime+q0[mu+1]-incli*qtime[mu+1];                //if(qmode[mu+1]==-10) orbitalinfo->R10r = true;else orbitalinfo->R10r = false;
1421                incli = (q1[mu+1]-q1[mu])/(qtime[mu+1]-qtime[mu]);                if ( debug ) printf(" grfuffi4 %i \n",mu);
1422                orbitalinfo->q1 =  incli*atime+q1[mu+1]-incli*qtime[mu+1];                break;
1423                incli = (q2[mu+1]-q2[mu])/(qtime[mu+1]-qtime[mu]);              }
1424                orbitalinfo->q2 =  incli*atime+q2[mu+1]-incli*qtime[mu+1];            }
1425                incli = (q3[mu+1]-q3[mu])/(qtime[mu+1]-qtime[mu]);          }
               orbitalinfo->q3 =  incli*atime+q3[mu+1]-incli*qtime[mu+1];  
             }else{  
               //sine interpolation  
               for(UInt_t mt=0;mt<q0sine.size();mt++){  
                 if(atime<=q0sine[mt].finishPoint && atime>=q0sine[mt].startPoint){  
                   if(!q0sine[mt].NeedFit)orbitalinfo->q0=q0sine[mt].A*sin(q0sine[mt].b*atime+q0sine[mt].c);else{  
                     incli = (q0[mu+1]-q0[mu])/(qtime[mu+1]-qtime[mu]);  
                     orbitalinfo->q0 =  incli*atime+q0[mu+1]-incli*qtime[mu+1];  
                   }  
                 }  
                 if(atime<=q1sine[mt].finishPoint && atime>=q1sine[mt].startPoint){  
                   if(!q1sine[mt].NeedFit)orbitalinfo->q1=q1sine[mt].A*sin(q1sine[mt].b*atime+q1sine[mt].c);else{  
                     incli = (q1[mu+1]-q1[mu])/(qtime[mu+1]-qtime[mu]);  
                     orbitalinfo->q1 =  incli*atime+q1[mu+1]-incli*qtime[mu+1];  
                   }  
                 }  
                 if(atime<=q2sine[mt].finishPoint && atime>=q2sine[mt].startPoint){  
                   if(!q2sine[mt].NeedFit)orbitalinfo->q2=q0sine[mt].A*sin(q2sine[mt].b*atime+q2sine[mt].c);else{  
                     incli = (q2[mu+1]-q2[mu])/(qtime[mu+1]-qtime[mu]);  
                     orbitalinfo->q2 =  incli*atime+q2[mu+1]-incli*qtime[mu+1];  
                   }  
                 }  
                 if(atime<=q3sine[mt].finishPoint && atime>=q3sine[mt].startPoint){  
                   if(!q3sine[mt].NeedFit)orbitalinfo->q3=q0sine[mt].A*sin(q3sine[mt].b*atime+q3sine[mt].c);else{  
                     incli = (q3[mu+1]-q3[mu])/(qtime[mu+1]-qtime[mu]);  
                     orbitalinfo->q3 =  incli*atime+q3[mu+1]-incli*qtime[mu+1];  
                   }  
                 }  
                 if(atime<=Yawsine[mt].finishPoint && atime>=Yawsine[mt].startPoint){  
                   if(!Yawsine[mt].NeedFit)orbitalinfo->phi=Yawsine[mt].A*sin(Yawsine[mt].b*atime+Yawsine[mt].c);else{  
                     incli = (qYaw[mu+1]-qYaw[mu])/(qtime[mu+1]-qtime[mu]);  
                     orbitalinfo->phi =  incli*atime+qYaw[mu+1]-incli*qtime[mu+1];  
                   }  
                 }  
               }  
             }*/  
             //q0testing->Fill(atime,orbitalinfo->q0,100);  
             //q1testing->Fill(atime,orbitalinfo->q1,100);  
             //Pitchtesting->Fill(atime,orbitalinfo->etha);  
             //q2testing->Fill(atime,orbitalinfo->q2);  
             //q3testing->Fill(atime,orbitalinfo->q3);  
             break;  
           }  
         }  
       }  
1426        }        }
1427          if ( debug ) printf(" grfuffi5  \n");
1428        //        //
1429        // ops no inclination information        // ops no inclination information
1430        //        //
1431          
1432        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 ){        if ( orbitalinfo->q0< -999 || orbitalinfo->q1 < -999 || orbitalinfo->q2 < -999 || orbitalinfo->q3 < -999 || orbitalinfo->q0 != orbitalinfo->q0 || orbitalinfo->q1 != orbitalinfo->q1 || orbitalinfo->q2 != orbitalinfo->q2 || orbitalinfo->q3 != orbitalinfo->q3 ){
1433            if ( debug ) cout << "ops no iclination information" << endl;
1434          orbitalinfo->mode = 10;          orbitalinfo->mode = 10;
1435          orbitalinfo->q0 = -1000.;          orbitalinfo->q0 = -1000.;
1436          orbitalinfo->q1 = -1000.;          orbitalinfo->q1 = -1000.;
# Line 1173  int OrbitalInfoCore(UInt_t run, TFile *f Line 1439  int OrbitalInfoCore(UInt_t run, TFile *f
1439          orbitalinfo->etha = -1000.;          orbitalinfo->etha = -1000.;
1440          orbitalinfo->phi = -1000.;          orbitalinfo->phi = -1000.;
1441          orbitalinfo->theta = -1000.;          orbitalinfo->theta = -1000.;
1442        };          orbitalinfo->TimeGap = -1000.;
1443            //orbitalinfo->qkind = -1000;
1444            
1445            //      if ( debug ){
1446            //        Int_t lopu;
1447            //         cin >> lopu;
1448            //      }
1449            if ( debug ) printf(" grfuffi6 \n");
1450          }
1451        //        //
1452          if ( debug ) printf(" filling \n");
1453        // #########################################################################################################################          // #########################################################################################################################  
1454        //        //
1455        // fill orbital positions        // fill orbital positions
# Line 1185  int OrbitalInfoCore(UInt_t run, TFile *f Line 1460  int OrbitalInfoCore(UInt_t run, TFile *f
1460        lon = (coo.m_Lon > M_PI) ? rad2deg(coo.m_Lon - 2*M_PI) : rad2deg(coo.m_Lon);        lon = (coo.m_Lon > M_PI) ? rad2deg(coo.m_Lon - 2*M_PI) : rad2deg(coo.m_Lon);
1461        lat = rad2deg(coo.m_Lat);        lat = rad2deg(coo.m_Lat);
1462        alt = coo.m_Alt;        alt = coo.m_Alt;
1463        //  
1464          cOrbit orbits2(*gltle->GetTle());
1465          orbits2.getPosition((double) (atime - gltle->GetFromTime())/60., &eCi);
1466          //      Float_t x=eCi.getPos().m_x;
1467          //      Float_t y=eCi.getPos().m_y;
1468          //      Float_t z=eCi.getPos().m_z;
1469          
1470          TVector3 V(eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z);
1471          TVector3 Pos(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z);
1472          
1473          Float_t dlon=Pos.Phi()*TMath::RadToDeg()-lon;
1474          
1475          Pos.RotateZ(-dlon*TMath::DegToRad());
1476          V.RotateZ(-dlon*TMath::DegToRad());
1477          Float_t diro;
1478          if(V.Z()>0) diro=1; else diro=-1;
1479          
1480          // 10REDNEW
1481          Int_t errq=0;
1482          Int_t azim=0;
1483          Int_t MU=0;
1484          for(UInt_t mu = must;mu<RTtime2.size()-1;mu++){
1485            if(atime<=RTstart[mu+1] && atime>=RTstart[mu]){
1486              errq=RTerrq[mu];
1487              azim=RTazim[mu];
1488              MU=mu;
1489              break;
1490            }
1491          }
1492          orbitalinfo->errq = errq;
1493          orbitalinfo->azim = azim;
1494          orbitalinfo->qkind = 0;
1495          
1496          if ( debug ) printf(" coord done \n");
1497        if( lon<180 && lon>-180 && lat<90 && lat>-90 && alt>0 ){          if( lon<180 && lon>-180 && lat<90 && lat>-90 && alt>0 ){  
1498          //                //      
1499          orbitalinfo->lon = lon;          orbitalinfo->lon = lon;
1500          orbitalinfo->lat = lat;          orbitalinfo->lat = lat;
1501          orbitalinfo->alt = alt ;          orbitalinfo->alt = alt;
1502            orbitalinfo->V = V;
1503    
1504            //      GMtype_CoordGeodetic  location;
1505            location.lambda = lon;
1506            location.phi = lat;
1507            location.HeightAboveEllipsoid = alt;
1508    
1509            GM_GeodeticToSpherical(Ellip, location, &CoordSpherical);
1510            GM_SphericalToCartesian(CoordSpherical,  &CoordCartesian);
1511            GM_EarthCartToDipoleCartCD(Pole, CoordCartesian, &DipoleCartesian);
1512            GM_CartesianToSpherical(DipoleCartesian, &DipoleSpherical);
1513            orbitalinfo->londip = DipoleSpherical.lambda;
1514            orbitalinfo->latdip = DipoleSpherical.phig;
1515    
1516            if(debug)cout<<"geodetic:\t"<<lon<<"\t"<<lat<<"\tgeomagnetic:\t"<<orbitalinfo->londip<<"\t"<<orbitalinfo->latdip<<endl;
1517    
1518          //          //
1519          // compute mag field components and L shell.          // compute mag field components and L shell.
1520          //          //
1521            if ( debug ) printf(" call igrf feldg \n");
1522          feldg_(&lat, &lon, &alt, &bnorth, &beast, &bdown, &babs);          feldg_(&lat, &lon, &alt, &bnorth, &beast, &bdown, &babs);
1523            if ( debug ) printf(" call igrf shellg \n");
1524          shellg_(&lat, &lon, &alt, &dimo, &xl, &icode, &bab1);          shellg_(&lat, &lon, &alt, &dimo, &xl, &icode, &bab1);
1525            if ( debug ) printf(" call igrf findb \n");
1526          findb0_(&stps, &bdel, &value, &bequ, &rr0);          findb0_(&stps, &bdel, &value, &bequ, &rr0);
1527          //          //
1528            if ( debug ) printf(" done igrf \n");
1529          orbitalinfo->Bnorth = bnorth;          orbitalinfo->Bnorth = bnorth;
1530          orbitalinfo->Beast = beast;          orbitalinfo->Beast = beast;
1531          orbitalinfo->Bdown = bdown;          orbitalinfo->Bdown = bdown;
# Line 1207  int OrbitalInfoCore(UInt_t run, TFile *f Line 1535  int OrbitalInfoCore(UInt_t run, TFile *f
1535          orbitalinfo->L = xl;                orbitalinfo->L = xl;      
1536          // Set Stormer vertical cutoff using L shell.          // Set Stormer vertical cutoff using L shell.
1537          orbitalinfo->cutoffsvl = 14.295 / (xl*xl); //          orbitalinfo->cutoffsvl = 14.295 / (xl*xl); //
1538            if(debug)cout << "L = " << xl << "\tM = " << dimo << "\tvertical cutoff:  "<< orbitalinfo->cutoffsvl << endl;
1539    
1540          /*          /*
1541  ---------- Forwarded message ----------            ---------- Forwarded message ----------
1542  Date: Wed, 09 May 2012 12:16:47 +0200            Date: Wed, 09 May 2012 12:16:47 +0200
1543  From: Alessandro Bruno <alessandro.bruno@ba.infn.it>            From: Alessandro Bruno <alessandro.bruno@ba.infn.it>
1544  To: Mirko Boezio <mirko.boezio@ts.infn.it>            To: Mirko Boezio <mirko.boezio@ts.infn.it>
1545  Cc: Francesco S. Cafagna <Francesco.Cafagna@ba.infn.it>            Cc: Francesco S. Cafagna <Francesco.Cafagna@ba.infn.it>
1546  Subject: Störmer vertical cutoff            Subject: Störmer vertical cutoff
1547    
1548  Ciao Mirko,            Ciao Mirko,
1549  volevo segnalarti che il valore dello Störmer vertical cutoff nel Level2 è            volevo segnalarti che il valore dello Störmer vertical cutoff nel Level2 è
1550  sovrastimato di circa il 4%.            sovrastimato di circa il 4%.
1551  Dopo un'approfondita analisi con l'IGRF-05 abbiamo ricavano un valore pari            Dopo un'approfondita analisi con l'IGRF-05 abbiamo ricavano un valore pari
1552  a: 14.295 / L^2 anzichè 14.9 / L^2, valore obsoleto in quanto riferito agli            a: 14.295 / L^2 anzichè 14.9 / L^2, valore obsoleto in quanto riferito agli
1553  anni '50.            anni '50.
1554  */          */
1555          //14.9/(xl*xl);          //14.9/(xl*xl);
1556          orbitalinfo->igrf_icode = icode;          orbitalinfo->igrf_icode = icode;
1557          //          //
1558        };              }      
1559        //        //
1560        if ( debug ) printf(" pitch angle \n");        if ( debug ) printf(" pitch angle \n");
1561        //        //
1562        // pitch angles        // pitch angles
1563        //        //
1564        //if ( orbitalinfo->mode != 10 && orbitalinfo->mode != 5 && orbitalinfo->mode !=7 && orbitalinfo->mode != 9 ){        if( orbitalinfo->TimeGap>0){
       if( orbitalinfo->TimeGap>0 && orbitalinfo->TimeGap<2000000){  
1565          //          //
1566            if ( debug ) printf(" timegap %f \n",orbitalinfo->TimeGap);
1567          Float_t Bx = -orbitalinfo->Bdown;          Float_t Bx = -orbitalinfo->Bdown;
1568          Float_t By = orbitalinfo->Beast;          Float_t By = orbitalinfo->Beast;
1569          Float_t Bz = orbitalinfo->Bnorth;          Float_t Bz = orbitalinfo->Bnorth;
1570          //  
1571          TMatrixD Fij = PO->ECItoGreenwich(PO->QuatoECI(orbitalinfo->q0,orbitalinfo->q1,orbitalinfo->q2,orbitalinfo->q3),orbitalinfo->absTime);          TMatrixD Qiji(3,3);
1572            TMatrixD Qij = PO->QuatoECI(orbitalinfo->q0,orbitalinfo->q1,orbitalinfo->q2,orbitalinfo->q3);
1573            TMatrixD Dij = PO->ECItoGEO(Qij,orbitalinfo->absTime,orbitalinfo->lat,orbitalinfo->lon);
1574    
1575    //10REDNEW
1576            /* If initial orientation data have reason to be inaccurate */
1577            Float_t tg = 0.00;
1578           Float_t tmptg;
1579           if(MU!=0){
1580    //      if(orbitalinfo->TimeGap>0 && errq==0 && azim==0){               // 10RED CHECK  (comparison between three metod of recovering orientation)
1581           if((atime>=RTstart[MU] && atime<RTstart[MU+1] && RTbank1[MU]==0 && RTbank2[MU]==0 && TMath::Abs(orbitalinfo->etha)>0.01) || ((RTbank1[MU]!=0 || RTbank2[MU]!=0) && atime>=RTstart[MU] && atime<RTstart[MU+1] && azim==0 && (errq!=0 || orbitalinfo->TimeGap>10.0 || ((modf(orbitalinfo->TimeGap,&tmptg)*1000>10 || modf(orbitalinfo->TimeGap,&tmptg)*1000==0.0) && orbitalinfo->TimeGap>2.0)))){
1582            /*  found in Rotation Table this data for this time interval*/
1583            if(atime<RTtime1[0])
1584              orbitalinfo->azim = 5;        //means that RotationTable no started yet
1585           else{
1586                    // search for angle betwean velosity and direction to north in tangential to Earth surfase plane in satellite position
1587                  Double_t bank=RTstart[MU];
1588                  Double_t tlat=orbitalinfo->lat;
1589    
1590                  tg=modf(orbitalinfo->TimeGap,&tg)*1000;
1591    
1592                  if(atime>=RTpluto1[MU] && atime<=RTpluto2[MU]){
1593                    Double_t kar=(RTbank2[MU]-RTbank1[MU])/(RTtime2[MU]-RTtime1[MU]);
1594                    Double_t bak=RTbank1[MU]-kar*RTtime1[MU];
1595                    bank=kar*atime+bak;
1596                  }
1597                  if(atime>=RTstart[MU] && atime<RTpluto1[MU]){
1598                     Double_t s_dBdt2=(RTbpluto1[MU]-RTbank1[MU])/(RTpluto1[MU]-RTstart[MU]);
1599                     Double_t s_t2=((Double_t)RTpluto1[MU]+(Double_t)RTstart[MU])/2. - RTstart[MU];
1600                     Double_t s_t1=RTstart[MU]-RTstart[MU];
1601                     Double_t s_k=s_dBdt2/(s_t2-s_t1);
1602                     Double_t s_b=-s_k*s_t1;
1603                     Double_t s_t3=RTpluto1[MU]-RTstart[MU];
1604                     Double_t s_b3=RTbpluto1[MU];
1605                     Double_t s_c=s_b3-0.5*s_k*s_t3*s_t3 -s_b*s_t3;
1606                     bank=0.5*s_k*(atime-RTstart[MU])*(atime-RTstart[MU]) + s_b*(atime-RTstart[MU]) + s_c;
1607                 }
1608                  if(atime>RTpluto2[MU] && atime<=RTstart[MU+1]){
1609                     Double_t s_dBdt2=(RTbpluto2[MU] - RTbank2[MU])/(RTpluto2[MU]-RTstart[MU+1]);
1610                     Double_t s_t2=((Double_t)RTpluto2[MU]+(Double_t)RTstart[MU+1])/2. - RTstart[MU];
1611                     Double_t s_t1=RTstart[MU+1]-RTstart[MU];
1612                     Double_t s_k=s_dBdt2/(s_t2-s_t1);
1613                     Double_t s_b=-s_k*s_t1;
1614                     Double_t s_t3=RTpluto2[MU]-RTstart[MU];
1615                     Double_t s_b3=RTbpluto2[MU];
1616                     Double_t s_c=s_b3-0.5*s_k*s_t3*s_t3 -s_b*s_t3;
1617                   bank=0.5*s_k*(atime-RTstart[MU])*(atime-RTstart[MU]) + s_b*(atime-RTstart[MU]) + s_c;
1618                 }
1619                  orbitalinfo->etha=bank;
1620                  Double_t spitch = 0.00001;  // temprary not zero to avoid problem with tranzition from Euler angles to orientation matrix
1621    
1622                    //Estimations of pitch angle of satellite
1623                  if(TMath::Abs(bank)>0.7){
1624                     Float_t spitch1=TMath::DegToRad()*0.7*diro;//RTdir1[MU];
1625                     Float_t spitch2=TMath::DegToRad()*0.7*diro;//RTdir2[MU];
1626                     Float_t kva=(spitch2-spitch1)/(RTtime2[MU]-RTtime1[MU]);
1627                     Float_t bva=spitch1-kva*RTtime1[MU];
1628                     spitch=kva*atime+bva;
1629                  }
1630    
1631                  //Calculate Yaw angle accordingly with fit, see picture FitYaw.jpg
1632                  Double_t yaw=0.00001;  // temprary not zero to avoid problem with tranzition from Euler angles to orientation matrix
1633                  if(TMath::Abs(tlat)<70)
1634                    yaw = -3.7e-8*tlat*tlat*tlat*tlat + 1.4e-7*tlat*tlat*tlat - 0.0005*tlat*tlat - 0.00025*tlat + 3.6;
1635                  yaw = diro*yaw;   //because should be different sign for ascending and descending orbits!
1636                  orbitalinfo->phi=yaw;
1637    
1638                  if(TMath::Abs(bank)>0.5 && TMath::Abs(yaw-orbitalinfo->phi)<3.0) yaw=orbitalinfo->phi;
1639    
1640    //            Qiji = PO->EulertoEci(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z,eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z,bank,yaw,spitch);             // 10RED CHECK
1641                  Qij = PO->EulertoEci(eCi.getPos().m_x,eCi.getPos().m_y,eCi.getPos().m_z,eCi.getVel().m_x,eCi.getVel().m_y,eCi.getVel().m_z,bank,yaw,spitch);              // STANDARD
1642                  orbitalinfo->qkind = 1;
1643    
1644              //Qij = PO->GEOtoECI(Dij,orbitalinfo->absTime,orbitalinfo->lat,orbitalinfo->lon); // to convert from Dij to Qij
1645    
1646            } // end of if(atime<RTtime1[0]
1647            } // end of f(((orbitalinfo->TimeGap>60.0 && TMath...
1648           } // end of MU~=0
1649    
1650            TMatrixD qij = PO->ColPermutation(Qij);
1651            TMatrixD Fij = PO->ECItoGreenwich(Qij,orbitalinfo->absTime);
1652          TMatrixD Gij = PO->ColPermutation(Fij);          TMatrixD Gij = PO->ColPermutation(Fij);
1653          TMatrixD Dij = PO->GreenwichtoGEO(orbitalinfo->lat,orbitalinfo->lon,Fij);          Dij = PO->ECItoGEO(Qij,orbitalinfo->absTime,orbitalinfo->lat,orbitalinfo->lon);
1654          TMatrixD Iij = PO->ColPermutation(Dij);          TMatrixD Iij = PO->ColPermutation(Dij);
1655          //          TVector3 SP = PO->GetSunPosition(orbitalinfo->absTime);
1656            // go to Pamela reference frame from Resurs reference frame
1657            Float_t tmpy = SP.Y();
1658            SP.SetY(SP.Z());
1659            SP.SetZ(-tmpy);
1660            TVector3 SunZenith;
1661            SunZenith.SetMagThetaPhi(1,23.439281*TMath::DegToRad(),TMath::Pi()/2.);
1662            TVector3 SunMag = -SP;
1663            SunMag.Rotate(-45*TMath::DegToRad(),SunZenith);
1664            tmpy=SunMag.Y();
1665            SunMag.SetY(SunMag.Z());
1666            SunMag.SetZ(-tmpy);
1667    
1668          orbitalinfo->Iij.ResizeTo(Iij);          orbitalinfo->Iij.ResizeTo(Iij);
1669          orbitalinfo->Iij = Iij;          orbitalinfo->Iij = Iij;
1670          //          //
1671          A1 = Iij(0,2);          //      A1 = Iij(0,2);
1672          A2 = Iij(1,2);          //      A2 = Iij(1,2);
1673          A3 = Iij(2,2);          //      A3 = Iij(2,2);
1674          //          //
1675          //      orbitalinfo->pamzenitangle = (Float_t)PO->GetPitchAngle(1,0,0,A1,A2,A3);                        // Angle between zenit and Pamela's main axiz          //      orbitalinfo->pamzenitangle = (Float_t)PO->GetPitchAngle(1,0,0,A1,A2,A3);                        // Angle between zenit and Pamela's main axiz
1676          //      orbitalinfo->pamBangle = (Float_t)PO->GetPitchAngle(A1,A2,A3,Bx,By,Bz);                 // Angle between Pamela's main axiz and B          //      orbitalinfo->pamBangle = (Float_t)PO->GetPitchAngle(A1,A2,A3,Bx,By,Bz);                 // Angle between Pamela's main axiz and B
1677          //          //
1678          if ( !standalone && tof->ntrk() > 0 ){          if ( debug ) printf(" matrixes done  \n");
1679            if ( !standalone ){
1680              if ( debug ) printf(" !standalone \n");
1681            //            //
1682              // Standard tracking algorithm
1683              //
1684            Int_t nn = 0;            Int_t nn = 0;
1685              if ( verbose ) printf(" standard tracking \n");
1686            for(Int_t nt=0; nt < tof->ntrk(); nt++){              for(Int_t nt=0; nt < tof->ntrk(); nt++){  
1687              //              //
1688              ToFTrkVar *ptt = tof->GetToFTrkVar(nt);              ToFTrkVar *ptt = tof->GetToFTrkVar(nt);
1689                if (debug) cout<<"tof->ntrk() = "<<tof->ntrk()<<"\tptt->trkseqno = "<<ptt->trkseqno<<"\ttrke->ntrk() = "<<trke->ntrk()<<endl;
1690              Double_t E11x = ptt->xtr_tof[0]; // tr->x[0];              Double_t E11x = ptt->xtr_tof[0]; // tr->x[0];
1691              Double_t E11y = ptt->ytr_tof[0]; //tr->y[0];              Double_t E11y = ptt->ytr_tof[0]; //tr->y[0];
1692              Double_t E11z = zin[0];              Double_t E11z = zin[0];
# Line 1266  anni '50. Line 1694  anni '50.
1694              Double_t E22y = ptt->ytr_tof[3];//tr->y[3];              Double_t E22y = ptt->ytr_tof[3];//tr->y[3];
1695              Double_t E22z = zin[3];              Double_t E22z = zin[3];
1696              if ( (E11x < 100. && E11y < 100. && E22x < 100. && E22y < 100.) || ptt->trkseqno != -1  ){              if ( (E11x < 100. && E11y < 100. && E22x < 100. && E22y < 100.) || ptt->trkseqno != -1  ){
1697                  TrkTrack *mytrack = trke->GetStoredTrack(ptt->trkseqno);
1698                  Float_t rig=1/mytrack->GetDeflection();
1699                Double_t norm = sqrt(pow(E22x-E11x,2)+pow(E22y-E11y,2)+pow(E22z-E11z,2));                Double_t norm = sqrt(pow(E22x-E11x,2)+pow(E22y-E11y,2)+pow(E22z-E11z,2));
1700                //              Double_t MyAzim = TMath::RadToDeg()*atan(TMath::Abs(E22y-E11y)/TMath::Abs(E22x-E11x));                //
               //              if(E22x-E11x>=0 && E22y-E11y <0) MyAzim =  360. - MyAzim;  
               //              if(E22x-E11x>=0 && E22y-E11y >=0) MyAzim = MyAzim;  
               //              if(E22x-E11x<0 && E22y-E11y >0) MyAzim = 180. - MyAzim;  
               //              if(E22x-E11x<0 && E22y-E11y <0) MyAzim = 180. + MyAzim;  
1701                Px = (E22x-E11x)/norm;                Px = (E22x-E11x)/norm;
1702                Py = (E22y-E11y)/norm;                Py = (E22y-E11y)/norm;
1703                Pz = (E22z-E11z)/norm;                Pz = (E22z-E11z)/norm;
# Line 1288  anni '50. Line 1714  anni '50.
1714                //                            //            
1715                t_orb->pitch = (Float_t)PO->GetPitchAngle(Eij(0,0),Eij(1,0),Eij(2,0),Bx,By,Bz);                t_orb->pitch = (Float_t)PO->GetPitchAngle(Eij(0,0),Eij(1,0),Eij(2,0),Bx,By,Bz);
1716                //                //
1717                  // SunPosition in instrumental reference frame
1718                  TMatrixD Kij = PO->PamelatoGEO(qij,Px,Py,Pz);
1719                  TMatrixD Lij = PO->PamelatoGEO(qij,0,0,1);
1720                  t_orb->sunangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),-SP.X(),-SP.Y(),-SP.Z());
1721                  t_orb->sunmagangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),SunMag.X(),SunMag.Y(),SunMag.Z());
1722                //                //
               Double_t omega = PO->GetPitchAngle(Eij(0,0),Eij(1,0),Eij(2,0),cos(orbitalinfo->lon+TMath::Pi()/2)-sin(orbitalinfo->lon+TMath::Pi()/2),cos(orbitalinfo->lon+TMath::Pi()/2)+sin(orbitalinfo->lon+TMath::Pi()/2),1);  
1723                //                //
1724                t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow((1+sqrt(1-pow(orbitalinfo->L,-3/2)*cos(omega))),2));                Double_t omega = PO->GetPitchAngle(-Eij(0,0),-Eij(1,0),-Eij(2,0),1,0,0) * TMath::DegToRad();
1725                  TVector3 Bxy(0,By,Bz);
1726                  TVector3 Exy(0,-Eij(1,0),-Eij(2,0));
1727                  Double_t dzeta=Bxy.Angle(Exy);
1728                  if (-Eij(1,0) < 0) dzeta=2.0*TMath::Pi() - dzeta;
1729                  
1730                  if(debug) cout << "omega = "<<omega*TMath::RadToDeg()<<"\tdzeta = "<<dzeta*TMath::RadToDeg()<<endl;
1731    
1732                  // Formula from D.F. Smart *, M.A. Shea [2005]; A review of geomagnetic cutoff rigidities for earth-orbiting spacecraft
1733                  if(rig>=0) t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow(1+sqrt(1-sin(omega)*sin(dzeta)*pow(cos(orbitalinfo->lat*TMath::DegToRad()),3)),2));
1734                  else       t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow(1+sqrt(1-sin(omega)*sin(TMath::Pi()+dzeta)*pow(cos(orbitalinfo->lat*TMath::DegToRad()),3)),2));
1735                  if (debug) cout << "R = " << rig << "\tcutoff = " << t_orb->cutoff << endl;
1736    
1737                //                //
1738                if ( t_orb->pitch != t_orb->pitch ) t_orb->pitch = -1000.;                if ( t_orb->pitch != t_orb->pitch ) t_orb->pitch = -1000.;
1739                if ( t_orb->cutoff != t_orb->cutoff ) t_orb->cutoff = -1000.;                if ( t_orb->cutoff != t_orb->cutoff ) t_orb->cutoff = -1000.;
1740                  if ( t_orb->sunangle != t_orb->sunangle ) t_orb->sunangle = -1000.;
1741                  if ( t_orb->sunmagangle != t_orb->sunmagangle ) t_orb->sunmagangle = -1000.;
1742                //                //
1743                if ( debug ) printf(" orbitalinfo->cutoffsvl %f vitaly %f \n",orbitalinfo->cutoffsvl,t_orb->cutoff);                if ( debug ) printf(" orbitalinfo->cutoffsvl %f vitaly %f \n",orbitalinfo->cutoffsvl,t_orb->cutoff);
1744                //                //
# Line 1303  anni '50. Line 1747  anni '50.
1747                //                //
1748                t_orb->Clear();                t_orb->Clear();
1749                //                //
1750              };              }
1751              //              //
1752            };            } // end standard tracking algorithm
1753    
1754              //
1755              // Code for extended tracking algorithm:
1756              //
1757              if ( hasNucleiTrk ){
1758                Int_t ttentry = 0;
1759                if ( verbose ) printf(" hasNucleiTrk \n");
1760                for(Int_t nt=0; nt < tcNucleiTof->GetEntries() ; nt++){  
1761                  //
1762                  if ( verbose ) printf(" got1\n");
1763                  ToFTrkVar *ptt = (ToFTrkVar*)(tcNucleiTof->At(nt));
1764                  if (verbose) cout<<" tcNucleiTof->GetEntries() = "<<tcNucleiTof->GetEntries()<<"\tptt->trkseqno = "<<ptt->trkseqno<<endl;
1765                  Double_t E11x = ptt->xtr_tof[0]; // tr->x[0];
1766                  Double_t E11y = ptt->ytr_tof[0]; //tr->y[0];
1767                  Double_t E11z = zin[0];
1768                  Double_t E22x = ptt->xtr_tof[3];//tr->x[3];
1769                  Double_t E22y = ptt->ytr_tof[3];//tr->y[3];
1770                  Double_t E22z = zin[3];
1771                  if ( (E11x < 100. && E11y < 100. && E22x < 100. && E22y < 100.) || ptt->trkseqno != -1  ){
1772                    TrkTrack *mytrack = (TrkTrack*)(tcNucleiTrk->At(ptt->trkseqno));
1773                    if ( verbose ) printf(" got tcNucleiTrk \n");
1774                    Float_t rig=1/mytrack->GetDeflection();
1775                    Double_t norm = sqrt(pow(E22x-E11x,2)+pow(E22y-E11y,2)+pow(E22z-E11z,2));
1776                    //
1777                    Px = (E22x-E11x)/norm;
1778                    Py = (E22y-E11y)/norm;
1779                    Pz = (E22z-E11z)/norm;
1780                    //
1781                    t_orb->trkseqno = ptt->trkseqno;
1782                    //
1783                    TMatrixD Eij = PO->PamelatoGEO(Iij,Px,Py,Pz);
1784                    t_orb->Eij.ResizeTo(Eij);      
1785                    t_orb->Eij = Eij;      
1786                    //
1787                    TMatrixD Sij = PO->PamelatoGEO(Gij,Px,Py,Pz);
1788                    t_orb->Sij.ResizeTo(Sij);
1789                    t_orb->Sij = Sij;
1790                    //          
1791                    t_orb->pitch = (Float_t)PO->GetPitchAngle(Eij(0,0),Eij(1,0),Eij(2,0),Bx,By,Bz);
1792                    //
1793                    // SunPosition in instrumental reference frame
1794                    TMatrixD Kij = PO->PamelatoGEO(qij,Px,Py,Pz);
1795                    TMatrixD Lij = PO->PamelatoGEO(qij,0,0,1);
1796                    t_orb->sunangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),-SP.X(),-SP.Y(),-SP.Z());
1797                    t_orb->sunmagangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),SunMag.X(),SunMag.Y(),SunMag.Z());
1798                    //
1799                    //
1800                    Double_t omega = PO->GetPitchAngle(-Eij(0,0),-Eij(1,0),-Eij(2,0),1,0,0) * TMath::DegToRad();
1801                    TVector3 Bxy(0,By,Bz);
1802                    TVector3 Exy(0,-Eij(1,0),-Eij(2,0));
1803                    Double_t dzeta=Bxy.Angle(Exy);
1804                    if (-Eij(1,0) < 0) dzeta=2.0*TMath::Pi() - dzeta;
1805                    
1806                    if(debug) cout << "omega = "<<omega*TMath::RadToDeg()<<"\tdzeta = "<<dzeta*TMath::RadToDeg()<<endl;
1807                    
1808                    // Formula from D.F. Smart *, M.A. Shea [2005]; A review of geomagnetic cutoff rigidities for earth-orbiting spacecraft
1809                    if(rig>=0) t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow(1+sqrt(1-sin(omega)*sin(dzeta)*pow(cos(orbitalinfo->lat*TMath::DegToRad()),3)),2));
1810                    else       t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow(1+sqrt(1-sin(omega)*sin(TMath::Pi()+dzeta)*pow(cos(orbitalinfo->lat*TMath::DegToRad()),3)),2));
1811                    if (debug) cout << "R = " << rig << "\tcutoff = " << t_orb->cutoff << endl;
1812                    
1813                    //
1814                    if ( t_orb->pitch != t_orb->pitch ) t_orb->pitch = -1000.;
1815                    if ( t_orb->cutoff != t_orb->cutoff ) t_orb->cutoff = -1000.;
1816                    if ( t_orb->sunangle != t_orb->sunangle ) t_orb->sunangle = -1000.;
1817                    if ( t_orb->sunmagangle != t_orb->sunmagangle ) t_orb->sunmagangle = -1000.;
1818                    //
1819                    if ( debug ) printf(" orbitalinfo->cutoffsvl %f vitaly %f \n",orbitalinfo->cutoffsvl,t_orb->cutoff);
1820                    //
1821                    TClonesArray &tt1 = *torbNucleiTrk;
1822                    new(tt1[ttentry]) OrbitalInfoTrkVar(*t_orb);
1823                    ttentry++;
1824                    //
1825                    t_orb->Clear();
1826                    //
1827                  }
1828                  //
1829                }
1830              } // end standard tracking algorithm: nuclei
1831              if ( hasExtNucleiTrk ){
1832                Int_t ttentry = 0;
1833                if ( verbose ) printf(" hasExtNucleiTrk \n");
1834                for(Int_t nt=0; nt < tcExtNucleiTof->GetEntries() ; nt++){  
1835                  //
1836                  if ( verbose ) printf(" got2\n");
1837                  ToFTrkVar *ptt = (ToFTrkVar*)(tcExtNucleiTof->At(nt));
1838                  if (verbose) cout<<" tcExtNucleiTof->GetEntries() = "<<tcExtNucleiTof->GetEntries()<<"\tptt->trkseqno = "<<ptt->trkseqno<<endl;
1839                  Double_t E11x = ptt->xtr_tof[0]; // tr->x[0];
1840                  Double_t E11y = ptt->ytr_tof[0]; //tr->y[0];
1841                  Double_t E11z = zin[0];
1842                  Double_t E22x = ptt->xtr_tof[3];//tr->x[3];
1843                  Double_t E22y = ptt->ytr_tof[3];//tr->y[3];
1844                  Double_t E22z = zin[3];
1845                  if ( (E11x < 100. && E11y < 100. && E22x < 100. && E22y < 100.) || ptt->trkseqno != -1  ){
1846                    ExtTrack *mytrack = (ExtTrack*)(tcExtNucleiTrk->At(ptt->trkseqno));
1847                    if ( verbose ) printf(" got tcExtNucleiTrk \n");
1848                    Float_t rig=1/mytrack->GetDeflection();
1849                    Double_t norm = sqrt(pow(E22x-E11x,2)+pow(E22y-E11y,2)+pow(E22z-E11z,2));
1850                    //
1851                    Px = (E22x-E11x)/norm;
1852                    Py = (E22y-E11y)/norm;
1853                    Pz = (E22z-E11z)/norm;
1854                    //
1855                    t_orb->trkseqno = ptt->trkseqno;
1856                    //
1857                    TMatrixD Eij = PO->PamelatoGEO(Iij,Px,Py,Pz);
1858                    t_orb->Eij.ResizeTo(Eij);      
1859                    t_orb->Eij = Eij;      
1860                    //
1861                    TMatrixD Sij = PO->PamelatoGEO(Gij,Px,Py,Pz);
1862                    t_orb->Sij.ResizeTo(Sij);
1863                    t_orb->Sij = Sij;
1864                    //          
1865                    t_orb->pitch = (Float_t)PO->GetPitchAngle(Eij(0,0),Eij(1,0),Eij(2,0),Bx,By,Bz);
1866                    //
1867                    // SunPosition in instrumental reference frame
1868                    TMatrixD Kij = PO->PamelatoGEO(qij,Px,Py,Pz);
1869                    TMatrixD Lij = PO->PamelatoGEO(qij,0,0,1);
1870                    t_orb->sunangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),-SP.X(),-SP.Y(),-SP.Z());
1871                    t_orb->sunmagangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),SunMag.X(),SunMag.Y(),SunMag.Z());
1872                    //
1873                    //
1874                    Double_t omega = PO->GetPitchAngle(-Eij(0,0),-Eij(1,0),-Eij(2,0),1,0,0) * TMath::DegToRad();
1875                    TVector3 Bxy(0,By,Bz);
1876                    TVector3 Exy(0,-Eij(1,0),-Eij(2,0));
1877                    Double_t dzeta=Bxy.Angle(Exy);
1878                    if (-Eij(1,0) < 0) dzeta=2.0*TMath::Pi() - dzeta;
1879                    
1880                    if(debug) cout << "omega = "<<omega*TMath::RadToDeg()<<"\tdzeta = "<<dzeta*TMath::RadToDeg()<<endl;
1881                    
1882                    // Formula from D.F. Smart *, M.A. Shea [2005]; A review of geomagnetic cutoff rigidities for earth-orbiting spacecraft
1883                    if(rig>=0) t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow(1+sqrt(1-sin(omega)*sin(dzeta)*pow(cos(orbitalinfo->lat*TMath::DegToRad()),3)),2));
1884                    else       t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow(1+sqrt(1-sin(omega)*sin(TMath::Pi()+dzeta)*pow(cos(orbitalinfo->lat*TMath::DegToRad()),3)),2));
1885                    if (debug) cout << "R = " << rig << "\tcutoff = " << t_orb->cutoff << endl;
1886                    
1887                    //
1888                    if ( t_orb->pitch != t_orb->pitch ) t_orb->pitch = -1000.;
1889                    if ( t_orb->cutoff != t_orb->cutoff ) t_orb->cutoff = -1000.;
1890                    if ( t_orb->sunangle != t_orb->sunangle ) t_orb->sunangle = -1000.;
1891                    if ( t_orb->sunmagangle != t_orb->sunmagangle ) t_orb->sunmagangle = -1000.;
1892                    //
1893                    if ( debug ) printf(" orbitalinfo->cutoffsvl %f vitaly %f \n",orbitalinfo->cutoffsvl,t_orb->cutoff);
1894                    //
1895                    TClonesArray &tt2 = *torbExtNucleiTrk;
1896                    new(tt2[ttentry]) OrbitalInfoTrkVar(*t_orb);
1897                    ttentry++;
1898                    //
1899                    t_orb->Clear();
1900                    //
1901                  }
1902                  //
1903                }
1904              } // end standard tracking algorithm: nuclei extended
1905             if ( hasExtTrk ){
1906                Int_t ttentry = 0;
1907                if ( verbose ) printf(" hasExtTrk \n");
1908                for(Int_t nt=0; nt < tcExtTof->GetEntries() ; nt++){  
1909                  //
1910                  if ( verbose ) printf(" got3\n");
1911                  ToFTrkVar *ptt = (ToFTrkVar*)(tcExtTof->At(nt));
1912                  if (verbose) cout<<" tcExtTof->GetEntries() = "<<tcExtTof->GetEntries()<<"\tptt->trkseqno = "<<ptt->trkseqno<<endl;
1913                  Double_t E11x = ptt->xtr_tof[0]; // tr->x[0];
1914                  Double_t E11y = ptt->ytr_tof[0]; //tr->y[0];
1915                  Double_t E11z = zin[0];
1916                  Double_t E22x = ptt->xtr_tof[3];//tr->x[3];
1917                  Double_t E22y = ptt->ytr_tof[3];//tr->y[3];
1918                  Double_t E22z = zin[3];
1919                  if ( (E11x < 100. && E11y < 100. && E22x < 100. && E22y < 100.) || ptt->trkseqno != -1  ){
1920                    ExtTrack *mytrack = (ExtTrack*)(tcExtTrk->At(ptt->trkseqno));
1921                    if ( verbose ) printf(" got tcExtTrk \n");
1922                    Float_t rig=1/mytrack->GetDeflection();
1923                    Double_t norm = sqrt(pow(E22x-E11x,2)+pow(E22y-E11y,2)+pow(E22z-E11z,2));
1924                    //
1925                    Px = (E22x-E11x)/norm;
1926                    Py = (E22y-E11y)/norm;
1927                    Pz = (E22z-E11z)/norm;
1928                    //
1929                    t_orb->trkseqno = ptt->trkseqno;
1930                    //
1931                    TMatrixD Eij = PO->PamelatoGEO(Iij,Px,Py,Pz);
1932                    t_orb->Eij.ResizeTo(Eij);      
1933                    t_orb->Eij = Eij;      
1934                    //
1935                    TMatrixD Sij = PO->PamelatoGEO(Gij,Px,Py,Pz);
1936                    t_orb->Sij.ResizeTo(Sij);
1937                    t_orb->Sij = Sij;
1938                    //          
1939                    t_orb->pitch = (Float_t)PO->GetPitchAngle(Eij(0,0),Eij(1,0),Eij(2,0),Bx,By,Bz);
1940                    //
1941                    // SunPosition in instrumental reference frame
1942                    TMatrixD Kij = PO->PamelatoGEO(qij,Px,Py,Pz);
1943                    TMatrixD Lij = PO->PamelatoGEO(qij,0,0,1);
1944                    t_orb->sunangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),-SP.X(),-SP.Y(),-SP.Z());
1945                    t_orb->sunmagangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),SunMag.X(),SunMag.Y(),SunMag.Z());
1946                    //
1947                    //
1948                    Double_t omega = PO->GetPitchAngle(-Eij(0,0),-Eij(1,0),-Eij(2,0),1,0,0) * TMath::DegToRad();
1949                    TVector3 Bxy(0,By,Bz);
1950                    TVector3 Exy(0,-Eij(1,0),-Eij(2,0));
1951                    Double_t dzeta=Bxy.Angle(Exy);
1952                    if (-Eij(1,0) < 0) dzeta=2.0*TMath::Pi() - dzeta;
1953                    
1954                    if(debug) cout << "omega = "<<omega*TMath::RadToDeg()<<"\tdzeta = "<<dzeta*TMath::RadToDeg()<<endl;
1955                    
1956                    // Formula from D.F. Smart *, M.A. Shea [2005]; A review of geomagnetic cutoff rigidities for earth-orbiting spacecraft
1957                    if(rig>=0) t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow(1+sqrt(1-sin(omega)*sin(dzeta)*pow(cos(orbitalinfo->lat*TMath::DegToRad()),3)),2));
1958                    else       t_orb->cutoff = 59.3/(pow(orbitalinfo->L,2)*pow(1+sqrt(1-sin(omega)*sin(TMath::Pi()+dzeta)*pow(cos(orbitalinfo->lat*TMath::DegToRad()),3)),2));
1959                    if (debug) cout << "R = " << rig << "\tcutoff = " << t_orb->cutoff << endl;
1960                    
1961                    //
1962                    if ( t_orb->pitch != t_orb->pitch ) t_orb->pitch = -1000.;
1963                    if ( t_orb->cutoff != t_orb->cutoff ) t_orb->cutoff = -1000.;
1964                    if ( t_orb->sunangle != t_orb->sunangle ) t_orb->sunangle = -1000.;
1965                    if ( t_orb->sunmagangle != t_orb->sunmagangle ) t_orb->sunmagangle = -1000.;
1966                    //
1967                    if ( debug ) printf(" orbitalinfo->cutoffsvl %f vitaly %f \n",orbitalinfo->cutoffsvl,t_orb->cutoff);
1968                    //
1969                    TClonesArray &tt3 = *torbExtTrk;
1970                    new(tt3[ttentry]) OrbitalInfoTrkVar(*t_orb);
1971                    ttentry++;
1972                    //
1973                    t_orb->Clear();
1974                    //
1975                  }
1976                  //
1977                }
1978              } // end standard tracking algorithm: extended
1979    
1980          } else {          } else {
1981            if ( debug ) printf(" mmm... mode %u standalone %i ntrk %i \n",orbitalinfo->mode,standalone,tof->ntrk());            if ( debug ) printf(" mmm... mode %u standalone  \n",orbitalinfo->mode);
1982          };          }
1983          //          //
1984        } else {        } else { // HERE IT MISS ALL CODE FOR EXTENDED TRACKING!
1985          if ( !standalone && tof->ntrk() > 0 ){          if ( !standalone ){
1986            //            //
1987              if ( verbose ) printf(" no orb info for tracks \n");
1988            Int_t nn = 0;            Int_t nn = 0;
1989            for(Int_t nt=0; nt < tof->ntrk(); nt++){              for(Int_t nt=0; nt < tof->ntrk(); nt++){  
1990              //              //
# Line 1327  anni '50. Line 1999  anni '50.
1999                //                            //            
2000                t_orb->pitch = -1000.;                t_orb->pitch = -1000.;
2001                //                //
2002                  t_orb->sunangle = -1000.;
2003                  //
2004                  t_orb->sunmagangle = -1000;
2005                  //
2006                t_orb->cutoff = -1000.;                t_orb->cutoff = -1000.;
2007                //                //
2008                new(tor[nn]) OrbitalInfoTrkVar(*t_orb);                new(tor[nn]) OrbitalInfoTrkVar(*t_orb);
# Line 1334  anni '50. Line 2010  anni '50.
2010                //                //
2011                t_orb->Clear();                t_orb->Clear();
2012                //                //
2013              };              }
2014              //              //
2015            };                }
2016          };            //
2017        };            // Code for extended tracking algorithm:
2018              //
2019              if ( hasNucleiTrk ){
2020                Int_t ttentry = 0;
2021                if ( verbose ) printf(" hasNucleiTrk \n");
2022                for(Int_t nt=0; nt < tcNucleiTof->GetEntries() ; nt++){  
2023                  //  
2024                  ToFTrkVar *ptt = (ToFTrkVar*)(tcNucleiTof->At(nt));
2025                  if ( ptt->trkseqno != -1  ){
2026                    //
2027                    t_orb->trkseqno = ptt->trkseqno;
2028                    //
2029                    t_orb->Eij = 0;
2030                    //
2031                    t_orb->Sij = 0;
2032                    //          
2033                    t_orb->pitch = -1000.;
2034                    //
2035                    t_orb->sunangle = -1000.;
2036                    //
2037                    t_orb->sunmagangle = -1000;
2038                    //
2039                    t_orb->cutoff = -1000.;
2040                    //
2041                    TClonesArray &tz1 = *torbNucleiTrk;
2042                    new(tz1[ttentry]) OrbitalInfoTrkVar(*t_orb);
2043                    ttentry++;
2044                    //
2045                    t_orb->Clear();
2046                    //
2047                  }
2048                  //
2049                }
2050              }
2051              if ( hasExtNucleiTrk ){
2052                Int_t ttentry = 0;
2053                if ( verbose ) printf(" hasExtNucleiTrk \n");
2054                for(Int_t nt=0; nt < tcExtNucleiTof->GetEntries() ; nt++){  
2055                  //
2056                  if ( verbose ) printf(" got2\n");
2057                  ToFTrkVar *ptt = (ToFTrkVar*)(tcExtNucleiTof->At(nt));
2058                  if ( ptt->trkseqno != -1  ){
2059                    //
2060                    t_orb->trkseqno = ptt->trkseqno;
2061                    //
2062                    t_orb->Eij = 0;
2063                    //
2064                    t_orb->Sij = 0;
2065                    //          
2066                    t_orb->pitch = -1000.;
2067                    //
2068                    t_orb->sunangle = -1000.;
2069                    //
2070                    t_orb->sunmagangle = -1000;
2071                    //
2072                    t_orb->cutoff = -1000.;
2073                    //
2074                    TClonesArray &tz2 = *torbExtNucleiTrk;
2075                    new(tz2[ttentry]) OrbitalInfoTrkVar(*t_orb);
2076                    ttentry++;
2077                    //
2078                    t_orb->Clear();
2079                    //
2080                  }
2081                  //
2082                }
2083              }
2084              if ( hasExtTrk ){
2085                Int_t ttentry = 0;
2086                if ( verbose ) printf(" hasExtTrk \n");
2087                for(Int_t nt=0; nt < tcExtTof->GetEntries() ; nt++){  
2088                  //
2089                  if ( verbose ) printf(" got3\n");
2090                  ToFTrkVar *ptt = (ToFTrkVar*)(tcExtTof->At(nt));
2091                  if ( ptt->trkseqno != -1  ){
2092                    //
2093                    t_orb->trkseqno = ptt->trkseqno;
2094                    //
2095                    t_orb->Eij = 0;
2096                    //
2097                    t_orb->Sij = 0;
2098                    //          
2099                    t_orb->pitch = -1000.;
2100                    //
2101                    t_orb->sunangle = -1000.;
2102                    //
2103                    t_orb->sunmagangle = -1000;
2104                    //
2105                    t_orb->cutoff = -1000.;
2106                    //
2107                    TClonesArray &tz3 = *torbExtNucleiTrk;
2108                    new(tz3[ttentry]) OrbitalInfoTrkVar(*t_orb);
2109                    ttentry++;
2110                    //
2111                    t_orb->Clear();
2112                    //
2113                  }
2114                  //
2115                }
2116              }
2117            }
2118          } // if( orbitalinfo->TimeGap>0){
2119        //        //
2120        // Fill the class        // Fill the class
2121        //        //
# Line 1351  anni '50. Line 2128  anni '50.
2128      // Here you may want to clear some variables before processing another run        // Here you may want to clear some variables before processing another run  
2129      //      //
2130    
     //gStyle->SetOptStat(000000);  
     //gStyle->SetPalette(1);  
       
     /*TCanvas* c1 = new TCanvas("c1","",1200,800);  
     //c1->Divide(1,4);  
     c1->cd(1);  
     //q0testing->Draw("colz");  
     //c1->cd(2);  
     //q1testing->Draw("colz");  
     //c1->cd(3);  
     Pitchtesting->Draw("colz");  
     //c1->cd(4);  
     //q3testing->Draw("colz");  
     c1->SaveAs("9.Rollhyst.png");  
     delete c1;*/  
   
2131      if ( verbose ) printf(" Clear before new run \n");      if ( verbose ) printf(" Clear before new run \n");
2132      delete dbtime;      delete dbtime;
2133    
2134      mcmdrc->Clear();      if ( mcmdrc ) mcmdrc->Clear();
2135      mcmdrc = 0;      mcmdrc = 0;
2136            
2137      if ( verbose ) printf(" Clear before new run1 \n");      if ( verbose ) printf(" Clear before new run1 \n");
# Line 1409  anni '50. Line 2170  anni '50.
2170          //          //
2171          // copy orbitalinfoclone to OrbitalInfo          // copy orbitalinfoclone to OrbitalInfo
2172          //          //
2173          orbitalinfo->Clear();          //      orbitalinfo->Clear();
2174          //          //
2175          memcpy(&orbitalinfo,&orbitalinfoclone,sizeof(orbitalinfoclone));          memcpy(&orbitalinfo,&orbitalinfoclone,sizeof(orbitalinfoclone));
2176          //          //
# Line 1425  anni '50. Line 2186  anni '50.
2186    //    //
2187    // Close files, delete old tree(s), write and close level2 file    // Close files, delete old tree(s), write and close level2 file
2188    //    //
2189    
2190    if ( l0File ) l0File->Close();    if ( l0File ) l0File->Close();
2191    if ( myfold ) gSystem->Unlink(tempname.str().c_str());    if ( myfold ) gSystem->Unlink(tempname.str().c_str());
2192    //    //
# Line 1432  anni '50. Line 2194  anni '50.
2194    //    //
2195    if ( file ){    if ( file ){
2196      file->cd();      file->cd();
2197      OrbitalInfotr->Write("OrbitalInfo", TObject::kOverwrite);      if ( OrbitalInfotr ) OrbitalInfotr->Write("OrbitalInfo", TObject::kOverwrite); // 10 RED bug fixed
2198    };    };
2199    //    //
2200    if (verbose) printf("\n Exiting...\n");    if (verbose) printf("\n Exiting...\n");
# Line 1460  anni '50. Line 2222  anni '50.
2222    if ( runinfo ) runinfo->Close();        if ( runinfo ) runinfo->Close();    
2223    if ( runinfo ) delete runinfo;    if ( runinfo ) delete runinfo;
2224    
2225      if ( tcNucleiTrk ){
2226        tcNucleiTrk->Delete();
2227        delete tcNucleiTrk;
2228        tcNucleiTrk = NULL;
2229      }
2230      if ( tcExtNucleiTrk ){
2231        tcExtNucleiTrk->Delete();
2232        delete tcExtNucleiTrk;
2233        tcExtNucleiTrk = NULL;
2234      }
2235      if ( tcExtTrk ){
2236        tcExtTrk->Delete();
2237        delete tcExtTrk;
2238        tcExtTrk = NULL;
2239      }
2240    
2241      if ( tcNucleiTof ){
2242        tcNucleiTof->Delete();
2243        delete tcNucleiTof;
2244        tcNucleiTof = NULL;
2245      }
2246      if ( tcExtNucleiTof ){
2247        tcExtNucleiTof->Delete();
2248        delete tcExtNucleiTof;
2249        tcExtNucleiTof = NULL;
2250      }
2251      if ( tcExtTof ){
2252        tcExtTof->Delete();
2253        delete tcExtTof;
2254        tcExtTrk = NULL;
2255      }
2256    
2257    
2258      if ( tof ) delete tof;
2259      if ( trke ) delete trke;
2260    
2261    if ( debug ){      if ( debug ){  
2262    cout << "1   0x" << OrbitalInfotr << endl;    cout << "1   0x" << OrbitalInfotr << endl;
2263    cout << "2   0x" << OrbitalInfotrclone << endl;    cout << "2   0x" << OrbitalInfotrclone << endl;
# Line 1516  UInt_t holeq(Double_t lower,Double_t upp Line 2314  UInt_t holeq(Double_t lower,Double_t upp
2314    Bool_t R10l = false;     // Sign of R10 mode in lower quaternions array    Bool_t R10l = false;     // Sign of R10 mode in lower quaternions array
2315    Bool_t R10u = false;     // Sign of R10 mode in upper quaternions array    Bool_t R10u = false;     // Sign of R10 mode in upper quaternions array
2316    Bool_t insm = false;     // Sign that we inside quaternions array    Bool_t insm = false;     // Sign that we inside quaternions array
2317    Bool_t mxtml = false;    // Sign of mixt mode in lower quaternions array    //  Bool_t mxtml = false;    // Sign of mixt mode in lower quaternions array
2318    Bool_t mxtmu = false;    // Sign of mixt mode in upper quaternions array    //  Bool_t mxtmu = false;    // Sign of mixt mode in upper quaternions array
2319    Bool_t npasm = false;     // Sign of normall pass between R10 and non R10 or between non R10 and R10    Bool_t npasm = false;     // Sign of normall pass between R10 and non R10 or between non R10 and R10
2320    UInt_t NCQl = 6;       // Number of correct quaternions in lower array    UInt_t NCQl = 6;       // Number of correct quaternions in lower array
2321    UInt_t NCQu = 6;       // Number of correct quaternions in upper array    //  UInt_t NCQu = 6;       // Number of correct quaternions in upper array
2322    if (f>0){    if (f>0){
2323      insm = true;      insm = true;
2324      if(Qupper->time[f]-Qupper->time[f-1]==30) R10u = false;      if(Qupper->time[f]-Qupper->time[f-1]==30) R10u = false;
# Line 1532  UInt_t holeq(Double_t lower,Double_t upp Line 2330  UInt_t holeq(Double_t lower,Double_t upp
2330      if((Qlower->time[5]-Qlower->time[0]==150)&&(Qlower->time[1]-Qlower->time[0]==30)) R10l = false;      if((Qlower->time[5]-Qlower->time[0]==150)&&(Qlower->time[1]-Qlower->time[0]==30)) R10l = false;
2331      if((Qupper->time[5]-Qupper->time[0]==150)&&(Qupper->time[1]-Qupper->time[0]==30)) R10u = false;      if((Qupper->time[5]-Qupper->time[0]==150)&&(Qupper->time[1]-Qupper->time[0]==30)) R10u = false;
2332      if((Qlower->time[5]-Qlower->time[0]<2)&&(Qlower->time[1]-Qlower->time[0]==30)){      if((Qlower->time[5]-Qlower->time[0]<2)&&(Qlower->time[1]-Qlower->time[0]==30)){
2333        mxtml = true;        //      mxtml = true;
2334        for(UInt_t i = 1; i < 6; i++){        for(UInt_t i = 1; i < 6; i++){
2335          if(Qlower->time[i]-Qlower->time[0]==30*i) NCQl=i;          if(Qlower->time[i]-Qlower->time[0]==30*i) NCQl=i;
2336        }        }
2337      }      }
2338      if((Qupper->time[5]-Qupper->time[0]<2)&&(Qupper->time[1]-Qupper->time[0]==30)){      //    if((Qupper->time[5]-Qupper->time[0]<2)&&(Qupper->time[1]-Qupper->time[0]==30)){
2339        mxtmu = true;        //      mxtmu = true;
2340        for(UInt_t i = 1; i < 6; i++){        //      for(UInt_t i = 1; i < 6; i++){
2341          if(Qupper->time[i]-Qupper->time[0]==30*i) NCQu=i;        //        if(Qupper->time[i]-Qupper->time[0]==30*i) NCQu=i;
2342        }        //      }
2343      }      //    }
2344    }    }
2345        
2346    if(((upper-lower==1.5)||(upper-lower==3.)||(upper-lower==30.)||(upper-lower==31.5)||(upper-lower==33.)||(upper-lower==181.5)||(upper-lower==210.)||(upper-lower==211.5))&&!insm) npasm = true;    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;
# Line 1574  void inclresize(vector<Double_t>& t,vect Line 2372  void inclresize(vector<Double_t>& t,vect
2372    Yaw.resize(sizee);    Yaw.resize(sizee);
2373  }  }
2374    
2375  //Find fitting sine functions for q0,q1,q2,q3 and Yaw-angle;  // geomagnetic calculation staff
2376  void sineparam(vector<Sine>& qsine, vector<Double_t>& qtime, vector<Float_t>& q, vector<Float_t>& Roll, vector<Float_t>& Pitch, Float_t limsin){  
2377    UInt_t mulast = 0;  //void GM_ScanIGRF(TString PATH, GMtype_Data *G0, GMtype_Data *G1, GMtype_Data *H1)
2378    UInt_t munow = 0;  void GM_ScanIGRF(TSQLServer *dbc, GMtype_Data *G0, GMtype_Data *G1, GMtype_Data *H1)
2379    UInt_t munext = 0;  {
2380    Bool_t increase = false;    GL_PARAM *glp = new GL_PARAM();
2381    Bool_t decrease = false;    Int_t parerror=glp->Query_GL_PARAM(1,304,dbc); // parameters stored in DB in GL_PRAM table  
2382    Bool_t Max_is_defined = false;    if ( parerror<0 ) {
2383    Bool_t Start_point_is_defined = false;      throw -902;
2384    Bool_t Period_is_defined = false;    }
2385    Bool_t Large_gap = false;          /*This function scans inputs G0, G1, and H1 of the IGRF table into 3 data arrays*/
2386    Bool_t normal_way = true;    //    TString SATH="/data03/Malakhov/pam9Malakhov/installed10/calib/orb-param/";
2387    Bool_t small_gap_on_ridge = false;          int i;
2388    Double_t t1 = 0;          double temp;
2389    Double_t t1A = 0;          char buffer[200];
2390    Int_t sinesize = 0;          FILE *IGRF;
2391    Int_t nfi = 0;          IGRF = fopen((glp->PATH+glp->NAME).Data(), "r");
2392    for(UInt_t mu = 0;mu<qtime.size();mu++){          //      IGRF = fopen(PATH+"IGRF.tab", "r");
2393      //cout<<"Roll["<<mu<<"] = "<<Roll[mu]<<endl;          G0->size = 25;
2394      if(TMath::Abs(Roll[mu])<1. && TMath::Abs(Pitch[mu])<1. && TMath::Abs(q[mu])<limsin){          G1->size = 25;
2395      //cout<<"q["<<mu<<endl<<"] = "<<q[mu]<<endl;          H1->size = 25;
2396      if(mulast!=0 && munow!=0 && munext!=0){mulast=munow;munow=munext;munext=mu;}          for( i = 0; i < 4; i++)
2397      if(munext==0 && munow!=0)munext=mu;          {
2398      if(munow==0 && mulast!=0)munow=mu;                  fgets(buffer, 200, IGRF);
     if(mulast==0)mulast=mu;  
       
     //cout<<"mulast = "<<mulast<<"\tmunow = "<<munow<<"\tmunext = "<<munext<<endl;  
     //Int_t ref;  
     //cin>>ref;  
     if(TMath::Abs(q[munow])>TMath::Abs(q[mulast]) && TMath::Abs(q[munow])>TMath::Abs(q[munext]) && q[mulast]*q[munext]>0 && qtime[munext]-qtime[mulast]>400)small_gap_on_ridge = true;  
     if(munext>mulast && (qtime[munext]-qtime[mulast]>=2000 || qtime[munext]-qtime[mulast]<0)){if(Large_gap){normal_way = false;Large_gap = false;}else{Large_gap = true;normal_way = false;}}else normal_way = true;  
     //if(normal_way)cout<<"Normal_Way"<<endl;  
     if(Large_gap || small_gap_on_ridge){  
       //cout<<"Large gap..."<<endl;  
       //if(small_gap_on_ridge)cout<<"small gap..."<<endl;  
       //cout<<"q["<<mulast<<"] = "<<q[mulast]<<"\tq["<<munow<<"] = "<<q[munow]<<"\tq["<<munext<<"] = "<<q[munext]<<endl;  
       //cout<<"qtime["<<mulast<<"] = "<<qtime[mulast]<<"\tqtime["<<munow<<"] = "<<qtime[munow]<<"\tqtime["<<munext<<"] = "<<qtime[munext]<<endl;  
       increase = false;  
       decrease = false;  
       if(nfi>0){  
         qsine.resize(qsine.size()-1);  
         sinesize = qsine.size();  
         //cout<<"nfi was larger then zero"<<endl;  
       }else{  
         //cout<<"nfi was not larger then zero :( nfi = "<<nfi<<endl;  
         //cout<<"qsine.size = "<<qsine.size()<<endl;  
         if(!Period_is_defined){  
           //cout<<"Period was defined"<<endl;  
           if(qsine.size()>1){  
             qsine[sinesize-1].b = qsine[sinesize-2].b;  
             qsine[sinesize-1].c = qsine[sinesize-2].c;  
           }else{  
             qsine[sinesize-1].b = TMath::Pi()/1591.54;  
             qsine[sinesize-1].c = qsine[sinesize-1].startPoint;  
           }  
         }  
         if(!Max_is_defined){  
           //cout<<"Max was already defined"<<endl;  
           if(qsine.size()>1)qsine[sinesize-1].A = qsine[sinesize-2].A;else qsine[sinesize-1].A = limsin;  
         }  
         qsine[sinesize-1].NeedFit = true;  
       }  
       qsine[sinesize-1].finishPoint = qtime[munow];  
       //cout<<"finish point before large gap = "<<qtime[munow]<<endl;  
       nfi = 0;  
       Max_is_defined = false;  
       Start_point_is_defined = false;  
       Period_is_defined = false;  
       small_gap_on_ridge = false;  
     }  
     //cout<<"Slope "<<increase<<"\t"<<decrease<<endl;  
     //cout<<"mulast = "<<mulast<<"\tmunow = "<<munow<<"\tmunext = "<<munext<<endl;  
     if((munext>munow) && (munow>mulast) && normal_way){  
       if(!increase && !decrease){  
         //cout<<"Normal way have started"<<endl;  
         qsine.resize(qsine.size()+1);  
         sinesize = qsine.size();  
         qsine[sinesize-1].startPoint=qtime[mulast];  
         if(q[munext]>q[munow] && q[munow]>q[mulast]) increase = true;  
         if(q[munext]<q[munow] && q[munow]<q[mulast]) decrease = true;  
       }  
       //if(TMath::Abs(q[munow])>TMath::Abs(q[mulast]) && TMath::Abs(q[munow])>TMath::Abs(q[munext]) && TMath::Abs(q[munow])>limsin && qtime[munow]-qtime[mulast]>=400 || qtime[munext]-qtime[munow]>=400){small_gap_on_ridge = true;mu--;continue;}  
       if(TMath::Abs(q[munow])>TMath::Abs(q[mulast]) && TMath::Abs(q[munow])>TMath::Abs(q[munext]) && TMath::Abs(q[munow])>0.9*limsin && qtime[munow]-qtime[mulast]<400 && qtime[munext]-qtime[munow]<400){  
         //cout<<"Max point is qtime = "<<qtime[munow]<<"\tq = "<<q[munow]<<endl;  
         if(q[munow]>q[mulast]){  
           increase = false;  
           decrease = true;  
         }  
         if(q[munow]<q[mulast]){  
           increase = true;  
           decrease = false;  
2399          }          }
2400          if(Max_is_defined && !Start_point_is_defined){          fscanf(IGRF, "g 1 0 %lf ", &G0->element[0]);
2401            Double_t qPer = qtime[munow]-t1A;          for(i = 1; i <= 22; i++)
2402            if(qPer>1000){          {
2403              //cout<<"qsine["<<sinesize-1<<"] = "<<qPer<<" = "<<qtime[munow]<<" - "<<t1A<<"\tlim = "<<limsin<<endl;                  fscanf(IGRF ,"%lf ", &G0->element[i]);
             qsine[sinesize-1].b=TMath::Pi()/qPer;  
             if(decrease)qsine[sinesize-1].c=-qsine[sinesize-1].b*t1A;  
             if(increase)qsine[sinesize-1].c=-qsine[sinesize-1].b*(t1A-qPer);  
             Period_is_defined = true;  
           }  
2404          }          }
2405          Max_is_defined = true;          fscanf(IGRF ,"%lf\n", &temp);
2406          qsine[sinesize-1].A = TMath::Abs(q[munow]);          G0->element[23] = temp * 5 + G0->element[22];
2407          if(Start_point_is_defined && Period_is_defined){          G0->element[24] = G0->element[23] + 5 * temp;
2408            qsine[sinesize-1].finishPoint = qtime[munow];          fscanf(IGRF, "g 1 1 %lf ", &G1->element[0]);
2409            nfi++;          for(i = 1; i <= 22; i++)
2410            qsine[sinesize-1].NeedFit = false;          {
2411            Max_is_defined = false;                  fscanf( IGRF, "%lf ", &G1->element[i]);
           Start_point_is_defined = false;  
           Period_is_defined = false;  
           qsine.resize(qsine.size()+1);  
           sinesize = qsine.size();  
           qsine[sinesize-1].startPoint = qtime[munow];  
2412          }          }
2413          if(!Start_point_is_defined) t1A=qtime[munow];          fscanf(IGRF, "%lf\n", &temp);
2414        }          G1->element[23] = temp * 5 + G1->element[22];
2415        //if((q[munow]>=0 && q[mulast]<=0) || (q[munow]<=0 && q[mulast]>=0))cout<<"cross zero point diference = "<<qtime[munext] - qtime[mulast]<<"\tqlast = "<<qtime[mulast]<<"\tqnow = "<<qtime[munow]<<"\tqnext = "<<qtime[munext]<<endl;          G1->element[24] = temp * 5 + G1->element[23];
2416        if(((q[munow]>=0 && q[mulast]<=0) || (q[munow]<=0 && q[mulast]>=0)) && qtime[munow]-qtime[mulast]<2000 && qtime[munext]-qtime[munow]<2000){          fscanf(IGRF, "h 1 1 %lf ", &H1->element[0]);
2417          Double_t tcrosszero = 0;          for(i = 1; i <= 22; i++)
2418          //cout<<"cross zero point...qtime = "<<qtime[munow]<<endl;          {
2419          if(q[munow]==0.) tcrosszero = qtime[munow];else                  fscanf( IGRF, "%lf ", &H1->element[i]);
           if(q[mulast]==0.)tcrosszero = qtime[mulast];else{  
             Double_t k_ = (q[munow]-q[mulast])/(qtime[munow]-qtime[mulast]);  
             Double_t b_ = q[munow]-k_*qtime[munow];  
             tcrosszero = -b_/k_;  
           }  
         if(Start_point_is_defined){  
           //cout<<"Start Point allready defined"<<endl;  
           Double_t qPer = tcrosszero - t1;  
           qsine[sinesize-1].b = TMath::Pi()/qPer;  
           //cout<<"qsine["<<sinesize-1<<"].b = "<<TMath::Pi()/qPer<<endl;  
           Period_is_defined = true;  
           Float_t x0 = 0;  
           if(decrease)x0 = t1;  
           if(increase)x0 = tcrosszero;  
           qsine[sinesize-1].c = -qsine[sinesize-1].b*x0;  
           if(Max_is_defined){  
             //cout<<"Max was previous defined"<<endl;  
             qsine[sinesize-1].finishPoint = qtime[munow];  
             nfi++;  
             qsine[sinesize-1].NeedFit = false;  
             Max_is_defined = false;  
             t1 = tcrosszero;  
             Start_point_is_defined = true;  
             Period_is_defined = false;  
             qsine.resize(qsine.size()+1);  
             sinesize = qsine.size();  
             qsine[sinesize-1].startPoint = qtime[munow];  
           }  
         }else{  
           t1 = tcrosszero;  
           Start_point_is_defined = true;  
2420          }          }
2421        }          fscanf(IGRF, "%lf\n", &temp);
2422      }          H1->element[23] = temp * 5 + H1->element[22];
2423      }          H1->element[24] = temp * 5 + H1->element[23];
2424    }    if ( glp ) delete glp;
2425    } /*GM_ScanIGRF*/
2426    
2427    //cout<<"FINISH SINE INTERPOLATION FUNCTION..."<<endl<<endl;  void GM_SetEllipsoid(GMtype_Ellipsoid *Ellip)
2428  }  {
2429            /*This function sets the WGS84 reference ellipsoid to its default values*/
2430            Ellip->a        =                       6378.137; /*semi-major axis of the ellipsoid in */
2431            Ellip->b        =                       6356.7523142;/*semi-minor axis of the ellipsoid in */
2432            Ellip->fla      =                       1/298.257223563;/* flattening */
2433            Ellip->eps      =                       sqrt(1- ( Ellip->b *    Ellip->b) / (Ellip->a * Ellip->a ));  /*first eccentricity */
2434            Ellip->epssq    =                       (Ellip->eps * Ellip->eps);   /*first eccentricity squared */
2435            Ellip->re       =                       6371.2;/* Earth's radius */
2436    } /*GM_SetEllipsoid*/
2437    
2438    
2439    void GM_EarthCartToDipoleCartCD(GMtype_Pole Pole, GMtype_CoordCartesian EarthCoord, GMtype_CoordCartesian *DipoleCoords)
2440    {
2441            /*This function converts from Earth centered cartesian coordinates to dipole centered cartesian coordinates*/
2442            double X, Y, Z, CosPhi, SinPhi, CosLambda, SinLambda;
2443            CosPhi = cos(TMath::DegToRad()*Pole.phi);
2444            SinPhi = sin(TMath::DegToRad()*Pole.phi);
2445            CosLambda = cos(TMath::DegToRad()*Pole.lambda);
2446            SinLambda = sin(TMath::DegToRad()*Pole.lambda);
2447            X = EarthCoord.x;
2448            Y = EarthCoord.y;
2449            Z = EarthCoord.z;
2450            
2451            /*These equations are taken from a document by Wallace H. Campbell*/
2452            DipoleCoords->x = X * CosPhi * CosLambda + Y * CosPhi * SinLambda - Z * SinPhi;
2453            DipoleCoords->y = -X * SinLambda + Y * CosLambda;
2454            DipoleCoords->z = X * SinPhi * CosLambda + Y * SinPhi * SinLambda + Z * CosPhi;
2455    } /*GM_EarthCartToDipoleCartCD*/
2456    
2457    void GM_GeodeticToSpherical(GMtype_Ellipsoid Ellip, GMtype_CoordGeodetic CoordGeodetic, GMtype_CoordSpherical *CoordSpherical)
2458    {
2459            double CosLat, SinLat, rc, xp, zp; /*all local variables */
2460            /*
2461            ** Convert geodetic coordinates, (defined by the WGS-84
2462            ** reference ellipsoid), to Earth Centered Earth Fixed Cartesian
2463            ** coordinates, and then to spherical coordinates.
2464            */
2465    
2466            CosLat = cos(TMath::DegToRad()*CoordGeodetic.phi);
2467            SinLat = sin(TMath::DegToRad()*CoordGeodetic.phi);
2468    
2469            /* compute the local radius of curvature on the WGS-84 reference ellipsoid */
2470    
2471            rc = Ellip.a / sqrt(1.0 - Ellip.epssq * SinLat * SinLat);
2472    
2473            /* compute ECEF Cartesian coordinates of specified point (for longitude=0) */
2474    
2475            xp = (rc + CoordGeodetic.HeightAboveEllipsoid) * CosLat;
2476            zp = (rc*(1.0 - Ellip.epssq) + CoordGeodetic.HeightAboveEllipsoid) * SinLat;
2477    
2478            /* compute spherical radius and angle lambda and phi of specified point */
2479    
2480            CoordSpherical->r = sqrt(xp * xp + zp * zp);
2481            CoordSpherical->phig = TMath::RadToDeg()*asin(zp / CoordSpherical->r);     /* geocentric latitude */
2482            CoordSpherical->lambda = CoordGeodetic.lambda;                   /* longitude */
2483    } /*GM_GeodeticToSpherical*/
2484    
2485    void GM_PoleLocation(GMtype_Model Model, GMtype_Pole *Pole)
2486    {
2487            /*This function finds the location of the north magnetic pole in spherical coordinates.  The equations are
2488            **from Wallace H. Campbell's Introduction to Geomagnetic Fields*/
2489    
2490            Pole->phi = TMath::RadToDeg()*-atan(sqrt(Model.h1 * Model.h1 + Model.g1 * Model.g1)/Model.g0);
2491            Pole->lambda = TMath::RadToDeg()*atan(Model.h1/Model.g1);
2492    } /*GM_PoleLocation*/
2493    
2494    void GM_SphericalToCartesian(GMtype_CoordSpherical CoordSpherical, GMtype_CoordCartesian *CoordCartesian)
2495    {
2496            /*This function converts spherical coordinates into Cartesian coordinates*/
2497            double CosPhi = cos(TMath::DegToRad()*CoordSpherical.phig);
2498            double SinPhi = sin(TMath::DegToRad()*CoordSpherical.phig);
2499            double CosLambda = cos(TMath::DegToRad()*CoordSpherical.lambda);
2500            double SinLambda = sin(TMath::DegToRad()*CoordSpherical.lambda);
2501            
2502            CoordCartesian->x = CoordSpherical.r * CosPhi * CosLambda;
2503            CoordCartesian->y = CoordSpherical.r * CosPhi * SinLambda;
2504            CoordCartesian->z = CoordSpherical.r * SinPhi;
2505    } /*GM_SphericalToCartesian*/
2506    
2507    void GM_TimeAdjustCoefs(Float_t year, Float_t jyear, GMtype_Data g0d, GMtype_Data g1d, GMtype_Data h1d, GMtype_Model *Model)
2508    {
2509            /*This function calls GM_LinearInterpolation for the coefficients to estimate the value of the
2510            **coefficient for the given date*/
2511            int index;
2512            double x;
2513            index = (year - GM_STARTYEAR) / 5;
2514            x = (jyear - GM_STARTYEAR) / 5;
2515            Model->g0 = GM_LinearInterpolation(index, index+1, g0d.element[index], g0d.element[index+1], x);
2516            Model->g1 = GM_LinearInterpolation(index, index+1, g1d.element[index], g1d.element[index+1], x);
2517            Model->h1 = GM_LinearInterpolation(index, index+1, h1d.element[index], h1d.element[index+1], x);
2518    } /*GM_TimeAdjustCoefs*/
2519    
2520    double GM_LinearInterpolation(double x1, double x2, double y1, double y2, double x)
2521    {
2522            /*This function takes a linear interpolation between two given points for x*/
2523            double weight, y;
2524            weight  = (x - x1) / (x2 - x1);
2525            y = y1 * (1 - weight) + y2 * weight;
2526            return y;
2527    }/*GM_LinearInterpolation*/
2528    
2529    void GM_CartesianToSpherical(GMtype_CoordCartesian CoordCartesian, GMtype_CoordSpherical *CoordSpherical)
2530    {
2531            /*This function converts a point from Cartesian coordinates into spherical coordinates*/
2532            double X, Y, Z;
2533            
2534            X = CoordCartesian.x;
2535            Y = CoordCartesian.y;
2536            Z = CoordCartesian.z;
2537    
2538            CoordSpherical->r = sqrt(X * X + Y * Y + Z * Z);
2539            CoordSpherical->phig = TMath::RadToDeg()*asin(Z / (CoordSpherical->r));
2540            CoordSpherical->lambda = TMath::RadToDeg()*atan2(Y, X);
2541    } /*GM_CartesianToSpherical*/

Legend:
Removed from v.1.60  
changed lines
  Added in v.1.77

  ViewVC Help
Powered by ViewVC 1.1.23