// Print all canvases in a single PS file void printCanvasesPS(TString name){ TPostScript * ps = new TPostScript(name,112); TIter iter(gROOT->GetListOfCanvases()); TCanvas *c; while( (c = (TCanvas *)iter()) ) { cout << "Printing " << c->GetName() << endl; ps->NewPage(); c->Draw(); } cout << " File " << name << " was created" << endl; ps->Close(); }
// main function int main(int argc, char** argv){ gROOT->SetBatch(kTRUE); gROOT->SetStyle("Plain"); gStyle->SetOptStat(0); TPostScript *ps = new TPostScript("histogramsznunu.ps"); TFile *znunucomp = new TFile("znunucomp.root", "recreate"); TCanvas *c1 = new TCanvas("aaa","c1",50,10,700,800); // these 2 crazy lines are needed ps->NewPage(); // for proper alignment of the 1st page TString data_file = argv[1]; TString mc_file = argv[2]; //DATA/MC PLOTS TFile *fdata = new TFile(data_file, "OLD"); // first file (index=0 in getHistogramsFromFile) TFile *fpmcs = new TFile(mc_file, "OLD"); // second file (index=1 in getHistogramsFromFile) if(!fdata || !fpmcs) { cout << "Can't open first and/or second file !!!" << endl; if(fdata) fdata->Close(); if(fpmcs) fpmcs->Close(); return 1; } if(argc!=5 && argc!=6) { cout<<" Please run it the following way: " <<" ./znunucomp <first_root_file_name> <second_root_file_name> <make_chi2_option> <compare_option> [rows_per_page]" << endl <<endl <<" If <make_chi2_option>=1 then CHI plots will be created too."<<endl <<" Use <compare_option>=0 for comparing Full-MC (GEANT) with Fast-MC (PMCS)," << endl <<" <compare_option>=1 for comparing Full-MC (GEANT) with Full-MC (GEANT)," << endl <<" <compare_option>=2 for comparing Fast-MC (PMCS) with Fast-MC (PMCS)." << endl << endl; return 1; } // make chi2 plot int chi2_option = atoi(argv[3]); bool make_chi2 = false; if(chi2_option>0) make_chi2 = true; // make compare option int compare_option = atoi(argv[4]); switch(compare_option) { case 0: // 0 for full MC - fast MC set_DATA_label("FULL MC"); // first file, upper label set_MC_label("FAST MC"); // second file, bottom label if(!(fdata->cd("ZNuNuCand_Hist") && fpmcs->cd("default"))){ cout<<" ==> compare option = 0, Are you comparing FULL-MC to FAST-MC ??? Aborted"<<endl; if(fdata) fdata->Close(); if(fpmcs) fpmcs->Close(); return 1; } getHistogramsFromFile(fdata, 0, true); // will assume the first file is FULL MC getHistogramsFromFile(fpmcs, 1, false);// will assume the second file is PMCS cout<<" Red histogram for the first file (FULL MC), Blue histogram for the second file (PMCS)"<<endl; break; case 1: // 1 for full MC - full MC set_DATA_label("FULL MC #1"); // first file, upper label set_MC_label("FULL MC #2"); // second file, bottom label if(!(fdata->cd("ZNuNuCand_Hist") && fpmcs->cd("ZNuNuCand_Hist"))){ cout<<" ==> compare option = 1, Are you comparing FULL-MC to FULL-MC ??? Aborted"<<endl; if(fdata) fdata->Close(); if(fpmcs) fpmcs->Close(); return 1; } getHistogramsFromFile(fdata, 0, true);// will assume the first file is FULL MC getHistogramsFromFile(fpmcs, 1, true);// will assume the second file is FULL MC cout<<" Red histogram for the first FULL MC file, Blue histogram for the second FULL MC file"<<endl; break; case 2: // 2 for fast MC - fast MC set_DATA_label("FAST MC #1"); // first file, upper label set_MC_label("FAST MC #2"); // second file, bottom label if(!(fdata->cd("default") && fpmcs->cd("default"))){ cout<<" ==> compare option = 2, Are you comparing FAST-MC to FAST-MC ??? Aborted"<<endl; if(fdata) fdata->Close(); if(fpmcs) fpmcs->Close(); return 1; } getHistogramsFromFile(fdata, 0, false);// will assume the first file is PMCS getHistogramsFromFile(fpmcs, 1, false);// will assume the second file is PMCS cout<<" Red histogram for the first PMCS file, Blue histogram for the second PMCS file"<<endl; break; default: // UNKNOWN cout<<"Wrong <compare_option>="<<compare_option<<" !!!"<<endl; if(fdata) fdata->Close(); if(fpmcs) fpmcs->Close(); return 1; }; // max plots/page int plots_per_page = 10; if(argc==6 && atoi(argv[5])>0) plots_per_page=atoi(argv[5]); //////////////////////////////////////////////////////////////////////////// typedef struct { char *cname; vector<TH1 *> *vect; } canvas_t; canvas_t plot[]= { {"ZNuNu_genZPt_Cuts", GenZPt_Cuts}, {"ZNuNu_genZPt_Cuts_bin", GenZPt_Cuts_bin}, {"ZNuNu_genZPt_Cuts_genZPtBin", GenZPt_Cuts_genZPtBin}, {"ZNuNu_genZPhi_Cuts", GenZPhi_Cuts}, {"ZNuNu_genZPhi_Cuts_bin", GenZPhi_Cuts_bin}, {"ZNuNu_genZPhi_Cuts_genZPtBin", GenZPhi_Cuts_genZPtBin}, {"ZNuNu_genVtxZ_Cuts", GenVtxZ_Cuts}, {"ZNuNu_genVtxZ_Cuts_bin", GenVtxZ_Cuts_bin}, {"ZNuNu_genVtxZ_Cuts_genZPtBin", GenVtxZ_Cuts_genZPtBin}, {"ZNuNu_RecoilPt_Cuts", RecoilPt_Cuts}, {"ZNuNu_RecoilPt_Cuts_bin", RecoilPt_Cuts_bin}, {"ZNuNu_RecoilPt_Cuts_genZPtBin", RecoilPt_Cuts_genZPtBin}, {"ZNuNu_RecoilPx_Cuts", RecoilPx_Cuts}, {"ZNuNu_RecoilPx_Cuts_bin", RecoilPx_Cuts_bin}, {"ZNuNu_RecoilPx_Cuts_genZPtBin", RecoilPx_Cuts_genZPtBin}, {"ZNuNu_RecoilPy_Cuts", RecoilPy_Cuts}, {"ZNuNu_RecoilPy_Cuts_bin", RecoilPy_Cuts_bin}, {"ZNuNu_RecoilPy_Cuts_genZPtBin", RecoilPy_Cuts_genZPtBin}, {"ZNuNu_RecoilPhi_Cuts", RecoilPhi_Cuts}, {"ZNuNu_RecoilPhi_Cuts_bin", RecoilPhi_Cuts_bin}, {"ZNuNu_RecoilPhi_Cuts_genZPtBin", RecoilPhi_Cuts_genZPtBin}, {"ZNuNu_RecoilResolution_Cuts", RecoilResolution_Cuts}, {"ZNuNu_RecoilResolution_Cuts_bin", RecoilResolution_Cuts_bin}, {"ZNuNu_RecoilResolution_Cuts_genZPtBin", RecoilResolution_Cuts_genZPtBin}, {"ZNuNu_DeltaPhi_genZ_Recoil_Cuts", DeltaPhi_genZ_Recoil_Cuts}, {"ZNuNu_DeltaPhi_genZ_Recoil_Cuts_bin", DeltaPhi_genZ_Recoil_Cuts_bin}, {"ZNuNu_DeltaPhi_genZ_Recoil_Cuts_genZPtBin", DeltaPhi_genZ_Recoil_Cuts_genZPtBin}, {"ZNuNu_Met_Cuts", Met_Cuts}, {"ZNuNu_Met_Cuts_bin", Met_Cuts_bin}, {"ZNuNu_Met_Cuts_genZPtBin", Met_Cuts_genZPtBin}, {"ZNuNu_MetPhi_Cuts", MetPhi_Cuts}, {"ZNuNu_MetPhi_Cuts_bin", MetPhi_Cuts_bin}, {"ZNuNu_MetPhi_Cuts_genZPtBin", MetPhi_Cuts_genZPtBin}, {"ZNuNu_MetX_Cuts", MetX_Cuts}, {"ZNuNu_MetX_Cuts_bin", MetX_Cuts_bin}, {"ZNuNu_MetX_Cuts_genZPtBin", MetX_Cuts_genZPtBin}, {"ZNuNu_MetY_Cuts", MetY_Cuts}, {"ZNuNu_MetY_Cuts_bin", MetY_Cuts_bin}, {"ZNuNu_MetY_Cuts_genZPtBin", MetY_Cuts_genZPtBin}, {"ZNuNu_ScalarEt_Cuts", ScalarEt_Cuts}, {"ZNuNu_ScalarEt_Cuts_bin", ScalarEt_Cuts_bin}, {"ZNuNu_ScalarEt_Cuts_genZPtBin", ScalarEt_Cuts_genZPtBin}, {"ZNuNu_RecoilResponse_V_RecoilPt_Cuts", RecoilResponse_V_Recoilt_Cuts}, {"ZNuNu_RecoilResponse_V_genZPt_Cuts", RecoilResponse_V_genZPt_Cuts}, {"ZNuNu_RecoilResponseProjection_V_RecoilPt_Cuts", RecoilResponseProjection_V_RecoilPt_Cuts}, {"ZNuNu_RecoilResponseProjection_V_genZPt_Cuts", RecoilResponseProjection_V_genZPt_Cuts} }; const int nplots=sizeof(plot)/sizeof(canvas_t); // plot::plot_util() now operates on copies of input histograms // and it does not scale the originals. for(int iplot=0; iplot<nplots; iplot++) { plot_util(plot[iplot].cname, (plot[iplot].vect)[0], (plot[iplot].vect)[1], make_chi2, -1E30, 1E30, ps, plots_per_page, znunucomp ); } //////////////////////////////////////////////////////////////////////////// ps->Close(); znunucomp->Write("All"); znunucomp->Close(); }
// main file int main(int argc, char** argv){ gROOT->SetBatch(kTRUE); gROOT->SetStyle("Plain"); gStyle->SetOptStat(0); TPostScript *ps = new TPostScript("histogramszee_minuit.ps"); TFile *zeecomp = new TFile("zeecomp_minuit.root", "recreate"); TCanvas *c1 = new TCanvas("aaa","c1",50,10,700,800); // these 2 crazy lines are needed ps->NewPage(); // for proper alignment of the 1st page TString data_file = argv[1]; TString mc_file = argv[2]; if(argc!=5 && argc!=6) { cout<<" Please run it the following way: " << endl <<" ./zeecomp_minuit <full_mc_root_file_name> <pmcs_root_file_name_after_MINUIT> <make_chi2_option> <compare_option> [rows_per_page]" << endl << endl; cout<<" If <make_chi2_option>=1 then CHI plots will be created too."<<endl; cout<<" Use <compare_option>=0 for comparing DATA with Fast-MC after MINUIT fit (PMCS)," << endl <<" <compare_option>=1 for comparing Full-MC (GEANT) with Fast-MC (PMCS, after MINUIT fit)," << endl <<" <compare_option>=2 for comparing Fast-MC (PMCS) with Fast-MC (PMCS, after MINUIT fit)," << endl <<" <compare_option>=3 for comparing Fast-MC (PMCS, after MINUIT fit) with Fast-MC (PMCS, after MINUIT fit)." << endl << endl; cout<<" For example: ./zeecomp_minuit data.root fastmc_minuit.root 0 0"<<endl <<" ./zeecomp_minuit fullmc.root fastmc_minuit.root 0 1"<<endl <<" ./zeecomp_minuit fastmc.root fastmc_minuit.root 0 2"<<endl <<" ./zeecomp_minuit fastmc_minuit1.root fastmc_minuit2.root 0 3"<<endl << endl; cout<<" If <make_chi2_option>=1 then CHI plots will be created too."<<endl; cout<<" For example: ./zeecomp_minuit fullmc.root fastmc_minuit.root 0 1"<<endl<<endl; return 1; } // make chi2 plot int chi2_option = atoi(argv[3]); bool make_chi2 = false; if(chi2_option>0) make_chi2 = true; //DATA/MC PLOTS TFile *fdata = new TFile(data_file, "OLD");// first file (index=0 in getHistogramsFromData/getHistogramsFromPMCS) TFile *fpmcs = new TFile(mc_file, "OLD"); // second file (index=1 in getHistogramsFromData/getHistogramsFromPMCS) if(!fdata || !fpmcs) { cout << "Can't open first and/or second file !!!" << endl; if(fdata) fdata->Close(); if(fpmcs) fpmcs->Close(); return 1; } // make compare option int compare_option = atoi(argv[4]); switch(compare_option) { case 0: // 0 for data - fast MC (MINUIT part) set_DATA_label("DATA"); // first file, upper label set_MC_label("FAST MC"); // second file, bottom label if(!(fdata->cd("ZCand_Hist") && fpmcs->cd("smeared"))){ cout<<" ==> compare option = 0, Are you comparing DATA to FAST-MC ??? Aborted"<<endl; if(fdata) fdata->Close(); if(fpmcs) fpmcs->Close(); return 1; } getHistogramsFromData_MINUITonly(fdata, 0, false);// will assume the first file is REAL data getHistogramsFromPMCS_MINUITonly(fpmcs, 1); // will assume the second file is PMCS (MINUIT fit) cout<<" Red histogram for the first file (DATA), Blue histogram for the second file (PMCS)"<<endl; break; case 1: // 1 for full MC - fast MC (MINUIT part) set_DATA_label("FULL MC"); // first file, upper label set_MC_label("FAST MC"); // second file, bottom label if(!(fdata->cd("ZCand_Hist") && fpmcs->cd("smeared"))){ cout<<" ==> compare option = 1, Are you comparing FULL-MC to FAST-MC ??? Aborted"<<endl; if(fdata) fdata->Close(); if(fpmcs) fpmcs->Close(); return 1; } getHistogramsFromData_MINUITonly(fdata, 0, true);// will assume the first file is FULL MC getHistogramsFromPMCS_MINUITonly(fpmcs, 1); // will assume the second file is PMCS (MINUIT fit) cout<<" Red histogram for the first file (FULL MC), Blue histogram for the second file (PMCS)"<<endl; break; case 2: // 2 for fast MC (default) - fast MC (MINUIT part) set_DATA_label("FAST MC - default"); // first file, upper label set_MC_label("FAST MC - MINUIT fit"); // second file, bottom label if(!(fdata->cd("smeared") && fpmcs->cd("smeared"))){ cout<<" ==> compare option = 2, Are you comparing FAST-MC to FAST-MC ??? Aborted"<<endl; if(fdata) fdata->Close(); if(fpmcs) fpmcs->Close(); return 1; } getHistogramsFromPMCS(fdata, 0); // will assume the first file is PMCS (default) getHistogramsFromPMCS_MINUITonly(fpmcs, 1); // will assume the second file is PMCS (MINUIT fit) cout<<" Red histogram for the first file (FULL MC), Blue histogram for the second file (PMCS)"<<endl; break; case 3: // 3 for fast MC (MINUIT part) - fast MC (MINUIT part) set_DATA_label("FAST MC - MINUIT fit #1"); // first file, upper label set_MC_label("FAST MC - MINUIT fit #2"); // second file, bottom label if(!(fdata->cd("smeared") && fpmcs->cd("smeared"))){ cout<<" ==> compare option = 3, Are you comparing FAST-MC to FAST-MC ??? Aborted"<<endl; if(fdata) fdata->Close(); if(fpmcs) fpmcs->Close(); return 1; } getHistogramsFromPMCS_MINUITonly(fdata, 0); // will assume the first file is PMCS (MINUIT fit) getHistogramsFromPMCS_MINUITonly(fpmcs, 1); // will assume the second file is PMCS (MINUIT fit) cout<<" Red histogram for the first file (FULL MC), Blue histogram for the second file (PMCS)"<<endl; break; default: // UNKNOWN cout<<"Wrong <compare_option>="<<compare_option<<" !!!"<<endl; if(fdata) fdata->Close(); if(fpmcs) fpmcs->Close(); return 1; }; // max plots/page int plots_per_page = 10; if(argc==6 && atoi(argv[5])>0) plots_per_page=atoi(argv[5]); //////////////////////////////////////////////////////////////////////////// #define FULLRANGE {-1E30, 1E30} typedef struct { char *cname; vector<TH1 *> *vect; const double rangeX[2]; } canvas_t; canvas_t plot[]= { { "hEtaImbalance", hetaimbalance, FULLRANGE}, { "deltaPhi_Z_Recoil", hdeltaPhi_Z_Recoil,FULLRANGE}}; const int nplots=sizeof(plot)/sizeof(canvas_t); typedef struct { char *cname; int property; // 0=MEAN, 1=RMS int distribution; // 0=Eta Imbalance, 1=Xi Imbalance vector<TH1 *> *inputY, *inputX; TGraphErrors *plot1[2], *plot2[2], *plotCHI[2]; // index: 0=non-fitted double *chi2; // 1=from gauss fit } canvasMeanRms_t; canvasMeanRms_t plotMeanRms[]= { { "etaimbalance_mean_compare", 0, 0, hetaimbalance, h_smearUt_binno, { mean_etaimbalance_ge1[0], mean_etaimbalance_ge1[1] }, { mean_etaimbalance_ge2[0], mean_etaimbalance_ge2[1] }, { mean_etaimbalance_ge_chi[0], mean_etaimbalance_ge_chi[1] }, chi2_mean_EtaImbalance }, { "etaimbalance_width_compare", 1, 0, hetaimbalance, h_smearUt_binno, { width_etaimbalance_ge1[0], width_etaimbalance_ge1[1] }, { width_etaimbalance_ge2[0], width_etaimbalance_ge2[1] }, { width_etaimbalance_ge_chi[0], width_etaimbalance_ge_chi[1] }, chi2_width_EtaImbalance } }; const int nplotsMeanRms=sizeof(plotMeanRms)/sizeof(canvasMeanRms_t); typedef struct { char *cname; vector<TH1 *> *inputY, *inputX; TGraphErrors *plot1[2], *plot2[2], *plotCHI[2]; // index: 0=non-fitted double *chi2; // 1=from gauss fit } canvasRmsDeltaPhiZRecoil_t; canvasRmsDeltaPhiZRecoil_t plotRmsDeltaPhiZRecoil[]= { { "deltaphiimbalance_compare", hdeltaPhi_Z_Recoil, h_smearUt_binno, { deltaphimbalance_ge1[0], deltaphimbalance_ge1[1] }, { deltaphimbalance_ge2[0], deltaphimbalance_ge2[1] }, { deltaphimbalance_chi[0], deltaphimbalance_chi[1] }, chi2_deltaphimbalance } }; const int nplotsRmsDeltaPhiZRecoil=sizeof(plotRmsDeltaPhiZRecoil)/sizeof(canvasRmsDeltaPhiZRecoil_t); // too many bins for eta-imbalance and xi-imbalance // will rebin them here for(int i=0; i<hetaimbalance[0].size(); i++) { (hetaimbalance[0])[i]->Rebin(2); (hetaimbalance[1])[i]->Rebin(2); } for(int iplot=0; iplot<nplots; iplot++) { // avoid blank pages for non-existing histograms if((plot[iplot].vect)[0].size() && (plot[iplot].vect)[1].size()) { plot_util(plot[iplot].cname, (plot[iplot].vect)[0], (plot[iplot].vect)[1], make_chi2, plot[iplot].rangeX[0], plot[iplot].rangeX[1], ps, plots_per_page, zeecomp); } } // plot::plot_util() now operates on copies of input histograms // and it does not scale the originals. // Here we calculate: mean value of EtaImbalance (property=0, distribution=0) // mean value of XiImbalance (property=0, distribution=1) // rms value of EtaImbalance (property=1, distribution=0) // rms value of XiImbalance (property=1, distribution=1). for(int iplot=0; iplot<nplotsMeanRms; iplot++) { // avoid blank pages for non-existing histograms if((plotMeanRms[iplot].inputY)[0].size() && (plotMeanRms[iplot].inputY)[1].size() && (plotMeanRms[iplot].inputX)[1].size()) { plot_MeanSigma_pTeeBin(plotMeanRms[iplot].cname, (plotMeanRms[iplot].inputY)[0], (plotMeanRms[iplot].inputY)[1], (plotMeanRms[iplot].inputX)[0], (plotMeanRms[iplot].plot1)[0], (plotMeanRms[iplot].plot2)[0], (plotMeanRms[iplot].plotCHI)[0], // non-fitted (plotMeanRms[iplot].plot1)[1], (plotMeanRms[iplot].plot2)[1], (plotMeanRms[iplot].plotCHI)[1], // fitted plotMeanRms[iplot].property, plotMeanRms[iplot].distribution, make_chi2, plotMeanRms[iplot].chi2[0], // non-fitted plotMeanRms[iplot].chi2[1], // fitted ps, plots_per_page, zeecomp ); } } // plot::plot_util() now operates on copies of input histograms // and it does not scale the originals. // Here sigma of Phi(Z)-Phi(Recoil) distribution (centered at PI) from histogram // |Phi(Z)-Phi(Recoil)| is calculated. A standard RMS won't work in this case. for(int iplot=0; iplot<nplotsRmsDeltaPhiZRecoil; iplot++) { // avoid blank pages for non-existing histograms if((plotRmsDeltaPhiZRecoil[iplot].inputY)[0].size() && (plotRmsDeltaPhiZRecoil[iplot].inputY)[1].size() && (plotRmsDeltaPhiZRecoil[iplot].inputX)[1].size()) { plot_SigmaDeltaPhiZRecoil_pTeeBin (plotRmsDeltaPhiZRecoil[iplot].cname, (plotRmsDeltaPhiZRecoil[iplot].inputY)[0], (plotRmsDeltaPhiZRecoil[iplot].inputY)[1], (plotRmsDeltaPhiZRecoil[iplot].inputX)[0], (plotRmsDeltaPhiZRecoil[iplot].plot1)[0], (plotRmsDeltaPhiZRecoil[iplot].plot2)[0], (plotRmsDeltaPhiZRecoil[iplot].plotCHI)[0], // non-fitted (plotRmsDeltaPhiZRecoil[iplot].plot1)[1], (plotRmsDeltaPhiZRecoil[iplot].plot2)[1], (plotRmsDeltaPhiZRecoil[iplot].plotCHI)[1], // fitted make_chi2, plotRmsDeltaPhiZRecoil[iplot].chi2[0], // non-fitted plotRmsDeltaPhiZRecoil[iplot].chi2[1], // fitted ps, plots_per_page, zeecomp ); } } ps->Close(); zeecomp->Write("All"); zeecomp->Close(); }
void run_alt_smooth(){ gROOT->LoadMacro("Fitter.cpp"); TPostScript *myps = new TPostScript("upara_eff_check022008_check.ps",111); // mass range double xmin = 50., xmax = 130.; // data TFile *data=new TFile("result_0221.root"); gDirectory->cd("ZCand_Hist"); const Int_t NBins = 15; //2 gev upara bins const Int_t NBinsX = 100; //1 gev mass bins TH2D *before = (TH2D *)gROOT->FindObject("ZCandUPara_V_Mass_NoCuts"); TH2D *after = (TH2D *)gROOT->FindObject("ZCandUPara_V_Mass_BothWithGoodSpatialMatch_IsoHMxCut"); //these x bins are mass int rbinpt = 4; before->RebinX(rbinpt); after->RebinX(rbinpt); //y bins are upara: int rbinupara = 8; before->RebinY(rbinupara); after->RebinY(rbinupara); Int_t NBins_X = before->GetNbinsX(); Double_t Axis_XMin = before->GetXaxis()->GetXmin(); Double_t Axis_XMax = before->GetXaxis()->GetXmax(); if(NBins_X != NBinsX) { cout<<"NBins="<<NBinsX<<" while NBins_X="<<NBins_X<<" make sure they are the same"<<endl; exit; } Int_t NBins_Y = before->GetNbinsY(); Double_t Axis_YMin = before->GetYaxis()->GetXmin(); Double_t Axis_YMax = before->GetYaxis()->GetXmax(); cout<<"Mass bin "<<NBins_Y<<" from "<<Axis_YMin<<" to "<<Axis_YMax<<endl; // 1D histogram TH1D *before_mass[NBins], *after_mass[NBins], *diff_mass[NBins], *bkgnd_mass[NBins]; double variable[NBins], variable_err[NBins]; char name[50]; for (int ybin = 0; ybin <NBins_Y; ybin ++){ //include underflow, but doesnt go to upper limit. //not really a problem because there are few events there //and we know the correct position anyway. sprintf(name, "%s%d", "before_", ybin); before_mass[ybin] = new TH1D(name, name, NBins_X, Axis_XMin, Axis_XMax); sprintf(name, "%s%d", "after_", ybin); after_mass[ybin] = new TH1D(name, name, NBins_X, Axis_XMin, Axis_XMax); sprintf(name, "%s%d", "diff_", ybin); diff_mass[ybin] = new TH1D(name, name, NBins_X, Axis_XMin, Axis_XMax); variable[ybin] = before->GetYaxis()->GetBinCenter(ybin); variable_err[ybin] = 1.0; for(int xbin=0; xbin < NBins_X; xbin ++) { cout<<"x,y: "<<xbin<<","<<ybin<<" before "<<before->GetBinContent(xbin, ybin)<<" after "<<after->GetBinContent(xbin, ybin)<<" diff " << (before->GetBinContent(xbin, ybin) - after->GetBinContent(xbin, ybin))<< endl; before_mass[ybin] -> SetBinContent(xbin, before->GetBinContent(xbin, ybin)); after_mass[ybin] -> SetBinContent(xbin, after->GetBinContent(xbin, ybin)); diff_mass[ybin]-> SetBinContent(xbin, (before->GetBinContent(xbin, ybin) - after->GetBinContent(xbin, ybin)) ); } before_mass[ybin]->Draw(); } // signal TFile *mc = new TFile("signal.root"); gDirectory->cd("smeared"); TH2D *sig2 = (TH2D *)gROOT->FindObject("smeared_hZcandMass_V_UPara_CCCC"); sig2->RebinY(rbinupara); //here x is the mass, y is upara //sig2->RebinX(rbinpt); //here x is the mass, y is upara Int_t NBins_X = sig2->GetNbinsX(); Double_t Axis_XMin = sig2->GetXaxis()->GetXmin(); Double_t Axis_XMax = sig2->GetXaxis()->GetXmax(); Int_t NBins_Y = sig2->GetNbinsY(); Double_t Axis_YMin = sig2->GetYaxis()->GetXmin(); Double_t Axis_YMax = sig2->GetYaxis()->GetXmax(); cout<<"upara bin "<<NBins_Y<<" from "<<Axis_YMin<<" to "<<Axis_YMax<<endl; if(NBins_Y != NBins) { cout<<"NBins="<<NBins<<" while NBins_Y="<<NBins_Y<<" make sure they are the same"<<endl; exit; } cout<<"NBinsx="<<NBinsX<<" while NBins_X="<<NBins_X<<" make sure they are the same"<<endl; NBins_X = NBinsX; Axis_XMin = 50.; // 1D histogram TH1D *Sig_All[NBins]; double variable[NBins], variable_err[NBins]; TH1D *QCDBkg_All[NBins]; //now for the bkg histogram: TFile *data=new TFile("result_bkg.root"); gDirectory->cd("ZCand_Hist"); TH2D *bkgnd = (TH2D *)gROOT->FindObject("ZCandUPara_V_Mass_0"); bkgnd->RebinX(rbinupara); //upara is x bkgnd->RebinY(4); //mass is y. great //bkgnd->Draw("colz"); char name[50]; for (int ybin = 0; ybin < NBins_Y; ybin ++){ sprintf(name, "%s%d", "sig_", ybin); Sig_All[ybin] = new TH1D(name, name, NBins_X, Axis_XMin, Axis_XMax); //note range //now is consistent with wmass analysis // variable[ybin] = sig2->GetYaxis()->GetBinCenter(ybin); //variable_err[ybin] = 0.; for(int xbin=50; xbin < 150; xbin ++) { //now is consistent with wmass analysis Sig_All[ybin] -> SetBinContent(xbin-50, sig2->GetBinContent(xbin,ybin)); //note order } //pmcs ranges is from 0 to 150 instead of 50 to 150 // Sig_All[ybin] -> Draw(); sprintf(name, "%s%d", "bkgnd_", ybin); QCDBkg_All[ybin] = new TH1D(name, name, NBins_X, Axis_XMin, Axis_XMax); sprintf(name, "%s%d", "bkgnd_orig_", ybin); bkgnd_mass[ybin] = new TH1D(name, name, NBins_X, Axis_XMin, Axis_XMax); for(int xbin=0; xbin < NBins_X; xbin ++) { bkgnd_mass[ybin] -> SetBinContent((xbin), bkgnd->GetBinContent(ybin, xbin)); //note order } bkgnd_mass[ybin]->Sumw2(); // bkgnd_mass[ybin]->Draw("pe"); //TF1 *func = new TF1("func","[0] + [1]*x + [2]*x*x + [3]*x*x*x + [4]*x*x*x*x + [5]*x*x*x*x*x", Axis_YMin, Axis_YMax); //func -> SetParameters(-28900.202091,1544.3,-31.665,0.3172,0.00000305); TF1 *func = new TF1("func","landau", Axis_XMin, Axis_XMax); if (bkgnd_mass[ybin]->Integral()>10){ bkgnd_mass[ybin]->Fit(func,"QN");//QN } else { cout<< " not enough events for bkgnd determination "<<endl; func -> SetParameters(3.93055e+02,5.64712e+01,3.26891e+00); //this is for the bins < 25 GeV (for now) the parameters are from the 25-26 gev bin. } //bkgnd_mass[xbin]->Draw(); //QCDBkg_All[xbin] = (TH1D *)Sig_All[xbin]->Clone(); for(int i=1; i<=QCDBkg_All[ybin]->GetNbinsX(); i++) { double center = QCDBkg_All[ybin]->GetBinCenter(i); QCDBkg_All[ybin] -> SetBinContent(i, 0); QCDBkg_All[ybin] -> SetBinError(i, 0); if(center>xmin && center<xmax) { double bin_min = QCDBkg_All[ybin]->GetBinLowEdge(i); double bin_max = bin_min + QCDBkg_All[ybin]->GetBinWidth(i); double integral = func->Integral(bin_min, bin_max); QCDBkg_All[ybin] -> SetBinContent(i, integral); QCDBkg_All[ybin] -> SetBinError(i, TMath::Sqrt(integral)); } } // for all bins QCDBkg_All[ybin]->Sumw2(); // QCDBkg_All[ybin]->Draw(); //Sig_All[ybin]->Draw(); } //bkgnd->Draw("colz"); //TH1D *Sig_All = (TH1D *)gROOT->FindObject("smeared_hZcandMass_CCCC"); // // fitter // Fitter fitter; double data_entry_before[NBins], mc_entry_before[NBins], mc_entry_diff[NBins], bkg_entry_before[NBins], mc_error_before[NBins], mc_error_diff[NBins]; double data_entry_after[NBins], mc_entry_after[NBins], bkg_entry_after[NBins], mc_error_after[NBins]; double eff[NBins], eff_err[NBins], deff[NBins], deff_err[NBins] ,reff[NBins], reff_err[NBins]; double chisq1[NBins], chisq2[NBins]; TCanvas *ctemp; int npad = 1; cout<< " nbins upara now "<<NBins<<endl; for(int i=0; i<NBins; i++) { int cbin = 2; /*before_mass[i]->Rebin(cbin); after_mass[i]->Rebin(cbin); diff_mass[i]->Rebin(cbin); Sig_All[i]->Rebin(cbin); QCDBkg_All[i]->Rebin(cbin); */ if (!(i%2)) { myps->NewPage(); ctemp = new TCanvas("ctemp","ctemp",600,800); ctemp->Divide(2,2); npad = 1; cout<<"NEWPAGE!!!"<<endl; } cout<<"=================================Starting number "<<i<<" =============================="<<endl; ctemp->cd(npad); // before becomes diff double sb = Sig_All[i]->Integral(); double bb = QCDBkg_All[i]->Integral(); cout<<diff_mass[i]->Integral()<<" "<< Sig_All[i]->Integral()<<" "<<QCDBkg_All[i]->Integral()<<endl; if(diff_mass[i]->Integral()>1. && Sig_All[i]->Integral()>2. && QCDBkg_All[i]->Integral()>1.) { cout<<"b mass "<<diff_mass[i]->Integral()<<endl; fitter.Update(diff_mass[i], Sig_All[i], QCDBkg_All[i], xmin, xmax); fitter.FitMass(); fitter.Compare(ctemp); fitter.GetDataSignalBkg(data_entry_before[i], mc_entry_before[i], bkg_entry_before[i], mc_error_before[i], chisq1[i]); } else { diff_mass[i]->SetTitle("no fit"); diff_mass[i]->Draw("pe"); //Sig_All[i]->Scale(diff_mass[i]->Integral()/Sig_All[i]->Integral()); Sig_All[i]->SetLineColor(kRed); Sig_All[i]->SetTitle("no fit"); Sig_All[i]->Draw("hist && same"); data_entry_before[i]=0.; mc_entry_before[i]=0.; bkg_entry_before[i]=0.; mc_error_before[i]=0.; } npad++; ctemp->cd(npad); if (Sig_All[i]->Integral()>0){ Sig_All[i]->Scale(sb/Sig_All[i]->Integral()); } if(QCDBkg_All[i]->Integral()>0){ QCDBkg_All[i]->Scale(bb/QCDBkg_All[i]->Integral()); } cout<<"---------------------------------------------------------------------------------here i am"<<endl; cout<<after_mass[i]->Integral()<<" "<< Sig_All[i]->Integral()<<" "<<QCDBkg_All[i]->Integral()<<endl; if(after_mass[i]->Integral()>1. && Sig_All[i]->Integral()>2. && QCDBkg_All[i]->Integral()>1.) { cout<<"---------------------------------------------------------------------------------here i am 2"<<endl; fitter.Update(after_mass[i], Sig_All[i], QCDBkg_All[i], xmin, xmax); fitter.FitMass(); //ctemp->cd(npad); fitter.Compare(ctemp); fitter.GetDataSignalBkg(data_entry_after[i], mc_entry_after[i], bkg_entry_after[i], mc_error_after[i], chisq2[i]); } else { cout<<"-----------------------------------------------------------------------------------here i am 3"<<endl; after_mass[i]->SetTitle("no fit"); after_mass[i]->Draw("pe"); //Sig_All[i]->Scale(after_mass[i]->Integral()/Sig_All[i]->Integral()); Sig_All[i]->SetLineColor(kRed); Sig_All[i]->SetTitle("no fit"); Sig_All[i]->Draw("hist && same"); data_entry_after[i]=0.; mc_entry_after[i]=0.; bkg_entry_after[i]=0.; mc_error_after[i]=0.; } npad++; } // for each histogram // plot efficiency myps->NewPage(); TCanvas *eff_canvas = new TCanvas("eff","eff",600,600); eff_canvas->Divide(1,1); eff_canvas->cd(1); cout<<"double cccc_mc_entry_after["<<NBins<<"]={"; for(int i=0; i<NBins; i++) { cout<<mc_entry_after[i]<<","; } cout<<"}"<<endl; cout<<"double cccc_mc_error_after["<<NBins<<"]={"; for(int i=0; i<NBins; i++) { cout<<mc_error_after[i]<<","; } cout<<"}"<<endl; cout<<"double cccc_mc_entry_before["<<NBins<<"]={"; for(int i=0; i<NBins; i++) { cout<<mc_entry_before[i]<<","; } cout<<"}"<<endl; cout<<"double cccc_mc_error_before["<<NBins<<"]={"; for(int i=0; i<NBins; i++) { cout<<mc_error_before[i]<<","; } cout<<"}"<<endl; cout<<"double variable[NBins]={"; for(int i=0; i<NBins; i++) { cout<<variable[i]<<","; } cout<<"}"<<endl; for(int i=0; i<NBins; i++) { if(mc_entry_before[i]>1.&& mc_entry_after[i]>1.) { // at least >one entry eff[i] = mc_entry_after[i]/(mc_entry_before[i] + mc_entry_after[i]); eff_err[i] = sqrt(mc_entry_before[i]*mc_entry_before[i]*mc_error_after[i]*mc_error_after[i]+ mc_entry_after[i]*mc_entry_after[i]*mc_error_before[i]*mc_error_before[i])/(mc_entry_before[i]+mc_entry_after[i])/(mc_entry_before[i]+mc_entry_after[i]); cout<<"what "<<i << " b "<<mc_entry_before[i]<<" a "<<mc_entry_after[i]<<" eff i "<<eff[i]<<" err i "<<eff_err[i] << " be "<<mc_error_before[i]<<" ae "<<mc_error_after[i]<<endl; } else { eff[i] = 0; eff_err[i] = 0.05; } } TF1 *afunc = new TF1("afunc",fitf,-15,15,3); afunc->SetParameters(-1.0,0.010,0.74); // TF1 *efffit2 = new TF1("efffit2","0.5 * [2] * (1. + TMath::Erf((x-[0])/(sqrt(2)*[1])))*(1. + TMath::Erf((x-[4])/(sqrt(2)*[3])))",15,55 ); // efffit2->SetParameters(23.,2.0,0.4,2.0,20.); TGraphErrors *ge = new TGraphErrors(NBins, variable, eff, variable_err, eff_err); ge->GetYaxis()->SetRangeUser(0.4,0.9); ge->SetMarkerColor(kRed); ge->SetMarkerSize(2); ge->SetLineColor(kRed); ge->GetXaxis()->SetTitle("Electron U_{||} [GeV]"); ge->GetYaxis()->SetTitle("Efficiency"); ge->GetYaxis()->SetTitleOffset(1.4); ge->SetTitle("Z->ee Candidates, U_{||} Eff."); ge->Fit("afunc","R"); TF1 *apol1 = new TF1("apol1","[0] + [1]*x", -20. ,0.); ge -> Draw("AP"); // ge->Fit("apol1","R"); // apol1->Draw("same"); TF1 *bpol1 = new TF1("bpol1","[0] + [1]*x", 0. ,20.); // ge->Fit("bpol1","R"); //bpol1->Draw("same"); // eff_canvas->Update(); // eff_canvas->cd(2); eff_canvas->SaveAs("upara_out_new.eps"); for(int i=0; i<NBins; i++) { if(data_entry_before[i]>1. && data_entry_after[i]>1.) {// at least one entry cout<<"what 2 "<<data_entry_before[i]<<" "<<data_entry_after[i]<< " "<<i<<endl; deff[i] = data_entry_after[i]/(data_entry_before[i]+data_entry_after[i]); deff_err[i] = sqrt(data_entry_before[i]*data_entry_before[i]*mc_error_after[i]*mc_error_after[i] + data_entry_after[i]*data_entry_after[i]*mc_error_before[i]*mc_error_before[i]) /(data_entry_before[i]+data_entry_after[i])/(data_entry_before[i]+data_entry_after[i]); //for this you really should have plain binominal errors (no background subtraction here) } else { deff[i] = 0; deff_err[i] = 0.05; } } TGraphErrors *de = new TGraphErrors(NBins, variable, deff, variable_err, deff_err); de->GetYaxis()->SetRangeUser(0.4,0.9); de->SetMarkerColor(kBlue); de->SetMarkerSize(2); de->SetLineColor(kBlue); //de->Fit("efffit2","RME"); //de -> Draw("SAME"); //eff_canvas->Update(); //now get full MC "answer": /* TFile *data=new TFile("/rooms/porcelain/tandeen/WMASS/output/FULL/Zee/UPARAEFF/result_MCzee_upara_1.root"); gDirectory->cd("ZCand_Hist"); TH1D *before2 = (TH1D *)gROOT->FindObject("ZCandUPara_NoCuts"); TH1D *after2 = (TH1D *)gROOT->FindObject("ZCandUPara_BothWithGoodSpatialMatch_IsoHMxCut"); before2->Rebin(8); after2->Rebin(8); TGraphAsymmErrors *effb = new TGraphAsymmErrors(); effb->BayesDivide(after2,before2,""); //"debug" // effb->Fit("pol1","","",0,15); effb->Draw("same"); effb->Fit("pol1","","",-20,0); double thep0 = pol1->GetParameter(0); double thep1 = pol1->GetParameter(1); cout<<"p0 "<<thep0<<" p1 "<<thep0<<endl; effb->Fit("pol1","","",0,20); //TF1 *cpol1 = new TF1("cpol1","[0] + [1]*x", -20. ,0.); //cout<<"cpol"<<endl; //effb->Fit("cpol1","R"); //cpol1->Draw("same"); TF1 *dpol1 = new TF1("dpol1","[0] + [1]*x", -20. , 0.); dpol1->SetParameters(thep0,thep1); //cout<<"dpol"<<endl; //effb->Fit("dpol1","R"); dpol1->Draw("same"); //effb->SetTitle(ZCandUPara_BothWithGoodSpatialMatch_IsoHMxCut->GetTitle()); //effb->GetXaxis()->SetTitle("trk deteta"); */ /* eff_canvas->cd(3); for(int i=0; i<NBins; i++) { if(eff[i]>0. && deff[i]>0.) {// at least one entry reff[i] = eff[i]/deff[i]; //reff_err[i] = sqrt(data_entry_before[i]*data_entry_before[i]*mc_error_after[i]*mc_error_after[i]+ data_entry_after[i]*data_entry_after[i]*mc_error_before[i]*mc_error_before[i])/(data_entry_before[i]+data_entry_after[i])/(data_entry_before[i]+data_entry_after[i]); } else { reff[i] = 1.0; //reff_err[i] = 0.1; } } TGraphErrors *erat = new TGraphErrors(NBins, variable, reff, variable_err, eff_err); erat->GetXaxis()->SetRangeUser(10,70); erat->SetMarkerColor(kRed); erat->SetMarkerSize(2); erat->SetLineColor(kRed); erat -> Draw("AP"); */ eff_canvas->Update(); myps->NewPage(); TCanvas *chi_canvas = new TCanvas("eff","eff",600,800); chi_canvas->Divide(1,2); chi_canvas->cd(1); TGraph *chi1 = new TGraph(NBins, variable, chisq1); // de->GetYaxis()->SetRangeUser(0.4,0.9); //de->SetMarkerColor(kBlue); //de->SetMarkerSize(2); //de->SetLineColor(kBlue); //de->Fit("efffit2","RME"); chi1-> Draw("A*"); chi_canvas->cd(2); TGraph *chi2 = new TGraphErrors(NBins, variable, chisq2); //de->GetYaxis()->SetRangeUser(0.4,0.9); //de->SetMarkerColor(kBlue); //de->SetMarkerSize(2); //de->SetLineColor(kBlue); //de->Fit("efffit2","RME"); chi2 -> Draw("A*"); chi_canvas->Update(); myps->Close(); }
void getY0() { gROOT->Reset(); gROOT->LoadMacro("fitfun.C"); // fit function for localY, local Z const Int_t N = 120; //histograms to check the par2 and par3 distributions TH1D *hPar2 = new TH1D("Par2","",500,0., 5.); TH1D *hPar3 = new TH1D("Par3","",500,0., 1.); TFile *fin = new TFile("align.root"); TH2D *yLocal2D = (TH2D *)fin->Get("yLocal_all"); yLocal2D->RebinY(5); TH1D *yLocal[N]; for(int i=0;i<N;i++) { char hisname[100]; sprintf(hisname,"Tray_%d",i+1); yLocal[i] = yLocal2D->ProjectionY(hisname,i+1,i+1); yLocal[i]->Sumw2(); } TF1 *fitfun = new TF1("fitfun",fitfun,-5.,5.,5); double t[N]; double y0[N], ye[N]; gStyle->SetOptStat(101); gStyle->SetOptFit(100); gStyle->SetTextSize(0.06); gStyle->SetTextFont(42); TCanvas *c1 = new TCanvas("c1","c1",0,0,800,600); c1->SetFillColor(10); c1->SetBorderMode(0); c1->SetBorderSize(2); c1->Divide(4,3); TPostScript *ps = new TPostScript("fig/yLocalFit.ps",112); for(int i=0;i<N;i++) { t[i] = i+1; // tray number if(i%12==0) ps->NewPage(); // 12 trays per page c1->cd(i%12+1); double par[5], err[5]; fitfun->SetParameters(0., yLocal[i]->GetBinContent(50), 0.1, 1., 0.); fitfun->SetLineWidth(2); yLocal[i]->Draw("e"); double entries = yLocal[i]->Integral(1,100); if(entries>10) { fitfun->SetParLimits(2, 1.55, 1.7); fitfun->SetParLimits(3, 0.1, 0.3); yLocal[i]->Fit("fitfun","R"); fitfun->GetParameters(&par[0]); err[0] = fitfun->GetParError(0); } else { par[0] = 0.; err[0] = 0.; } hPar2->Fill(par[2]); hPar3->Fill(par[3]); char text[100]; sprintf(text, "Y0 = %5.3f #pm %5.3f", par[0], err[0]); TLatex *tex = new TLatex(-3, par[1]/3., text); tex->SetTextSize(0.07); tex->SetTextFont(12); tex->Draw("same"); y0[i] = par[0]; ye[i] = err[0]; c1->Update(); } ps->NewPage(); gStyle->SetOptStat(0); gStyle->SetOptFit(0); gStyle->SetEndErrorSize(0.01); TCanvas *c1 = new TCanvas("c1","c1",0,0,800,600); c1->SetFillColor(10); c1->SetBorderMode(0); c1->SetBorderSize(2); c1->SetLeftMargin(0.14); c1->SetBottomMargin(0.15); c1->SetTopMargin(0.02); c1->SetRightMargin(0.04); c1->Draw(); double x1 = 0.5; double x2 = 120.5; double y1 = -2.; double y2 = 2.; TH1D *h0 = new TH1D("h0","",1, x1, x2); h0->SetMinimum(y1); h0->SetMaximum(y2); h0->GetXaxis()->SetNdivisions(208); h0->GetXaxis()->CenterTitle(); h0->GetXaxis()->SetTitle("Tray #"); h0->GetXaxis()->SetTitleOffset(1.0); h0->GetXaxis()->SetTitleSize(0.07); h0->GetXaxis()->SetLabelOffset(0.01); h0->GetXaxis()->SetLabelSize(0.05); h0->GetXaxis()->SetLabelFont(42); h0->GetXaxis()->SetTitleFont(42); h0->GetYaxis()->SetNdivisions(210); h0->GetYaxis()->SetTitle("yLocal Offset"); h0->GetYaxis()->SetTitleOffset(1.0); h0->GetYaxis()->SetTitleSize(0.07); h0->GetYaxis()->SetLabelOffset(0.01); h0->GetYaxis()->SetLabelSize(0.045); h0->GetYaxis()->SetLabelFont(42); h0->GetYaxis()->SetTitleFont(42); h0->Draw(); TLine *l1 = new TLine(x1,y1,x2,y1); l1->SetLineWidth(3); l1->Draw("same"); TLine *l2 = new TLine(x1,y2,x2,y2); l2->SetLineWidth(3); l2->Draw("same"); TLine *l3 = new TLine(x1,y1,x1,y2); l3->SetLineWidth(3); l3->Draw("same"); TLine *l4 = new TLine(x2,y1,x2,y2); l4->SetLineWidth(3); l4->Draw("same"); TGraphErrors *gr = new TGraphErrors(N, t, y0, 0, ye); gr->SetMarkerStyle(20); gr->SetMarkerSize(1.5); gr->SetLineWidth(2); gr->Draw("p"); c1->Update(); ps->Close(); ofstream outData; outData.open("yOffset.dat"); for(int i=0;i<N;i++) { outData << setw(15) << y0[i] << setw(15) << ye[i] << endl; } outData.close(); TFile *fout = new TFile("yFitPar.root","recreate"); hPar2->Write(); hPar3->Write(); fout->Close(); }
void getX0() { gROOT->Reset(); gROOT->LoadMacro("fitfun.C"); // fit function for localY, local Z const Int_t N = 120; const Int_t M = 7; // number of module angle groups //histograms to check the par2 and par3 distributions TH1D *hPar2 = new TH1D("Par2","",500,0., 5.); TH1D *hPar3 = new TH1D("Par3","",500,0., 1.); Double_t a[M] = {0., 16., 20., 22., 26., 30., 32.}; TH2D *zLocal2D[M]; TH1D *zLocal[N][M]; TFile *fin = new TFile("align.root"); for(int j=0;j<M;j++) { char inhis[100]; sprintf(inhis,"zLocal_%d",j); zLocal2D[j] = (TH2D *)fin->Get(inhis); zLocal2D[j]->RebinY(5); for(int i=0;i<N;i++) { char hisname[100]; sprintf(hisname,"Tray_%d_A_%d",i+1,j); zLocal[i][j] = zLocal2D[j]->ProjectionY(hisname,i+1,i+1); zLocal[i][j]->Sumw2(); } } TF1 *fitfun = new TF1("fitfun",fitfun,-6.,6.,5); double t[N]; double z0[N][M], ze[N][M]; gStyle->SetOptStat(101); gStyle->SetOptFit(100); gStyle->SetTextSize(0.06); gStyle->SetTextFont(42); TCanvas *c1 = new TCanvas("c1","c1",0,0,800,600); c1->SetFillColor(10); c1->SetBorderMode(0); c1->SetBorderSize(2); c1->Divide(4,3); TPostScript *ps = new TPostScript("fig/xLocalFit.ps",112); for(int j=0;j<M;j++) { for(int i=0;i<N;i++) { t[i] = i+1; // tray number if(i%12==0) ps->NewPage(); // 12 trays per page c1->cd(i%12+1); double par[5], err[5]; fitfun->SetParameters(0., zLocal[i][j]->GetBinContent(50), 0.1, 1., 0.); fitfun->SetLineWidth(2); zLocal[i][j]->Draw("e"); double entries = zLocal[i][j]->Integral(1,100); if(entries>10) { fitfun->SetParLimits(0, -3., 3.); fitfun->SetParLimits(2, 2.9, 3.1); fitfun->SetParLimits(3, 0.01, 0.16); zLocal[i][j]->Fit("fitfun","R"); fitfun->GetParameters(&par[0]); err[0] = fitfun->GetParError(0); } else { par[0] = 0.; err[0] = 0.; } hPar2->Fill(par[2]); hPar3->Fill(par[3]); char text[100]; sprintf(text, "Z0 = %5.3f #pm %5.3f", par[0], err[0]); TLatex *tex = new TLatex(-3, par[1]/3., text); tex->SetTextSize(0.07); tex->SetTextFont(12); tex->Draw("same"); z0[i][j] = par[0]; ze[i][j] = err[0]; c1->Update(); } } gStyle->SetOptStat(0); gStyle->SetOptFit(0); gStyle->SetEndErrorSize(0.01); TF1 *fitangle = new TF1("fitangle","[0]*sin(x*3.14159/180.)+[1]",-10.,40.); double z00[N], ze0[N]; // angle=0 modules zOffset double z0F[N], zeF[N]; // angle=0 modules zOffset after fitangle fit double x0[N], xe[N]; for(int i=0;i<N;i++) { if(i%12==0) ps->NewPage(); // 12 trays per page c1->cd(i%12+1); z00[i] = z0[i][0]; ze0[i] = ze[i][0]; double x1 = -10.; double x2 = 50.; double y1 = -2.5; double y2 = 1.5; char title[100]; sprintf(title,"Tray_%d",i+1); TH1D *h0 = new TH1D("h0",title,1, x1, x2); h0->SetMinimum(y1); h0->SetMaximum(y2); h0->GetXaxis()->SetNdivisions(208); h0->GetXaxis()->CenterTitle(); h0->GetXaxis()->SetTitle("Module Angle (deg)"); h0->GetXaxis()->SetTitleOffset(1.0); h0->GetXaxis()->SetTitleSize(0.07); h0->GetXaxis()->SetLabelOffset(0.01); h0->GetXaxis()->SetLabelSize(0.045); h0->GetXaxis()->SetLabelFont(42); h0->GetXaxis()->SetTitleFont(42); h0->GetYaxis()->SetNdivisions(210); h0->GetYaxis()->SetTitle("zLocal Offset"); h0->GetYaxis()->SetTitleOffset(1.0); h0->GetYaxis()->SetTitleSize(0.07); h0->GetYaxis()->SetLabelOffset(0.01); h0->GetYaxis()->SetLabelSize(0.045); h0->GetYaxis()->SetLabelFont(42); h0->GetYaxis()->SetTitleFont(42); h0->Draw(); TGraphErrors *gr = new TGraphErrors(M, a, z0[i], 0, ze[i]); gr->SetMarkerStyle(24); gr->SetMarkerSize(1.5); gr->SetLineWidth(2); gr->Draw("p"); fitangle->SetParameters(-0.5, 0.0); gr->Fit("fitangle","R"); x0[i] = fitangle->GetParameter(0); z0F[i] = fitangle->GetParameter(1); xe[i] = fitangle->GetParError(0); zeF[i] = fitangle->GetParError(1); c1->Update(); } ps->NewPage(); gStyle->SetOptStat(0); gStyle->SetOptFit(0); gStyle->SetEndErrorSize(0.01); TCanvas *c1 = new TCanvas("c1","c1",0,0,800,600); c1->SetFillColor(10); c1->SetBorderMode(0); c1->SetBorderSize(2); c1->SetLeftMargin(0.14); c1->SetBottomMargin(0.15); c1->SetTopMargin(0.02); c1->SetRightMargin(0.04); c1->Draw(); double x1 = 0.5; double x2 = 120.5; double y1 = -3.; double y2 = 1.; TH1D *h0 = new TH1D("h0","",1, x1, x2); h0->SetMinimum(y1); h0->SetMaximum(y2); h0->GetXaxis()->SetNdivisions(208); h0->GetXaxis()->CenterTitle(); h0->GetXaxis()->SetTitle("Tray #"); h0->GetXaxis()->SetTitleOffset(1.0); h0->GetXaxis()->SetTitleSize(0.07); h0->GetXaxis()->SetLabelOffset(0.01); h0->GetXaxis()->SetLabelSize(0.05); h0->GetXaxis()->SetLabelFont(42); h0->GetXaxis()->SetTitleFont(42); h0->GetYaxis()->SetNdivisions(210); h0->GetYaxis()->SetTitle("zLocal Offset"); h0->GetYaxis()->SetTitleOffset(1.0); h0->GetYaxis()->SetTitleSize(0.07); h0->GetYaxis()->SetLabelOffset(0.01); h0->GetYaxis()->SetLabelSize(0.045); h0->GetYaxis()->SetLabelFont(42); h0->GetYaxis()->SetTitleFont(42); h0->Draw(); TLine *l1 = new TLine(x1,y1,x2,y1); l1->SetLineWidth(3); l1->Draw("same"); TLine *l2 = new TLine(x1,y2,x2,y2); l2->SetLineWidth(3); l2->Draw("same"); TLine *l3 = new TLine(x1,y1,x1,y2); l3->SetLineWidth(3); l3->Draw("same"); TLine *l4 = new TLine(x2,y1,x2,y2); l4->SetLineWidth(3); l4->Draw("same"); TGraphErrors *gr = new TGraphErrors(N, t, z00, 0, ze0); gr->SetMarkerStyle(20); gr->SetMarkerSize(1.5); gr->SetLineWidth(2); gr->Draw("p"); TGraphErrors *gr = new TGraphErrors(N, t, z0F, 0, zeF); gr->SetMarkerStyle(24); gr->SetMarkerSize(1.5); gr->SetLineWidth(2); gr->Draw("p"); c1->Update(); ps->NewPage(); gStyle->SetOptStat(0); gStyle->SetOptFit(0); gStyle->SetEndErrorSize(0.01); TCanvas *c1 = new TCanvas("c1","c1",0,0,800,600); c1->SetFillColor(10); c1->SetBorderMode(0); c1->SetBorderSize(2); c1->SetLeftMargin(0.14); c1->SetBottomMargin(0.15); c1->SetTopMargin(0.02); c1->SetRightMargin(0.04); c1->Draw(); double x1 = 0.5; double x2 = 120.5; double y1 = -2.; double y2 = 3.; TH1D *h0 = new TH1D("h0","",1, x1, x2); h0->SetMinimum(y1); h0->SetMaximum(y2); h0->GetXaxis()->SetNdivisions(208); h0->GetXaxis()->CenterTitle(); h0->GetXaxis()->SetTitle("Tray #"); h0->GetXaxis()->SetTitleOffset(1.0); h0->GetXaxis()->SetTitleSize(0.07); h0->GetXaxis()->SetLabelOffset(0.01); h0->GetXaxis()->SetLabelSize(0.05); h0->GetXaxis()->SetLabelFont(42); h0->GetXaxis()->SetTitleFont(42); h0->GetYaxis()->SetNdivisions(210); h0->GetYaxis()->SetTitle("xLocal Offset"); h0->GetYaxis()->SetTitleOffset(1.0); h0->GetYaxis()->SetTitleSize(0.07); h0->GetYaxis()->SetLabelOffset(0.01); h0->GetYaxis()->SetLabelSize(0.045); h0->GetYaxis()->SetLabelFont(42); h0->GetYaxis()->SetTitleFont(42); h0->Draw(); TLine *l1 = new TLine(x1,y1,x2,y1); l1->SetLineWidth(3); l1->Draw("same"); TLine *l2 = new TLine(x1,y2,x2,y2); l2->SetLineWidth(3); l2->Draw("same"); TLine *l3 = new TLine(x1,y1,x1,y2); l3->SetLineWidth(3); l3->Draw("same"); TLine *l4 = new TLine(x2,y1,x2,y2); l4->SetLineWidth(3); l4->Draw("same"); TGraphErrors *gr = new TGraphErrors(N, t, x0, 0, xe); gr->SetMarkerStyle(20); gr->SetMarkerSize(1.5); gr->SetLineWidth(2); gr->Draw("p"); c1->Update(); ps->Close(); ofstream outData; outData.open("xOffset.dat"); for(int i=0;i<N;i++) { outData << setw(15) << z00[i] << setw(15) << ze0[i] << setw(15) << x0[i] << setw(15) << xe[i] << endl; } outData.close(); TFile *fout = new TFile("xFitPar.root","recreate"); hPar2->Write(); hPar3->Write(); fout->Close(); }