//______________________________________________________________________________ void HighlightFragment() { // TODO templates: what and how highlighing if (!gPad || !gr) return; // not correct TVirtualPad *ph = (TVirtualPad *)gPad->FindObject("ph"); if (!ph) { ph = new TPad("ph", "ph", 0.0, 0.2, 1.0, 1.0); ph->SetFillColor(kBlue-10); ph->Draw(); } Int_t ih = gr->GetHighlightPoint(); if (ih == -1) return; TRsnFragment *frag = group->FragmentAt(ih); if (!frag) return; TVirtualPad *save = gPad; ph->cd(); TObject *element = frag->FindElement(tagname); if (!element) ph->Clear(); else element->Draw(); save->cd(); }
//________________________________________________________ TVirtualPad* GFHistManager::GetPad(Int_t layer, Int_t histNum) { // pointer to pad where hists from layer/histNum are painted in // callable after draw! Int_t totHistsYet = 0; Int_t numHists = 0; TCanvas *can = NULL; for (Int_t numCan = 0; ; ++numCan) { can = this->GetCanvas(layer, numCan); if (!can) break; numHists = TMath::Max(1, this->NumberOfSubPadsOf(can)); totHistsYet += numHists; if (totHistsYet > histNum) { totHistsYet -= numHists; break; } } TVirtualPad *result = NULL; if (can) { TVirtualPad *oldPad = gPad; if (numHists <= 1) can->cd(0); // one hist per canvas: no pads! else can->cd(histNum - totHistsYet + 1); result = gPad; oldPad->cd(); } return result; }
void DynamicExec() { // Example of function called when a mouse event occurs in a pad. // When moving the mouse in the canvas, a second canvas shows the // projection along X of the bin corresponding to the Y position // of the mouse. The resulting histogram is fitted with a gaussian. // A "dynamic" line shows the current bin position in Y. // This more elaborated example can be used as a starting point // to develop more powerful interactive applications exploiting CINT // as a development engine. // // Author: Rene Brun TObject *select = gPad->GetSelected(); if(!select) return; if (!select->InheritsFrom("TH2")) {gPad->SetUniqueID(0); return;} TH2 *h = (TH2*)select; gPad->GetCanvas()->FeedbackMode(kTRUE); //erase old position and draw a line at current position int pyold = gPad->GetUniqueID(); int px = gPad->GetEventX(); int py = gPad->GetEventY(); float uxmin = gPad->GetUxmin(); float uxmax = gPad->GetUxmax(); int pxmin = gPad->XtoAbsPixel(uxmin); int pxmax = gPad->XtoAbsPixel(uxmax); if(pyold) gVirtualX->DrawLine(pxmin,pyold,pxmax,pyold); gVirtualX->DrawLine(pxmin,py,pxmax,py); gPad->SetUniqueID(py); Float_t upy = gPad->AbsPixeltoY(py); Float_t y = gPad->PadtoY(upy); //create or set the new canvas c2 TVirtualPad *padsav = gPad; TCanvas *c2 = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("c2"); if(c2) delete c2->GetPrimitive("Projection"); else c2 = new TCanvas("c2","Projection Canvas",710,10,700,500); c2->SetGrid(); c2->cd(); //draw slice corresponding to mouse position Int_t biny = h->GetYaxis()->FindBin(y); TH1D *hp = h->ProjectionX("",biny,biny); hp->SetFillColor(38); char title[80]; sprintf(title,"Projection of biny=%d",biny); hp->SetName("Projection"); hp->SetTitle(title); hp->Fit("gaus","ql"); hp->GetFunction("gaus")->SetLineColor(kRed); hp->GetFunction("gaus")->SetLineWidth(6); c2->Update(); padsav->cd(); }
void exec2() { if (!gPad) { Error("exec2", "gPad is null, you are not supposed to run this macro"); return; } TObject *select = gPad->GetSelected(); if(!select) return; if (!select->InheritsFrom(TH2::Class())) {gPad->SetUniqueID(0); return;} gPad->GetCanvas()->FeedbackMode(kTRUE); //erase old position and draw a line at current position int pyold = gPad->GetUniqueID(); int px = gPad->GetEventX(); int py = gPad->GetEventY(); float uxmin = gPad->GetUxmin(); float uxmax = gPad->GetUxmax(); int pxmin = gPad->XtoAbsPixel(uxmin); int pxmax = gPad->XtoAbsPixel(uxmax); if(pyold) gVirtualX->DrawLine(pxmin,pyold,pxmax,pyold); gVirtualX->DrawLine(pxmin,py,pxmax,py); gPad->SetUniqueID(py); Float_t upy = gPad->AbsPixeltoY(py); Float_t y = gPad->PadtoY(upy); //create or set the new canvas c2 TVirtualPad *padsav = gPad; TCanvas *c2 = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("c2"); if(c2) delete c2->GetPrimitive("Projection"); else c2 = new TCanvas("c2"); c2->cd(); //draw slice corresponding to mouse position TH2 *h = (TH2*)select; Int_t biny = h->GetYaxis()->FindBin(y); TH1D *hp = h->ProjectionX("",biny,biny); char title[80]; sprintf(title,"Projection of biny=%d",biny); hp->SetName("Projection"); hp->SetTitle(title); hp->Fit("gaus","ql"); c2->Update(); padsav->cd(); }
void fixsplithist(TH1* htop, TH1* hbot){ TVirtualPad* pmain = TVirtualPad::Pad()->GetCanvas(); if(!pmain) return; TVirtualPad* p1 = pmain->cd(1); TVirtualPad* p2 = pmain->cd(2); if(!p1 || !p2) return; double scale = p1->GetHNDC() / p2->GetHNDC(); double s = htop->GetYaxis()->GetLabelSize() * scale; double ss = htop->GetYaxis()->GetLabelSize(); hbot->GetYaxis()->SetLabelSize(s); htop->GetYaxis()->SetLabelSize(ss); s = htop->GetYaxis()->GetTitleSize() * scale; hbot->GetYaxis()->SetTitleSize(s); hbot->GetYaxis()->SetTitleOffset(0.5); htop->GetYaxis()->SetTitleOffset(0.5); s = htop->GetYaxis()->GetLabelOffset() * scale; s = htop->GetXaxis()->GetLabelSize() * scale; hbot->GetXaxis()->SetLabelSize(s); htop->GetXaxis()->SetLabelSize(0.); s = htop->GetXaxis()->GetTitleSize() * scale; hbot->GetXaxis()->SetTitleSize(s); s = htop->GetXaxis()->GetLabelOffset() * scale; hbot->GetXaxis()->SetLabelOffset(s); hbot->GetYaxis()->SetNdivisions(5); }
void KVSpIdGUI::SpiderIdentification() { if ((!fHisto) || (!fGrid)) return; TVirtualPad* pad = fGrid->GetPad(); fGrid->UnDraw(); fZp = fZpEntry->GetIntNumber(); if (!fUserParameter) fSpFactor = GetFactor(); else fSpFactor = fSpiderFactorEntry->GetNumber(); fAnglesUp = fAngleUpEntry->GetIntNumber(); fAnglesDown = fAngleDownEntry->GetIntNumber(); fAlpha = fApertureUpEntry->GetNumber(); fPiedType = fPiedChoice->GetSelected(); fMatrixType = fTypeChoice->GetSelected(); Int_t type = fMatrixType; TH2* tmpHisto = fHisto; TList* tmpCut = 0; if (fUseCut) { tmpHisto = (TH2*)fHisto->Clone(Form("%s_cut", fHisto->GetName())); tmpHisto->Reset(); for (int i = 1; i <= fHisto->GetNbinsX(); i++) { for (int j = 1; j <= fHisto->GetNbinsY(); j++) { Stat_t ww = fHisto->GetBinContent(i, j); Axis_t x0 = fHisto->GetXaxis()->GetBinCenter(i); Axis_t y0 = fHisto->GetYaxis()->GetBinCenter(j); if (fGrid->IsIdentifiable(x0, y0)) tmpHisto->Fill(x0, y0, ww); } } tmpCut = (TList*)fGrid->GetCuts()->Clone("tmpCuts"); } fGrid->Clear(); if (fScaledHisto) delete fScaledHisto; KVHistoManipulator hm; TF1 RtLt("RtLt", Form("x*%lf", fSfx), 0, tmpHisto->GetXaxis()->GetXmax()); TF1 RtLty("RtLty", Form("x*%lf", fSfy), 0, tmpHisto->GetXaxis()->GetXmax()); fScaledHisto = (TH2F*)hm.ScaleHisto(tmpHisto, &RtLt, &RtLty); if (fIdentificator) delete fIdentificator; fIdentificator = new KVSpiderIdentificator(fScaledHisto, fXm * fSfx, fYm * fSfy); switch (fPiedType) { case kUser: fIdentificator->SetX0(fPdx * fSfx); fIdentificator->SetY0(fPdy * fSfy); break; case kAuto: break; case kNone: fIdentificator->SetX0(0.); fIdentificator->SetY0(0.); } fIdentificator->SetParameters(fSpFactor); fIdentificator->SetNangles(fAnglesUp, fAnglesDown); fIdentificator->SetAlpha(fAlpha); fProgressBar->SetRange(0, fAnglesUp + fAnglesDown + 1); fProgressBar->Reset(); fIdentificator->Connect("Increment(Float_t)", "TGHProgressBar", fProgressBar, "SetPosition(Float_t)"); fTestButton->SetEnabled(kFALSE); fCloseButton->SetEnabled(kFALSE); fIdentificator->ProcessIdentification(); fTestButton->SetEnabled(kTRUE); fCloseButton->SetEnabled(kTRUE); fIdentificator->Disconnect("Increment(Float_t)", fProgressBar, "SetPosition(Float_t)"); fProgressBar->Reset(); if (fDebug) fIdentificator->Draw(fOption.Data()); TList* ll = (TList*)fIdentificator->GetListOfLines(); KVIDZALine* TheLine = 0; int zmax = 0; KVSpiderLine* spline = 0; TIter next_line(ll); while ((spline = (KVSpiderLine*)next_line())) { if ((spline->GetN() > 10)) { //&&(spline->GetX(0)<=fIdentificator->GetX0()+200.)) TF1* ff1 = 0; if (type == kSiCsI) ff1 = spline->GetFunction(fPdx * fSfx, TMath::Max(fScaledHisto->GetXaxis()->GetXmax() * 0.9, spline->GetX(spline->GetN() - 1))); else if (type == kSiSi) ff1 = spline->GetFunction(fPdx * fSfx, TMath::Min(fScaledHisto->GetXaxis()->GetXmax() * 0.9, spline->GetX(spline->GetN() - 1) * 1.5)); else if (type == kChIoSi) ff1 = spline->GetFunction(fPdx * fSfx, TMath::Min(fScaledHisto->GetXaxis()->GetXmax() * 0.9, spline->GetX(spline->GetN() - 1) * 1.5)); else ff1 = spline->GetFunction(); if ((type == kSiCsI) && (ff1->GetParameter(1) >= 3000. || (ff1->GetParameter(2) <= 0.35) || (ff1->GetParameter(2) >= 1.))) { Info("SpiderIdentification", "Z = %d has been rejected (fit parameters)", spline->GetZ()); continue; } TheLine = (KVIDZALine*)((KVIDZAGrid*)fGrid)->NewLine("ID"); TheLine->SetZ(spline->GetZ()); double min, max; ff1->GetRange(min, max); double step = TMath::Min((max - min) * 0.05, 20.); //20.; double stepmax = (max - min) * 0.2; //800.; double x = 0.; for (x = min + 1; x < max + step; x += step) { if (step <= stepmax) step *= 1.3; if (ff1->Eval(x) < 4000) TheLine->SetPoint(TheLine->GetN(), x, ff1->Eval(x)); } if (max > x) TheLine->SetPoint(TheLine->GetN(), max, ff1->Eval(max)); fGrid->Add("ID", TheLine); if (spline->GetZ() >= zmax) zmax = spline->GetZ(); } else { Info("SpiderIdentification", "Z = %d has been rejected (too few points)", spline->GetZ()); } } TF1 fx("fx12", Form("x/%lf", fSfx), 0., fScaledHisto->GetNbinsX() * 1.); TF1 fy("fy12", Form("x/%lf", fSfy), 0., fScaledHisto->GetNbinsY() * 1.); fGrid->Scale(&fx, &fy); if (fUseCut) delete tmpHisto; if (tmpCut) fGrid->GetCuts()->AddAll(tmpCut); pad->cd(); fGrid->Draw(); pad->Modified(); pad->Update(); DoClose(); }
void danss_calc_ratio(void) { #ifdef STRONG_CUTS const char fname[] = "danss_report_strong.root"; const char pname[] = "danss_ratio_strong.pdf"; #else const char fname[] = "danss_report.root"; const char pname[] = "danss_ratio.pdf"; #endif const struct { char name[32]; int first; int last; } positions[] = { { "down_21.04.16", 2307, 2361}, // [0] - 0- { "up_22.04.16", 2366, 2387}, // [1] - 0+ { "down_23.04.16", 2399, 2445}, // [2] - 0- { "mid_24.04.16", 2449, 2512}, { "up_25.04.16", 2514, 2562}, // [4] - 1+ { "down_26.04.16", 2564, 2609}, // [5] - 1- { "mid_27.04.16", 2620, 2685}, { "up_28.04.16", 2687, 2730}, // [7] - 2+ { "down_29.04.16", 2733, 2788}, // [8] - 2- { "mid_30.04.16", 2791, 2832}, { "stuck_01.05.16", 2836, 3399}, { "stuck_10.05.16", 3400, 3788}, { "up_03.06.16", 4261, 4400}, // [12] - 3+ { "down_06.06.16", 4403, 4439}, // [13] - 3- { "up_08.06.16", 4508, 4601}, // [14] - 3+ { "raised_30.09.16", 5540, 5807}, { "raised_04.10.16", 5808, 5903}, // veto corners on { "mid_05.10.16", 5907, 5995}, // [17] { "up_10.10.16", 6007, 6130}, // [18] - 5+ // { "mid_12.10.16", 6136, 6275}, // { "down_14.10.16", 6278, 6467}, // { "up_17.10.16", 6469, 6570}, // { "mid_21.10.16", 6573, 6582}, // { "down_21.10.16", 6587, 6745}, // { "up_24.10.16", 6757, 6815}, // { "mid_27.10.16", 6842, 6923}, // { "down_28.10.16", 6926, 7095}, { "up_31.10.16", 7106, 7364}, // [19] - 5+ { "mid_11.11.16", 7387, 7406}, // [20] { "down_11.11.16", 7418, 7458}, // [21] - 5- { "up_14.11.16", 7478, 7579}, // [22] - 6+ // { "mid_16.11.16", 7581, 7717}, { "down_18.11.16", 7727, 7913}, // [23] - 6- { "up_21.11.16", 7922, 8042}, // [24] - 7+ { "mid_23.11.16", 8048, 8179}, // [25] { "down_25.11.16", 8185, 8353}, // [26] - 7- { "up_28.11.16", 8357, 8430}, // [27] - 8+ { "mid_01.12.16", 8470, 8571}, // [28] { "down_02.12.16", 8574, 8738}, // [29] - 8- { "up_05.12.16", 8741, 8869}, // [30] - 8+ { "mid_07.12.16", 8873, 9009}, // [31] { "up_12.12.16", 9012, 9112}, // [32] - 9+ { "mid_14.12.16", 9116, 9245}, // [33] { "down_16.12.16", 9253, 9470}, // [34] - 9- // { "up_19.12.16", 9475, 9600}, // { "mid_21.12.16", 9603, 9712}, // { "down_23.12.16", 9715, 9869}, // { "up_26.12.16", 9871, 10019} // { "mid_28.12.16", 10021, 10171}, // { "down_30.12.16", 10175, 10307}, // { "down_02.01.17", 10308, 10356}, // { "down_03.01.17", 10357, 10424}, { "up_04.01.17", 10433, 10832}, // [35] - 10+ { "mid_11.01.17", 10834, 10973}, // [36] { "down_13.01.17", 10979, 11147}, // [37] - 10- { "up_16.01.17", 11150, 11267}, // [38] - 11+ { "mid_18.01.17", 11271, 11401}, // [39] { "down_20.01.17", 11404, 11563}, // [40] - 11- { "up_23.01.17", 11570, 11619} // [41] - 11+ }; int i, j; int N; TCanvas *cv; TFile *f; TH1 *h[sizeof(positions) / sizeof(positions[0])]; TH1 *hSum[12]; TH1 *hRatio[7]; TH1 *hTmp[3]; char str[1024]; TLatex *txt; double val, err; TVirtualPad *pd; const char periods[3][30] = {"April-June", "October-November", "December-January"}; gStyle->SetOptStat(0); gStyle->SetOptFit(1); N = sizeof(positions) / sizeof(positions[0]); cv = new TCanvas("CV", "Results", 2400, 1200); f = new TFile(fname, "UPDATE"); if (!f->IsOpen()) return; sprintf(str, "%s[", pname); cv->Print(str); txt = new TLatex(); for (i=0; i<N; i++) { sprintf(str, "%s_hRes", positions[i].name); h[i] = (TH1 *) f->Get(str); if (!h[i]) { printf("%s not found in %s\n", positions[i].name, fname); return; } h[i]->SetBit(TH1::kIsAverage); } hSum[0] = (TH1 *) h[0]->Clone("hUp"); hSum[1] = (TH1 *) h[0]->Clone("hDown"); hSum[2] = (TH1 *) h[0]->Clone("hMid"); hSum[3] = (TH1 *) h[0]->Clone("hSum"); hSum[4] = (TH1 *) h[0]->Clone("hSum_first"); hSum[5] = (TH1 *) h[0]->Clone("hSum_last"); hSum[6] = (TH1 *) h[0]->Clone("hUpAprilJune"); hSum[7] = (TH1 *) h[0]->Clone("hDownAprilJune"); hSum[8] = (TH1 *) h[0]->Clone("hUpOctoberNovember"); hSum[9] = (TH1 *) h[0]->Clone("hDownOctoberNovember"); hSum[10] = (TH1 *) h[0]->Clone("hUpDecemberJanuary"); hSum[11] = (TH1 *) h[0]->Clone("hDownDecemberJanuary"); hRatio[0] = (TH1 *) h[0]->Clone("hRatio"); hRatio[1] = (TH1 *) h[0]->Clone("hMix"); hRatio[2] = (TH1 *) h[0]->Clone("hRatio2"); hRatio[3] = (TH1 *) h[0]->Clone("hRatioMidUp"); hRatio[4] = (TH1 *) h[0]->Clone("hRatioAprilJune"); hRatio[5] = (TH1 *) h[0]->Clone("hRatioOctoberNovember"); hRatio[6] = (TH1 *) h[0]->Clone("hRatioDecemberJanuary"); hTmp[0] = (TH1 *) h[0]->Clone("hTmpUp"); hTmp[1] = (TH1 *) h[0]->Clone("hTmpDown"); hTmp[2] = (TH1 *) h[0]->Clone("hTmpRatio"); for (i=0; i<12; i++) hSum[i]->Reset(); for (i=0; i<12; i++) hSum[i]->SetLineWidth(2); for (i=0; i<N; i++) { switch (positions[i].name[0]) { case 'u' : j = 0; break; case 'd' : j = 1; break; case 'm' : j = 2; break; default : j = -1; break; } if (j >= 0) hSum[j]->Add(h[i]); hSum[(i < N/2) ? 4 : 5]->Add(h[i]); hSum[3]->Add(h[i]); } // for (i=0; i<3; i++) hSum[3]->Add(hSum[i]); hRatio[0]->Divide(hSum[1], hSum[0]); hRatio[1]->Divide(hSum[5], hSum[4]); hRatio[3]->Divide(hSum[2], hSum[0]); // Ratio from short ratios hRatio[2]->Reset(); hRatio[2]->SetBit(TH1::kIsAverage); // 0+2 / 1 hTmp[0]->Add(h[0], h[2]); hTmp[2]->Divide(hTmp[0], h[1]); hRatio[2]->Add(hTmp[2]); // 5 / 4 hTmp[2]->Divide(h[5], h[4]); hRatio[2]->Add(hTmp[2]); // 8 / 7 hTmp[2]->Divide(h[8], h[7]); hRatio[2]->Add(hTmp[2]); // 13 / 12 + 14 hTmp[0]->Add(h[12], h[14]); hTmp[2]->Divide(h[13], hTmp[0]); hRatio[2]->Add(hTmp[2]); // 21 / 18+19 hTmp[0]->Add(h[18], h[19]); hTmp[2]->Divide(h[21], hTmp[0]); hRatio[2]->Add(hTmp[2]); // 23 / 22 hTmp[2]->Divide(h[23], h[22]); hRatio[2]->Add(hTmp[2]); // 26 / 24 hTmp[2]->Divide(h[26], h[24]); hRatio[2]->Add(hTmp[2]); // 29 / 27 + 30 hTmp[0]->Add(h[27], h[30]); hTmp[2]->Divide(h[29], hTmp[0]); hRatio[2]->Add(hTmp[2]); // 34 / 32 hTmp[2]->Divide(h[34], h[32]); hRatio[2]->Add(hTmp[2]); // 37 / 35 hTmp[2]->Divide(h[37], h[35]); hRatio[2]->Add(hTmp[2]); // 40 / 38 + 41 hTmp[0]->Add(h[38], h[41]); hTmp[2]->Divide(h[40], hTmp[0]); hRatio[2]->Add(hTmp[2]); // AprilJune (0 + 2 + 5 + 8 + 13) / (1 + 4 + 7 + 12 + 14) hSum[6]->Add(h[1]); hSum[6]->Add(h[4]); hSum[6]->Add(h[7]); hSum[6]->Add(h[12]); hSum[6]->Add(h[14]); hSum[7]->Add(h[0]); hSum[7]->Add(h[2]); hSum[7]->Add(h[5]); hSum[7]->Add(h[8]); hSum[7]->Add(h[13]); hRatio[4]->Divide(hSum[7], hSum[6]); // OctoberNovember (21 + 23 + 26 + 29) / (18 + 19 + 22 + 24 + 27 + 30) hSum[8]->Add(h[18]); hSum[8]->Add(h[19]); hSum[8]->Add(h[22]); hSum[8]->Add(h[24]); hSum[8]->Add(h[27]); hSum[8]->Add(h[30]); hSum[9]->Add(h[21]); hSum[9]->Add(h[23]); hSum[9]->Add(h[26]); hSum[9]->Add(h[29]); hRatio[5]->Divide(hSum[9], hSum[8]); // DecemberJanuary (34 + 37 + 40) / (32 + 35 + 38 + 41) hSum[10]->Add(h[32]); hSum[10]->Add(h[35]); hSum[10]->Add(h[38]); hSum[10]->Add(h[41]); hSum[11]->Add(h[34]); hSum[11]->Add(h[37]); hSum[11]->Add(h[40]); hRatio[6]->Divide(hSum[11], hSum[10]); cv->Divide(2, 1); pd = cv->cd(1); pd->Divide(1, 2); pd->cd(1); hSum[0]->SetTitle("Up - Middle - Down;MeV;mHz"); hSum[0]->SetLineColor(kRed); hSum[2]->SetLineColor(kGreen); hSum[1]->SetLineColor(kBlue); for (i=0; i<4; i++) hSum[i]->SetLineWidth(2); hSum[0]->Draw(); hSum[2]->Draw("same"); hSum[1]->Draw("same"); val = hSum[0]->IntegralAndError(1, 35, err); sprintf(str, "Up = %5.2f+-%4.2f", val, err); txt->SetTextColor(kRed); txt->DrawTextNDC(0.4, 0.85, str); val = hSum[2]->IntegralAndError(1, 35, err); sprintf(str, "Mid = %5.2f+-%4.2f", val, err); txt->SetTextColor(kGreen); txt->DrawTextNDC(0.4, 0.8, str); val = hSum[1]->IntegralAndError(1, 35, err); sprintf(str, "Down = %5.2f+-%4.2f", val, err); txt->SetTextColor(kBlue); txt->DrawTextNDC(0.4, 0.75, str); pd->cd(2); hSum[3]->SetTitle("Average of all positions;MeV;mHz"); hSum[3]->SetLineColor(kBlack); hSum[3]->Draw(); val = hSum[3]->IntegralAndError(1, 35, err); sprintf(str, "Avr = %5.2f+-%4.2f", val, err); txt->SetTextColor(kBlack); txt->DrawTextNDC(0.4, 0.8, str); pd = cv->cd(2); pd->Divide(1, 4); pd->cd(1); hRatio[0]->SetTitle("Down/Up all by all;MeV;"); hRatio[0]->SetLineColor(kBlack); hRatio[0]->SetLineWidth(2); hRatio[0]->SetMinimum(0.5); hRatio[0]->SetMaximum(1.0); hRatio[0]->Fit("pol0", "", "", 1, 7); pd->cd(2); hRatio[2]->SetTitle("Down/Up pair by pair;MeV;"); hRatio[2]->SetLineColor(kBlack); hRatio[2]->SetLineWidth(2); hRatio[2]->SetMinimum(0.5); hRatio[2]->SetMaximum(1.0); hRatio[2]->Fit("pol0", "", "", 1, 7); pd->cd(3); hRatio[3]->SetTitle("Mid/Up all by all;MeV;"); hRatio[3]->SetLineColor(kBlack); hRatio[3]->SetLineWidth(2); hRatio[3]->SetMinimum(0.65); hRatio[3]->SetMaximum(1.15); hRatio[3]->Fit("pol0", "", "", 1, 7); pd->cd(4); hRatio[1]->SetTitle("First half/Last half;MeV;"); hRatio[1]->SetLineColor(kBlack); hRatio[1]->SetLineWidth(2); hRatio[1]->SetMinimum(0.75); hRatio[1]->SetMaximum(1.25); hRatio[1]->Fit("pol0", "", "", 1, 7); cv->Update(); cv->Print(pname); cv->Clear(); cv->Divide(2, 2); for (i=0; i<3; i++) { cv->cd(i+1); sprintf(str, "Down/Up all by all for %s;MeV;", periods[i]); hRatio[4+i]->SetTitle(str); hRatio[4+i]->SetLineColor(kBlack); hRatio[4+i]->SetLineWidth(2); hRatio[4+i]->SetMinimum(0.5); hRatio[4+i]->SetMaximum(1.0); hRatio[4+i]->Fit("pol0", "", "", 1, 7); } cv->Update(); cv->Print(pname); sprintf(str, "%s]", pname); cv->Print(str); for (i=0; i<12; i++) hSum[i]->Write(); for (i=0; i<7; i++) hRatio[i]->Write(); f->Close(); delete cv; }
void makeqaplot(int run=0, int plt=0, int save=0){ runnum=run; yearday=run/1000; if(save==0) {png=0; pdf=0;} if(save==1) {png=1; pdf=0;} if(save==2) {png=0; pdf=1;} if(save==3) {png=1; pdf=1;} c1 = new TCanvas("c1","QA",50,50,800,800); gStyle->SetLabelSize(0.04,"xy"); //colortable(); gStyle->SetPalette(1); gStyle->SetStatW(0.4); char fname[50]; if(run==0) {sprintf(fname,"fgtQA.root");} else {sprintf(fname,"%d/fgtQA_%d.root",yearday,run);} cout << "Opening "<<fname<<endl; file=new TFile(fname,""); char c[50]; if(plt==0 || plt==1) { gStyle->SetOptStat(111110); c1->Divide(1,3); for(int i=0; i<3; i++){ TVirtualPad* pad = c1->cd(i+1); int log=0; if(i>0) {log=1;} pad->SetLogy(log); hist0[i]=(TH1F*) file->Get(cHist[i]); hist0[i]->SetFillColor(kBlue); hist0[i]->Draw(); if(i==2){ float ntot = float(hist0[i]->GetEntries()); if(ntot>0.0){ int nbin = hist0[i]->GetNbinsX(); float nofgt = hist0[i]->Integral(1,1); int bin = hist0[i]->FindBin(float(kFgtNumElecIds)); float nonzs = hist0[i]->Integral(bin-1,nbin+1); float zs = hist0[i]->Integral(2,bin-2); hist0[i]->GetXaxis()->SetRange(2, bin-2); float mean = hist0[i]->GetMean() / float(kFgtNumElecIds); char c[100]; sprintf(c,"Total %d",ntot); TText *t1 = new TText(0.3,0.8,c); t1->SetNDC(); t1->SetTextSize(0.06); t1->Draw(); sprintf(c,"NoFGT %d (%5.2f)",nofgt,nofgt/ntot); TText *t2 = new TText(0.3,0.7,c); t2->SetNDC(); t2->SetTextSize(0.06); t2->Draw(); sprintf(c,"NoneZS %d (%5.2f)",nonzs,nonzs/ntot); TText *t3 = new TText(0.3,0.6,c); t3->SetNDC(); t3->SetTextSize(0.06); t3->Draw(); sprintf(c,"ZS %d (%5.2f)",zs,zs/ntot); TText *t4 = new TText(0.3,0.5,c); t4->SetNDC(); t4->SetTextSize(0.06); t4->Draw(); sprintf(c,"Mean ZS data size/fullsize= %5.3f",mean); TText *t5 = new TText(0.3,0.4,c); t5->SetNDC(); t5->SetTextSize(0.06); t5->Draw(); if(mean>0.08) { t5->SetTextColor(2); } else { t5->SetTextColor(4); } } } } c1->Update(); save("plot"); } if(plt==0 || plt==2) { c1->Clear(); gStyle->SetOptStat(0); gStyle->SetOptTitle(0); c1->Divide(1,3); for(int i=3; i<6; i++){ hist0[i]=(TH1F*) file->Get(cHist[i]); } int nevt=hist0[5]->GetEntries(); printf("Nevent=%d\n",nevt); TVirtualPad* pad; pad=c1->cd(1); pad->SetLogy(); pad->SetTopMargin(0.01); pad->SetRightMargin(0.01); hist0[3]->GetXaxis()->SetLabelSize(0.07); hist0[3]->GetYaxis()->SetLabelSize(0.07); hist0[3]->SetFillColor(kRed); hist0[3]->Scale(1/float(nevt)); hist0[3]->Draw(); TText *tx= new TText(0.87,0.0,"EleID"); tx->SetNDC(); tx->SetTextSize(0.1); tx->Draw(); TText *t3= new TText(0.05,0.1,"F3=frac in 3sig/2tb"); t3->SetNDC(); t3->SetTextSize(0.08); t3->SetTextAngle(90); t3->Draw(); pad=c1->cd(2); pad->SetLogy(); pad->SetTopMargin(0.01); pad->SetRightMargin(0.01); hist0[4]->GetXaxis()->SetLabelSize(0.07); hist0[4]->GetYaxis()->SetLabelSize(0.07); hist0[4]->SetFillColor(kBlue); hist0[4]->Scale(1/float(nevt)); hist0[4]->Draw(); tx->Draw(); TText *t4= new TText(0.05,0.1,"F10=frac in 10sig & >500"); t4->SetNDC(); t4->SetTextSize(0.08); t4->SetTextAngle(90); t4->Draw(); float min=-4; int max=hist0[3]->GetNbinsX(); printf("Max=%d\n",max); TH1F *h1 = new TH1F("ZSdataFrac","ZSdataFrac",50,min,0); TH1F *h2 = new TH1F("10SigmaFrac","10SigmaFrac",50,min,0); float f1[kFgtNumElecIds],f2[kFgtNumElecIds]; for(int i=0; i<max; i++){ f1[i] = log10(hist0[3]->GetBinContent(i+1)); if(f1[i]<min) {f1[i]=min;} h1->Fill(f1[i]); f2[i] = log10(hist0[4]->GetBinContent(i+1)); if(f2[i]<min) {f2[i]=min;} h2->Fill(f2[i]); } pad = c1->cd(3); pad->Divide(2,1); TVirtualPad *pad2; pad2 = pad->cd(1); pad2->SetLogy(); pad2->SetTopMargin(0.01); pad2->SetRightMargin(0.01); h1->GetXaxis()->SetLabelSize(0.1); h1->GetYaxis()->SetLabelSize(0.1); h2->GetXaxis()->SetLabelSize(0.1); h2->GetYaxis()->SetLabelSize(0.1); h1->SetLineColor(kRed); h2->SetLineColor(kBlue); if(h1->GetMaximum()>h2->GetMaximum()){ h1->Draw(); h2->Draw("SAME"); }else{ h2->Draw(); h1->Draw("SAME"); } TText *t5= new TText(0.2,0.88,"Log(F3)"); t5->SetNDC(); t5->SetTextSize(0.1); t5->SetTextColor(2); t5->Draw(); TText *t6= new TText(0.6,0.88,"Log(F10)"); t6->SetNDC(); t6->SetTextSize(0.1); t6->SetTextColor(4); t6->Draw(); //read ped file int eid, t; float ped[kFgtNumElecIds],rms[kFgtNumElecIds],p,r; int status[kFgtNumElecIds]; memset(status,0,sizeof(status)); cout<<"Reading Ped File "<<endl; std::ifstream in("ped.txt"); if (!in.is_open()) { cout << "Can't find file!\n"; exit(0); } while (!in.eof()){ in >> eid >> t >> p >> r; ped[eid]=p; rms[eid]=r; } in.close(); TH1F * hr1= new TH1F("RMS","RMS",60,0,120); TH1F * hr2= new TH1F("RMS2","RMS2",60,0,120); TH1F * hr3= new TH1F("RMS3","RMS3",60,0,120); TH1F * hr4= new TH1F("RMS4","RMS4",60,0,120); TH1F * hr5= new TH1F("RMS5","RMS5",60,0,120); float f1l=-3.5, f1h=-0.5; float f2l=-3.5, f2h=-1.2; for(int i=0; i<kFgtNumElecIds; i++){ if(f1[i]<f1l) status[i]+=1; if(f1[i]>f1h) status[i]+=2; if(f1[i]<f2l) status[i]+=4; if(f1[i]>f2h) status[i]+=8; hr1->Fill(rms[i]); if(f1[i]<f1l) {hr2->Fill(rms[i]);} if(f1[i]<f1l || f1[i]>f1h) {hr3->Fill(rms[i]);} if(f1[i]<f1l || f1[i]>f1h || f2[i]<f2l) {hr4->Fill(rms[i]);} if(f1[i]<f1l || f1[i]>f1h || f2[i]<f2l || f2[i]>f2h) {hr5->Fill(rms[i]);} } char filename[150]; if(nevt>=1000){ sprintf(filename,"%d/status/status.%d.txt",yearday,run); }else{ sprintf(filename,"%d/status/status.%d.lowstat.txt",yearday,run); } FILE* pfile=fopen(filename,"w"); if(!pfile){ printf("Couldn't open file %s\n",filename); }else{ printf("Writing %s\n",filename); for(int i=0; i<kFgtNumElecIds; i++){ fprintf(pfile,"%d 0x%d\n",i,status[i]); } fclose(pfile); } pad2 = pad->cd(2); pad2->SetLogy(0); pad2->SetTopMargin(0.01); pad2->SetRightMargin(0.01); hr1->GetXaxis()->SetLabelSize(0.1); hr1->GetYaxis()->SetLabelSize(0.05); hr1->SetFillColor(3); hr1->Draw(); hr5->SetFillColor(9); hr5->Draw("same"); hr4->SetFillColor(4); hr4->Draw("same"); hr3->SetFillColor(6); hr3->Draw("same"); hr2->SetFillColor(2); hr2->Draw("same"); char cc1[100]; sprintf(cc1,"Log(F3)<%4.1f",f1l); char cc2[100]; sprintf(cc2,"Log(F3)>%4.1f",f1h); char cc3[100]; sprintf(cc3,"Log(F10)<%4.1f",f2l); char cc4[100]; sprintf(cc4,"Log(F10)>%4.1f",f2h); TText *t7 = new TText(0.6,0.88,cc1); t7->SetNDC(); t7->SetTextSize(0.07); t7->SetTextColor(2); t7->Draw(); TText *t8 = new TText(0.6,0.78,cc2); t8->SetNDC(); t8->SetTextSize(0.07); t8->SetTextColor(6); t8->Draw(); TText *t9 = new TText(0.6,0.68,cc3); t9->SetNDC(); t9->SetTextSize(0.07); t9->SetTextColor(4); t9->Draw(); TText *t10= new TText(0.6,0.58,cc4); t10->SetNDC(); t10->SetTextSize(0.07); t10->SetTextColor(9); t10->Draw(); TText *t11= new TText(0.6,0.48,"OK"); t11->SetNDC(); t11->SetTextSize(0.07); t11->SetTextColor(3); t11->Draw(); TText *t12= new TText(0.8,0.15,"PedRMS"); t12->SetNDC(); t12->SetTextSize(0.07); t12->Draw(); c1->Update(); save("frac"); }
void validation() { msglvl[DBG] = SILENT; msglvl[INF] = VISUAL; msglvl[WRN] = VISUAL; msglvl[ERR] = VISUAL; msglvl[FAT] = VISUAL; TDirectory* oldDir = gDirectory; // remember old directory style(); Int_t g4bin = (ng4bins/g4max+1); //==> g^4=1 ==> SSM ! TString suffix = ""; if(doTruth) suffix = "_truth"; TString mctype = (isMC11c) ? "mc11c" : "mc11a"; // TString fBGname = "plots/ZP_2dtemplates_"+mctype+"_33st_overallEWkF_noInAmpSigEWkF_noHighMbins_wthOfficialZP_Xmass2000.root"; // TString fBGname = "plots/ZP_2dtemplates_"+mctype+"_33st_noKKtmplates_overallEWkF_noInAmpSigEWkF_noTruth_wthOfficialZP_treeLevelMass_Xmass2000.root"; // TString fBGname = "plots/ZP_2dtemplates_"+mctype+"_33st_noKKtmplates_overallEWkF_noInAmpSigEWkF_wthOfficialZP_treeLevelMass_Xmass2000.root"; // TString fBGname = "plots/ZP_2dtemplates_mc11c_33st_noKKtmplates_overallEWkF_noInAmpSigEWkF_wthOfficialZP_fixedBWwidth_treeLevelMass_Xmass2000.root"; // TString fBGname = "plots/ZP_2dtemplates_mc11c_33st_noKKtmplates_overallEWkF_noInAmpSigEWkF_noTruth_wthOfficialZP_treeLevelMass_Xmass2000.root"; // TString fBGname = "plots/ZP_2dtemplates_"+mctype+"_33st_noKKtmplates_overallEWkF_noInAmpSigEWkF_noTruth_wthOfficialZP_treeLevelMass_Xmass2000.root"; // TString fBGname = "plots/ZP_2dtemplates_"+mctype+"_33st_noKKtmplates_overallEWkF_noInAmpSigEWkF_noTruth_wthOfficialZP_fixedBWwidth_treeLevelMass_Xmass2000.root"; TLegend* legR = new TLegend(0.15,0.75,0.35,0.85,NULL,"brNDC"); legR->SetFillStyle(4000); //will be transparent legR->SetFillColor(0); legR->SetTextFont(42); TH1D* hDummy = new TH1D("","",1,0.,1.); hDummy->SetMarkerStyle(20); hDummy->SetMarkerSize(0.8); hDummy->SetMarkerColor(kBlack); if(!doResiduals) legR->AddEntry(hDummy,"#frac{template}{official}","lep"); else legR->AddEntry(hDummy,"#frac{template - official}{#sqrt{#delta^{2}template + #delta^{2}official}}","lep"); TPaveText* ptxt = new TPaveText(0.145,0.35,0.245,0.55,"NDC"); TText* txt; ptxt->SetTextSize(0.03); ptxt->SetBorderSize(0); ptxt->SetFillStyle(4000); //will be transparent ptxt->SetFillColor(0); ptxt->SetTextAlign(12); txt = ptxt->AddText("This range"); txt = ptxt->AddText("is chopped"); txt = ptxt->AddText("before the"); txt = ptxt->AddText("template is"); txt = ptxt->AddText("handed to"); txt = ptxt->AddText("BAT (limit)."); oldDir->cd(); TString fBGname = "plots/validation/ZP_2dtemplates_mc11c_33st_noKKtmplates_wthOfficialZP_treeLevelMass_Xmass2000.root"; TFile* fD = new TFile(fBGname,"READ"); TH1D* hDY = NULL; if(doTruth) hDY = (TH1D*)fD->Get("hMass_DYmumu_truth")->Clone(); else hDY = (TH1D*)fD->Get("hMass_DYmumu")->Clone(); hDY->SetLineColor(kMagenta-5); hDY->SetMarkerColor(kMagenta-5); oldDir->cd(); TFile* fDYrozmin = new TFile("plots/mass_plot_tables_3st.root","READ"); TH1D* hDYrozmin = (TH1D*)fDYrozmin->Get("mass_log_dy")->Clone(); hDYrozmin = (TH1D*)hGeV2TeV(hDYrozmin)->Clone(); hDYrozmin = (TH1D*)hChopper(hDYrozmin,bins2chop)->Clone(); oldDir->cd(); TFile* f1dTemplates = new TFile("plots/ZpSignal_MM_MC11c_5points.root","READ"); TObjArray* toarr1d = new TObjArray(); toarr1d->Read("template"); TMapTSP2TH1D h1dBrandeisTmpltMap; double Nflat = 399948; double sigmaflat = 4.3988E+07*nb2fb; double Lmcflat = Nflat/sigmaflat; double scale = luminosity/Lmcflat; TH1D* h1dTmp = NULL; h1dTmp = (TH1D*)((TObjArray*)toarr1d->At(0/*22*/))->Clone(); h1dTmp->Scale(scale); h1dTmp = (TH1D*)hChopper(h1dTmp,bins2chop)->Clone(); h1dTmp->Add(hDYrozmin); h1dBrandeisTmpltMap.insert( make_pair("1000",(TH1D*)resetErrors(h1dTmp)->Clone("1000")) ); h1dTmp = NULL; h1dTmp = (TH1D*)((TObjArray*)toarr1d->At(1/*28*/))->Clone(); h1dTmp->Scale(scale); h1dTmp = (TH1D*)hChopper(h1dTmp,bins2chop)->Clone(); h1dTmp->Add(hDYrozmin); h1dBrandeisTmpltMap.insert( make_pair("1250",(TH1D*)resetErrors(h1dTmp)->Clone("1250")) ); h1dTmp = NULL; h1dTmp = (TH1D*)((TObjArray*)toarr1d->At(2/*34*/))->Clone(); h1dTmp->Scale(scale); h1dTmp = (TH1D*)hChopper(h1dTmp,bins2chop)->Clone(); h1dTmp->Add(hDYrozmin); h1dBrandeisTmpltMap.insert( make_pair("1500",(TH1D*)resetErrors(h1dTmp)->Clone("1500")) ); h1dTmp = NULL; h1dTmp = (TH1D*)((TObjArray*)toarr1d->At(3/*40*/))->Clone(); h1dTmp->Scale(scale); h1dTmp = (TH1D*)hChopper(h1dTmp,bins2chop)->Clone(); h1dTmp->Add(hDYrozmin); h1dBrandeisTmpltMap.insert( make_pair("1750",(TH1D*)resetErrors(h1dTmp)->Clone("1750")) ); h1dTmp = NULL; h1dTmp = (TH1D*)((TObjArray*)toarr1d->At(4/*47*/))->Clone(); h1dTmp->Scale(scale); h1dTmp = (TH1D*)hChopper(h1dTmp,bins2chop)->Clone(); h1dTmp->Add(hDYrozmin); h1dBrandeisTmpltMap.insert( make_pair("2000",(TH1D*)resetErrors(h1dTmp)->Clone("2000")) ); oldDir->cd(); TMapTSP2TH1D h1Map; h1Map.insert( make_pair("1000o", (TH1D*)fD->Get("hMass_Zprime_SSM1000"+suffix)->Clone()) ); h1Map.insert( make_pair("1000t", (TH1D*)fD->Get("hMass_Zprime_SSM1000_template"+suffix)->Clone()) ); if(isMC11c) { h1Map.insert( make_pair("1250o", (TH1D*)fD->Get("hMass_Zprime_SSM1250"+suffix)->Clone()) ); h1Map.insert( make_pair("1250t", (TH1D*)fD->Get("hMass_Zprime_SSM1250_template"+suffix)->Clone()) ); } h1Map.insert( make_pair("1500o", (TH1D*)fD->Get("hMass_Zprime_SSM1500"+suffix)->Clone()) ); h1Map.insert( make_pair("1500t", (TH1D*)fD->Get("hMass_Zprime_SSM1500_template"+suffix)->Clone()) ); h1Map.insert( make_pair("1750o", (TH1D*)fD->Get("hMass_Zprime_SSM1750"+suffix)->Clone()) ); h1Map.insert( make_pair("1750t", (TH1D*)fD->Get("hMass_Zprime_SSM1750_template"+suffix)->Clone()) ); h1Map.insert( make_pair("2000o", (TH1D*)fD->Get("hMass_Zprime_SSM2000"+suffix)->Clone()) ); h1Map.insert( make_pair("2000t", (TH1D*)fD->Get("hMass_Zprime_SSM2000_template"+suffix)->Clone()) ); TMapTSP2TH1D h1rMap; h1rMap.insert( make_pair("1000", (TH1D*)fD->Get("hMass_Zprime_SSM1000"+suffix)->Clone()) ); if(isMC11c) h1rMap.insert( make_pair("1250", (TH1D*)fD->Get("hMass_Zprime_SSM1250"+suffix)->Clone()) ); h1rMap.insert( make_pair("1500", (TH1D*)fD->Get("hMass_Zprime_SSM1500"+suffix)->Clone()) ); h1rMap.insert( make_pair("1750", (TH1D*)fD->Get("hMass_Zprime_SSM1750"+suffix)->Clone()) ); h1rMap.insert( make_pair("2000", (TH1D*)fD->Get("hMass_Zprime_SSM2000"+suffix)->Clone()) ); for(TMapTSP2TH1D::iterator it=h1rMap.begin() ; it!=h1rMap.end() ; ++it) { it->second->Reset(); if(!doResiduals) it->second->Divide(h1Map[it->first+"o"],h1Map[it->first+"t"],1.,1.,"B"); else residuals(h1Map[it->first+"o"], h1Map[it->first+"t"], it->second); // for(Int_t i=0 ; i<=it->second->GetNbinsX()+1 ; i++) it->second->SetBinError(i,0); it->second->SetMarkerStyle(20); it->second->SetMarkerSize(0.5); it->second->GetXaxis()->SetLabelSize(0.073); it->second->GetYaxis()->SetLabelSize(0.073); it->second->GetXaxis()->SetTitleSize(0.073); it->second->GetYaxis()->SetTitleSize(0.073); it->second->SetTitleSize(0.075); it->second->GetYaxis()->SetTitleOffset(0.5); if(!doResiduals) { it->second->SetMinimum(0.2); it->second->SetMaximum(1.8); } else { it->second->SetMinimum(-5.); it->second->SetMaximum(+5.); } it->second->SetTitle(""); if(!doResiduals) it->second->GetYaxis()->SetTitle("ratio"); else it->second->GetYaxis()->SetTitle("residuals"); } TMapTSP2TGAE poissonGraphMap; TMapTSP2TLeg legMap; _INFO(""); oldDir->cd(); fD->cd(); TH1D* h1Template = (TH1D*)fD->Get("hMass_DYmumu"+suffix)->Clone(); h1Template->Reset(); TObjArray* toarr = new TObjArray(); if(doTruth) toarr->Read("truth_template2d"); else toarr->Read("template2d"); TH2D* h2SSM2000 = (TH2D*)((TObjArray*)toarr->At(0))->Clone("hMass"+suffix+"_Zprime_SSM2000_template2d"); for(Int_t bin=1 ; bin<=h2SSM2000->GetNbinsX() ; bin++) { h1Template->SetBinContent(bin, h2SSM2000->GetBinContent(bin,g4bin)); h1Template->SetBinError(bin, h2SSM2000->GetBinError(bin,g4bin)); } h1Template->SetLineColor(kViolet); h1Template->SetLineWidth(1); h1Template->SetMarkerStyle(20); h1Template->SetMarkerSize(0.3); h1Template->SetMarkerColor(kViolet); // the functions h2Template = (TH2D*)h2SSM2000->Clone(); vector<TF1*> vfunc; unsigned int nmllbins = h2Template->GetNbinsX(); for(unsigned int mll=1 ; mll<=(nmllbins-bins2chop) ; mll++) // 1...(56-9 = 47) { TString mllname = (TString)_s(mll); TString mllval = (TString)_s(h2Template->GetXaxis()->GetBinCenter(mll+bins2chop)); TF1* f = new TF1("fNominal_mll"+mllname,fTH1toTF1,g4min,g4max,1); f->SetParameter(0,mll); f->SetParNames("mll"); // f->SetLineColor(kBlue); // f->SetLineWidth(1); f->SetNpx(400); vfunc.push_back(f); } TGraph* graphDY = new TGraph(); graphDY->SetMarkerStyle(25); graphDY->SetMarkerSize(0.6); graphDY->SetMarkerColor(kGreen+2); TGraph* graphSSM = new TGraph(); graphSSM->SetMarkerStyle(24); graphSSM->SetMarkerSize(0.6); graphSSM->SetMarkerColor(kOrange+8); for(unsigned int i=0 ; i<vfunc.size() ; i++) { double DY = vfunc[i]->Eval(0.0); double SSM = vfunc[i]->Eval(1.0); graphDY->SetPoint(i,h2Template->GetXaxis()->GetBinCenter(bins2chop+i+1),DY); graphSSM->SetPoint(i,h2Template->GetXaxis()->GetBinCenter(bins2chop+i+1),SSM); } oldDir->cd(); TObjArray* toarr1dTLV = new TObjArray(); TMapTSP2TH1D h1dTlvTmpltMap; TFile* fT = NULL; TString fTname = "plots/validation/ZP_2dtemplates_mc11c_33st_noInterference_noKKtmplates_noOverallEWkF_wthOfficialZP_treeLevelMass_Xmass"; fT = new TFile(fTname+"1000.root","READ"); toarr1dTLV->Read("template"); h1dTmp = (TH1D*)((TObjArray*)toarr1dTLV->At(0))->Clone(); h1dTmp->Add(hDY); h1dTlvTmpltMap.insert( make_pair("1000",(TH1D*)resetErrors(h1dTmp)->Clone("1000")) ); fT = new TFile(fTname+"1250.root","READ"); toarr1dTLV->Read("template"); h1dTmp = (TH1D*)((TObjArray*)toarr1dTLV->At(0))->Clone(); h1dTmp->Add(hDY); h1dTlvTmpltMap.insert( make_pair("1250",(TH1D*)resetErrors(h1dTmp)->Clone("1250")) ); fT = new TFile(fTname+"1500.root","READ"); toarr1dTLV->Read("template"); h1dTmp = (TH1D*)((TObjArray*)toarr1dTLV->At(0))->Clone(); h1dTmp->Add(hDY); h1dTlvTmpltMap.insert( make_pair("1500",(TH1D*)resetErrors(h1dTmp)->Clone("1500")) ); fT = new TFile(fTname+"1750.root","READ"); toarr1dTLV->Read("template"); h1dTmp = (TH1D*)((TObjArray*)toarr1dTLV->At(0))->Clone(); h1dTmp->Add(hDY); h1dTlvTmpltMap.insert( make_pair("1750",(TH1D*)resetErrors(h1dTmp)->Clone("1750")) ); fT = new TFile(fTname+"2000.root","READ"); toarr1dTLV->Read("template"); h1dTmp = (TH1D*)((TObjArray*)toarr1dTLV->At(0))->Clone(); h1dTmp->Add(hDY); h1dTlvTmpltMap.insert( make_pair("2000",(TH1D*)resetErrors(h1dTmp)->Clone("2000")) ); oldDir->cd(); for(TMapTSP2TH1D::iterator it=h1Map.begin() ; it!=h1Map.end() ; ++it) { if(it->first.Contains("o")) { TString name = it->first; name.ReplaceAll("o",""); it->second->SetFillColor(kAzure-9); if(doTruth) it->second->SetTitle("m_{Z'} = "+name+" GeV (truth)"); else it->second->SetTitle("m_{Z'} = "+name+" GeV"); } if(it->first.Contains("t")) { //TGraphAsymmErrors* poisson(TH1D* h) it->second->SetLineColor(kBlue); it->second->SetMarkerStyle(20); it->second->SetMarkerSize(0.4); it->second->SetMarkerColor(kBlue); it->second->SetLineWidth(1); TString name = it->first; name.ReplaceAll("t",""); poissonGraphMap.insert( make_pair(name, (TGraphAsymmErrors*)poisson(it->second)->Clone()) ); poissonGraphMap[name]->SetMarkerStyle(20); poissonGraphMap[name]->SetMarkerSize(0.3); poissonGraphMap[name]->SetMarkerColor(kBlue); poissonGraphMap[name]->SetLineWidth(1); poissonGraphMap[name]->SetLineColor(kBlue); } } Double_t yLine = (!doResiduals) ? 1. : 0.; TLine* line = new TLine(0.07,yLine,3.,yLine); line->SetLineColor(kRed); line->SetLineWidth(2); TMapTSP2TCNV cnvMap; cnvMap.insert( make_pair("1000", new TCanvas("1000","1000",600,550)) ); if(isMC11c) cnvMap.insert( make_pair("1250", new TCanvas("1250","1250",600,550)) ); cnvMap.insert( make_pair("1500", new TCanvas("1500","1500",600,550)) ); cnvMap.insert( make_pair("1750", new TCanvas("1750","1750",600,550)) ); cnvMap.insert( make_pair("2000", new TCanvas("2000","2000",600,550)) ); for(TMapTSP2TCNV::iterator it=cnvMap.begin() ; it!=cnvMap.end() ; ++it) { _INFO("starting "+(string)it->first); if(it->first=="2000") legMap.insert( make_pair(it->first, new TLegend(0.35,0.55,0.83,0.84,NULL,"brNDC")) ); else legMap.insert( make_pair(it->first, new TLegend(0.35,0.60,0.83,0.84,NULL,"brNDC")) ); legMap[it->first]->SetFillStyle(4000); //will be transparent legMap[it->first]->SetFillColor(0); legMap[it->first]->SetTextFont(42); legMap[it->first]->AddEntry(h1Map[it->first+"o"],"Official Z'_{SSM}","F"); legMap[it->first]->AddEntry(hDY,"Official DY#mu#mu","lep"); legMap[it->first]->AddEntry(h1Map[it->first+"t"],"ME^{2} method: Template w/o couplings scale","lep"); if(it->first=="2000") { legMap[it->first]->AddEntry(h1Template,"ME^{2} method: Template histogram at #it{g=1} (SSM)","lep"); legMap[it->first]->AddEntry(graphSSM, "ME^{2} method: Template function at #it{g=1} (SSM)","p"); legMap[it->first]->AddEntry(graphDY, "ME^{2} method: Template function at #it{g=0} (DY)","p"); } if(!doTruth) { h1dTlvTmpltMap[it->first]->SetLineColor(kCyan+2); h1dTlvTmpltMap[it->first]->SetMarkerColor(kCyan+2); h1dTlvTmpltMap[it->first]->SetMarkerStyle(5); h1dTlvTmpltMap[it->first]->SetMarkerSize(0.5); legMap[it->first]->AddEntry(h1dTlvTmpltMap[it->first],"ME^{2} method: DY+Template (no interference)","p"); h1dBrandeisTmpltMap[it->first]->SetLineColor(kRed); h1dBrandeisTmpltMap[it->first]->SetMarkerColor(kRed); h1dBrandeisTmpltMap[it->first]->SetMarkerStyle(27); h1dBrandeisTmpltMap[it->first]->SetMarkerSize(0.5); legMap[it->first]->AddEntry(h1dBrandeisTmpltMap[it->first],"Flat Z' method: DY+Template (no interference)","p"); } it->second->Divide(1,2); TVirtualPad* ph = it->second->cd(1); TVirtualPad* pr = it->second->cd(2); ph->SetPad(0.00, 0.35, 1.00, 1.00); pr->SetPad(0.00, 0.00, 1.00, 0.35); ph->SetBottomMargin(0.012); pr->SetBottomMargin(0.20); pr->SetTopMargin(0.012); ph->cd(); ph->Draw(); ph->SetTicks(1,1); ph->SetLogy(); ph->SetLogx(); // h1Map[it->first+"o"]->SetMaximum( h1Map[it->first+"t"]->GetMaximum()*1.5 ); // h1Map[it->first+"o"]->Draw(); TH1D* hTmpNoErr = (TH1D*)resetErrors(h1Map[it->first+"o"])->Clone(); hTmpNoErr->SetMaximum( h1Map[it->first+"t"]->GetMaximum()*1.5 ); hTmpNoErr->SetLineStyle(1); hTmpNoErr->SetLineColor(kBlack); hTmpNoErr->SetFillColor(kAzure-9); hTmpNoErr->Draw(); TH1D* hTmpErr = (TH1D*)ShiftLog(h1Map[it->first+"o"],0.2)->Clone(); hTmpErr->SetFillStyle(4000); //will be transparent hTmpErr->SetFillColor(0); hTmpErr->DrawCopy("epx0SAMES"); hDY->Draw("SAMES"); h1Map[it->first+"t"]->Draw("epSAMES"); //poissonGraphMap[it->first]->Draw("pSAMES"); if(it->first=="2000") { graphDY->Draw("SAMESp"); graphSSM->Draw("SAMESp"); h1Template->Draw("epSAMES"); } _INFO(""); h1dTlvTmpltMap[it->first]->Draw("SAMESp"); h1dBrandeisTmpltMap[it->first]->Draw("SAMESp"); TLine* chopline = new TLine(0.12805,getYmin(h1Map[it->first+"o"]),0.12805,7.e5); chopline->SetLineStyle(2); chopline->SetLineColor(kBlack); chopline->Draw("SAMES"); ptxt->Draw("SAMES"); legMap[it->first]->Draw("SAMES"); ph->RedrawAxis(); ph->Update(); _INFO(""); pr->cd(); pr->Draw(); pr->SetTicks(1,1); pr->SetGridy(); pr->SetLogx(); h1rMap[it->first]->Draw("ep"); line->Draw("SAMES"); h1rMap[it->first]->Draw("epSAMES"); legR->Draw("SAMES"); pr->RedrawAxis(); pr->Update(); unsigned int savestate = 1; if(it->first=="1000") savestate = 0; else if(it->first=="2000") savestate = 2; else savestate = 1; TString testType = (doResiduals) ? "_residuals" : "_ratio"; mutype = (doTruth) ? "_truth" : "_recon"; savemultipdf(it->second, "plots/validation/validation"+mutype+testType+"_"+mctype+"_all.pdf", savestate); saveas(it->second, "plots/validation/validation"+mutype+testType+"_"+mctype+"_"+it->first); TCanvas* c = new TCanvas(it->first,"",600,400); c->cd(); c->Draw(); c->SetTicks(1,1); c->SetLogy(); c->SetLogx(); hTmpNoErr->Draw(); hTmpErr->DrawCopy("epx0SAMES"); hDY->Draw("SAMES"); h1Map[it->first+"t"]->Draw("epSAMES"); //poissonGraphMap[it->first]->Draw("pSAMES"); if(it->first=="2000") { graphDY->Draw("SAMESp"); graphSSM->Draw("SAMESp"); h1Template->Draw("epSAMES"); } h1dTlvTmpltMap[it->first]->Draw("SAMESp"); h1dBrandeisTmpltMap[it->first]->Draw("SAMESp"); legMap[it->first]->Draw("SAMES"); chopline->Draw("SAMES"); ptxt->Draw("SAMES"); c->RedrawAxis(); c->Update(); saveas(c,"plots/validation/validation_"+it->first+"_"+mutype+testType); _INFO("done "+(string)it->first); } }
void DrawTwoInPad(TVirtualPad* p, Int_t sub, TH1* h1, TH1* h2, Bool_t ratio, Bool_t logy=false, Bool_t legend=false) { TVirtualPad* pp = p->cd(sub); pp->SetRightMargin(0.02); pp->SetLeftMargin(0.10); TVirtualPad* ppp = pp; if (ratio) { pp->Divide(1,2,0,0); ppp = pp->cd(1); ppp->SetRightMargin(0.02); } if (logy) ppp->SetLogy(); TH1* hs[] = { h1, h2, 0 }; if (h1->GetMaximum() < h2->GetMaximum()) { hs[0] = h2; hs[1] = h1; } TH1** ph = hs; Double_t size = (ratio ? 0.1 : 0.05); Double_t off = (ratio ? 0.6 : 0.5); h1->SetFillStyle(3004); h2->SetFillStyle(3005); while (*ph) { TString opt("hist"); if (ph != hs) opt.Append(" same"); TH1* copy = (*ph)->DrawCopy(opt); copy->GetXaxis()->SetLabelSize(2*size); copy->GetYaxis()->SetLabelSize(size); copy->GetYaxis()->SetTitleSize(size); copy->GetYaxis()->SetTitleOffset(off); copy->SetYTitle(copy->GetTitle()); copy->SetTitle(""); copy->SetDirectory(0); ph++; } TString s1 = h1->GetYaxis()->GetTitle(); TString s2 = h2->GetYaxis()->GetTitle(); if (legend) { TLegend* l = new TLegend(0.6, 0.1, 0.9, 0.9); l->SetBorderSize(0); TLegendEntry* e = l->AddEntry("dummy", s1, "lf"); l->SetFillColor(kWhite); e->SetFillColor(kBlack); e->SetFillStyle(h1->GetFillStyle()); e = l->AddEntry("dummy", s2, "lf"); e->SetFillColor(kBlack); e->SetFillStyle(h2->GetFillStyle()); l->Draw(); } if (!ratio) return; ppp = pp->cd(2); ppp->SetRightMargin(0.02); TH1* r = static_cast<TH1*>(h1->Clone(Form("ratio%s", h1->GetName()))); r->SetDirectory(0); r->SetTitle(""); r->GetXaxis()->SetLabelSize(size); r->GetYaxis()->SetLabelSize(size); r->GetYaxis()->SetTitleSize(0.9*size); r->GetYaxis()->SetTitleOffset(0.9*off); r->SetMarkerStyle(20); r->SetMarkerColor(h1->GetFillColor()+1); r->SetFillStyle(3007); r->SetYTitle(Form("#frac{%s}{%s}", s1.Data(), s2.Data())); // r->Add(h2, -1); // r->Divide(h1); if (!r->IsA()->InheritsFrom(TProfile::Class())) { r->GetSumw2()->Set(0); // r->Sumw2(false); h2->GetSumw2()->Set(0); // h2->Sumw2(false); } r->Divide(h2); Printf("%s", r->GetName()); for (UShort_t bin = 1; bin <= r->GetNbinsX(); bin++) { Printf(" bin # %2d: Diff=%g+/-%g", bin, r->GetBinContent(bin), r->GetBinError(bin)); r->SetBinError(bin, 0); } r->GetSumw2()->Set(0); //r->Sumw2(false); r->SetMarkerSize(4); r->SetMaximum(r->GetMaximum()*1.2); r->SetMinimum(r->GetMinimum()*0.8); r->Draw("hist text30"); p->Modified(); p->Update(); p->cd(); }