/[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.89 - (show annotations) (download)
Fri Apr 3 12:40:12 2015 UTC (10 years, 8 months ago) by pam-ts
Branch: MAIN
Changes since 1.88: +2 -2 lines
misprint with parenthesis corrected

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 Bool_t tgpar=false;
1671 Bool_t tgpar0=false;
1672 if (orbitalinfo->TimeGap>10.0 || ((modf(orbitalinfo->TimeGap,&tmptg)*1000>10 || modf(orbitalinfo->TimeGap,&tmptg)*1000==0.0) && orbitalinfo->TimeGap>2.0)) tgpar=true;
1673 if (orbitalinfo->TimeGap>180.0) tgpar0=true;
1674 if(MU!=0){
1675 // if(orbitalinfo->TimeGap>0 && errq==0 && azim==0){ // 10RED CHECK (comparison between three metod of recovering orientation)
1676 if((atime>=RTstart[MU] && atime<RTstart[MU+1] && RTbank1[MU]==0 && RTbank2[MU]==0 && (TMath::Abs(orbitalinfo->etha)>0.1 || tgpar0)) || ((RTbank1[MU]!=0 || RTbank2[MU]!=0) && atime>=RTstart[MU] && atime<RTstart[MU+1] && azim==0 && (errq!=0 || tgpar))){
1677 //found in Rotation Table this data for this time interval
1678 if(atime<RTtime1[0])
1679 orbitalinfo->azim = 5; //means that RotationTable no started yet
1680 else{
1681 // search for angle betwean velosity and direction to north in tangential to Earth surfase plane in satellite position
1682 Double_t bank=RTstart[MU];
1683 Double_t tlat=orbitalinfo->lat;
1684
1685 tg=modf(orbitalinfo->TimeGap,&tg)*1000;
1686
1687 if(atime>=RTpluto1[MU] && atime<=RTpluto2[MU]){
1688 Double_t kar=(RTbank2[MU]-RTbank1[MU])/(RTtime2[MU]-RTtime1[MU]);
1689 Double_t bak=RTbank1[MU]-kar*RTtime1[MU];
1690 bank=kar*atime+bak;
1691 }
1692 if(atime>=RTstart[MU] && atime<RTpluto1[MU]){
1693 Double_t s_dBdt2=(RTbpluto1[MU]-RTbank1[MU])/(Int_t)(RTpluto1[MU]-RTstart[MU]);
1694 Double_t s_t2=((Double_t)RTpluto1[MU]+(Double_t)RTstart[MU])/2. - RTstart[MU];
1695 Double_t s_t1=RTstart[MU]-RTstart[MU];
1696 Double_t s_k=s_dBdt2/(s_t2-s_t1);
1697 Double_t s_b=-s_k*s_t1;
1698 Double_t s_t3=RTpluto1[MU]-RTstart[MU];
1699 Double_t s_b3=RTbpluto1[MU];
1700 Double_t s_c=s_b3-0.5*s_k*s_t3*s_t3 -s_b*s_t3;
1701 bank=0.5*s_k*(atime-RTstart[MU])*(atime-RTstart[MU]) + s_b*(atime-RTstart[MU]) + s_c;
1702 }
1703 if(atime>RTpluto2[MU] && atime<=RTstart[MU+1]){
1704 Double_t s_dBdt2=(RTbpluto2[MU] - RTbank2[MU])/(Int_t)(RTpluto2[MU]-RTstart[MU+1]);
1705 Double_t s_t2=((Double_t)RTpluto2[MU]+(Double_t)RTstart[MU+1])/2. - RTstart[MU];
1706 Double_t s_t1=RTstart[MU+1]-RTstart[MU];
1707 Double_t s_k=s_dBdt2/(s_t2-s_t1);
1708 Double_t s_b=-s_k*s_t1;
1709 Double_t s_t3=RTpluto2[MU]-RTstart[MU];
1710 Double_t s_b3=RTbpluto2[MU];
1711 Double_t s_c=s_b3-0.5*s_k*s_t3*s_t3 -s_b*s_t3;
1712 bank=0.5*s_k*(atime-RTstart[MU])*(atime-RTstart[MU]) + s_b*(atime-RTstart[MU]) + s_c;
1713 }
1714 if(TMath::Abs(orbitalinfo->etha-bank)>0.1){
1715 orbitalinfo->etha=bank;
1716 Double_t spitch = 0.00001; // temprary not zero to avoid problem with tranzition from Euler angles to orientation matrix
1717
1718 //Estimations of pitch angle of satellite
1719 if(TMath::Abs(bank)>0.7){
1720 Float_t spitch1=TMath::DegToRad()*0.7*diro;//RTdir1[MU];
1721 Float_t spitch2=TMath::DegToRad()*0.7*diro;//RTdir2[MU];
1722 Float_t kva=(spitch2-spitch1)/(RTtime2[MU]-RTtime1[MU]);
1723 Float_t bva=spitch1-kva*RTtime1[MU];
1724 spitch=kva*atime+bva;
1725 }
1726
1727 //Calculate Yaw angle accordingly with fit, see picture FitYaw.jpg
1728 Double_t yaw=0.00001; // temprary not zero to avoid problem with tranzition from Euler angles to orientation matrix
1729 if(TMath::Abs(tlat)<70)
1730 yaw = -3.7e-8*tlat*tlat*tlat*tlat + 1.4e-7*tlat*tlat*tlat - 0.0005*tlat*tlat - 0.00025*tlat + 3.6;
1731 yaw = diro*yaw; //because should be different sign for ascending and descending orbits!
1732 orbitalinfo->phi=yaw;
1733
1734 if(TMath::Abs(bank)>0.5 && TMath::Abs(yaw-orbitalinfo->phi)<3.0) yaw=orbitalinfo->phi;
1735
1736 // 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
1737 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
1738 orbitalinfo->qkind = 1;
1739 }
1740
1741 //Qij = PO->GEOtoECI(Dij,orbitalinfo->absTime,orbitalinfo->lat,orbitalinfo->lon); // to convert from Dij to Qij
1742
1743 } // end of if(atime<RTtime1[0]
1744 } // end of (((orbitalinfo->TimeGap>60.0 && TMath...
1745 } // end of MU~=0
1746
1747 TMatrixD qij = PO->ColPermutation(Qij);
1748 TMatrixD Fij = PO->ECItoGreenwich(Qij,orbitalinfo->absTime);
1749 TMatrixD Gij = PO->ColPermutation(Fij);
1750 Dij = PO->ECItoGEO(Qij,orbitalinfo->absTime,orbitalinfo->lat,orbitalinfo->lon);
1751 TMatrixD Iij = PO->ColPermutation(Dij);
1752 TVector3 SP = PO->GetSunPosition(orbitalinfo->absTime);
1753 // go to Pamela reference frame from Resurs reference frame
1754 Float_t tmpy = SP.Y();
1755 SP.SetY(SP.Z());
1756 SP.SetZ(-tmpy);
1757 TVector3 SunZenith;
1758 SunZenith.SetMagThetaPhi(1,23.439281*TMath::DegToRad(),TMath::Pi()/2.);
1759 TVector3 SunMag = -SP;
1760 SunMag.Rotate(-45*TMath::DegToRad(),SunZenith);
1761 tmpy=SunMag.Y();
1762 SunMag.SetY(SunMag.Z());
1763 SunMag.SetZ(-tmpy);
1764
1765 orbitalinfo->Iij.ResizeTo(Iij);
1766 orbitalinfo->Iij = Iij;
1767
1768 Bool_t saso=true;
1769 if (orbitalinfo->qkind==1) saso=true;
1770 if (orbitalinfo->qkind==0 && orbitalinfo->azim>=0 && orbitalinfo->azim!=5 && tgpar) saso=false;
1771 if (orbitalinfo->qkind==0 && orbitalinfo->axim==5 && TMath::Abs(orbitalinfo->etha)>0.1 && tgpar) saso=false;
1772 if (orbitalinfo->qkind==0 && orbitalinfo->azim==5 && TMath::Abs(orbitalinfo->etha)<=0.1 && tgpar0) saso=false;
1773 if (saso) orbitalinfo->mode=orbitalinfo->rtqual; else orbitalinfo->mode=2;
1774
1775 //
1776 // A1 = Iij(0,2);
1777 // A2 = Iij(1,2);
1778 // A3 = Iij(2,2);
1779 //
1780 // orbitalinfo->pamzenitangle = (Float_t)PO->GetPitchAngle(1,0,0,A1,A2,A3); // Angle between zenit and Pamela's main axiz
1781 // orbitalinfo->pamBangle = (Float_t)PO->GetPitchAngle(A1,A2,A3,Bx,By,Bz); // Angle between Pamela's main axiz and B
1782 //
1783 if ( debug ) printf(" matrixes done \n");
1784 if ( !standalone ){
1785 if ( debug ) printf(" !standalone \n");
1786 //
1787 // Standard tracking algorithm
1788 //
1789 Int_t nn = 0;
1790 if ( verbose ) printf(" standard tracking \n");
1791 for(Int_t nt=0; nt < tof->ntrk(); nt++){
1792 //
1793 ToFTrkVar *ptt = tof->GetToFTrkVar(nt);
1794 if (debug) cout<<"tof->ntrk() = "<<tof->ntrk()<<"\tptt->trkseqno = "<<ptt->trkseqno<<"\ttrke->ntrk() = "<<trke->ntrk()<<endl;
1795 Double_t E11x = ptt->xtr_tof[0]; // tr->x[0];
1796 Double_t E11y = ptt->ytr_tof[0]; //tr->y[0];
1797 Double_t E11z = zin[0];
1798 Double_t E22x = ptt->xtr_tof[3];//tr->x[3];
1799 Double_t E22y = ptt->ytr_tof[3];//tr->y[3];
1800 Double_t E22z = zin[3];
1801 if ( (E11x < 100. && E11y < 100. && E22x < 100. && E22y < 100.) || ptt->trkseqno != -1 ){
1802 TrkTrack *mytrack = trke->GetStoredTrack(ptt->trkseqno);
1803 Float_t rig=1/mytrack->GetDeflection();
1804 Double_t norm = sqrt(pow(E22x-E11x,2)+pow(E22y-E11y,2)+pow(E22z-E11z,2));
1805 //
1806 Px = (E22x-E11x)/norm;
1807 Py = (E22y-E11y)/norm;
1808 Pz = (E22z-E11z)/norm;
1809 //
1810 t_orb->trkseqno = ptt->trkseqno;
1811 //
1812 TMatrixD Eij = PO->PamelatoGEO(Iij,Px,Py,Pz);
1813 t_orb->Eij.ResizeTo(Eij);
1814 t_orb->Eij = Eij;
1815 //
1816 TMatrixD Sij = PO->PamelatoGEO(Gij,Px,Py,Pz);
1817 t_orb->Sij.ResizeTo(Sij);
1818 t_orb->Sij = Sij;
1819 //
1820 t_orb->pitch = (Float_t)PO->GetPitchAngle(Eij(0,0),Eij(1,0),Eij(2,0),Bx,By,Bz);
1821 //
1822 // SunPosition in instrumental reference frame
1823 TMatrixD Kij = PO->PamelatoGEO(qij,Px,Py,Pz);
1824 TMatrixD Lij = PO->PamelatoGEO(qij,0,0,1);
1825 t_orb->sunangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),-SP.X(),-SP.Y(),-SP.Z());
1826 t_orb->sunmagangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),SunMag.X(),SunMag.Y(),SunMag.Z());
1827 //
1828 //
1829 Double_t omega = PO->GetPitchAngle(-Eij(0,0),-Eij(1,0),-Eij(2,0),1,0,0) * TMath::DegToRad();
1830 TVector3 Bxy(0,By,Bz);
1831 TVector3 Exy(0,-Eij(1,0),-Eij(2,0));
1832 Double_t dzeta=Bxy.Angle(Exy);
1833 if (-Eij(1,0) < 0) dzeta=2.0*TMath::Pi() - dzeta;
1834
1835 if(debug) cout << "omega = "<<omega*TMath::RadToDeg()<<"\tdzeta = "<<dzeta*TMath::RadToDeg()<<endl;
1836
1837 // Formula from D.F. Smart *, M.A. Shea [2005]; A review of geomagnetic cutoff rigidities for earth-orbiting spacecraft
1838 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));
1839 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));
1840 if (debug) cout << "R = " << rig << "\tcutoff = " << t_orb->cutoff << endl;
1841
1842 //
1843 if ( t_orb->pitch != t_orb->pitch ) t_orb->pitch = -1000.;
1844 if ( t_orb->cutoff != t_orb->cutoff ) t_orb->cutoff = -1000.;
1845 if ( t_orb->sunangle != t_orb->sunangle ) t_orb->sunangle = -1000.;
1846 if ( t_orb->sunmagangle != t_orb->sunmagangle ) t_orb->sunmagangle = -1000.;
1847 //
1848 if ( debug ) printf(" orbitalinfo->cutoffsvl %f vitaly %f \n",orbitalinfo->cutoffsvl,t_orb->cutoff);
1849 //
1850 new(tor[nn]) OrbitalInfoTrkVar(*t_orb);
1851 nn++;
1852 //
1853 t_orb->Clear();
1854 //
1855 }
1856 //
1857 } // end standard tracking algorithm
1858
1859 //
1860 // Code for extended tracking algorithm:
1861 //
1862 if ( hasNucleiTrk ){
1863 Int_t ttentry = 0;
1864 if ( verbose ) printf(" hasNucleiTrk \n");
1865 for(Int_t nt=0; nt < tcNucleiTof->GetEntries() ; nt++){
1866 //
1867 if ( verbose ) printf(" got1\n");
1868 ToFTrkVar *ptt = (ToFTrkVar*)(tcNucleiTof->At(nt));
1869 if (verbose) cout<<" tcNucleiTof->GetEntries() = "<<tcNucleiTof->GetEntries()<<"\tptt->trkseqno = "<<ptt->trkseqno<<endl;
1870 Double_t E11x = ptt->xtr_tof[0]; // tr->x[0];
1871 Double_t E11y = ptt->ytr_tof[0]; //tr->y[0];
1872 Double_t E11z = zin[0];
1873 Double_t E22x = ptt->xtr_tof[3];//tr->x[3];
1874 Double_t E22y = ptt->ytr_tof[3];//tr->y[3];
1875 Double_t E22z = zin[3];
1876 if ( (E11x < 100. && E11y < 100. && E22x < 100. && E22y < 100.) || ptt->trkseqno != -1 ){
1877 TrkTrack *mytrack = (TrkTrack*)(tcNucleiTrk->At(ptt->trkseqno));
1878 if ( verbose ) printf(" got tcNucleiTrk \n");
1879 Float_t rig=1/mytrack->GetDeflection();
1880 Double_t norm = sqrt(pow(E22x-E11x,2)+pow(E22y-E11y,2)+pow(E22z-E11z,2));
1881 //
1882 Px = (E22x-E11x)/norm;
1883 Py = (E22y-E11y)/norm;
1884 Pz = (E22z-E11z)/norm;
1885 //
1886 t_orb->trkseqno = ptt->trkseqno;
1887 //
1888 TMatrixD Eij = PO->PamelatoGEO(Iij,Px,Py,Pz);
1889 t_orb->Eij.ResizeTo(Eij);
1890 t_orb->Eij = Eij;
1891 //
1892 TMatrixD Sij = PO->PamelatoGEO(Gij,Px,Py,Pz);
1893 t_orb->Sij.ResizeTo(Sij);
1894 t_orb->Sij = Sij;
1895 //
1896 t_orb->pitch = (Float_t)PO->GetPitchAngle(Eij(0,0),Eij(1,0),Eij(2,0),Bx,By,Bz);
1897 //
1898 // SunPosition in instrumental reference frame
1899 TMatrixD Kij = PO->PamelatoGEO(qij,Px,Py,Pz);
1900 TMatrixD Lij = PO->PamelatoGEO(qij,0,0,1);
1901 t_orb->sunangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),-SP.X(),-SP.Y(),-SP.Z());
1902 t_orb->sunmagangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),SunMag.X(),SunMag.Y(),SunMag.Z());
1903 //
1904 //
1905 Double_t omega = PO->GetPitchAngle(-Eij(0,0),-Eij(1,0),-Eij(2,0),1,0,0) * TMath::DegToRad();
1906 TVector3 Bxy(0,By,Bz);
1907 TVector3 Exy(0,-Eij(1,0),-Eij(2,0));
1908 Double_t dzeta=Bxy.Angle(Exy);
1909 if (-Eij(1,0) < 0) dzeta=2.0*TMath::Pi() - dzeta;
1910
1911 if(debug) cout << "omega = "<<omega*TMath::RadToDeg()<<"\tdzeta = "<<dzeta*TMath::RadToDeg()<<endl;
1912
1913 // Formula from D.F. Smart *, M.A. Shea [2005]; A review of geomagnetic cutoff rigidities for earth-orbiting spacecraft
1914 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));
1915 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));
1916 if (debug) cout << "R = " << rig << "\tcutoff = " << t_orb->cutoff << endl;
1917
1918 //
1919 if ( t_orb->pitch != t_orb->pitch ) t_orb->pitch = -1000.;
1920 if ( t_orb->cutoff != t_orb->cutoff ) t_orb->cutoff = -1000.;
1921 if ( t_orb->sunangle != t_orb->sunangle ) t_orb->sunangle = -1000.;
1922 if ( t_orb->sunmagangle != t_orb->sunmagangle ) t_orb->sunmagangle = -1000.;
1923 //
1924 if ( debug ) printf(" orbitalinfo->cutoffsvl %f vitaly %f \n",orbitalinfo->cutoffsvl,t_orb->cutoff);
1925 //
1926 TClonesArray &tt1 = *torbNucleiTrk;
1927 new(tt1[ttentry]) OrbitalInfoTrkVar(*t_orb);
1928 ttentry++;
1929 //
1930 t_orb->Clear();
1931 //
1932 }
1933 //
1934 }
1935 } // end standard tracking algorithm: nuclei
1936 if ( hasExtNucleiTrk ){
1937 Int_t ttentry = 0;
1938 if ( verbose ) printf(" hasExtNucleiTrk \n");
1939 for(Int_t nt=0; nt < tcExtNucleiTof->GetEntries() ; nt++){
1940 //
1941 if ( verbose ) printf(" got2\n");
1942 ToFTrkVar *ptt = (ToFTrkVar*)(tcExtNucleiTof->At(nt));
1943 if (verbose) cout<<" tcExtNucleiTof->GetEntries() = "<<tcExtNucleiTof->GetEntries()<<"\tptt->trkseqno = "<<ptt->trkseqno<<endl;
1944 Double_t E11x = ptt->xtr_tof[0]; // tr->x[0];
1945 Double_t E11y = ptt->ytr_tof[0]; //tr->y[0];
1946 Double_t E11z = zin[0];
1947 Double_t E22x = ptt->xtr_tof[3];//tr->x[3];
1948 Double_t E22y = ptt->ytr_tof[3];//tr->y[3];
1949 Double_t E22z = zin[3];
1950 if ( (E11x < 100. && E11y < 100. && E22x < 100. && E22y < 100.) || ptt->trkseqno != -1 ){
1951 ExtTrack *mytrack = (ExtTrack*)(tcExtNucleiTrk->At(ptt->trkseqno));
1952 if ( verbose ) printf(" got tcExtNucleiTrk \n");
1953 Float_t rig=1/mytrack->GetDeflection();
1954 Double_t norm = sqrt(pow(E22x-E11x,2)+pow(E22y-E11y,2)+pow(E22z-E11z,2));
1955 //
1956 Px = (E22x-E11x)/norm;
1957 Py = (E22y-E11y)/norm;
1958 Pz = (E22z-E11z)/norm;
1959 //
1960 t_orb->trkseqno = ptt->trkseqno;
1961 //
1962 TMatrixD Eij = PO->PamelatoGEO(Iij,Px,Py,Pz);
1963 t_orb->Eij.ResizeTo(Eij);
1964 t_orb->Eij = Eij;
1965 //
1966 TMatrixD Sij = PO->PamelatoGEO(Gij,Px,Py,Pz);
1967 t_orb->Sij.ResizeTo(Sij);
1968 t_orb->Sij = Sij;
1969 //
1970 t_orb->pitch = (Float_t)PO->GetPitchAngle(Eij(0,0),Eij(1,0),Eij(2,0),Bx,By,Bz);
1971 //
1972 // SunPosition in instrumental reference frame
1973 TMatrixD Kij = PO->PamelatoGEO(qij,Px,Py,Pz);
1974 TMatrixD Lij = PO->PamelatoGEO(qij,0,0,1);
1975 t_orb->sunangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),-SP.X(),-SP.Y(),-SP.Z());
1976 t_orb->sunmagangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),SunMag.X(),SunMag.Y(),SunMag.Z());
1977 //
1978 //
1979 Double_t omega = PO->GetPitchAngle(-Eij(0,0),-Eij(1,0),-Eij(2,0),1,0,0) * TMath::DegToRad();
1980 TVector3 Bxy(0,By,Bz);
1981 TVector3 Exy(0,-Eij(1,0),-Eij(2,0));
1982 Double_t dzeta=Bxy.Angle(Exy);
1983 if (-Eij(1,0) < 0) dzeta=2.0*TMath::Pi() - dzeta;
1984
1985 if(debug) cout << "omega = "<<omega*TMath::RadToDeg()<<"\tdzeta = "<<dzeta*TMath::RadToDeg()<<endl;
1986
1987 // Formula from D.F. Smart *, M.A. Shea [2005]; A review of geomagnetic cutoff rigidities for earth-orbiting spacecraft
1988 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));
1989 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));
1990 if (debug) cout << "R = " << rig << "\tcutoff = " << t_orb->cutoff << endl;
1991
1992 //
1993 if ( t_orb->pitch != t_orb->pitch ) t_orb->pitch = -1000.;
1994 if ( t_orb->cutoff != t_orb->cutoff ) t_orb->cutoff = -1000.;
1995 if ( t_orb->sunangle != t_orb->sunangle ) t_orb->sunangle = -1000.;
1996 if ( t_orb->sunmagangle != t_orb->sunmagangle ) t_orb->sunmagangle = -1000.;
1997 //
1998 if ( debug ) printf(" orbitalinfo->cutoffsvl %f vitaly %f \n",orbitalinfo->cutoffsvl,t_orb->cutoff);
1999 //
2000 TClonesArray &tt2 = *torbExtNucleiTrk;
2001 new(tt2[ttentry]) OrbitalInfoTrkVar(*t_orb);
2002 ttentry++;
2003 //
2004 t_orb->Clear();
2005 //
2006 }
2007 //
2008 }
2009 } // end standard tracking algorithm: nuclei extended
2010 if ( hasExtTrk ){
2011 Int_t ttentry = 0;
2012 if ( verbose ) printf(" hasExtTrk \n");
2013 for(Int_t nt=0; nt < tcExtTof->GetEntries() ; nt++){
2014 //
2015 if ( verbose ) printf(" got3\n");
2016 ToFTrkVar *ptt = (ToFTrkVar*)(tcExtTof->At(nt));
2017 if (verbose) cout<<" tcExtTof->GetEntries() = "<<tcExtTof->GetEntries()<<"\tptt->trkseqno = "<<ptt->trkseqno<<endl;
2018 Double_t E11x = ptt->xtr_tof[0]; // tr->x[0];
2019 Double_t E11y = ptt->ytr_tof[0]; //tr->y[0];
2020 Double_t E11z = zin[0];
2021 Double_t E22x = ptt->xtr_tof[3];//tr->x[3];
2022 Double_t E22y = ptt->ytr_tof[3];//tr->y[3];
2023 Double_t E22z = zin[3];
2024 if ( (E11x < 100. && E11y < 100. && E22x < 100. && E22y < 100.) || ptt->trkseqno != -1 ){
2025 ExtTrack *mytrack = (ExtTrack*)(tcExtTrk->At(ptt->trkseqno));
2026 if ( verbose ) printf(" got tcExtTrk \n");
2027 Float_t rig=1/mytrack->GetDeflection();
2028 Double_t norm = sqrt(pow(E22x-E11x,2)+pow(E22y-E11y,2)+pow(E22z-E11z,2));
2029 //
2030 Px = (E22x-E11x)/norm;
2031 Py = (E22y-E11y)/norm;
2032 Pz = (E22z-E11z)/norm;
2033 //
2034 t_orb->trkseqno = ptt->trkseqno;
2035 //
2036 TMatrixD Eij = PO->PamelatoGEO(Iij,Px,Py,Pz);
2037 t_orb->Eij.ResizeTo(Eij);
2038 t_orb->Eij = Eij;
2039 //
2040 TMatrixD Sij = PO->PamelatoGEO(Gij,Px,Py,Pz);
2041 t_orb->Sij.ResizeTo(Sij);
2042 t_orb->Sij = Sij;
2043 //
2044 t_orb->pitch = (Float_t)PO->GetPitchAngle(Eij(0,0),Eij(1,0),Eij(2,0),Bx,By,Bz);
2045 //
2046 // SunPosition in instrumental reference frame
2047 TMatrixD Kij = PO->PamelatoGEO(qij,Px,Py,Pz);
2048 TMatrixD Lij = PO->PamelatoGEO(qij,0,0,1);
2049 t_orb->sunangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),-SP.X(),-SP.Y(),-SP.Z());
2050 t_orb->sunmagangle=(Float_t)PO->GetPitchAngle(Kij(0,0),Kij(1,0),Kij(2,0),SunMag.X(),SunMag.Y(),SunMag.Z());
2051 //
2052 //
2053 Double_t omega = PO->GetPitchAngle(-Eij(0,0),-Eij(1,0),-Eij(2,0),1,0,0) * TMath::DegToRad();
2054 TVector3 Bxy(0,By,Bz);
2055 TVector3 Exy(0,-Eij(1,0),-Eij(2,0));
2056 Double_t dzeta=Bxy.Angle(Exy);
2057 if (-Eij(1,0) < 0) dzeta=2.0*TMath::Pi() - dzeta;
2058
2059 if(debug) cout << "omega = "<<omega*TMath::RadToDeg()<<"\tdzeta = "<<dzeta*TMath::RadToDeg()<<endl;
2060
2061 // Formula from D.F. Smart *, M.A. Shea [2005]; A review of geomagnetic cutoff rigidities for earth-orbiting spacecraft
2062 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));
2063 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));
2064 if (debug) cout << "R = " << rig << "\tcutoff = " << t_orb->cutoff << endl;
2065
2066 //
2067 if ( t_orb->pitch != t_orb->pitch ) t_orb->pitch = -1000.;
2068 if ( t_orb->cutoff != t_orb->cutoff ) t_orb->cutoff = -1000.;
2069 if ( t_orb->sunangle != t_orb->sunangle ) t_orb->sunangle = -1000.;
2070 if ( t_orb->sunmagangle != t_orb->sunmagangle ) t_orb->sunmagangle = -1000.;
2071 //
2072 if ( debug ) printf(" orbitalinfo->cutoffsvl %f vitaly %f \n",orbitalinfo->cutoffsvl,t_orb->cutoff);
2073 //
2074 TClonesArray &tt3 = *torbExtTrk;
2075 new(tt3[ttentry]) OrbitalInfoTrkVar(*t_orb);
2076 ttentry++;
2077 //
2078 t_orb->Clear();
2079 //
2080 }
2081 //
2082 }
2083 } // end standard tracking algorithm: extended
2084
2085 } else {
2086 if ( debug ) printf(" mmm... mode %u standalone \n",orbitalinfo->mode);
2087 }
2088 //
2089 } else { // HERE IT MISS ALL CODE FOR EXTENDED TRACKING!
2090 if ( !standalone ){
2091 //
2092 if ( verbose ) printf(" no orb info for tracks \n");
2093 Int_t nn = 0;
2094 for(Int_t nt=0; nt < tof->ntrk(); nt++){
2095 //
2096 ToFTrkVar *ptt = tof->GetToFTrkVar(nt);
2097 if ( ptt->trkseqno != -1 ){
2098 //
2099 t_orb->trkseqno = ptt->trkseqno;
2100 //
2101 t_orb->Eij = 0;
2102 //
2103 t_orb->Sij = 0;
2104 //
2105 t_orb->pitch = -1000.;
2106 //
2107 t_orb->sunangle = -1000.;
2108 //
2109 t_orb->sunmagangle = -1000;
2110 //
2111 t_orb->cutoff = -1000.;
2112 //
2113 new(tor[nn]) OrbitalInfoTrkVar(*t_orb);
2114 nn++;
2115 //
2116 t_orb->Clear();
2117 //
2118 }
2119 //
2120 }
2121 //
2122 // Code for extended tracking algorithm:
2123 //
2124 if ( hasNucleiTrk ){
2125 Int_t ttentry = 0;
2126 if ( verbose ) printf(" hasNucleiTrk \n");
2127 for(Int_t nt=0; nt < tcNucleiTof->GetEntries() ; nt++){
2128 //
2129 ToFTrkVar *ptt = (ToFTrkVar*)(tcNucleiTof->At(nt));
2130 if ( ptt->trkseqno != -1 ){
2131 //
2132 t_orb->trkseqno = ptt->trkseqno;
2133 //
2134 t_orb->Eij = 0;
2135 //
2136 t_orb->Sij = 0;
2137 //
2138 t_orb->pitch = -1000.;
2139 //
2140 t_orb->sunangle = -1000.;
2141 //
2142 t_orb->sunmagangle = -1000;
2143 //
2144 t_orb->cutoff = -1000.;
2145 //
2146 TClonesArray &tz1 = *torbNucleiTrk;
2147 new(tz1[ttentry]) OrbitalInfoTrkVar(*t_orb);
2148 ttentry++;
2149 //
2150 t_orb->Clear();
2151 //
2152 }
2153 //
2154 }
2155 }
2156 if ( hasExtNucleiTrk ){
2157 Int_t ttentry = 0;
2158 if ( verbose ) printf(" hasExtNucleiTrk \n");
2159 for(Int_t nt=0; nt < tcExtNucleiTof->GetEntries() ; nt++){
2160 //
2161 if ( verbose ) printf(" got2\n");
2162 ToFTrkVar *ptt = (ToFTrkVar*)(tcExtNucleiTof->At(nt));
2163 if ( ptt->trkseqno != -1 ){
2164 //
2165 t_orb->trkseqno = ptt->trkseqno;
2166 //
2167 t_orb->Eij = 0;
2168 //
2169 t_orb->Sij = 0;
2170 //
2171 t_orb->pitch = -1000.;
2172 //
2173 t_orb->sunangle = -1000.;
2174 //
2175 t_orb->sunmagangle = -1000;
2176 //
2177 t_orb->cutoff = -1000.;
2178 //
2179 TClonesArray &tz2 = *torbExtNucleiTrk;
2180 new(tz2[ttentry]) OrbitalInfoTrkVar(*t_orb);
2181 ttentry++;
2182 //
2183 t_orb->Clear();
2184 //
2185 }
2186 //
2187 }
2188 }
2189 if ( hasExtTrk ){
2190 Int_t ttentry = 0;
2191 if ( verbose ) printf(" hasExtTrk \n");
2192 for(Int_t nt=0; nt < tcExtTof->GetEntries() ; nt++){
2193 //
2194 if ( verbose ) printf(" got3\n");
2195 ToFTrkVar *ptt = (ToFTrkVar*)(tcExtTof->At(nt));
2196 if ( ptt->trkseqno != -1 ){
2197 //
2198 t_orb->trkseqno = ptt->trkseqno;
2199 //
2200 t_orb->Eij = 0;
2201 //
2202 t_orb->Sij = 0;
2203 //
2204 t_orb->pitch = -1000.;
2205 //
2206 t_orb->sunangle = -1000.;
2207 //
2208 t_orb->sunmagangle = -1000;
2209 //
2210 t_orb->cutoff = -1000.;
2211 //
2212 TClonesArray &tz3 = *torbExtNucleiTrk;
2213 new(tz3[ttentry]) OrbitalInfoTrkVar(*t_orb);
2214 ttentry++;
2215 //
2216 t_orb->Clear();
2217 //
2218 }
2219 //
2220 }
2221 }
2222 }
2223 } // if( orbitalinfo->TimeGap>0){
2224 //
2225 // Fill the class
2226 //
2227 OrbitalInfotr->Fill();
2228 //
2229 // tor.Clear("C"); // memory leak?
2230 tor.Delete(); // memory leak?
2231 delete t_orb;
2232 //
2233 // printf(" q0 size %i q0 capacity %i \n",(int)q0.size(),(int)q0.capacity());
2234 } // loop over the events in the run
2235
2236
2237 //
2238 // Here you may want to clear some variables before processing another run
2239 //
2240
2241 // OrbitalInfotr->FlushBaskets();
2242
2243 if ( verbose ) printf(" Clear before new run \n");
2244 delete dbtime;
2245
2246 if ( mcmdrc ) mcmdrc->Clear();
2247 mcmdrc = 0;
2248
2249 if ( verbose ) printf(" Clear before new run1 \n");
2250 if ( L_QQ_Q_l_lower ) delete L_QQ_Q_l_lower;
2251 if ( verbose ) printf(" Clear before new run2 \n");
2252 if ( L_QQ_Q_l_upper ) delete L_QQ_Q_l_upper;
2253 if ( verbose ) printf(" Clear before new run3 \n");
2254 if ( RYPang_upper ) delete RYPang_upper;
2255 if ( verbose ) printf(" Clear before new run4 \n");
2256 if ( RYPang_lower ) delete RYPang_lower;
2257
2258
2259 if ( l0tr ){
2260 if ( verbose ) printf(" delete l0tr\n");
2261 l0tr->Delete();
2262 l0tr = 0;
2263 }
2264 // if ( l0head ){
2265 // printf(" delete l0head\n");
2266 // l0head->Reset();
2267 // delete l0head;
2268 // printf(" delete l0head done\n");
2269 // l0head = 0;
2270 // }
2271 if (eh) {
2272 if ( verbose ) printf(" delete eh\n");
2273 delete eh;
2274 eh = 0;
2275 }
2276
2277 if ( verbose ) printf(" close file \n");
2278 if ( l0File ) l0File->Close("R");
2279 if ( verbose ) printf(" End run \n");
2280
2281 q0.clear();
2282 q1.clear();
2283 q2.clear();
2284 q3.clear();
2285 qtime.clear();
2286 qPitch.clear();
2287 qRoll.clear();
2288 qYaw.clear();
2289 qmode.clear();
2290
2291 if (ch){
2292 if ( verbose ) printf(" delete ch\n");
2293 ch->Delete();
2294 ch = 0;
2295 }
2296 } // process all the runs <===
2297 if ( debug ){
2298 printf("AFTER LOOP ON RUNs\n");
2299 gObjectTable->Print();
2300 }
2301 //
2302 if (verbose) printf("\n Finished processing data \n");
2303 //
2304 closeandexit:
2305 //
2306 // 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.
2307 //
2308 if ( !reprocall && reproc && code >= 0 ){
2309 if ( totfileentries > noaftrun ){
2310 if (verbose){
2311 printf("\n Post-processing: copying events from the old tree after the processed run\n");
2312 printf(" Copying %i events in the file which are after the end of the run %i \n",(int)(totfileentries-noaftrun),(int)run);
2313 printf(" Start copying at event number %i end copying at event number %i \n",(int)noaftrun,(int)totfileentries);
2314 }
2315 for (UInt_t j = noaftrun; j < totfileentries; j++ ){
2316 //
2317 // Get entry from old tree
2318 //
2319 if ( OrbitalInfotrclone->GetEntry(j) <= 0 ) throw -36;
2320 //
2321 // copy orbitalinfoclone to OrbitalInfo
2322 //
2323 // orbitalinfo->Clear();
2324 //
2325 memcpy(&orbitalinfo,&orbitalinfoclone,sizeof(orbitalinfoclone));
2326 //
2327 // Fill entry in the new tree
2328 //
2329 OrbitalInfotr->Fill();
2330 };
2331 if (verbose) printf(" Finished successful copying!\n");
2332 };
2333 //if ( OrbitalInfotrclone ) OrbitalInfotrclone->Clear();
2334 //if ( OrbitalInfotrclone ) OrbitalInfotrclone->Delete();
2335 };
2336 //
2337 // Close files, delete old tree(s), write and close level2 file
2338 //
2339
2340 if ( l0File ) l0File->Close();
2341 if ( myfold ) gSystem->Unlink(tempname.str().c_str());
2342 //
2343 if ( OrbitalInfotr ) OrbitalInfotr->SetName("OrbitalInfo");
2344 //
2345 if ( file ){
2346 file->cd();
2347 if ( OrbitalInfotr ) OrbitalInfotr->Write("OrbitalInfo", TObject::kOverwrite); // 10 RED bug fixed
2348 };
2349 //
2350 if (verbose) printf("\n Exiting...\n");
2351
2352 if ( myfold ) gSystem->Unlink(OrbitalInfofolder.str().c_str());
2353 //
2354 // the end
2355 //
2356 if ( dbc ){
2357 dbc->Close();
2358 delete dbc;
2359 };
2360 //
2361 if (verbose) printf("\n Exiting...\n");
2362 if ( tempfile ) tempfile->Close();
2363
2364 if ( PO ) delete PO;
2365 if ( gltle ) delete gltle;
2366 if ( glparam ) delete glparam;
2367 if ( glparam2 ) delete glparam2;
2368 if (verbose) printf("\n Exiting3...\n");
2369 if ( glroot ) delete glroot;
2370 if (verbose) printf("\n Exiting4...\n");
2371 if ( runinfo ) runinfo->Close();
2372 if ( runinfo ) delete runinfo;
2373
2374 if ( tcNucleiTrk ){
2375 tcNucleiTrk->Delete();
2376 delete tcNucleiTrk;
2377 tcNucleiTrk = NULL;
2378 }
2379 if ( tcExtNucleiTrk ){
2380 tcExtNucleiTrk->Delete();
2381 delete tcExtNucleiTrk;
2382 tcExtNucleiTrk = NULL;
2383 }
2384 if ( tcExtTrk ){
2385 tcExtTrk->Delete();
2386 delete tcExtTrk;
2387 tcExtTrk = NULL;
2388 }
2389
2390 if ( tcNucleiTof ){
2391 tcNucleiTof->Delete();
2392 delete tcNucleiTof;
2393 tcNucleiTof = NULL;
2394 }
2395 if ( tcExtNucleiTof ){
2396 tcExtNucleiTof->Delete();
2397 delete tcExtNucleiTof;
2398 tcExtNucleiTof = NULL;
2399 }
2400 if ( tcExtTof ){
2401 tcExtTof->Delete();
2402 delete tcExtTof;
2403 tcExtTrk = NULL;
2404 }
2405
2406
2407 if ( tof ) delete tof;
2408 if ( trke ) delete trke;
2409
2410 if ( debug ){
2411 cout << "1 0x" << OrbitalInfotr << endl;
2412 cout << "2 0x" << OrbitalInfotrclone << endl;
2413 cout << "3 0x" << l0tr << endl;
2414 cout << "4 0x" << tempOrbitalInfo << endl;
2415 cout << "5 0x" << ttof << endl;
2416 }
2417 //
2418 if ( debug ) file->ls();
2419 //
2420 if ( debug ){
2421 printf("BEFORE EXITING\n");
2422 gObjectTable->Print();
2423 }
2424 if(code < 0) throw code;
2425 return(code);
2426 }
2427
2428
2429 //
2430 // Returns the cCoordGeo structure holding the geographical
2431 // coordinates for the event (see sgp4.h).
2432 //
2433 // atime is the abstime of the event in UTC unix time.
2434 // tletime is the time of the tle in UTC unix time.
2435 // tle is the previous and nearest tle (compared to atime).
2436 cCoordGeo getCoo(UInt_t atime, UInt_t tletime, cTle *tle)
2437 {
2438 cEci eci;
2439 cOrbit orbit(*tle);
2440 orbit.getPosition((double) (atime - tletime)/60., &eci);
2441
2442 return eci.toGeo();
2443 }
2444
2445 // function of copyng of quatrnions classes
2446
2447 void CopyQ(Quaternions *Q1, Quaternions *Q2){
2448 for(UInt_t i = 0; i < 6; i++){
2449 Q1->time[i]=Q2->time[i];
2450 for (UInt_t j = 0; j < 4; j++)Q1->quat[i][j]=Q2->quat[i][j];
2451 }
2452 return;
2453 }
2454
2455 // functions of copyng InclinationInfo classes
2456
2457 void CopyAng(InclinationInfo *A1, InclinationInfo *A2){
2458 A1->Tangazh = A2->Tangazh;
2459 A1->Ryskanie = A2->Ryskanie;
2460 A1->Kren = A2->Kren;
2461 return;
2462 }
2463
2464 UInt_t holeq(Double_t lower,Double_t upper,Quaternions *Qlower, Quaternions *Qupper, UInt_t f){
2465
2466 UInt_t hole = 10;
2467 Bool_t R10l = false; // Sign of R10 mode in lower quaternions array
2468 Bool_t R10u = false; // Sign of R10 mode in upper quaternions array
2469 Bool_t insm = false; // Sign that we inside quaternions array
2470 // Bool_t mxtml = false; // Sign of mixt mode in lower quaternions array
2471 // Bool_t mxtmu = false; // Sign of mixt mode in upper quaternions array
2472 Bool_t npasm = false; // Sign of normall pass between R10 and non R10 or between non R10 and R10
2473 UInt_t NCQl = 6; // Number of correct quaternions in lower array
2474 // UInt_t NCQu = 6; // Number of correct quaternions in upper array
2475 if (f>0){
2476 insm = true;
2477 if(Qupper->time[f]-Qupper->time[f-1]==30) R10u = false;
2478 if(Qupper->time[f]-Qupper->time[f-1]<1) R10u = true;
2479 }else{
2480 insm = false;
2481 if((Qlower->time[5]-Qlower->time[0]<2)&&(Qlower->time[1]-Qlower->time[0]<2)) R10l = true;
2482 if((Qupper->time[5]-Qupper->time[0]<2)&&(Qupper->time[1]-Qupper->time[0]<2)) R10u = true;
2483 if((Qlower->time[5]-Qlower->time[0]==150)&&(Qlower->time[1]-Qlower->time[0]==30)) R10l = false;
2484 if((Qupper->time[5]-Qupper->time[0]==150)&&(Qupper->time[1]-Qupper->time[0]==30)) R10u = false;
2485 if((Qlower->time[5]-Qlower->time[0]<2)&&(Qlower->time[1]-Qlower->time[0]==30)){
2486 // mxtml = true;
2487 for(UInt_t i = 1; i < 6; i++){
2488 if(Qlower->time[i]-Qlower->time[0]==30*i) NCQl=i;
2489 }
2490 }
2491 // if((Qupper->time[5]-Qupper->time[0]<2)&&(Qupper->time[1]-Qupper->time[0]==30)){
2492 // mxtmu = true;
2493 // for(UInt_t i = 1; i < 6; i++){
2494 // if(Qupper->time[i]-Qupper->time[0]==30*i) NCQu=i;
2495 // }
2496 // }
2497 }
2498
2499 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;
2500
2501
2502 if (R10u&&insm) hole=0; // best event R10
2503 if ((upper-lower<=5)&&(!insm)&&R10l&&R10u) hole = 1; // when first of 6 quaternions in array is correct
2504 if (((!R10u)&&insm)||((!insm)&&(!R10u)&&(!R10l)&&((upper-lower==210+(6-NCQl)*30)||(upper-lower==30)))) hole = 2; //non R10
2505 if (npasm&&(!insm)&&((R10l&&!R10u)||(R10u&&!R10l))) hole = 3; //normall pass from R10 to non R10 or from non R10 to R10
2506 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
2507 if ((upper-lower>=300)&&(!insm)&&((R10l&&!R10u)||(R10u&&!R10l))) hole = 5; //uneliminable hole between R10 and non R10 or between non R10 and R10
2508 if ((upper-lower>5)&&(upper-lower<=300)&&R10u&&R10l) hole = 6; // eliminable hole inside R10
2509 if ((upper-lower>300)&&R10u&&R10l) hole = 7; //uneliminable hole inside R10
2510 if ((upper-lower>210)&&(upper-lower<=1200)&&(!R10u)&&(!R10l)) hole = 8; //eliminable hole inside non R10
2511 if ((upper-lower>1200)&&!R10u&&!R10l) hole = 9; // uneliminable hole inside non R10
2512 return hole;
2513 }
2514
2515 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){
2516 Int_t sizee = t.size()+1;
2517 t.resize(sizee);
2518 q0.resize(sizee);
2519 q1.resize(sizee);
2520 q2.resize(sizee);
2521 q3.resize(sizee);
2522 mode.resize(sizee);
2523 Roll.resize(sizee);
2524 Pitch.resize(sizee);
2525 Yaw.resize(sizee);
2526 }
2527
2528 // geomagnetic calculation staff
2529
2530 void GM_ScanIGRF(TSQLServer *dbc, GMtype_Data *G0, GMtype_Data *G1, GMtype_Data *H1)
2531 {
2532 GL_PARAM *glp = new GL_PARAM();
2533 Int_t parerror=glp->Query_GL_PARAM(1,304,dbc); // parameters stored in DB in GL_PRAM table
2534 if ( parerror<0 ) {
2535 throw -902;
2536 }
2537 /*This function scans inputs G0, G1, and H1 of the IGRF table into 3 data arrays*/
2538 // TString SATH="/data03/Malakhov/pam9Malakhov/installed10/calib/orb-param/";
2539 int i;
2540 double temp;
2541 char buffer[200];
2542 FILE *IGRF;
2543 IGRF = fopen((glp->PATH+glp->NAME).Data(), "r");
2544 // IGRF = fopen(PATH+"IGRF.tab", "r");
2545 G0->size = 25;
2546 G1->size = 25;
2547 H1->size = 25;
2548 for( i = 0; i < 4; i++)
2549 {
2550 fgets(buffer, 200, IGRF);
2551 }
2552 fscanf(IGRF, "g 1 0 %lf ", &G0->element[0]);
2553 for(i = 1; i <= 22; i++)
2554 {
2555 fscanf(IGRF ,"%lf ", &G0->element[i]);
2556 }
2557 fscanf(IGRF ,"%lf\n", &temp);
2558 G0->element[23] = temp * 5 + G0->element[22];
2559 G0->element[24] = G0->element[23] + 5 * temp;
2560 fscanf(IGRF, "g 1 1 %lf ", &G1->element[0]);
2561 for(i = 1; i <= 22; i++)
2562 {
2563 fscanf( IGRF, "%lf ", &G1->element[i]);
2564 }
2565 fscanf(IGRF, "%lf\n", &temp);
2566 G1->element[23] = temp * 5 + G1->element[22];
2567 G1->element[24] = temp * 5 + G1->element[23];
2568 fscanf(IGRF, "h 1 1 %lf ", &H1->element[0]);
2569 for(i = 1; i <= 22; i++)
2570 {
2571 fscanf( IGRF, "%lf ", &H1->element[i]);
2572 }
2573 fscanf(IGRF, "%lf\n", &temp);
2574 H1->element[23] = temp * 5 + H1->element[22];
2575 H1->element[24] = temp * 5 + H1->element[23];
2576 if ( glp ) delete glp;
2577 /*
2578 printf("############################## SCAN IGRF ######################################\n");
2579 printf(" G0 G1 H1\n");
2580 printf(" size %10i %10i %10i \n",G0->size,G1->size,H1->size);
2581 for ( i = 0; i < 30; i++){
2582 printf("%5i %10.2f %10.2f %10.2f \n",i,G0->element[i],G1->element[i],H1->element[i]);
2583 }
2584 printf("###############################################################################\n");
2585 */
2586 } /*GM_ScanIGRF*/
2587
2588
2589
2590
2591 void GM_SetIGRF(Int_t isSecular, TString ifile1, TString ifile2, GMtype_Data *G0, GMtype_Data *G1, GMtype_Data *H1)
2592 {
2593 /*This function scans inputs G0, G1, and H1 of the IGRF table into 3 data arrays*/
2594 int i;
2595 double temp,temp2;
2596 int it1,it2;
2597 char buffer[200];
2598 FILE *IGRF;
2599 G0->size = 2;
2600 G1->size = 2;
2601 H1->size = 2;
2602
2603 for( i = 0; i < 30; i++){
2604 G0->element[i] = 0.;
2605 G1->element[i] = 0.;
2606 H1->element[i] = 0.;
2607 }
2608
2609 IGRF = fopen(ifile1.Data(), "r");
2610 for( i = 0; i < 2; i++){
2611 fgets(buffer, 200, IGRF);
2612 }
2613 fscanf(IGRF, "%3i%3i%12lf%11lf",&it1,&it2, &G0->element[0],&temp);
2614 fscanf(IGRF, "%3i%3i%12lf%11lf",&it1,&it2, &G1->element[0],&H1->element[0]);
2615 fclose(IGRF);
2616
2617 IGRF = fopen(ifile2.Data(), "r");
2618 for( i = 0; i < 2; i++){
2619 fgets(buffer, 200, IGRF);
2620 }
2621 if ( isSecular ){
2622 fscanf(IGRF, "%3i%3i%12lf%11lf",&it1,&it2,&temp,&temp2);
2623 G0->element[1] = temp * 5. + G0->element[0];
2624 fscanf(IGRF, "%3i%3i%12lf%11lf",&it1,&it2,&temp,&temp2);
2625 G1->element[1] = temp * 5. + G1->element[0];
2626 H1->element[1] = temp2 * 5. + H1->element[0];
2627 } else {
2628 fscanf(IGRF, "%3i%3i%12lf%11lf",&it1,&it2, &G0->element[1],&temp);
2629 fscanf(IGRF, "%3i%3i%12lf%11lf",&it1,&it2, &G1->element[1],&H1->element[1]);
2630 }
2631 fclose(IGRF);
2632 /*
2633 printf("############################## SCAN IGRF ######################################\n");
2634 printf(" G0 G1 H1\n");
2635 printf(" size %10i %10i %10i \n",G0->size,G1->size,H1->size);
2636 for ( i = 0; i < 30; i++){
2637 printf("%5i %10.2f %10.2f %10.2f \n",i,G0->element[i],G1->element[i],H1->element[i]);
2638 }
2639 printf("###############################################################################\n");
2640 */
2641 } /*GM_ScanIGRF*/
2642
2643 void GM_SetEllipsoid(GMtype_Ellipsoid *Ellip)
2644 {
2645 /*This function sets the WGS84 reference ellipsoid to its default values*/
2646 Ellip->a = 6378.137; /*semi-major axis of the ellipsoid in */
2647 Ellip->b = 6356.7523142;/*semi-minor axis of the ellipsoid in */
2648 Ellip->fla = 1/298.257223563;/* flattening */
2649 Ellip->eps = sqrt(1- ( Ellip->b * Ellip->b) / (Ellip->a * Ellip->a )); /*first eccentricity */
2650 Ellip->epssq = (Ellip->eps * Ellip->eps); /*first eccentricity squared */
2651 Ellip->re = 6371.2;/* Earth's radius */
2652 } /*GM_SetEllipsoid*/
2653
2654
2655 void GM_EarthCartToDipoleCartCD(GMtype_Pole Pole, GMtype_CoordCartesian EarthCoord, GMtype_CoordCartesian *DipoleCoords)
2656 {
2657 /*This function converts from Earth centered cartesian coordinates to dipole centered cartesian coordinates*/
2658 double X, Y, Z, CosPhi, SinPhi, CosLambda, SinLambda;
2659 CosPhi = cos(TMath::DegToRad()*Pole.phi);
2660 SinPhi = sin(TMath::DegToRad()*Pole.phi);
2661 CosLambda = cos(TMath::DegToRad()*Pole.lambda);
2662 SinLambda = sin(TMath::DegToRad()*Pole.lambda);
2663 X = EarthCoord.x;
2664 Y = EarthCoord.y;
2665 Z = EarthCoord.z;
2666
2667 /*These equations are taken from a document by Wallace H. Campbell*/
2668 DipoleCoords->x = X * CosPhi * CosLambda + Y * CosPhi * SinLambda - Z * SinPhi;
2669 DipoleCoords->y = -X * SinLambda + Y * CosLambda;
2670 DipoleCoords->z = X * SinPhi * CosLambda + Y * SinPhi * SinLambda + Z * CosPhi;
2671 } /*GM_EarthCartToDipoleCartCD*/
2672
2673 void GM_GeodeticToSpherical(GMtype_Ellipsoid Ellip, GMtype_CoordGeodetic CoordGeodetic, GMtype_CoordSpherical *CoordSpherical)
2674 {
2675 double CosLat, SinLat, rc, xp, zp; /*all local variables */
2676 /*
2677 ** Convert geodetic coordinates, (defined by the WGS-84
2678 ** reference ellipsoid), to Earth Centered Earth Fixed Cartesian
2679 ** coordinates, and then to spherical coordinates.
2680 */
2681
2682 CosLat = cos(TMath::DegToRad()*CoordGeodetic.phi);
2683 SinLat = sin(TMath::DegToRad()*CoordGeodetic.phi);
2684
2685 /* compute the local radius of curvature on the WGS-84 reference ellipsoid */
2686
2687 rc = Ellip.a / sqrt(1.0 - Ellip.epssq * SinLat * SinLat);
2688
2689 /* compute ECEF Cartesian coordinates of specified point (for longitude=0) */
2690
2691 xp = (rc + CoordGeodetic.HeightAboveEllipsoid) * CosLat;
2692 zp = (rc*(1.0 - Ellip.epssq) + CoordGeodetic.HeightAboveEllipsoid) * SinLat;
2693
2694 /* compute spherical radius and angle lambda and phi of specified point */
2695
2696 CoordSpherical->r = sqrt(xp * xp + zp * zp);
2697 CoordSpherical->phig = TMath::RadToDeg()*asin(zp / CoordSpherical->r); /* geocentric latitude */
2698 CoordSpherical->lambda = CoordGeodetic.lambda; /* longitude */
2699 } /*GM_GeodeticToSpherical*/
2700
2701 void GM_PoleLocation(GMtype_Model Model, GMtype_Pole *Pole)
2702 {
2703 /*This function finds the location of the north magnetic pole in spherical coordinates. The equations are
2704 **from Wallace H. Campbell's Introduction to Geomagnetic Fields*/
2705
2706 Pole->phi = TMath::RadToDeg()*-atan(sqrt(Model.h1 * Model.h1 + Model.g1 * Model.g1)/Model.g0);
2707 Pole->lambda = TMath::RadToDeg()*atan(Model.h1/Model.g1);
2708 } /*GM_PoleLocation*/
2709
2710 void GM_SphericalToCartesian(GMtype_CoordSpherical CoordSpherical, GMtype_CoordCartesian *CoordCartesian)
2711 {
2712 /*This function converts spherical coordinates into Cartesian coordinates*/
2713 double CosPhi = cos(TMath::DegToRad()*CoordSpherical.phig);
2714 double SinPhi = sin(TMath::DegToRad()*CoordSpherical.phig);
2715 double CosLambda = cos(TMath::DegToRad()*CoordSpherical.lambda);
2716 double SinLambda = sin(TMath::DegToRad()*CoordSpherical.lambda);
2717
2718 CoordCartesian->x = CoordSpherical.r * CosPhi * CosLambda;
2719 CoordCartesian->y = CoordSpherical.r * CosPhi * SinLambda;
2720 CoordCartesian->z = CoordSpherical.r * SinPhi;
2721 } /*GM_SphericalToCartesian*/
2722
2723 void GM_TimeAdjustCoefs(Float_t year, Float_t jyear, GMtype_Data g0d, GMtype_Data g1d, GMtype_Data h1d, GMtype_Model *Model)
2724 {
2725 /*This function calls GM_LinearInterpolation for the coefficients to estimate the value of the
2726 **coefficient for the given date*/
2727 int index;
2728 double x;
2729 index = (year - GM_STARTYEAR) / 5;
2730 x = (jyear - GM_STARTYEAR) / 5.;
2731 Model->g0 = GM_LinearInterpolation(index, index+1, g0d.element[index], g0d.element[index+1], x);
2732 Model->g1 = GM_LinearInterpolation(index, index+1, g1d.element[index], g1d.element[index+1], x);
2733 Model->h1 = GM_LinearInterpolation(index, index+1, h1d.element[index], h1d.element[index+1], x);
2734 } /*GM_TimeAdjustCoefs*/
2735
2736 double GM_LinearInterpolation(double x1, double x2, double y1, double y2, double x)
2737 {
2738 /*This function takes a linear interpolation between two given points for x*/
2739 double weight, y;
2740 weight = (x - x1) / (x2 - x1);
2741 y = y1 * (1. - weight) + y2 * weight;
2742 // printf(" x1 %f x2 %f y1 %f y2 %f x %f ==> y %f \n",x1,x2,y1,y2,x,y);
2743 return y;
2744 }/*GM_LinearInterpolation*/
2745
2746 void GM_CartesianToSpherical(GMtype_CoordCartesian CoordCartesian, GMtype_CoordSpherical *CoordSpherical)
2747 {
2748 /*This function converts a point from Cartesian coordinates into spherical coordinates*/
2749 double X, Y, Z;
2750
2751 X = CoordCartesian.x;
2752 Y = CoordCartesian.y;
2753 Z = CoordCartesian.z;
2754
2755 CoordSpherical->r = sqrt(X * X + Y * Y + Z * Z);
2756 CoordSpherical->phig = TMath::RadToDeg()*asin(Z / (CoordSpherical->r));
2757 CoordSpherical->lambda = TMath::RadToDeg()*atan2(Y, X);
2758 } /*GM_CartesianToSpherical*/

  ViewVC Help
Powered by ViewVC 1.1.23