1 | /* ======================================================================== *\
|
---|
2 | !
|
---|
3 | ! *
|
---|
4 | ! * This file is part of MARS, the MAGIC Analysis and Reconstruction
|
---|
5 | ! * Software. It is distributed to you in the hope that it can be a useful
|
---|
6 | ! * and timesaving tool in analysing Data of imaging Cerenkov telescopes.
|
---|
7 | ! * It is distributed WITHOUT ANY WARRANTY.
|
---|
8 | ! *
|
---|
9 | ! * Permission to use, copy, modify and distribute this software and its
|
---|
10 | ! * documentation for any purpose is hereby granted without fee,
|
---|
11 | ! * provided that the above copyright notice appear in all copies and
|
---|
12 | ! * that both that copyright notice and this permission notice appear
|
---|
13 | ! * in supporting documentation. It is provided "as is" without express
|
---|
14 | ! * or implied warranty.
|
---|
15 | ! *
|
---|
16 | !
|
---|
17 | !
|
---|
18 | ! Author(s): Robert Wagner <magicdev@rwagner.de> 12/2002
|
---|
19 | !
|
---|
20 | ! Copyright: MAGIC Software Development, 2000-2002
|
---|
21 | !
|
---|
22 | !
|
---|
23 | \* ======================================================================== */
|
---|
24 |
|
---|
25 | /////////////////////////////////////////////////////////////////////////////
|
---|
26 | // //
|
---|
27 | // MVPPlotter //
|
---|
28 | // //
|
---|
29 | /////////////////////////////////////////////////////////////////////////////
|
---|
30 | #include "MVPPlotter.h"
|
---|
31 |
|
---|
32 | #include <stream.h>
|
---|
33 |
|
---|
34 | #include "TCanvas.h"
|
---|
35 | #include "TH1.h"
|
---|
36 | #include "TH2.h"
|
---|
37 | #include "TPaveText.h"
|
---|
38 | #include "TPaveLabel.h"
|
---|
39 | #include "TGraph.h"
|
---|
40 | #include "TString.h"
|
---|
41 | #include "TStyle.h"
|
---|
42 |
|
---|
43 | #include "MParList.h"
|
---|
44 | #include "MVPTime.h"
|
---|
45 |
|
---|
46 | ClassImp(MVPPlotter);
|
---|
47 |
|
---|
48 | // --------------------------------------------------------------------------
|
---|
49 | //
|
---|
50 | // Default constructor.
|
---|
51 | //
|
---|
52 | MVPPlotter::MVPPlotter(const char *name, const char *title) : fUseSun(kTRUE), fUseMoon(kTRUE), fUsePlanets(kTRUE), fAstronomicalDarkness(-18.0)
|
---|
53 | {
|
---|
54 | // fName = name ? name : "MVPPlotter";
|
---|
55 | // fTitle = title ? title : "Generates visibility histograms and information";
|
---|
56 |
|
---|
57 | fgSecPerDay = 86400;
|
---|
58 | fgMJD010170 = 40586; // 01-01-70 is JD 40586
|
---|
59 | fgDegToRad = 2*TMath::Pi()/360;
|
---|
60 |
|
---|
61 | }
|
---|
62 |
|
---|
63 | MVPPlotter::~MVPPlotter()
|
---|
64 | // --------------------------------------------------------------------------
|
---|
65 | //
|
---|
66 | // Destructor. Deletes objects if allocated.
|
---|
67 | //
|
---|
68 | {
|
---|
69 | if (fUseSun) delete fSun;
|
---|
70 | if (fUseMoon) delete fMoon;
|
---|
71 | if (fUsePlanets) {
|
---|
72 | delete fVenus;
|
---|
73 | delete fMars;
|
---|
74 | delete fJupiter;
|
---|
75 | delete fSaturn;
|
---|
76 | }
|
---|
77 | }
|
---|
78 |
|
---|
79 | void MVPPlotter::SetupObjects()
|
---|
80 | // --------------------------------------------------------------------------
|
---|
81 | //
|
---|
82 | // Create instances for Sun, Moon, Planets if requested.
|
---|
83 | //
|
---|
84 | {
|
---|
85 |
|
---|
86 | fTime = new MVPTime();
|
---|
87 | fPlist.AddToList(fTime);
|
---|
88 | fPlist.AddToList(fObs);
|
---|
89 |
|
---|
90 | if (fObject==NULL) {
|
---|
91 | cout << "You didn't specify an object!" << endl;
|
---|
92 | }
|
---|
93 |
|
---|
94 | fObject->PreProcess(&fPlist);
|
---|
95 | cout << "Processing object " << fObject->GetObjectName() << endl;
|
---|
96 |
|
---|
97 | if (fUseSun) {
|
---|
98 | fSun = new MVPObject();
|
---|
99 | fSun->SetObject(0); // Sun
|
---|
100 | fSun->PreProcess(&fPlist);
|
---|
101 | fSun->SetCalcEc(kTRUE);
|
---|
102 | }
|
---|
103 |
|
---|
104 | if (fUseMoon) {
|
---|
105 | fMoon = new MVPObject();
|
---|
106 | fMoon->SetObject(3); // Moon
|
---|
107 | fMoon->PreProcess(&fPlist);
|
---|
108 | fMoon->SetCalcEc(kTRUE);
|
---|
109 | }
|
---|
110 |
|
---|
111 | if (fUsePlanets) {
|
---|
112 | fVenus = new MVPObject();
|
---|
113 | fVenus->SetObject(2);
|
---|
114 | fVenus->PreProcess(&fPlist);
|
---|
115 | fVenus->SetCalcEc(kTRUE);
|
---|
116 |
|
---|
117 | fMars = new MVPObject();
|
---|
118 | fMars->SetObject(4);
|
---|
119 | fMars->PreProcess(&fPlist);
|
---|
120 | fMars->SetCalcEc(kTRUE);
|
---|
121 |
|
---|
122 | fJupiter = new MVPObject();
|
---|
123 | fJupiter->SetObject(5);
|
---|
124 | fJupiter->PreProcess(&fPlist);
|
---|
125 | fJupiter->SetCalcEc(kTRUE);
|
---|
126 |
|
---|
127 | fSaturn = new MVPObject();
|
---|
128 | fSaturn->SetObject(6);
|
---|
129 | fSaturn->PreProcess(&fPlist);
|
---|
130 | fSaturn->SetCalcEc(kTRUE);
|
---|
131 | }
|
---|
132 | }
|
---|
133 |
|
---|
134 | // --------------------------------------------------------------------------
|
---|
135 | //
|
---|
136 | // Plots for a single object and a whole year are generated.
|
---|
137 | //
|
---|
138 | // Currently we do the following:
|
---|
139 | // - Create a plot MJD vs UTC for one year
|
---|
140 | // - Create a plot maxObjHeight vs Week for one year
|
---|
141 | // - Create visibility tables for one year (ZA, hours)
|
---|
142 | //
|
---|
143 | Bool_t MVPPlotter::CalcYear(Int_t year, UInt_t daySlices=96)
|
---|
144 | {
|
---|
145 | SetupObjects();
|
---|
146 |
|
---|
147 | UInt_t startday = (UInt_t)fTime->MJDStartOfYear(year);
|
---|
148 | UInt_t stopday = (UInt_t)fTime->MJDStartOfYear(year+1)-1;
|
---|
149 |
|
---|
150 | cout << "Processing period MJD "<< startday << " to MJD "<< stopday << endl;
|
---|
151 |
|
---|
152 | ULong_t startdayROOT = fgSecPerDay * (startday-fgMJD010170);
|
---|
153 | ULong_t stopdayROOT = fgSecPerDay * (stopday-fgMJD010170);
|
---|
154 |
|
---|
155 | // 2D Plot ZA vs MJD and UTC
|
---|
156 | fMjdUtcYear = new TH2D("fMjdUtcYear", "Visibility of object",
|
---|
157 | stopday-startday+1,startdayROOT,stopdayROOT,
|
---|
158 | daySlices+1,-450,fgSecPerDay+450);
|
---|
159 |
|
---|
160 | // Observability hours per day MJD
|
---|
161 | fMjdObsHours = new TH1D("fMjdObsHours", "Observation hours per day",
|
---|
162 | stopday-startday+1,startdayROOT,stopdayROOT);
|
---|
163 |
|
---|
164 | if (fUseMoon) {
|
---|
165 | // 2D Plot ZA of moon vs MJD and UTC
|
---|
166 | fMjdUtcYearMoon =new TH2D("fMjdUtcYearMoon", "Moon ZA",
|
---|
167 | stopday-startday+1,startdayROOT,stopdayROOT,
|
---|
168 | daySlices+1,-450,fgSecPerDay+450);
|
---|
169 |
|
---|
170 | // Moon phase vs MJD
|
---|
171 | fMjdMoonPhase =new TH1D("fMjdMoonPhase", "Moon phase",
|
---|
172 | stopday-startday+1,startdayROOT,stopdayROOT);
|
---|
173 | // Moon distance of object vs MJD
|
---|
174 | fMjdMoonDistance =new TH1D("fMjdMoonDistance", "Moon distance",
|
---|
175 | stopday-startday+1,startdayROOT,stopdayROOT);
|
---|
176 | // Moon intensity at object vs MJD
|
---|
177 | fMjdMoonIntensity =new TH1D("fMjdMoonIntensity", "Moon intensity at locus of object",
|
---|
178 | stopday-startday+1,startdayROOT,stopdayROOT);
|
---|
179 |
|
---|
180 | }
|
---|
181 |
|
---|
182 | if (fUsePlanets) {
|
---|
183 | // Distance of closest planet vs MJD
|
---|
184 | fMjdPlanetDistance =new TH1D("fMjdPlanetDistance", "PlanetDistance",
|
---|
185 | stopday-startday+1,startdayROOT,stopdayROOT);
|
---|
186 | }
|
---|
187 |
|
---|
188 |
|
---|
189 | // Array which holds total visibility time for whole year [0] and
|
---|
190 | // each month [1]..[12]
|
---|
191 | Float_t visibility[13][18];
|
---|
192 | memset(visibility, 0, 13*18*sizeof(Float_t));
|
---|
193 | /*
|
---|
194 | for (int m=0;m<13;m++)
|
---|
195 | for (int z=0;z<18;z++)
|
---|
196 | visibility[m][z]=0;
|
---|
197 | */
|
---|
198 | int fday, ftime;
|
---|
199 | Double_t phase=0;
|
---|
200 | Double_t obsHours;
|
---|
201 |
|
---|
202 | for (UInt_t day=startday; day<stopday+1; day++) {
|
---|
203 | Double_t todaysPhase=0;
|
---|
204 | Double_t moonIntensity;
|
---|
205 | obsHours=0;
|
---|
206 | for (UInt_t i=0; i<daySlices; i++)
|
---|
207 | {
|
---|
208 | // Rearrange filling of bins such that a "day" doesn't start at midnight,
|
---|
209 | // but rather at noon. This results in plots in which a "day" covers
|
---|
210 | // a whole night.
|
---|
211 | if (i>=(daySlices/2)) {
|
---|
212 | fday=day;
|
---|
213 | ftime=i-(daySlices/2);
|
---|
214 | } else {
|
---|
215 | fday=day-1;
|
---|
216 | ftime=i+(daySlices/2);
|
---|
217 | }
|
---|
218 |
|
---|
219 | // Objects access fTime via parameter list...
|
---|
220 | fTime->SetMJD(day,(Double_t)i/daySlices);
|
---|
221 |
|
---|
222 | if (fUseSun) fSun->Process();
|
---|
223 | if (fUseMoon) fMoon->Process();
|
---|
224 |
|
---|
225 | if (fUseSun && fUseMoon) {
|
---|
226 |
|
---|
227 | // Calculate moon phase...
|
---|
228 | phase = fSun->GetEcLong() - fMoon->GetEcLong();
|
---|
229 | phase = TMath::Pi()-(acos(cos(phase)*cos(fMoon->GetEcLat())));
|
---|
230 | phase = phase*180/TMath::Pi();
|
---|
231 | todaysPhase+=phase;
|
---|
232 |
|
---|
233 | }
|
---|
234 |
|
---|
235 | // If sun is not up (or we should not use sun information...)
|
---|
236 | if (fSun->GetAltitudeDeg() < fAstronomicalDarkness) {
|
---|
237 | // Calculate Position of object:
|
---|
238 | fObject->Process();
|
---|
239 |
|
---|
240 | // Calculate moon brightness at locus of object
|
---|
241 | // now this is gonna be fun...
|
---|
242 |
|
---|
243 | /* Evaluates predicted LUNAR part of sky brightness, in
|
---|
244 | * V magnitudes per square arcsecond,
|
---|
245 | */
|
---|
246 |
|
---|
247 | moonIntensity = LunSkyBright(phase/180, fObject->GetDistance(fMoon),
|
---|
248 | fMoon->GetAltitudeDeg(), fObject->GetAltitudeDeg());
|
---|
249 | fMjdMoonIntensity->Fill(fgSecPerDay*(fday-fgMJD010170),moonIntensity);
|
---|
250 |
|
---|
251 |
|
---|
252 |
|
---|
253 | // If moon is not up (or we should not use moon information...)
|
---|
254 | if (!fUseMoon || fMoon->GetAltitudeDeg()<=0 || moonIntensity<60) {
|
---|
255 | // Fill MJD-UTC histogram
|
---|
256 | fMjdUtcYear->Fill(fgSecPerDay*(fday-fgMJD010170),fgSecPerDay*ftime/daySlices,fObject->GetAltitudeDeg());
|
---|
257 | }
|
---|
258 |
|
---|
259 | // Sum up visibility time (only if moon not visible or moon
|
---|
260 | // info shouldn't be used at all)
|
---|
261 | if ((!fUseMoon)||(fMoon->GetAltitudeDeg()<=0)||(moonIntensity<60)) {
|
---|
262 | // Calculate
|
---|
263 | for (int z=0;z<18;z++) {
|
---|
264 | if (fObject->GetAltitudeDeg()>(z*5)) {
|
---|
265 | visibility[0][z]+=(Double_t)(60*24/daySlices);
|
---|
266 | visibility[(Int_t)fTime->GetMonth()][z]+=(Double_t)(60*24/daySlices);
|
---|
267 | }
|
---|
268 | } //for
|
---|
269 |
|
---|
270 | if ((fObject->GetAltitudeDeg())>40) {
|
---|
271 | fMjdObsHours->Fill(fgSecPerDay*(fday-fgMJD010170),(Double_t)(24/(Double_t)daySlices));
|
---|
272 | }
|
---|
273 |
|
---|
274 | }
|
---|
275 |
|
---|
276 |
|
---|
277 | } //fi sun
|
---|
278 |
|
---|
279 | // Optional: Fill histo with moon-up times...
|
---|
280 | // if (fMoon->GetAltitudeDeg() >0)
|
---|
281 | // fMjdUtcYearMoon->Fill(fgSecPerDay*(day-fgMJD010170),fgSecPerDay*i/daySlices,phase);
|
---|
282 | // fMoon->Process();
|
---|
283 | // Double_t phase;
|
---|
284 | // phase = fSun->GetEcLong() - moon->GetEcLong();
|
---|
285 | // phase = TMath::Pi()-(acos(cos(phase)*cos(moon->GetEcLat())));
|
---|
286 | // cout << "Phase: " << phase*180/TMath::Pi() << endl;
|
---|
287 |
|
---|
288 | } //for daySlices
|
---|
289 |
|
---|
290 | // Distance of Venus to object
|
---|
291 |
|
---|
292 | if (fUsePlanets) {
|
---|
293 | fVenus->Process();
|
---|
294 | fMars->Process();
|
---|
295 | fJupiter->Process();
|
---|
296 | fSaturn->Process();
|
---|
297 |
|
---|
298 | Double_t distance = fVenus->GetDistance(fObject);
|
---|
299 | distance = TMath::Min(distance, fMars->GetDistance(fObject));
|
---|
300 | distance = TMath::Min(distance, fJupiter->GetDistance(fObject));
|
---|
301 | distance = TMath::Min(distance, fSaturn->GetDistance(fObject));
|
---|
302 |
|
---|
303 | fMjdPlanetDistance->Fill(fgSecPerDay*(fday-fgMJD010170),distance);
|
---|
304 | }
|
---|
305 |
|
---|
306 | fMjdMoonPhase->Fill(fgSecPerDay*(fday-fgMJD010170),todaysPhase/i);
|
---|
307 | fMjdMoonDistance->Fill(fgSecPerDay*(fday-fgMJD010170),fMoon->GetDistance(fObject));
|
---|
308 |
|
---|
309 |
|
---|
310 | } //for days
|
---|
311 |
|
---|
312 |
|
---|
313 | // Here we print the tables with visibilities...
|
---|
314 | cout << "Visibility time [hours]: " << endl;
|
---|
315 |
|
---|
316 | for (int z=1;z<17;z++) {
|
---|
317 | if (visibility[0][z]==0) break;
|
---|
318 | printf("Alt>%2d|%6d|",z*5,(Int_t)(visibility[0][z]/60));
|
---|
319 | for (int m=1;m<13;m++) {
|
---|
320 | printf("%5d ",(Int_t)(visibility[m][z]/60));
|
---|
321 | }
|
---|
322 | printf("\n");
|
---|
323 | }
|
---|
324 |
|
---|
325 | int vistimestart=0;
|
---|
326 | int vistimeend=0;
|
---|
327 | for (int m=1; m<13; m++) {
|
---|
328 | int n = (m==1 ? 12 : m-1);
|
---|
329 | if (visibility[m][8]/60>20 && visibility[n][8]/60<=20) {
|
---|
330 | vistimestart=m; // we're on the rising slope
|
---|
331 | }
|
---|
332 | }
|
---|
333 |
|
---|
334 | for (int m=1; m<13; m++) {
|
---|
335 | int n = (m==1 ? 12 : m-1);
|
---|
336 | if (visibility[m][8]/60<20 && visibility[n][8]/60>=20) {
|
---|
337 | vistimeend=n; // we're on the falling slope
|
---|
338 | }
|
---|
339 | }
|
---|
340 |
|
---|
341 | cout << "Visibility (Alt>40) during months: " << vistimestart << "-" << vistimeend << " approx " << visibility[0][8]/60 << "hrs" <<endl;
|
---|
342 |
|
---|
343 |
|
---|
344 | /*!!!!!!!!!!!!!!!!!!!!!!!*/gROOT->Reset();
|
---|
345 |
|
---|
346 | TCanvas *cMjdUtcYear = new TCanvas("cMjdUtcYear", "Object Visibility MjdUtcYear", 1100,500);
|
---|
347 | cMjdUtcYear->cd(0);
|
---|
348 |
|
---|
349 | gStyle->SetPalette(1);
|
---|
350 | // gStyle->SetOptStat(0);
|
---|
351 | gStyle->SetOptFit(0);
|
---|
352 | gStyle->SetFillStyle(0);
|
---|
353 | gStyle->SetFillColor(10);
|
---|
354 | gStyle->SetCanvasColor(10);
|
---|
355 | gStyle->SetDrawBorder(0);
|
---|
356 | gStyle->SetPadColor(10);
|
---|
357 | gStyle->SetPadBorderSize(0);
|
---|
358 | gStyle->SetPadLeftMargin(0.12);
|
---|
359 | gStyle->SetTitleYOffset(1.2);
|
---|
360 | gStyle->SetTitleXOffset(1.2);
|
---|
361 |
|
---|
362 | gStyle->SetPadLeftMargin(0.01);
|
---|
363 | gStyle->SetPadRightMargin(0.1);
|
---|
364 | gStyle->SetPadTopMargin(0.03);
|
---|
365 | gStyle->SetPadBottomMargin(0.12);
|
---|
366 |
|
---|
367 | fMjdUtcYear->SetTitle(fObject->GetObjectName());
|
---|
368 | fMjdUtcYear->GetXaxis()->SetTimeDisplay(1);
|
---|
369 | fMjdUtcYear->GetXaxis()->SetTimeFormat("%b %y");
|
---|
370 | fMjdUtcYear->GetYaxis()->SetTimeDisplay(1);
|
---|
371 | fMjdUtcYear->GetYaxis()->SetTimeFormat("%Hh");
|
---|
372 | gStyle->SetTimeOffset(43200);
|
---|
373 | fMjdUtcYear->GetYaxis()->SetLabelOffset(0.01);
|
---|
374 | fMjdUtcYear->SetMinimum(0);
|
---|
375 | fMjdUtcYear->SetMaximum(90);
|
---|
376 |
|
---|
377 | fMjdUtcYear->GetYaxis()->SetTitle("Hour");
|
---|
378 | fMjdUtcYear->GetXaxis()->SetTitle("Day of year");
|
---|
379 | fMjdUtcYear->GetZaxis()->SetTitle("Altitude");
|
---|
380 | fMjdUtcYear->Draw("SURF2BB9Z");
|
---|
381 | gPad->SetPhi(0);
|
---|
382 | gPad->SetTheta(90);
|
---|
383 | gPad->Modified();
|
---|
384 |
|
---|
385 | TPaveText *pt = new TPaveText(-0.74,-0.35,-0.58,0.52,"");
|
---|
386 | char ptLine[80];
|
---|
387 | pt->AddText("Visibility time [hrs]:");
|
---|
388 | pt->SetTextAlign(13);
|
---|
389 | pt->SetFillStyle(0);
|
---|
390 | pt->SetBorderSize(0);
|
---|
391 | pt->SetTextFont(42);
|
---|
392 | for (int j=1;j<17;j++) {
|
---|
393 | sprintf (ptLine, "Alt>%i: %i", j*5, (Int_t)visibility[0][j]/60);
|
---|
394 | pt->AddText(ptLine);
|
---|
395 | if (visibility[0][j]==0) break;
|
---|
396 | }
|
---|
397 | pt->Draw();
|
---|
398 |
|
---|
399 |
|
---|
400 | if (fUseMoon) {
|
---|
401 | TCanvas *cMjdMoon = new TCanvas("cMjdMoon", "the Moon phase", 600,600);
|
---|
402 | gStyle->SetOptTitle(1);
|
---|
403 | cMjdMoon->Divide(1,3);
|
---|
404 | cMjdMoon->cd(1);
|
---|
405 | fMjdMoonPhase->Draw();
|
---|
406 | cMjdMoon->cd(2);
|
---|
407 | fMjdMoonDistance->Draw();
|
---|
408 | cMjdMoon->cd(3);
|
---|
409 | fMjdMoonIntensity->Draw();
|
---|
410 | }
|
---|
411 |
|
---|
412 | TCanvas *cObsHours = new TCanvas("cObsHours", "ObsHours per day", 600,400);
|
---|
413 | fMjdObsHours->Draw();
|
---|
414 |
|
---|
415 |
|
---|
416 |
|
---|
417 | if (fUsePlanets) {
|
---|
418 | TCanvas *cMjdPlanets = new TCanvas("cMjdPlanets", "the distance to planets", 600,200);
|
---|
419 | cMjdPlanets->cd(0);
|
---|
420 | fMjdPlanetDistance->Draw();
|
---|
421 | }
|
---|
422 |
|
---|
423 |
|
---|
424 | // next histogram
|
---|
425 | Float_t objectHeight[55];
|
---|
426 | Float_t simpleCounter[55];
|
---|
427 | Int_t weekCounter=0;
|
---|
428 |
|
---|
429 | simpleCounter[weekCounter]=0;
|
---|
430 | objectHeight[weekCounter]=0;
|
---|
431 | weekCounter++;
|
---|
432 |
|
---|
433 | const Int_t startday2 = fTime->MJDStartOfYear(year);
|
---|
434 | const Int_t stopday2 = fTime->MJDStartOfYear(year+1)-1;
|
---|
435 |
|
---|
436 | for (int day=startday2; day<stopday2+1; day+=7)
|
---|
437 | {
|
---|
438 | simpleCounter[weekCounter]=weekCounter-1;
|
---|
439 | objectHeight[weekCounter]=0;
|
---|
440 | for (int i=0; i<daySlices; i++)
|
---|
441 | {
|
---|
442 | if (i>=48)
|
---|
443 | {
|
---|
444 | fday=day;
|
---|
445 | ftime=i-48;
|
---|
446 | }
|
---|
447 | else
|
---|
448 | {
|
---|
449 | fday=day-1;
|
---|
450 | ftime=i+48;
|
---|
451 | }
|
---|
452 |
|
---|
453 | fTime->SetMJD(day,(Double_t)i/daySlices);
|
---|
454 | fObject->Process();
|
---|
455 | fSun->Process();
|
---|
456 |
|
---|
457 | if (fSun->GetAltitudeDeg() < -25.0)
|
---|
458 | {
|
---|
459 | if (objectHeight[weekCounter]<(fObject->GetAltitudeDeg()))
|
---|
460 | objectHeight[weekCounter]=fObject->GetAltitudeDeg();
|
---|
461 | }
|
---|
462 |
|
---|
463 | } //i
|
---|
464 | weekCounter++;
|
---|
465 | } //day
|
---|
466 | simpleCounter[weekCounter]=weekCounter-2;
|
---|
467 | objectHeight[weekCounter]=0;
|
---|
468 | weekCounter++;
|
---|
469 |
|
---|
470 | TString months[12] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
|
---|
471 |
|
---|
472 | TCanvas *c2 = new TCanvas("c2", "Object Visibility",600,100);
|
---|
473 |
|
---|
474 | // gStyle->SetOptTitle(0);
|
---|
475 | // gStyle->SetPadLeftMargin(0.000001);
|
---|
476 | // gStyle->SetPadRightMargin(0.000001);
|
---|
477 | // gStyle->SetPadTopMargin(0.001);
|
---|
478 | // gStyle->SetPadBottomMargin(0.000001);
|
---|
479 | gPad->SetGrid();
|
---|
480 |
|
---|
481 | c2->SetGrid();
|
---|
482 | TGraph *tg=new TGraph(weekCounter,simpleCounter,objectHeight);
|
---|
483 |
|
---|
484 | tg->SetMinimum(1);
|
---|
485 | tg->SetMaximum(90);
|
---|
486 |
|
---|
487 | Double_t maxza = abs(fObject->GetDec()-fObs->GetLatitude());
|
---|
488 |
|
---|
489 | if (maxza > 90) maxza=90;
|
---|
490 | if (maxza < 0) maxza=00;
|
---|
491 |
|
---|
492 | cout << "MaxZA: ";
|
---|
493 | cout << maxza << endl;
|
---|
494 |
|
---|
495 | if (maxza < 30) { //colors=green to yellow
|
---|
496 | maxza *= 9/30;
|
---|
497 | maxza += 80;
|
---|
498 |
|
---|
499 | } else { //colors=yellow to red
|
---|
500 | maxza -= 30;
|
---|
501 | maxza *= 11/60;
|
---|
502 | maxza += 89;
|
---|
503 | }
|
---|
504 |
|
---|
505 | tg->SetFillColor((Int_t)maxza);
|
---|
506 | tg->SetLineColor((Int_t)maxza);
|
---|
507 | tg->SetLineWidth((Int_t)maxza);
|
---|
508 | tg->Draw("AF");
|
---|
509 |
|
---|
510 | tg->GetXaxis()->SetLimits(0,52);
|
---|
511 | tg->GetXaxis()->SetTickLength(0.1);
|
---|
512 | tg->GetXaxis()->SetNdivisions(0);
|
---|
513 | tg->GetYaxis()->SetNdivisions(202);
|
---|
514 |
|
---|
515 | TPaveLabel* l= new TPaveLabel(2,46,35,88, fObject->GetObjectName());
|
---|
516 | l->SetBorderSize(0);
|
---|
517 | l->SetFillStyle(0);
|
---|
518 | l->SetTextAlign(12);
|
---|
519 | l->Draw();
|
---|
520 |
|
---|
521 | if ((vistimestart<13)&&(vistimeend>0)) {
|
---|
522 | TString label=months[vistimestart-1]+"-"+months[vistimeend-1];
|
---|
523 | TPaveLabel* l2= new TPaveLabel(35,46,50,88, label);
|
---|
524 | l2->SetBorderSize(0);
|
---|
525 | l2->SetFillStyle(0);
|
---|
526 | l2->SetTextAlign(32);
|
---|
527 | l2->Draw();
|
---|
528 |
|
---|
529 | }
|
---|
530 |
|
---|
531 | c2->Modified();
|
---|
532 | c2->Update();
|
---|
533 |
|
---|
534 | return kTRUE;
|
---|
535 | }
|
---|
536 |
|
---|
537 | Double_t MVPPlotter::LunSkyBright(Double_t moon_phase,Double_t rho,Double_t altmoon,Double_t alt)
|
---|
538 | {
|
---|
539 | /* Evaluates predicted LUNAR part of sky brightness, in
|
---|
540 | * V magnitudes per square arcsecond, following K. Krisciunas
|
---|
541 | * and B. E. Schaeffer (1991) PASP 103, 1033.
|
---|
542 | *
|
---|
543 | * moon_phase = Phase of the Moon, between 0. (no moon) and 1. (full moon),
|
---|
544 | * rho (deg) = separation of moon and object,
|
---|
545 | * altmoon (deg) = altitude of moon above horizon,
|
---|
546 | * alt (deg) = altitude of object above horizon
|
---|
547 | */
|
---|
548 |
|
---|
549 | double kzen=1.;
|
---|
550 |
|
---|
551 | double rho_rad = rho*fgDegToRad;
|
---|
552 | double alpha = 180.*(1. - moon_phase);
|
---|
553 | double Zmoon = (90. - altmoon)*fgDegToRad;
|
---|
554 | double Z = (90. - alt)*fgDegToRad;
|
---|
555 |
|
---|
556 | double istar = -0.4*(3.84 + 0.026*fabs(alpha) + 4.0e-9*pow(alpha,4.)); /*eqn 20*/
|
---|
557 | istar = pow(10.,istar);
|
---|
558 | if(fabs(alpha) < 7.) /* crude accounting for opposition effect */
|
---|
559 | istar *= 1.35 - 0.05 * fabs(istar);
|
---|
560 | /* 35 per cent brighter at full, effect tapering linearly to
|
---|
561 | zero at 7 degrees away from full. mentioned peripherally in
|
---|
562 | Krisciunas and Scheafer, p. 1035. */
|
---|
563 | double fofrho = 229087. * (1.06 + cos(rho_rad)*cos(rho_rad));
|
---|
564 | if(fabs(rho) > 10.)
|
---|
565 | fofrho+=pow(10.,(6.15 - rho/40.)); /* eqn 21 */
|
---|
566 | else if (fabs(rho) > 0.25)
|
---|
567 | fofrho+=6.2e7 / (rho*rho); /* eqn 19 */
|
---|
568 | else fofrho = fofrho+9.9e8; /*for 1/4 degree -- radius of moon! */
|
---|
569 |
|
---|
570 | double Xzm = sqrt(1.0 - 0.96*sin(Zmoon)*sin(Zmoon));
|
---|
571 |
|
---|
572 | if(Xzm != 0.) Xzm = 1./Xzm;
|
---|
573 | else Xzm = 10000.;
|
---|
574 |
|
---|
575 | double Xo = sqrt(1.0 - 0.96*sin(Z)*sin(Z));
|
---|
576 | if(Xo != 0.) Xo = 1./Xo;
|
---|
577 | else Xo = 10000.;
|
---|
578 |
|
---|
579 | double Bmoon = fofrho * istar * pow(10.,(-0.4*kzen*Xzm))
|
---|
580 | * (1. - pow(10.,(-0.4*kzen*Xo))); /* nanoLamberts */
|
---|
581 | // cout << " Bmoon=" << Bmoon;
|
---|
582 | if(Bmoon > 0.001)
|
---|
583 | return(Bmoon);
|
---|
584 | else return(99999.);
|
---|
585 | }
|
---|
586 |
|
---|
587 |
|
---|