| 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 |
|
|---|