/[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.78 - (show annotations) (download)
Fri Oct 10 13:35:10 2014 UTC (11 years, 2 months ago) by mocchiut
Branch: MAIN
Changes since 1.77: +1 -1 lines
10RED: NO_UNSIGNED_SUBTRACTION bug in MySQL >=5.5.5 fixed

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

  ViewVC Help
Powered by ViewVC 1.1.23