diff --git a/src/MINERvA/MINERvA_CCinc_XSec_2DEavq3_nu.cxx b/src/MINERvA/MINERvA_CCinc_XSec_2DEavq3_nu.cxx index 0dc4943..67fc298 100755 --- a/src/MINERvA/MINERvA_CCinc_XSec_2DEavq3_nu.cxx +++ b/src/MINERvA/MINERvA_CCinc_XSec_2DEavq3_nu.cxx @@ -1,139 +1,139 @@ // Copyright 2016 L. Pickering, P Stowell, R. Terri, C. Wilkinson, C. Wret /******************************************************************************* * This file is part of NUISANCE. * * NUISANCE is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * NUISANCE is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with NUISANCE. If not, see <http://www.gnu.org/licenses/>. *******************************************************************************/ #include "MINERvA_SignalDef.h" #include "MINERvA_CCinc_XSec_2DEavq3_nu.h" //******************************************************************** MINERvA_CCinc_XSec_2DEavq3_nu::MINERvA_CCinc_XSec_2DEavq3_nu(std::string inputfile, FitWeight *rw, std::string type, std::string fakeDataFile){ //******************************************************************** // Measurement Details fName = "MINERvA_CCinc_XSec_2DEavq3_nu"; fPlotTitles = "; q_{3} (GeV); E_{avail} (GeV); d^{2}#sigma/dq_{3}dE_{avail} (cm^{2}/GeV^{2})"; EnuMin = 2.; EnuMax = 6.; hadroncut = FitPar::Config().GetParB("MINERvA_CCinc_XSec_2DEavq3_nu.hadron_cut"); useq3true = FitPar::Config().GetParB("MINERvA_CCinc_XSec_2DEavq3_nu.useq3true"); splitMEC_PN_NN = FitPar::Config().GetParB("Modes.split_PN_NN"); fNormError = 0.107; fDefaultTypes = "FIX/FULL"; fAllowedTypes = "FIX,FREE,SHAPE/FULL,DIAG/MASK"; Measurement2D::SetupMeasurement(inputfile, type, rw, fakeDataFile); // Binning for the 2D Histograms this->fNDataPointsX = 7; this->fNDataPointsY = 17; Double_t tempx[7] = {0.0, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8}; Double_t tempy[17] = {0.0, 0.02, 0.04, 0.06, 0.08, 0.10, 0.12, 0.14, 0.16, 0.20, 0.25, 0.30, 0.35, 0.40, 0.50, 0.60, 0.80}; this->fXBins = tempx; this->fYBins = tempy; // Fill data and 1Dto2D Maps for covariance SetDataValuesFromText( FitPar::GetDataBase()+"/MINERvA/CCEavq3/data_2D.txt", 1E-42); SetMapValuesFromText( FitPar::GetDataBase()+"/MINERvA/CCEavq3/map_2D.txt"); SetCovarMatrixFromChol( FitPar::GetDataBase()+"/MINERvA/CCEavq3/covar_2D.txt", 67); // Data is in 1E-42 and so is the covariance, need to scale accordingly. (*this->fFullCovar) *= 1E-16; (*this->covar) *= 1E16; // Set data errors from covariance matrix StatUtils::SetDataErrorFromCov(fDataHist, fFullCovar, fMapHist, 1E-38); // Setup mc Histograms SetupDefaultHist(); // Set Scale Factor fScaleFactor = (this->fEventHist->Integral("width")*1E-42/(fNEvents+0.))/this->TotalIntegratedFlux(); }; //******************************************************************** void MINERvA_CCinc_XSec_2DEavq3_nu::FillEventVariables(FitEvent *event){ //******************************************************************** // Seperate MEC if (splitMEC_PN_NN){ int npr = 0; int nne = 0; for (UInt_t j = 0; j < event->Npart(); j++){ if ((event->PartInfo(j))->fIsAlive) continue; if (event->PartInfo(j)->fPID == 2212) npr++; else if (event->PartInfo(j)->fPID == 2112) nne++; } if (event->Mode == 2 and npr == 1 and nne == 1){ event->Mode = 2; Mode = 2; } else if (event->Mode == 2 and npr == 0 and nne == 2){ event->Mode = 3; Mode = 3; } } // Set Defaults double Eav = -999.9; double q3 = -999.9; // If muon found get kinematics FitParticle* muon = event->GetHMFSParticle(13); FitParticle* neutrino = event->GetNeutrinoIn(); if (muon && neutrino){ // Set Q from Muon TLorentzVector q = neutrino->fP - muon->fP; double q0 = (q.E())/1.E3; - double q3_true = (q.Vect().Mag())/1.E3; + //double q3_true = (q.Vect().Mag())/1.E3; double thmu = muon->fP.Vect().Angle(neutrino->fP.Vect()); double pmu = muon->fP.Vect().Mag()/1.E3; double emu = muon->fP.E()/1.E3; double mmu = muon->fP.Mag()/1.E3; // Get Enu Rec double enu_rec = emu + q0; // Set Q2 QE double q2qe = 2*enu_rec * (emu - pmu * cos(thmu)) - mmu*mmu; // Calc Q3 from Q2QE and EnuTree q3 = sqrt(q2qe + q0*q0); // Get Eav too Eav = FitUtils::GetErecoil_MINERvA_LowRecoil(event) / 1.E3; } // Set Hist Variables fXVar = q3; fYVar = Eav; return; } //******************************************************************** bool MINERvA_CCinc_XSec_2DEavq3_nu::isSignal(FitEvent *event){ //******************************************************************** return SignalDef::isCCincLowRecoil_MINERvA(event, EnuMin, EnuMax); } diff --git a/src/Utils/PlotUtils.cxx b/src/Utils/PlotUtils.cxx index fa061c3..99b5fcf 100644 --- a/src/Utils/PlotUtils.cxx +++ b/src/Utils/PlotUtils.cxx @@ -1,879 +1,879 @@ // Copyright 2016 L. Pickering, P Stowell, R. Terri, C. Wilkinson, C. Wret /******************************************************************************* * This file is part of NUISANCE. * * NUISANCE is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * NUISANCE is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with NUISANCE. If not, see <http://www.gnu.org/licenses/>. *******************************************************************************/ #include "PlotUtils.h" #include "FitEvent.h" #include "FitParameters.h" // MOVE TO MB UTILS! // This function is intended to be modified to enforce a consistent masking for all models. TH2D* PlotUtils::SetMaskHist(std::string type, TH2D* data){ TH2D *fMaskHist = (TH2D*)data->Clone("fMaskHist"); for (int xBin = 0; xBin < fMaskHist->GetNbinsX(); ++xBin){ for (int yBin = 0; yBin < fMaskHist->GetNbinsY(); ++yBin){ if (data->GetBinContent(xBin+1, yBin+1) == 0) fMaskHist->SetBinContent(xBin+1, yBin+1, 0); else fMaskHist->SetBinContent(xBin+1, yBin+1, 0.5); if (!type.compare("MB_numu_2D")){ if (yBin == 19 && xBin < 8) fMaskHist->SetBinContent(xBin+1, yBin+1, 1.0); } else { if (yBin == 19 && xBin < 11) fMaskHist->SetBinContent(xBin+1, yBin+1, 1.0); } if (yBin == 18 && xBin < 3) fMaskHist->SetBinContent(xBin+1, yBin+1, 1.0); if (yBin == 17 && xBin < 2) fMaskHist->SetBinContent(xBin+1, yBin+1, 1.0); if (yBin == 16 && xBin < 1) fMaskHist->SetBinContent(xBin+1, yBin+1, 1.0); } } return fMaskHist; }; // MOVE TO GENERAL UTILS? bool PlotUtils::CheckObjectWithName(TFile *inFile, std::string substring){ TIter nextkey(inFile->GetListOfKeys()); TKey *key; while ( (key = (TKey*)nextkey()) ) { std::string test(key->GetName()); if (test.find(substring) != std::string::npos) return true; } return false; }; // MOVE TO GENERAL UTILS? std::string PlotUtils::GetObjectWithName(TFile *inFile, std::string substring){ TIter nextkey(inFile->GetListOfKeys()); TKey *key; std::string output="NULL"; while ( (key = (TKey*)nextkey()) ) { std::string test(key->GetName()); if (test.find(substring) != std::string::npos) output = test; } return output; }; void PlotUtils::CreateNeutModeArray(TH1* hist, TH1* neutarray[]){ for (int i = 0; i < 60; i++){ neutarray[i] = (TH1*)hist->Clone(Form("%s_NMODE_%i",hist->GetName(),i)); } return; }; void PlotUtils::DeleteNeutModeArray(TH1* neutarray[]){ for (int i = 0; i < 60; i++){ delete neutarray[i]; } return; }; void PlotUtils::FillNeutModeArray(TH1D* hist[], int mode, double xval, double weight){ if (abs(mode) > 60) return; hist[abs(mode)]->Fill(xval, weight); return; }; void PlotUtils::FillNeutModeArray(TH2D* hist[], int mode, double xval, double yval, double weight){ if (abs(mode) > 60) return; hist[abs(mode)]->Fill(xval,yval,weight); return; }; THStack PlotUtils::GetNeutModeStack(std::string title, TH1* ModeStack[], int option) { (void) option; THStack allmodes = THStack(title.c_str(),title.c_str()); for (int i = 0; i < 60; i++){ allmodes.Add(ModeStack[i]); } // Credit to Clarence for copying all this out. // CC ModeStack[1]->SetTitle("CCQE"); ModeStack[1]->SetFillColor(kBlue); // ModeStack[1]->SetFillStyle(3444); ModeStack[1]->SetLineColor(kBlue); ModeStack[2]->SetTitle("2p/2h Nieves"); ModeStack[2]->SetFillColor(kRed); //ModeStack[2]->SetFillStyle(3344); ModeStack[2]->SetLineColor(kRed); //ModeStack[11]->SetTitle("#it{#nu + p #rightarrow l^{-} + p + #pi^{+}}"); ModeStack[11]->SetTitle("CC1#pi^{+} on p"); ModeStack[11]->SetFillColor(kGreen); //ModeStack[11]->SetFillStyle(3004); ModeStack[11]->SetLineColor(kGreen); //ModeStack[12]->SetTitle("#it{#nu + n #rightarrow l^{-} + p + #pi^{0}}"); ModeStack[12]->SetTitle("CC1#pi^{0} on n"); ModeStack[12]->SetFillColor(kGreen+3); //ModeStack[12]->SetFillStyle(3005); ModeStack[12]->SetLineColor(kGreen); //ModeStack[13]->SetTitle("#it{#nu + n #rightarrow l^{-} + n + #pi^{+}}"); ModeStack[13]->SetTitle("CC1#pi^{+} on n"); ModeStack[13]->SetFillColor(kGreen-2); //ModeStack[13]->SetFillStyle(3004); ModeStack[13]->SetLineColor(kGreen); ModeStack[16]->SetTitle("CC coherent"); ModeStack[16]->SetFillColor(kBlue); //ModeStack[16]->SetFillStyle(3644); ModeStack[16]->SetLineColor(kBlue); //ModeStack[17]->SetTitle("#it{#nu + n #rightarrow l^{-} + p + #gamma}"); ModeStack[17]->SetTitle("CC1#gamma"); ModeStack[17]->SetFillColor(kMagenta); //ModeStack[17]->SetFillStyle(3001); ModeStack[17]->SetLineColor(kMagenta); ModeStack[21]->SetTitle("Multi #pi (1.3 < W < 2.0)"); ModeStack[21]->SetFillColor(kYellow); //ModeStack[21]->SetFillStyle(3005); ModeStack[21]->SetLineColor(kYellow); //ModeStack[22]->SetTitle("#it{#nu + n #rightarrow l^{-} + p + #eta^{0}}"); ModeStack[22]->SetTitle("CC1#eta^{0} on n"); ModeStack[22]->SetFillColor(kYellow-2); //ModeStack[22]->SetFillStyle(3013); ModeStack[22]->SetLineColor(kYellow-2); //ModeStack[23]->SetTitle("#it{#nu + n #rightarrow l^{-} + #Lambda + K^{+}}"); ModeStack[23]->SetTitle("CC1#Labda1K^{+}"); ModeStack[23]->SetFillColor(kYellow-6); //ModeStack[23]->SetFillStyle(3013); ModeStack[23]->SetLineColor(kYellow-6); ModeStack[26]->SetTitle("DIS (W > 2.0)"); ModeStack[26]->SetFillColor(kRed); //ModeStack[26]->SetFillStyle(3006); ModeStack[26]->SetLineColor(kRed); // NC //ModeStack[31]->SetTitle("#it{#nu + n #rightarrow #nu + n + #pi^{0}}"); ModeStack[31]->SetTitle("NC1#pi^{0} on n"); ModeStack[31]->SetFillColor(kBlue); //ModeStack[31]->SetFillStyle(3004); ModeStack[31]->SetLineColor(kBlue); //ModeStack[32]->SetTitle("#it{#nu + p #rightarrow #nu + p + #pi^{0}}"); ModeStack[32]->SetTitle("NC1#pi^{0} on p"); ModeStack[32]->SetFillColor(kBlue+3); //ModeStack[32]->SetFillStyle(3004); ModeStack[32]->SetLineColor(kBlue+3); //ModeStack[33]->SetTitle("#it{#nu + n #rightarrow #nu + p + #pi^{-}}"); ModeStack[33]->SetTitle("NC1#pi^{-} on n"); ModeStack[33]->SetFillColor(kBlue-2); //ModeStack[33]->SetFillStyle(3005); ModeStack[33]->SetLineColor(kBlue-2); //ModeStack[34]->SetTitle("#it{#nu + p #rightarrow #nu + n + #pi^{+}}"); ModeStack[34]->SetTitle("NC1#pi^{+} on p"); ModeStack[34]->SetFillColor(kBlue-8); //ModeStack[34]->SetFillStyle(3005); ModeStack[34]->SetLineColor(kBlue-8); ModeStack[36]->SetTitle("NC Coherent"); ModeStack[36]->SetFillColor(kBlue+8); //ModeStack[36]->SetFillStyle(3644); ModeStack[36]->SetLineColor(kBlue+8); //ModeStack[38]->SetTitle("#it{#nu + n #rightarrow #nu + n + #gamma}"); ModeStack[38]->SetTitle("NC1#gamma on n"); ModeStack[38]->SetFillColor(kMagenta); //ModeStack[38]->SetFillStyle(3001); ModeStack[38]->SetLineColor(kMagenta); //ModeStack[39]->SetTitle("#it{#nu + p #rightarrow #nu + p + #gamma}"); ModeStack[39]->SetTitle("NC1#gamma on p"); ModeStack[39]->SetFillColor(kMagenta-10); //ModeStack[39]->SetFillStyle(3001); ModeStack[39]->SetLineColor(kMagenta-10); ModeStack[41]->SetTitle("Multi #pi (1.3 < W < 2.0)"); ModeStack[41]->SetFillColor(kBlue-10); //ModeStack[41]->SetFillStyle(3005); ModeStack[41]->SetLineColor(kBlue-10); //ModeStack[42]->SetTitle("#it{#nu + n #rightarrow #nu + n + #eta^{0}}"); ModeStack[42]->SetTitle("NC1#eta^{0} on n"); ModeStack[42]->SetFillColor(kYellow-2); //ModeStack[42]->SetFillStyle(3013); ModeStack[42]->SetLineColor(kYellow-2); //ModeStack[43]->SetTitle("#it{#nu + p #rightarrow #nu + p + #eta^{0}}"); ModeStack[43]->SetTitle("NC1#eta^{0} on p"); ModeStack[43]->SetFillColor(kYellow-4); //ModeStack[43]->SetFillStyle(3013); ModeStack[43]->SetLineColor(kYellow-4); //ModeStack[44]->SetTitle("#it{#nu + n #rightarrow #nu + #Lambda + K^{0}}"); ModeStack[44]->SetTitle("NC1#Lambda1K^{0} on n"); ModeStack[44]->SetFillColor(kYellow - 6); //ModeStack[44]->SetFillStyle(3014); ModeStack[44]->SetLineColor(kYellow - 6); //ModeStack[45]->SetTitle("#it{#nu + p #rightarrow #nu + #Lambda + K^{+}}"); ModeStack[45]->SetTitle("NC1#Lambda1K^{+}"); ModeStack[45]->SetFillColor(kYellow - 10); //ModeStack[45]->SetFillStyle(3014); ModeStack[45]->SetLineColor(kYellow - 10); ModeStack[46]->SetTitle("DIS (W > 2.0)"); ModeStack[46]->SetFillColor(kRed); //ModeStack[46]->SetFillStyle(3006); ModeStack[46]->SetLineColor(kRed); //ModeStack[51]->SetTitle("#it{#nu + p #rightarrow #nu + p}"); ModeStack[51]->SetTitle("NC on p"); ModeStack[51]->SetFillColor(kBlack); //ModeStack[51]->SetFillStyle(3444); ModeStack[51]->SetLineColor(kBlack); //ModeStack[52]->SetTitle("#it{#nu + n #rightarrow #nu + n}"); ModeStack[52]->SetTitle("NC on n"); ModeStack[52]->SetFillColor(kGray); //ModeStack[52]->SetFillStyle(3444); ModeStack[52]->SetLineColor(kGray); return allmodes; }; TLegend PlotUtils::GenerateStackLegend(THStack stack, int xlow, int ylow, int xhigh, int yhigh){ TLegend leg = TLegend(xlow,ylow,xhigh,yhigh); TObjArray* histarray = stack.GetStack(); int nhist = histarray->GetEntries(); for (int i = 0; i < nhist; i++){ TH1* hist = (TH1*)(histarray->At(i)); leg.AddEntry( (hist), ((TH1*)histarray->At(i))->GetTitle(), "fl"); } leg.SetName(Form("%s_LEG",stack.GetName())); return leg; }; void PlotUtils::ScaleNeutModeArray(TH1* hist[], double factor, std::string option){ for (int i = 0; i < 60; i++){ if (hist[i]) hist[i]->Scale(factor,option.c_str()); } return; }; void PlotUtils::ResetNeutModeArray(TH1* hist[]){ for (int i = 0; i < 60; i++){ if (hist[i]) hist[i]->Reset(); } return; }; //******************************************************************** // This assumes the Enu axis is the x axis, as is the case for MiniBooNE 2D distributions void PlotUtils::FluxUnfoldedScaling(TH2D* fMCHist, TH1D* fhist, TH1D* ehist, double scalefactor) { //******************************************************************** // Make clones to avoid changing stuff TH1D* eventhist = (TH1D*)ehist->Clone(); TH1D* fFluxHist = (TH1D*)fhist->Clone(); // Undo width integral in SF fMCHist->Scale( scalefactor / eventhist->Integral(1,eventhist->GetNbinsX()+1,"width")); // Standardise The Flux eventhist->Scale(1.0/fFluxHist->Integral()); fFluxHist->Scale(1.0/fFluxHist->Integral()); // Scale fMCHist by eventhist integral fMCHist->Scale( eventhist->Integral(1,eventhist->GetNbinsX()+1) ); // Now Get a flux PDF assuming X axis is Enu TH1D* pdfflux = (TH1D*) fMCHist->ProjectionX()->Clone(); pdfflux->Reset(); for (int i = 0; i < pdfflux->GetNbinsX(); i++){ double Ml = pdfflux->GetXaxis()->GetBinLowEdge(i+1); double Mh = pdfflux->GetXaxis()->GetBinLowEdge(i+2); - double Mc = pdfflux->GetXaxis()->GetBinCenter(i+1); - double Mw = pdfflux->GetBinWidth(i+1); + //double Mc = pdfflux->GetXaxis()->GetBinCenter(i+1); + //double Mw = pdfflux->GetBinWidth(i+1); double fluxint = 0.0; for (int j = 0; j < fFluxHist->GetNbinsX(); j++){ - double Fc = fFluxHist->GetXaxis()->GetBinCenter(j+1); + //double Fc = fFluxHist->GetXaxis()->GetBinCenter(j+1); double Fl = fFluxHist->GetXaxis()->GetBinLowEdge(j+1); double Fh = fFluxHist->GetXaxis()->GetBinLowEdge(j+2); double Fe = fFluxHist->GetBinContent(j+1); double Fw = fFluxHist->GetXaxis()->GetBinWidth(j+1); if (Fl >= Ml and Fh <= Mh){ fluxint += Fe; } else if (Fl < Ml and Fl < Mh and Fh > Ml and Fh < Mh){ fluxint += Fe * (Fh - Ml)/Fw; } else if (Fh > Mh and Fl < Mh and Fh > Ml and Fl > Ml){ fluxint += Fe * (Mh - Fl)/Fw; } else if (Ml >= Fl and Mh <= Fh){ fluxint += Fe * (Mh - Ml)/Fw; } else { continue; } } pdfflux->SetBinContent(i+1, fluxint); } for (int i = 0; i < fMCHist->GetNbinsX()+1; i++) { for (int j = 0; j < fMCHist->GetNbinsY()+1; j++){ if (pdfflux->GetBinContent(i+1) == 0.0) continue; double binWidth = fMCHist->GetYaxis()->GetBinLowEdge(j+2) - fMCHist->GetYaxis()->GetBinLowEdge(j+1); fMCHist->SetBinContent(i+1, j+1, fMCHist->GetBinContent(i+1,j+1) /pdfflux->GetBinContent(i+1) / binWidth); fMCHist->SetBinError(i+1, j+1, fMCHist->GetBinError(i+1,j+1) /pdfflux->GetBinContent(i+1) / binWidth); } } delete eventhist; delete fFluxHist; return; }; TH1D* PlotUtils::InterpolateFineHistogram(TH1D* hist, int res, std::string opt){ int nbins = hist->GetNbinsX(); double elow = hist->GetXaxis()->GetBinLowEdge(1); double ehigh = hist->GetXaxis()->GetBinLowEdge(nbins+1); bool width = true; //opt.find("width") != std::string::npos; TH1D* fine = new TH1D("fine","fine", nbins*res, elow, ehigh); TGraph* temp = new TGraph(); for (int i = 0; i < nbins; i++){ double E = hist->GetXaxis()->GetBinCenter(i+1); double C = hist->GetBinContent(i+1); double W = hist->GetXaxis()->GetBinWidth(i+1); if (!width) W = 1.0; if (W != 0.0) temp->SetPoint( temp->GetN(), E, C / W ); } for (int i = 0; i < fine->GetNbinsX(); i++){ double E = fine->GetXaxis()->GetBinCenter(i+1); double W = fine->GetBinWidth(i+1); if (!width) W = 1.0; fine->SetBinContent(i+1, temp->Eval(E,0,"S") * W); } fine->Scale(hist->Integral(1,hist->GetNbinsX()+1) / fine->Integral(1, fine->GetNbinsX()+1)); std::cout << "Interpolation Difference = " << fine->Integral(1,fine->GetNbinsX()+1) << "/" << hist->Integral(1,hist->GetNbinsX()+1) << std::endl; return fine; } //******************************************************************** // This interpolates the flux by a TGraph instead of requiring the flux and MC flux to have the same binning void PlotUtils::FluxUnfoldedScaling(TH1D* mcHist, TH1D* fhist, TH1D* ehist, double scalefactor, int nevents) { //******************************************************************** TH1D* eventhist = (TH1D*)ehist->Clone(); TH1D* fFluxHist = (TH1D*)fhist->Clone(); if (FitPar::Config().GetParB("save_flux_debug")){ std::string name = std::string(mcHist->GetName()); mcHist->Write((name + "_UNF_MC").c_str()); fFluxHist->Write((name + "_UNF_FLUX").c_str()); eventhist->Write((name + "_UNF_EVT").c_str()); TH1D* scalehist = new TH1D("scalehist","scalehist",1,0.0,1.0); scalehist->SetBinContent(1,scalefactor); scalehist->SetBinContent(2,nevents); scalehist->Write((name + "_UNF_SCALE").c_str()); } // Undo width integral in SF mcHist->Scale( scalefactor / eventhist->Integral(1,eventhist->GetNbinsX()+1,"width")); // Standardise The Flux eventhist->Scale(1.0/fFluxHist->Integral()); fFluxHist->Scale(1.0/fFluxHist->Integral()); // Scale mcHist by eventhist integral mcHist->Scale( eventhist->Integral(1,eventhist->GetNbinsX()+1) ); // Now Get a flux PDF TH1D* pdfflux = (TH1D*) mcHist->Clone(); pdfflux->Reset(); for (int i = 0; i < mcHist->GetNbinsX(); i++){ double Ml = mcHist->GetXaxis()->GetBinLowEdge(i+1); double Mh = mcHist->GetXaxis()->GetBinLowEdge(i+2); - double Mc = mcHist->GetXaxis()->GetBinCenter(i+1); - double Me = mcHist->GetBinContent(i+1); - double Mw = mcHist->GetBinWidth(i+1); + //double Mc = mcHist->GetXaxis()->GetBinCenter(i+1); + //double Me = mcHist->GetBinContent(i+1); + //double Mw = mcHist->GetBinWidth(i+1); double fluxint = 0.0; for (int j = 0; j < fFluxHist->GetNbinsX(); j++){ - double Fc = fFluxHist->GetXaxis()->GetBinCenter(j+1); + //double Fc = fFluxHist->GetXaxis()->GetBinCenter(j+1); double Fl = fFluxHist->GetXaxis()->GetBinLowEdge(j+1); double Fh = fFluxHist->GetXaxis()->GetBinLowEdge(j+2); double Fe = fFluxHist->GetBinContent(j+1); double Fw = fFluxHist->GetXaxis()->GetBinWidth(j+1); if (Fl >= Ml and Fh <= Mh){ fluxint += Fe; } else if (Fl < Ml and Fl < Mh and Fh > Ml and Fh < Mh){ fluxint += Fe * (Fh - Ml)/Fw; } else if (Fh > Mh and Fl < Mh and Fh > Ml and Fl > Ml){ fluxint += Fe * (Mh - Fl)/Fw; } else if (Ml >= Fl and Mh <= Fh){ fluxint += Fe * (Mh - Ml)/Fw; } else { continue; } } pdfflux->SetBinContent(i+1, fluxint); } // Scale MC hist by pdfflux for (int i = 0; i < mcHist->GetNbinsX(); i++){ if (pdfflux->GetBinContent(i+1) == 0.0) continue; mcHist->SetBinContent(i+1, mcHist->GetBinContent(i+1) / pdfflux->GetBinContent(i+1)); mcHist->SetBinError(i+1, mcHist->GetBinError(i+1) / pdfflux->GetBinContent(i+1)); } delete eventhist; delete fFluxHist; return; }; // MOVE TO GENERAL UTILS //******************************************************************** void PlotUtils::Set2DHistFromText(std::string dataFile, TH2* hist, double norm, bool skipbins){ //******************************************************************** std::string line; std::ifstream data(dataFile.c_str(),ifstream::in); int yBin = 0; while(std::getline(data >> std::ws, line, '\n')){ std::vector<double> entries = GeneralUtils::ParseToDbl(line, " "); // Loop over entries and insert them into the histogram for (uint xBin = 0; xBin < entries.size(); xBin++){ if (!skipbins or entries[xBin] != -1.0) hist->SetBinContent(xBin+1, yBin+1, entries[xBin]*norm); } yBin++; } return; } // MOVE TO GENERAL UTILS TH1D* PlotUtils::GetTH1DFromFile(std::string dataFile, std::string title, std::string fPlotTitles, std::string alt_name){ TH1D* tempPlot; // If format is a root file if (dataFile.find(".root") != std::string::npos){ TFile* temp_infile = new TFile(dataFile.c_str(), "READ"); tempPlot = (TH1D*)temp_infile->Get(title.c_str()); tempPlot->SetDirectory(0); temp_infile->Close(); delete temp_infile; // Else its a space seperated txt file } else { // Make a TGraph Errors TGraphErrors *gr = new TGraphErrors(dataFile.c_str(),"%lg %lg %lg"); if (gr->IsZombie()) { exit(-1); } double* bins = gr->GetX(); double* values = gr->GetY(); double* errors = gr->GetEY(); int npoints = gr->GetN(); // Fill the histogram from it tempPlot = new TH1D(title.c_str(),title.c_str(),npoints-1,bins); for (int i = 0; i < npoints; ++i){ tempPlot->SetBinContent(i+1, values[i]); tempPlot->SetBinError(i+1, errors[i]); } delete gr; } // Allow alternate naming for root files if (!alt_name.empty()){ tempPlot->SetNameTitle(alt_name.c_str(), alt_name.c_str()); } // Allow alternate axis titles if (!fPlotTitles.empty()){ tempPlot->SetNameTitle( tempPlot->GetName(), (std::string(tempPlot->GetTitle()) + fPlotTitles).c_str() ); } return tempPlot; }; TH1D* PlotUtils::GetRatioPlot(TH1D* hist1, TH1D* hist2){ // make copy of first hist TH1D* new_hist = (TH1D*) hist1->Clone(); // Do bins and errors ourselves as scales can go awkward for (int i = 0; i < new_hist->GetNbinsX(); i++){ if (hist2->GetBinContent(i+1) == 0.0){ new_hist->SetBinContent(i+1, 0.0); } new_hist->SetBinContent(i+1, hist1->GetBinContent(i+1) / hist2->GetBinContent(i+1) ); new_hist->SetBinError(i+1, hist1->GetBinError(i+1) / hist2->GetBinContent(i+1) ); } return new_hist; }; TH1D* PlotUtils::GetRenormalisedPlot(TH1D* hist1, TH1D* hist2){ // make copy of first hist TH1D* new_hist = (TH1D*) hist1->Clone(); if (hist1->Integral("width") == 0 or hist2->Integral("width") == 0){ new_hist->Reset(); return new_hist; } Double_t scaleF = hist2->Integral("width") / hist1->Integral("width"); new_hist->Scale(scaleF); return new_hist; }; TH1D* PlotUtils::GetShapePlot(TH1D* hist1){ // make copy of first hist TH1D* new_hist = (TH1D*) hist1->Clone(); if (hist1->Integral("width") == 0){ new_hist->Reset(); return new_hist; } Double_t scaleF1 = 1.0 / hist1->Integral("width"); new_hist->Scale(scaleF1); return new_hist; }; TH1D* PlotUtils::GetShapeRatio(TH1D* hist1, TH1D* hist2){ TH1D* new_hist1 = GetShapePlot(hist1); TH1D* new_hist2 = GetShapePlot(hist2); // Do bins and errors ourselves as scales can go awkward for (int i = 0; i < new_hist1->GetNbinsX(); i++){ if (hist2->GetBinContent(i+1) == 0){ new_hist1->SetBinContent(i+1, 0.0); } new_hist1->SetBinContent(i+1, new_hist1->GetBinContent(i+1) / new_hist2->GetBinContent(i+1) ); new_hist1->SetBinError(i+1, new_hist1->GetBinError(i+1) / new_hist2->GetBinContent(i+1) ); } delete new_hist2; return new_hist1; }; TH2D* PlotUtils::GetCovarPlot(TMatrixDSym* cov, std::string name, std::string title){ TH2D* CovarPlot; if (cov) CovarPlot = new TH2D((*cov)); else CovarPlot = new TH2D(name.c_str(), title.c_str(), 1,0,1,1,0,1); CovarPlot->SetName(name.c_str()); CovarPlot->SetTitle(title.c_str()); return CovarPlot; } TH2D* PlotUtils::GetFullCovarPlot(TMatrixDSym* cov, std::string name){ return PlotUtils::GetCovarPlot(cov, name + "_COV", name + "_COV;Bins;Bins;Covariance (#times10^{-76})"); } TH2D* PlotUtils::GetInvCovarPlot(TMatrixDSym* cov, std::string name){ return PlotUtils::GetCovarPlot(cov, name + "_INVCOV", name + "_INVCOV;Bins;Bins;Inv. Covariance (#times10^{-76})"); } TH2D* PlotUtils::GetDecompCovarPlot(TMatrixDSym* cov, std::string name){ return PlotUtils::GetCovarPlot(cov, name + "_DECCOV", name + "_DECCOV;Bins;Bins;Decomp Covariance (#times10^{-76})"); } TH1D* PlotUtils::GetTH1DFromRootFile(std::string file, std::string name){ TFile* rootHistFile = new TFile(file.c_str(),"READ"); TH1D* tempHist = (TH1D*) rootHistFile->Get(name.c_str())->Clone(); tempHist->SetDirectory(0); rootHistFile->Close(); return tempHist; } void PlotUtils::AddNeutModeArray(TH1D* hist1[], TH1D* hist2[], double scaling){ for (int i = 0; i < 60; i++){ if (!hist2[i]) continue; if (!hist1[i]) continue; hist1[i]->Add(hist2[i], scaling); } return; } void PlotUtils::ScaleToData(TH1D* data, TH1D* mc, TH1I* mask){ double scaleF = GetDataMCRatio(data, mc, mask); mc->Scale(scaleF); return; } void PlotUtils::MaskBins(TH1D* hist, TH1I* mask){ for (int i = 0; i < hist->GetNbinsX(); i++){ if (mask->GetBinContent(i+1) <= 0.5) continue; hist->SetBinContent(i+1, 0.0); hist->SetBinError(i+1, 0.0); LOG(REC)<<"MaskBins: Set "<<hist->GetName()<<" Bin "<<i+1<<" to 0.0 +- 0.0"<<std::endl; } return; } void PlotUtils::MaskBins(TH2D* hist, TH2I* mask){ for (int i = 0; i < hist->GetNbinsX(); i++){ for (int j = 0; j < hist->GetNbinsY(); j++){ if (mask->GetBinContent(i+1,j+1) <= 0.5) continue; hist->SetBinContent(i+1,j+1, 0.0); hist->SetBinError(i+1, j+1,0.0); LOG(REC)<<"MaskBins: Set "<<hist->GetName()<<" Bin "<<i+1<<" "<<j+1<<" to 0.0 +- 0.0"<<std::endl; } } return; } double PlotUtils::GetDataMCRatio(TH1D* data, TH1D* mc, TH1I* mask){ double rat = 1.0; TH1D* newmc = (TH1D*)mc->Clone(); TH1D* newdt = (TH1D*)data->Clone(); if (mask){ MaskBins(newmc, mask); MaskBins(newdt, mask); } rat = newdt->Integral()/newmc->Integral(); return rat; } TH2D* PlotUtils::GetCorrelationPlot(TH2D* cov, std::string name){ TH2D* cor = (TH2D*)cov->Clone(); cor->Reset(); for (int i = 0; i < cov->GetNbinsX(); i++){ for (int j = 0; j < cov->GetNbinsY(); j++){ if (cov->GetBinContent(i+1,i+1) != 0.0 and cov->GetBinContent(j+1,j+1) != 0.0) cor->SetBinContent(i+1,j+1, cov->GetBinContent(i+1,j+1)/(sqrt(cov->GetBinContent(i+1,i+1) * cov->GetBinContent(j+1,j+1)))); } } if (!name.empty()) { cor->SetNameTitle(name.c_str(), (name + ";;correlation").c_str()); } cor->SetMinimum(-1); cor->SetMaximum(1); return cor; } TH2D* PlotUtils::GetDecompPlot(TH2D* cov, std::string name){ TMatrixDSym* covarmat = new TMatrixDSym(cov->GetNbinsX()); for (int i = 0; i < cov->GetNbinsX(); i++) for (int j = 0; j < cov->GetNbinsY(); j++) (*covarmat)(i,j) = cov->GetBinContent(i+1,j+1); TMatrixDSym* decompmat = StatUtils::GetDecomp(covarmat); TH2D* dec = (TH2D*) cov->Clone(); for (int i = 0; i < cov->GetNbinsX(); i++) for (int j = 0; j < cov->GetNbinsY(); j++) dec->SetBinContent(i+1,j+1,(*decompmat)(i,j)); delete covarmat; delete decompmat; dec->SetNameTitle(name.c_str(),(name + ";;;decomposition").c_str()); return dec; } TH2D* PlotUtils::MergeIntoTH2D(TH1D* xhist, TH1D* yhist, std::string zname){ std::vector<double> xedges, yedges; for (int i = 0; i < xhist->GetNbinsX()+2; i++) { xedges.push_back(xhist->GetXaxis()->GetBinLowEdge(i+1)); } for (int i = 0; i < yhist->GetNbinsX()+2; i++) { yedges.push_back(yhist->GetXaxis()->GetBinLowEdge(i+1)); } int nbinsx = xhist->GetNbinsX(); int nbinsy = yhist->GetNbinsX(); std::string name = std::string(xhist->GetName())+"_vs_"+std::string(yhist->GetName()); std::string titles = ";" + std::string(xhist->GetXaxis()->GetTitle()) + ";" + std::string(yhist->GetXaxis()->GetTitle()) + ";" + zname; TH2D* newplot = new TH2D(name.c_str(),(name+titles).c_str(), nbinsx, &xedges[0], nbinsy, &yedges[0]); return newplot; } //*************************************************** void PlotUtils::MatchEmptyBins(TH1D* data, TH1D* mc){ //************************************************** for (int i = 0; i < data->GetNbinsX(); i++){ if (data->GetBinContent(i+1) == 0.0 or data->GetBinError(i+1) == 0.0) mc->SetBinContent(i+1,0.0); } return; } //*************************************************** void PlotUtils::MatchEmptyBins(TH2D* data, TH2D* mc){ //************************************************** for (int i = 0; i < data->GetNbinsX(); i++){ for (int j = 0; j < data->GetNbinsY(); j++){ if (data->GetBinContent(i+1,j+1) == 0.0 or data->GetBinError(i+1,j+1) == 0.0) mc->SetBinContent(i+1,j+1,0.0); } } return; } //*************************************************** TH1D* PlotUtils::GetProjectionX(TH2D* hist, TH2I* mask){ //*************************************************** TH2D* maskedhist = StatUtils::ApplyHistogramMasking(hist, mask); TH1D* hist_X = maskedhist->ProjectionX(); delete maskedhist; return hist_X; } //*************************************************** TH1D* PlotUtils::GetProjectionY(TH2D* hist, TH2I* mask){ //*************************************************** TH2D* maskedhist = StatUtils::ApplyHistogramMasking(hist, mask); TH1D* hist_Y = maskedhist->ProjectionY(); delete maskedhist; return hist_Y; }