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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.85 - (show annotations) (download)
Mon Mar 30 13:37:22 2015 UTC (10 years, 8 months ago) by mocchiut
Branch: MAIN
Changes since 1.84: +2 -2 lines
OI: icode bug fixed

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

  ViewVC Help
Powered by ViewVC 1.1.23