/[PAMELA software]/quicklook/dataToXML/OrbitalRate.cpp
ViewVC logotype

Contents of /quicklook/dataToXML/OrbitalRate.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (show annotations) (download)
Fri Jun 30 13:19:25 2006 UTC (18 years, 5 months ago) by kusanagi
Branch: MAIN
CVS Tags: dataToXML1_02/01
Changes since 1.4: +89 -28 lines
Added parameters for the Resours time offset.

1 /**
2 * Rate
3 * author Nagni
4 * version 1.0 - 27 April 2006
5 *
6 * Description: .
7 *
8 * Parameters:
9 * base - the path where to find the PAMELA unpacked root file.
10 * outDirectory - the path where to put the output file.
11 * orbPath - the path where to find an orb format for the output.
12 *
13 * version 1.0 - 27 April 2006
14 * First implementation
15 */
16
17 #include <mcmd/McmdEvent.h>
18 #include <mcmd/McmdRecord.h>
19 #include <EventHeader.h>
20 #include <PscuHeader.h>
21 #include <TTree.h>
22 #include "cTle.h"
23 #include "cEci.h"
24 #include "cOrbit.h"
25 #include "cJulian.h"
26 #include "TH2F.h"
27 #include "TFrame.h"
28 #include "TGraph.h"
29 #include "TCanvas.h"
30 #include "TASImage.h"
31 #include "TMarker.h"
32 #include <TDatime.h>
33
34 #include "TString.h"
35 #include "TObjString.h"
36 #include "TStyle.h"
37 #include "TPaletteAxis.h"
38 #include "TROOT.h"
39 #include <sys/stat.h>
40 #include <fstream>
41
42 #define TRUE 1
43 #define FALSE 0
44 /**
45 *
46 * @param base
47 * @param outDirectory
48 * @param xslPath
49 */
50 using namespace std;
51
52 void InitStyle() {
53 gROOT->SetStyle("Plain");
54
55 TStyle *myStyle[2], *tempo;
56 myStyle[0]=new TStyle("StyleWhite", "white");
57 myStyle[1]=new TStyle("StyleBlack", "black");
58
59 tempo=gStyle;
60 Int_t linecol, bkgndcol, histcol;
61
62 for(Int_t style=0; style<2; style++) {
63
64 linecol=kWhite*style+kBlack*(1-style);
65 bkgndcol=kBlack*style+kWhite*(1-style);
66 histcol=kYellow*style+kBlack*(1-style); // was 95
67
68 myStyle[style]->Copy(*tempo);
69
70 myStyle[style]->SetCanvasBorderMode(0);
71 myStyle[style]->SetCanvasBorderSize(1);
72 myStyle[style]->SetFrameBorderSize(1);
73 myStyle[style]->SetFrameBorderMode(0);
74 myStyle[style]->SetPadBorderSize(1);
75 myStyle[style]->SetStatBorderSize(1);
76 myStyle[style]->SetTitleBorderSize(1);
77 myStyle[style]->SetPadBorderMode(0);
78 myStyle[style]->SetPalette(1,0);
79 myStyle[style]->SetPaperSize(20,27);
80 myStyle[style]->SetFuncColor(kRed);
81 myStyle[style]->SetFuncWidth(1);
82 myStyle[style]->SetLineScalePS(1);
83 myStyle[style]->SetCanvasColor(bkgndcol);
84 myStyle[style]->SetAxisColor(linecol,"XYZ");
85 myStyle[style]->SetFrameFillColor(bkgndcol);
86 myStyle[style]->SetFrameLineColor(linecol);
87 myStyle[style]->SetLabelColor(linecol,"XYZ");
88 myStyle[style]->SetPadColor(bkgndcol);
89 myStyle[style]->SetStatColor(bkgndcol);
90 myStyle[style]->SetStatTextColor(linecol);
91 myStyle[style]->SetTitleColor(linecol,"XYZ");
92 myStyle[style]->SetTitleFillColor(bkgndcol);
93 myStyle[style]->SetTitleTextColor(linecol);
94 myStyle[style]->SetLineColor(linecol);
95 myStyle[style]->SetMarkerColor(histcol);
96 myStyle[style]->SetTextColor(linecol);
97
98 myStyle[style]->SetGridColor((style)?13:kBlack);
99 myStyle[style]->SetHistFillStyle(1001*(1-style));
100 myStyle[style]->SetHistLineColor(histcol);
101 myStyle[style]->SetHistFillColor((style)?bkgndcol:kYellow);
102 }
103
104 myStyle[1]->cd();
105
106 gROOT->ForceStyle();
107
108 }
109
110 void Rate(TString base, TString outDirectory = "", TString format = "jpg", TString mapFile = "", TString tleFile = "", int offDate = 20060614, int offTime = 210000){
111 TTree *tr = 0;
112 pamela::McmdEvent *mcmdev = 0;
113 pamela::McmdRecord *mcmdrc = 0;
114 pamela::EventHeader *eh = 0;
115 pamela::PscuHeader *ph = 0;
116 TArrayC *mcmddata;
117 ULong64_t nevents = 0;
118 double timesync = 0;
119 stringstream oss;
120 double offsetTime = 0;
121 double absTime = 0;
122 UInt_t i = 0;
123 UInt_t j = 0;
124 struct stat buf;
125
126 i = stat (mapFile.Data(), &buf );
127 // If the file does not exists
128 if (i != 0){
129 printf("The %s file does not exists.", mapFile.Data());
130 exit(0);
131 }
132
133 TString filename = ((TObjString*)base.Tokenize('/')->Last())->GetString();
134 filename = ((TObjString*)filename.Tokenize('.')->First())->GetString();
135
136 string str1 = "RESURS-DK 1";
137 string str2 = "1 29228U 06021A 06166.45315890 -.00001271 40192-5 00000+0 0 12";
138 string str3 = "2 29228 069.9476 065.6885 0106036 060.6946 300.4810 16.02948390 10";
139 if (tleFile != ""){
140 fstream fileTle(tleFile.Data(),ios::in);
141 if (fileTle.is_open()) {
142 getline (fileTle,str1);
143 getline (fileTle,str2);
144 getline (fileTle,str3);
145 }
146 fileTle.close();
147 }
148
149 cTle tle1(str1, str2, str3);
150 cOrbit orbit(tle1);
151 cEci eci;
152 cCoordGeo coo;
153 TH2F *rate = new TH2F("rate", base, 360, -180, 180, 161, -80.5, 80.5);
154 TFile *rootFile = new TFile(base);
155 if (rootFile->IsZombie()) {
156 printf("The %s file does not exist", base.Data());
157 exit(0);
158 }
159
160
161 /*
162 * process Mcmd
163 */
164 long int recEntries;
165 tr = (TTree*)rootFile->Get("Mcmd");
166 tr->SetBranchAddress("Mcmd", &mcmdev);
167 nevents = tr->GetEntries();
168
169 bool timeFound = FALSE;
170 while (i < nevents) {
171 tr->GetEntry(i);
172 recEntries = mcmdev->Records->GetEntries();
173 while (j < recEntries){
174 mcmdrc = (pamela::McmdRecord*)mcmdev->Records->At(j);
175 //mcmddata = mcmdrc->McmdData;
176 //printf(" timesync TimeSync %i \n", (unsigned int)mcmddata->At(0));
177 //It is a TimeSync?
178 if ((mcmdrc != 0) && (mcmdrc->ID1 == 0xE0)){
179 mcmddata = mcmdrc->McmdData;
180 timesync = (((unsigned int)mcmddata->At(0)<<24)&0xFF000000) + (((unsigned int)mcmddata->At(1)<<16)&0x00FF0000) + (((unsigned int)mcmddata->At(2)<<8)&0x0000FF00) + (((unsigned int)mcmddata->At(3))&0x000000FF);
181 timesync = timesync - (mcmdrc->MCMD_RECORD_OBT)*(1./1000.);
182 timeFound = TRUE;
183 //printf(" timesync TimeSync %i \n", timesync);
184 }
185
186 //It is an Inclination Mcmd?
187 if ((mcmdrc != 0) && (mcmdrc->ID1 == 0xE2)){
188 mcmddata = mcmdrc->McmdData;
189 timesync = (((mcmddata->At(0) << 24) & 0xFF000000) + ((mcmddata->At(1) << 16) & 0x00FF0000) + ((mcmddata->At(2) << 8) & 0x0000FF00) + (mcmddata->At(3) & 0x000000FF))/128.0;
190 timesync = timesync - (mcmdrc->MCMD_RECORD_OBT)*(1./1000.);
191 timeFound = TRUE;
192 //printf(" timesync Inclination %16.8f \n", timesync);
193 }
194
195 if (timeFound) break;
196 j++;
197 }
198 if (timeFound) break;
199 i++;
200 }
201
202 if (!timeFound) {
203 printf("No timesync info have been found in the file %s", base.Data());
204 exit(0);
205 }
206
207 //printf("%d \n", tle1.getField(cTle::FLD_EPOCHYEAR));
208 //printf("%d \n", tle1.getField(cTle::FLD_EPOCHDAY));
209 //Get the Julian date of the TLE Epoch
210 cJulian offTLE = cJulian(((int)tle1.getField(cTle::FLD_EPOCHYEAR) + 2000), tle1.getField(cTle::FLD_EPOCHDAY));
211 //cJulian offTLE = cJulian(2006, 178.79019958);
212
213
214 //Get the Julian date of the Resours offset
215 TDatime offRes = TDatime(offDate, offTime);
216 cJulian offResours = cJulian(offRes.GetYear(), offRes.GetMonth(), offRes.GetDay(), offRes.GetHour(), offRes.GetMinute(), offRes.GetSecond());
217 //Add to the Resours Offset the seconds differece beetwen the timesynch from MCMD and the relative OBT
218 offResours.addSec(timesync);
219 //printf(" diff %16.8f \n", timesync);
220
221 //Get the MINUTES past since the TLE Epoch
222 offsetTime = (offResours.getDate() - offTLE.getDate()) * 24.0 * 60.0;
223 printf(" offSET %16.8f \n", offsetTime);
224
225 //printf(" offResours %16.8f \n", offResours.getDate());
226 //printf(" offTLE %16.8f \n", offTLE.getDate());
227 tr = (TTree*)rootFile->Get("Physics");
228 TBranch *headBr = tr->GetBranch("Header");
229 tr->SetBranchAddress("Header", &eh);
230 nevents = tr->GetEntries();
231 //Fill variables from root-ple
232 for (i = 0; i < nevents; i++){
233 //for (i = 0; i < 1000; i++){
234 tr->GetEntry(i);
235 ph = eh->GetPscuHeader();
236 absTime = offsetTime + (ph->GetOrbitalTime()*(1./60000.));
237 //printf(" absTime %16.8f \n", absTime);
238 orbit.getPosition(absTime, &eci);
239 coo = eci.toGeo();
240 rate->Fill(rad2deg(coo.m_Lon) - 180.0 , rad2deg(coo.m_Lat));
241 printf(" Time: %16.8f Lat: %16.8f Long: %16.8f Alt: %16.8f\n", absTime, rad2deg(coo.m_Lat), rad2deg(coo.m_Lon), coo.m_Alt);
242 }
243 double posx=-1000,posy=-1000,oldposx=-1000,oldposy=-1000;
244
245 int ptcnt=0, color=0;
246 TMarker *tma=NULL;
247 TLine *tli=NULL;
248 double step=0;
249
250
251 TImage *tImage=TImage::Open(mapFile);
252 int width=(int)(tImage->GetWidth()*0.80);
253 int height=(int)(tImage->GetHeight()*0.80);
254 InitStyle();
255 TCanvas *c1 = new TCanvas("c1","rate/orbit",-width, height); // - : removes the menu bars
256
257 TH1F *hframe=NULL;
258 hframe=gPad->DrawFrame(-180,-90,180,90);
259 oss.str("");
260 oss << filename << " - Event Rate (Hz)";
261 hframe->SetTitle(oss.str().c_str());
262 hframe->SetXTitle("Longitude (deg)");
263 hframe->SetYTitle("Latitude (deg)");
264 c1->cd();
265
266
267
268 TPad *p2 = new TPad("p2", "p2", 0.10, 0.04, 0.983, 1);
269 p2->Draw();
270 p2->cd();
271 TPaletteAxis *tpa=NULL;
272 TH2F *forpal=new TH2F("forpal","",2,0,2,2,0,2);
273 forpal->SetAxisColor(kBlack); //Delete the stat box
274 forpal->SetStats(0); //Delete the stat box
275 forpal->SetMinimum(0.1);
276 forpal->SetMaximum(15);
277 forpal->SetBinContent(5,1); // just to initialize the histo
278 forpal->SetContour(50);
279 TPaletteAxis *tpp=(TPaletteAxis*)((forpal->GetListOfFunctions())->FindObject("palette"));
280 step=forpal->GetContourLevel(1)-forpal->GetContourLevel(0);
281 tpa=new TPaletteAxis(184,-90,195,90,forpal);
282 tpa->SetLabelColor(kWhite);
283 forpal->Draw("colz");
284
285 c1->cd();
286 TPad *p1 = new TPad("p1", "p1", 0.10,0.10,0.90,0.92);
287 p1->Draw();
288 p1->cd();
289 tImage->Draw("X");
290 c1->cd();
291 gPad->RedrawAxis();
292 c1->Update();
293
294 c1->cd();
295 ptcnt=0;
296 tma=new TMarker();
297 tma->SetMarkerStyle(4);
298 tli=new TLine();
299 tli->SetLineColor(kMagenta);
300 Stat_t freq;
301 for (Int_t kk = 0; kk < 360; kk++){
302 for (Int_t jj = 0; jj < 161; jj++){
303 freq = rate->GetBinContent(kk, jj);
304 if (freq>0) {
305 posx=(kk - 180); posy= jj - 80.5;
306 // color: palette colors from 51 to 100 ie 50 levels
307 color=51+(int) ((log10((rate==0)?0.1:freq)-log10(0.1))/step); // step defined by palette
308 if (color>100) color=100; // just in case if max rate is not max...
309 tma->SetMarkerColor(color);
310 if (!(posx<0 && oldposx>0) && oldposx!=-1000 && oldposy!=-1000) tli->DrawLine(oldposx,oldposy,posx,posy);
311 tma->DrawMarker(posx,posy);
312 oldposx=posx;
313 oldposy=posy;
314 }
315 }
316 }
317 oss.str("");
318 if (outDirectory == "") {
319 oss << filename.Data() << "_OrbitRate." << format.Data();
320 } else {
321 oss << outDirectory.Data() << filename.Data() << "_OrbitRate." << format.Data();
322 }
323 c1->SaveAs(oss.str().c_str());
324 rootFile->Close();
325 }
326
327 int main(int argc, char* argv[]){
328 TString outDir = "./";
329 TString mapFile = "";
330 TString tleFile = "";
331 TString format = "jpg";
332 int offDate = 20060614;
333 int offTime = 210000;
334
335 if (argc < 2){
336 printf("You have to insert at least the file to analyze and the mapFile \n");
337 printf("Try '--help' for more information. \n");
338 exit(1);
339 }
340
341 if (!strcmp(argv[1], "--help")){
342 printf( "Usage: OrbitRate FILE -map mapFile [OPTION] \n");
343 printf( "mapFile have to be a mercator map image [gif|jpg|png] \n");
344 printf( "\t --help Print this help and exit \n");
345 printf( "\t -tleFile[path] Path where to find the tle infos [default dummyOrbit] \n");
346 printf( "\t\tThe tle file have to satisfy a 3-line structure like (this is the included dummyOrbit)\n ");
347 printf( "\t\t\tGP4 Test\n");
348 printf( "\t\t\t1 25544U 98067A 06117.32388940 .00009459 00000-0 64427-4 0 8131\n");
349 printf( "\t\t\t2 25544 51.6388 89.2928 0009043 155.3293 354.6512 15.75673697425143\n");
350 printf( "\t -outDir[path] Path where to put the output [default ~/tmp] \n");
351 printf( "\t -format[jpg|gif|ps] Format for output files [default 'jpg'] \n");
352 printf( "\t -offDate Date of resetting of the Resource counter [format YYMMDD default 20060614] \n");
353 printf( "\t -offTime Time of resetting of the Resource counter [format HHMMSS default 210000] \n");
354 exit(1);
355 }
356
357 for (int i = 2; i < argc; i++){
358 if (!strcmp(argv[i], "-outDir")){
359 if (++i >= argc){
360 printf( "-outDir needs arguments. \n");
361 printf( "Try '--help' for more information. \n");
362 exit(1);
363 } else {
364 outDir = argv[i];
365 continue;
366 }
367 }
368
369 if (!strcmp(argv[i], "-tle")){
370 if (++i >= argc){
371 printf( "-tle needs arguments. \n");
372 printf( "Try '--help' for more information. \n");
373 exit(1);
374 } else {
375 tleFile = argv[i];
376 continue;
377 }
378 }
379
380 if (!strcmp(argv[i], "-offTime")){
381 if (++i >= argc){
382 printf( "-offTime needs arguments. \n");
383 printf( "Try '--help' for more information. \n");
384 exit(1);
385 }
386 else{
387 offTime = atol(argv[i]);
388 continue;
389 }
390 }
391
392 if (!strcmp(argv[i], "-offDate")){
393 if (++i >= argc){
394 printf( "-offDate needs arguments. \n");
395 printf( "Try '--help' for more information. \n");
396 exit(1);
397 }
398 else{
399 offDate = atol(argv[i]);
400 continue;
401 }
402 }
403
404 if (!strcmp(argv[i], "-map")){
405 if (++i >= argc){
406 printf( "-map needs arguments. \n");
407 printf( "Try '--help' for more information. \n");
408 exit(1);
409 } else {
410 mapFile = argv[i];
411 continue;
412 }
413 }
414
415 if (!strcmp(argv[i], "-format")) {
416 if (++i >= argc){
417 printf( "-format needs arguments. \n");
418 printf( "Try '--help' for more information. \n");
419 exit(1);
420 } else {
421 format = argv[i];
422 continue;
423 }
424 }
425 }
426 if (mapFile != ""){
427 Rate(argv[1], outDir, format, mapFile, tleFile, offDate, offTime);
428 } else {
429 printf("You have to insert at least the file to analyze and the mapFile \n");
430 printf("Try '--help' for more information. \n");
431 }
432 }
433
434
435
436

  ViewVC Help
Powered by ViewVC 1.1.23