Changeset 8994 for trunk/MagicSoft/Mars/datacenter/macros/plotrundb.C
- Timestamp:
- 07/03/08 17:29:50 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/MagicSoft/Mars/datacenter/macros/plotrundb.C
r8752 r8994 1 1 /* ======================================================================== *\ 2 ! $Name: not supported by cvs2svn $:$Id: plotrundb.C,v 1. 4 2007-10-07 21:12:15tbretz Exp $2 ! $Name: not supported by cvs2svn $:$Id: plotrundb.C,v 1.5 2008-07-03 16:29:48 tbretz Exp $ 3 3 ! -------------------------------------------------------------------------- 4 4 ! … … 21 21 ! Author(s): Daniela Dorner, 05/2005 <mailto:dorner@astro.uni-wuerzburg.de> 22 22 ! 23 ! Copyright: MAGIC Software Development, 2000-200 623 ! Copyright: MAGIC Software Development, 2000-2008 24 24 ! 25 25 ! … … 59 59 // 60 60 ///////////////////////////////////////////////////////////////////////////// 61 #include <iostream> 62 #include <iomanip> 63 64 #include <TH1.h> 65 #include <TEnv.h> 66 #include <TPad.h> 67 #include <TLine.h> 68 #include <TText.h> 69 #include <TFrame.h> 70 #include <TStyle.h> 71 #include <TCanvas.h> 72 #include <TPRegexp.h> 73 #include <TSQLRow.h> 74 #include <TSQLResult.h> 75 #include <TGraphErrors.h> 76 77 #include "MTime.h" 78 #include "MAstro.h" 79 #include "MDataSet.h" 80 #include "MSQLMagic.h" 81 #include "MStatusDisplay.h" 82 83 class MPlot : public MParContainer 84 { 85 public: 86 // Possible constants to group-by (average) over a certain period 87 enum GroupBy_t 88 { 89 kNone, 90 kGroupByPrimary, 91 kGroupByHour, 92 kGroupByNight, 93 kGroupByWeek, 94 kGroupByMonth, 95 kGroupBySeason, 96 kGroupByYear 97 }; 98 99 private: 100 MSQLMagic &fServer; // Reference to the sql-server class 101 102 MDataSet *fDataSet; // A possible dtaset to highlite single points 103 104 TString fPrimaryDate; // The name of the data we plot 105 TString fPrimaryNumber; // The corresponding name for the key number 106 TString fSecondary; // The value versus which the second plot is made 107 108 TString fRequestFrom; // Start of a requested date range 109 TString fRequestTo; // End of a requested date range 110 Int_t fRequestPeriod; // A possible requested period 111 112 Float_t fPlotMin; 113 Float_t fPlotMax; 114 115 Float_t fHistMin; 116 Float_t fHistMax; 117 118 TString fDescription; // The description (title) of the plot 119 TString fNameTab; // The name of the tab in the display 120 121 TString fCondition; // An additional condition added to the query 122 GroupBy_t fGroupBy; // A possible Group-By flag 123 124 // -------------------------------------------------------------------------- 125 // 126 // Function to plot the result of the query 127 // 128 void PlotTable(TSQLResult &res, TString name, Float_t fmin, Float_t fmax, Float_t resolution) 129 { 130 // Enable all otions in the statistics box 131 gStyle->SetOptStat(111111); 132 133 // Create TGraph objects 134 TGraph > = res.GetFieldCount()>4 ? *new TGraphErrors : *new TGraph; 135 gt.SetNameTitle(name, Form("%s vs Time", name.Data())); 136 gt.SetMarkerStyle(kFullDotMedium); 137 138 TGraph gz; 139 gz.SetNameTitle(name, Form("%s vs <Zd>", name.Data())); 140 gz.SetMarkerStyle(kFullDotMedium); 141 142 TGraph gt0, gt1; 143 gt0.SetMarkerColor(kRed); 144 gt1.SetMarkerColor(kBlue); 145 gt0.SetMarkerStyle(kFullDotLarge); 146 gt1.SetMarkerStyle(kFullDotLarge); 147 148 TGraph gz0, gz1; 149 gz0.SetMarkerColor(kRed); 150 gz1.SetMarkerColor(kBlue); 151 gz0.SetMarkerStyle(kFullDotLarge); 152 gz1.SetMarkerStyle(kFullDotLarge); 153 154 Int_t first = -1; 155 Int_t last = -1; 156 157 // Loop over the data 158 TSQLRow *row=0; 159 while ((row=res.Next())) 160 { 161 // Get all fields of this row 162 const char *date = (*row)[0]; 163 const char *zd = (*row)[1]; 164 const char *val = (*row)[2]; 165 const char *snum = res.GetFieldCount()>3 ? (*row)[3] : 0; 166 const char *verr = res.GetFieldCount()>4 ? (*row)[5] : 0; 167 168 delete row; 169 170 if (!date || !val || !zd) 171 continue; 172 173 // check if date is valid 174 MTime t(date); 175 if (!t.SetSqlDateTime(date)) 176 continue; 177 178 // check if it belongs to the requested MAGIC period 179 if (fRequestPeriod>0 && MAstro::GetMagicPeriod(t.GetMjd())!=fRequestPeriod) 180 continue; 181 182 // Get axis range 183 if (first<0) 184 first = TMath::Nint(TMath::Floor(t.GetMjd())); 185 last = TMath::Nint(TMath::Ceil(t.GetMjd())); 186 187 // Convert a possible key number into a integer 188 UInt_t seq = snum ? atoi(snum) : 0; 189 190 // convert primary and secondary value into floats 191 Float_t value = atof(val); 192 Float_t zenith = atof(zd); 193 194 // If a datset is given add the point to the special TGraphs 195 // used for highliting these dates 196 if (fDataSet) 197 { 198 if (fDataSet->HasOnSequence(seq)) 199 { 200 gt1.SetPoint(gt1.GetN(), t.GetAxisTime(), value); 201 gz1.SetPoint(gz1.GetN(), zenith, value); 202 } 203 204 if (fDataSet->HasOffSequence(seq)) 205 { 206 gt0.SetPoint(gt0.GetN(), t.GetAxisTime(), value); 207 gz0.SetPoint(gz0.GetN(), zenith, value); 208 } 209 } 210 211 // Add Data to TGraph 212 gt.SetPoint(gt.GetN(), t.GetAxisTime(), value); 213 gz.SetPoint(gz.GetN(), zenith, value); 214 215 // Set error-bar, if one 216 if (verr) 217 static_cast<TGraphErrors&>(gt).SetPointError(gt.GetN()-1, 0, atof(verr)); 218 } 219 220 // If this is done earlier the plots remain empty since root 5.12/00 221 if (fmax>fmin) 222 { 223 gt.SetMinimum(fmin); 224 gt.SetMaximum(fmax); 225 gz.SetMinimum(fmin); 226 gz.SetMaximum(fmax); 227 } 228 229 gROOT->SetSelectedPad(0); 230 231 // Create a TCanvas or open a new tab 232 TString title = fNameTab.IsNull() ? name(name.First('.')+2, name.Length()) : fNameTab; 233 TCanvas &c = fDisplay ? fDisplay->AddTab(title) : *new TCanvas; 234 // Set fillcolor, remove border and divide pad 235 c.SetFillColor(kWhite); 236 c.SetBorderMode(0); 237 c.Divide(1,2); 238 239 // Output mean and rms to console 240 cerr << setprecision(4) << setw(10) << title << ": "; 241 if (gt.GetN()==0) 242 { 243 cerr << " <empty>" << endl; 244 return; 245 } 246 cerr << setw(8) << gt.GetMean(2) << "+-" << setw(8) << gt.GetRMS(2) << " "; 247 if (gt0.GetN()>0 || gt1.GetN()>0) 248 { 249 cerr << setw(8) << gt1.GetMean(2) << "+-" << setw(8) << gt1.GetRMS(2) << " "; 250 cerr << setw(8) << gt0.GetMean(2) << "+-" << setw(8) << gt0.GetRMS(2); 251 } 252 cerr << endl; 253 254 TVirtualPad *pad = gPad; 255 256 // draw contants of pad 2 (counting starts at 0) 257 pad->cd(2); 258 gPad->SetBorderMode(0); 259 gPad->SetFrameBorderMode(0); 260 gPad->SetGridy(); 261 262 gPad->SetLeftMargin(0.06); 263 gPad->SetRightMargin(0.06); 264 gPad->SetBottomMargin(0.08); 265 266 // format axis 267 TH1 *h = gt.GetHistogram(); 268 269 h->SetXTitle("Time"); 270 h->SetYTitle(name); 271 h->GetXaxis()->SetTimeDisplay(1); 272 h->GetYaxis()->SetTitleOffset(0.8); 273 h->GetXaxis()->SetTitleOffset(1.0); 274 h->GetXaxis()->SetLabelOffset(0.01); 275 276 // draw TGraph 277 gt.DrawClone("AP"); 278 if (gt0.GetN()>0) 279 gt0.DrawClone("P"); 280 if (gt1.GetN()>0) 281 gt1.DrawClone("P"); 282 283 // Add lines and text showing the MAGIC periods 284 TLine l; 285 TText t; 286 Int_t num=0; 287 l.SetLineStyle(kDotted); 288 l.SetLineColor(kBlue); 289 t.SetTextColor(kBlue); 290 l.SetLineWidth(1); 291 t.SetTextSize(h->GetXaxis()->GetLabelSize()); 292 t.SetTextAlign(21); 293 Int_t p0 = MAstro::GetMagicPeriod(first); 294 for (Int_t p = first; p<last; p++) 295 { 296 Int_t p1 = MAstro::GetMagicPeriod(p); 297 if (p1!=p0) 298 { 299 l.DrawLine(MTime(p).GetAxisTime(), h->GetMinimum(), MTime(p).GetAxisTime(), h->GetMaximum()); 300 t.DrawText(MTime(p+15).GetAxisTime(), h->GetMaximum(), Form("%d", p1)); 301 num++; 302 } 303 p0 = p1; 304 } 305 if (num<4) 306 gPad->SetGridx(); 307 308 const Double_t min = fHistMin>fHistMax ? h->GetMinimum()-resolution/2 : fHistMin; 309 const Double_t max = fHistMin>fHistMax ? h->GetMaximum()+resolution/2 : fHistMax; 310 311 // Use this to save the pad with the time development to a file 312 //gPad->SaveAs(Form("plotdb-%s.eps", title.Data())); 313 314 // Go back to first (upper) pad, format it and divide it again 315 pad->cd(1); 316 gPad->SetBorderMode(0); 317 gPad->SetFrameBorderMode(0); 318 gPad->Divide(2,1); 319 320 TVirtualPad *pad2 = gPad; 321 322 // format left pad 323 pad2->cd(1); 324 gPad->SetBorderMode(0); 325 gPad->SetFrameBorderMode(0); 326 gPad->SetGridx(); 327 gPad->SetGridy(); 328 329 // Create histogram 330 const Int_t n = resolution>0 ? TMath::Nint((max-min)/resolution) : 50; 331 332 TH1F hist("Hist", Form("Distribution of %s", fDescription.IsNull() ? name.Data() : fDescription.Data()), n, min, max); 333 hist.SetDirectory(0); 334 335 // Fill data into histogra, 336 for (int i=0; i<gt.GetN(); i++) 337 hist.Fill(gt.GetY()[i]); 338 339 // Format histogram 340 if (fDescription.IsNull()) 341 hist.SetXTitle(name); 342 hist.SetYTitle("Counts"); 343 344 // plot histogram 345 hist.DrawCopy(""); 346 347 // format right pad 348 pad2->cd(2); 349 gPad->SetBorderMode(0); 350 gPad->SetFrameBorderMode(0); 351 gPad->SetGridy(); 352 353 // format graph 354 TH1 *h2 = gz.GetHistogram(); 355 356 h2->SetXTitle("Zd"); 357 h2->SetYTitle(name); 358 359 // draw graph 360 gz.DrawClone("AP"); 361 362 if (gz0.GetN()>0) 363 gz0.DrawClone("P"); 364 if (gz1.GetN()>0) 365 gz1.DrawClone("P"); 366 } 367 368 public: 369 MPlot(MSQLMagic &server) : fServer(server), fDataSet(NULL), 370 fRequestPeriod(-1), fPlotMin(0), fPlotMax(-1), fHistMin(0), fHistMax(-1), fGroupBy(kNone) 371 { 372 } 373 ~MPlot() 374 { 375 if (fDataSet) 376 delete fDataSet; 377 } 378 void SetDataSet(const TString filename) 379 { 380 if (fDataSet) 381 { 382 delete fDataSet; 383 fDataSet = NULL; 384 } 385 if (!filename.IsNull()) 386 fDataSet = new MDataSet(filename); 387 } 388 void SetPlotRange(Float_t min, Float_t max, Int_t n=5) { fPlotMin = min; fPlotMax = max; } 389 void SetHistRange(Float_t min, Float_t max) { fHistMin = min; fHistMax = max; } 390 void SetRequestRange(const char *from="", const char *to="") { fRequestFrom = from; fRequestTo = to; } 391 void SetRequestPeriod(Int_t n=-1) { fRequestPeriod = n; } 392 void SetCondition(const char *cond="") { fCondition = cond; } 393 void SetDescription(const char *d, const char *t=0) { fDescription = d; fNameTab = t; } 394 void SetGroupBy(GroupBy_t b=kGroupByWeek) { fGroupBy=b; } 395 void SetPrimaryDate(const char *ts) { fPrimaryDate=ts; } 396 void SetPrimaryNumber(const char *ts) { fPrimaryNumber=ts; } 397 void SetSecondary(const char *ts) { fSecondary=ts; } 398 399 Bool_t Plot(const char *value, Float_t min=0, Float_t max=-1, Float_t resolution=0) 400 { 401 TString named = fPrimaryDate; 402 TString named2 = fSecondary; 403 TString namev = value; 404 405 TString tablev = namev(0, namev.First('.')); 406 TString valuev = namev(namev.First('.')+1, namev.Length()); 407 408 TString tabled = named(0, named.First('.')); 409 TString valued = named(named.First('.')+1, named.Length()); 410 411 TString query="SELECT "; 412 switch (fGroupBy) 413 { 414 case kNone: 415 case kGroupByPrimary: 416 query += Form("%s AS %s", valued.Data(), valued.Data()+1); 417 break; 418 case kGroupByHour: 419 query += Form("DATE_FORMAT(%s, '%%Y-%%m-%%d %%H:30:00') AS %s ", fPrimaryDate.Data(), valued.Data()+1); 420 break; 421 case kGroupByNight: 422 query += Form("DATE_FORMAT(ADDDATE(%s,Interval 12 hour), '%%Y-%%m-%%d 00:00:00') AS %s ", fPrimaryDate.Data(), valued.Data()+1); 423 break; 424 case kGroupByWeek: 425 query += Form("DATE_FORMAT(ADDDATE(%s,Interval 12 hour), '%%x%%v') AS %s ", fPrimaryDate.Data(), valued.Data()+1); 426 break; 427 case kGroupByMonth: 428 query += Form("DATE_FORMAT(ADDDATE(%s,Interval 12 hour), '%%Y-%%m-15 00:00:00') AS %s ", fPrimaryDate.Data(), valued.Data()+1); 429 break; 430 case kGroupBySeason: 431 //query += Form("DATE_FORMAT(ADDDATE(%s,Interval 12 hour), '%%Y-%%m-15 00:00:00') AS %s ", fPrimaryDate.Data(), valued.Data()+1); 432 break; 433 case kGroupByYear: 434 query += Form("DATE_FORMAT(ADDDATE(%s,Interval 12 hour), '%%Y-08-15 00:00:00') AS %s ", fPrimaryDate.Data(), valued.Data()+1); 435 break; 436 } 437 438 if (fGroupBy==kNone) 439 { 440 query += ", "; 441 query += fSecondary; 442 query += ", "; 443 query += value; 444 query += ", "; 445 query += fPrimaryNumber; 446 query += " "; 447 } 448 else 449 { 450 query += ", AVG("; 451 query += fSecondary; 452 query += "), AVG("; 453 query += value; 454 query += "), "; 455 query += fPrimaryNumber; 456 query += ", STD("; 457 query += fSecondary; 458 query += "), STD("; 459 query += value; 460 query += ") "; 461 } 462 463 query += Form("FROM %s ", tabled.Data()); 464 465 const Bool_t interval = !fRequestFrom.IsNull() && !fRequestTo.IsNull(); 466 467 TString where(fCondition); 468 if (!where.IsNull()) 469 where += " AND "; 470 where += "RunData.fExcludedFDAKEY=1 "; 471 472 if (interval) 473 { 474 if (!where.IsNull()) 475 where += " AND "; 476 where += Form("%s BETWEEN '%s' AND '%s' ", 477 fPrimaryDate.Data(), fRequestFrom.Data(), fRequestTo.Data()); 478 } 479 480 // ------------------------------ 481 482 query += fServer.GetJoins(tabled, query+" "+where); 483 484 if (!where.IsNull()) 485 { 486 query += "WHERE "; 487 query += where; 488 } 489 490 if (fGroupBy!=kNone) 491 { 492 query += Form("GROUP BY %s ", valued.Data()+1); 493 //query += Form(" HAVING COUNT(%s)=(COUNT(*)+1)/2 ", valuev.Data()); 494 } 495 query += Form("ORDER BY %s ", valued.Data()+1); 496 497 498 // ------------------------------ 499 500 TSQLResult *res = fServer.Query(query); 501 if (!res) 502 { 503 cout << "ERROR - Query failed: " << query << endl; 504 return kFALSE; 505 } 506 507 if (max>min) 508 PlotTable(*res, namev, min, max, resolution); 509 else 510 PlotTable(*res, namev, fPlotMin, fPlotMax, resolution); 511 512 513 delete res; 514 return kTRUE; 515 } 516 }; 61 #include "plotdb.C" 517 62 518 63 void plotall(MPlot &plot) … … 523 68 plot.SetPrimaryNumber("RunData.fRunNumber"); 524 69 plot.SetSecondary("RunData.fZenithDistance"); 70 71 MTime t(-1); 72 TString cond = "RunData.fExcludedFDAKEY=1 AND RunData.fRunStart BETWEEN '2004-01-01' AND '"; 73 cond += t.GetSqlDateTime(); 74 cond += "'"; 75 plot.SetCondition(cond); 525 76 526 77 //inner camera … … 536 87 plot.SetDescription("L2 Trigger rate before prescaler;R_{L2,U}", "Unpresc"); 537 88 plot.Plot("RunData.fL2RateUnpresc", -0.5, 999.5, 5); 538 89 /* 539 90 //from signal*.root 540 91 plot.SetDescription("Signal Position;<T_{S}> [sl]", "PosMean"); … … 555 106 plot.SetDescription("Interleaved Signal Height FWHM;\\sigma_{H} [counts]", "ISigFWHM"); 556 107 plot.Plot("DataCheck.fHeightFWHMInterlaced", -0.5, 155.5, 1); 108 */ 557 109 } 558 110
Note:
See TracChangeset
for help on using the changeset viewer.