FACT++  1.0
int main ( int  argc,
const char *  argv[] 
)

Definition at line 82 of file makeplots.cc.

References CheckForGap(), color(), Configuration::DoParse(), DrawClone(), Nova::SolarObjects::fJD, Nova::SolarObjects::fMoonEqu, Nova::SolarObjects::fMoonHrz, Configuration::Get(), Nova::GetAngularSeparation(), Time::GetAsStr(), Nova::GetHrzFromEqu(), Nova::GetSolarRst(), Configuration::Has(), Time::JD(), kBlue, kCyan, kGreen, kMagenta, kRed, kWhite, kYellow, Time::Mjd(), FACT::PredictI(), PrintUsage(), Time::SetFromStr(), Configuration::SetPrintUsage(), SetupConfiguration(), t, and time.

83 {
84  gROOT->SetBatch();
85 
86  Configuration conf(argv[0]);
87  conf.SetPrintUsage(PrintUsage);
88  SetupConfiguration(conf);
89 
90  if (!conf.DoParse(argc, argv))
91  return 127;
92 
93 // if (conf.Has("ra")^conf.Has("dec"))
94 // {
95 // cout << "ERROR - Either --ra or --dec missing." << endl;
96 // return 1;
97 // }
98 
99  // ------------------ Eval config ---------------------
100 
101  Time time;
102  if (conf.Has("date-time"))
103  time.SetFromStr(conf.Get<string>("date-time"));
104 
105  const double max_current = conf.Get<double>("max-current");
106  const double max_zd = conf.Get<double>("max-zd");
107  const double no_limits = conf.Get<bool>("no-limits");
108 
109  // -12: nautical
110  // Sun set with the same date than th provided date
111  // Sun rise on the following day
112  const RstTime sun_set = GetSolarRst(time.JD()-0.5, -12);
113  const RstTime sun_rise = GetSolarRst(time.JD()+0.5, -12);
114 
115  const double jd = floor(time.Mjd())+2400001;
116 
117  cout << "Time: " << time << endl;
118  cout << "Base: " << Time(jd-0.5) << endl;
119  cout << "Set: " << Time(sun_set.set) << endl;
120  cout << "Rise: " << Time(sun_rise.rise) << endl;
121 
122  const double sunset = sun_set.set;
123  const double sunrise = sun_rise.rise;
124 
125  const string fDatabase = conf.Get<string>("source-database");
126 
127  // ------------- Get Sources from databasse ---------------------
128 
129  const mysqlpp::StoreQueryResult res =
130  Database(fDatabase).query("SELECT fSourceName, fRightAscension, fDeclination FROM Source WHERE fSourceTypeKEY=1").store();
131 
132  // ------------- Create canvases and frames ---------------------
133 
134  // It is important to use an offset which is larger than
135  // 1970-01-01 00:00:00. This one will not work if your
136  // local time zone is positive!
137  TH1S hframe("", "", 1, Time(sunset).Mjd()*24*3600, Time(sunrise).Mjd()*24*3600);
138  hframe.SetStats(kFALSE);
139  hframe.GetXaxis()->SetTimeFormat("%Hh%M%F1995-01-01 00:00:00 GMT");
140  hframe.GetXaxis()->SetTitle((Time(jd).GetAsStr("%d/%m/%Y")+" - "+Time(jd+1).GetAsStr("%d/%m/%Y")+" [UTC]").c_str());
141  hframe.GetXaxis()->CenterTitle();
142  hframe.GetYaxis()->CenterTitle();
143  hframe.GetXaxis()->SetTimeDisplay(true);
144  hframe.GetYaxis()->SetTitleSize(0.040);
145  hframe.GetXaxis()->SetTitleSize(0.040);
146  hframe.GetXaxis()->SetTitleOffset(1.1);
147  hframe.GetYaxis()->SetLabelSize(0.040);
148  hframe.GetXaxis()->SetLabelSize(0.040);
149 
150  TCanvas c1;
151  c1.SetFillColor(kWhite);
152  c1.SetBorderMode(0);
153  c1.SetFrameBorderMode(0);
154  c1.SetLeftMargin(0.085);
155  c1.SetRightMargin(0.01);
156  c1.SetTopMargin(0.03);
157  c1.SetGrid();
158  hframe.GetYaxis()->SetTitle("Altitude [deg]");
159  hframe.SetMinimum(15);
160  hframe.SetMaximum(90);
161  hframe.DrawCopy();
162 
163  TCanvas c2;
164  c2.SetFillColor(kWhite);
165  c2.SetBorderMode(0);
166  c2.SetFrameBorderMode(0);
167  c2.SetLeftMargin(0.085);
168  c2.SetRightMargin(0.01);
169  c2.SetTopMargin(0.03);
170  c2.SetGrid();
171  hframe.GetYaxis()->SetTitle("Predicted Current [#muA]");
172  hframe.SetMinimum(0);
173  hframe.SetMaximum(100);
174  hframe.DrawCopy();
175 
176  TCanvas c3;
177  c3.SetFillColor(kWhite);
178  c3.SetBorderMode(0);
179  c3.SetFrameBorderMode(0);
180  c3.SetLeftMargin(0.085);
181  c3.SetRightMargin(0.01);
182  c3.SetTopMargin(0.03);
183  c3.SetGrid();
184  c3.SetLogy();
185  hframe.GetYaxis()->SetTitle("Estimated relative threshold");
186  hframe.GetYaxis()->SetMoreLogLabels();
187  hframe.SetMinimum(0.9);
188  hframe.SetMaximum(11);
189  hframe.DrawCopy();
190 
191  TCanvas c4;
192  c4.SetFillColor(kWhite);
193  c4.SetBorderMode(0);
194  c4.SetFrameBorderMode(0);
195  c4.SetLeftMargin(0.085);
196  c4.SetRightMargin(0.01);
197  c4.SetTopMargin(0.03);
198  c4.SetGrid();
199  hframe.GetYaxis()->SetTitle("Distance to moon [deg]");
200  hframe.SetMinimum(0);
201  hframe.SetMaximum(180);
202  hframe.DrawCopy();
203 
204  Int_t color[] = { kBlack, kRed, kBlue, kGreen, kCyan, kMagenta };
205  Int_t style[] = { kSolid, kDashed, kDotted };
206 
207  TLegend leg(0, 0, 1, 1);
208 
209  // ------------- Loop over sources ---------------------
210 
211  Int_t cnt=0;
212  for (vector<mysqlpp::Row>::const_iterator v=res.begin(); v<res.end(); v++, cnt++)
213  {
214  // Eval row
215  const string name = (*v)[0].c_str();
216 
217  EquPosn pos;
218  pos.ra = double((*v)[1])*15;
219  pos.dec = double((*v)[2]);
220 
221  // Create graphs
222  TGraph g1, g2, g3, g4, gr, gm;
223  g1.SetName(name.data());
224  g2.SetName(name.data());
225  g3.SetName(name.data());
226  g4.SetName(name.data());
227  g1.SetLineWidth(2);
228  g2.SetLineWidth(2);
229  g3.SetLineWidth(2);
230  g4.SetLineWidth(2);
231  gm.SetLineWidth(1);
232  g1.SetLineStyle(style[cnt/6]);
233  g2.SetLineStyle(style[cnt/6]);
234  g3.SetLineStyle(style[cnt/6]);
235  g4.SetLineStyle(style[cnt/6]);
236  g1.SetLineColor(color[cnt%6]);
237  g2.SetLineColor(color[cnt%6]);
238  g3.SetLineColor(color[cnt%6]);
239  g4.SetLineColor(color[cnt%6]);
240  gm.SetLineColor(kYellow);
241 
242  if (cnt==0)
243  leg.AddEntry(gm.Clone(), "Moon", "l");
244  leg.AddEntry(g1.Clone(), name.data(), "l");
245 
246  // Loop over 24 hours
247  for (double h=0; h<1; h+=1./(24*12))
248  {
249  const SolarObjects so(jd+h);
250 
251  // get local position of source
252  const HrzPosn hrz = GetHrzFromEqu(pos, so.fJD);
253 
254  if (v==res.begin())
255  cout << Time(so.fJD) <<" " << 90-so.fMoonHrz.alt << endl;
256 
257  const double cur = FACT::PredictI(so, pos);
258 
259  // Relative energy threshold prediction
260  const double ratio = pow(cos((90-hrz.alt)*M_PI/180), -2.664);
261 
262  // Add points to curve
263  const double axis = Time(so.fJD).Mjd()*24*3600;
264 
265  // If there is a gap of more than one bin, start a new curve
266  CheckForGap(c1, g1, axis);
267  CheckForGap(c1, gm, axis);
268  CheckForGap(c2, g2, axis);
269  CheckForGap(c3, g3, axis);
270  CheckForGap(c4, g4, axis);
271 
272  // Add data
273  if (no_limits || cur<max_current)
274  g1.SetPoint(g1.GetN(), axis, hrz.alt);
275 
276  if (no_limits || 90-hrz.alt<max_zd)
277  g2.SetPoint(g2.GetN(), axis, cur);
278 
279  if (no_limits || (cur<max_current && 90-hrz.alt<max_zd))
280  g3.SetPoint(g3.GetN(), axis, ratio*pow(cur/6.2, 0.394));
281 
282  if (no_limits || (cur<max_current && 90-hrz.alt<max_zd))
283  {
284  const double angle = GetAngularSeparation(so.fMoonEqu, pos);
285  g4.SetPoint(g4.GetN(), axis, angle);
286  }
287 
288  if (cnt==0)
289  gm.SetPoint(gm.GetN(), axis, so.fMoonHrz.alt);
290  }
291 
292  if (cnt==0)
293  DrawClone(c1, gm);
294 
295  DrawClone(c1, g1);
296  DrawClone(c2, g2);
297  DrawClone(c3, g3);
298  DrawClone(c4, g4);
299  }
300 
301 
302  // Save three plots
303  TCanvas c5;
304  c5.SetFillColor(kWhite);
305  c5.SetBorderMode(0);
306  c5.SetFrameBorderMode(0);
307  leg.Draw();
308 
309  const string t = Time(jd).GetAsStr("%Y%m%d");
310 
311  c1.SaveAs((t+"-ZenithDistance.eps").c_str());
312  c2.SaveAs((t+"-PredictedCurrent.eps").c_str());
313  c3.SaveAs((t+"-RelativeThreshold.eps").c_str());
314  c4.SaveAs((t+"-MoonDist.eps").c_str());
315  c5.SaveAs((t+"-Legend.eps").c_str());
316 
317  c1.SaveAs((t+"-ZenithDistance.root").c_str());
318  c2.SaveAs((t+"-PredictedCurrent.root").c_str());
319  c3.SaveAs((t+"-RelativeThreshold.root").c_str());
320  c4.SaveAs((t+"-MoonDist.root").c_str());
321 
322  c1.Print((t+".pdf(").c_str(), "pdf");
323  c2.Print((t+".pdf" ).c_str(), "pdf");
324  c3.Print((t+".pdf" ).c_str(), "pdf");
325  c4.Print((t+".pdf" ).c_str(), "pdf");
326  c5.Print((t+".pdf)").c_str(), "pdf");
327 
328  return 0;
329 }
Set color Cyan.
Definition: WindowLog.h:22
Set color White.
Definition: WindowLog.h:23
Set color Green.
Definition: WindowLog.h:18
Adds some functionality to boost::posix_time::ptime for our needs.
Definition: Time.h:30
Set color Yellow.
Definition: WindowLog.h:19
Set color Red.
Definition: WindowLog.h:17
void DrawClone(TCanvas &c, TGraph &g)
Definition: makeplots.cc:30
void SetupConfiguration(Configuration &conf)
Definition: makeplots.cc:43
double JD() const
Definition: Time.h:87
Set color Magenta.
Definition: WindowLog.h:21
void Mjd(double mjd)
Definition: Time.cc:145
Set color Blue.
Definition: WindowLog.h:20
double h
Definition: palObs.c:170
Warning because the service this data corrsponds to might have been last updated longer ago than Local time
Definition: smartfact.txt:92
Commandline parsing, resource file parsing and database access.
Definition: Configuration.h:9
void SetFromStr(const std::string &str, const char *fmt="%Y-%m-%d %H:%M:%S")
Definition: Time.cc:273
void CheckForGap(TCanvas &c, TGraph &g, double axis)
Definition: makeplots.cc:19
RstTime GetSolarRst(double jd, const LnLatPosn &obs, double hrz=LN_SOLAR_STANDART_HORIZON)
Definition: nova.h:97
HrzPosn GetHrzFromEqu(const EquPosn &equ, const LnLatPosn &obs, double jd)
Definition: nova.h:75
TT t
Definition: test_client.c:26
function color(col)
Definition: color.js:31
ln_rst_time RstTime
Definition: nova.h:13
double GetAngularSeparation(const EquPosn &p1, const EquPosn &p2)
Definition: nova.h:148
std::string GetAsStr(const char *fmt="%Y-%m-%d %H:%M:%S") const
Definition: Time.cc:240
double PredictI(const Nova::SolarObjects &so, const Nova::EquPosn &srcEqu)
Definition: Prediction.h:10
void PrintUsage()
Definition: makeplots.cc:63

+ Here is the call graph for this function: