void drawPtEta(char *inf){ TFile a(inf); a.cd("ana"); TProfile *h = new TProfile("h","",100,-3,3); TCanvas *c = new TCanvas("c","",400,400); hi->Draw("(pt):eta>>h","evtType!=92&&evtType!=93&&(abs(eta)<2.4&&chg!=0&&abs(pdg)!=11&&abs(pdg)!=13)","prof",10000); double nevt = hi->GetEntries("evtType!=92&&evtType!=93"); h->Sumw2(); //h->Scale(2./nevt); h->SetXTitle("#eta"); h->SetYTitle("Average P_{T}"); h->Draw(); c->SaveAs(Form("%s-PtEta-2.4.gif",inf)); c->SaveAs(Form("%s-PtEta-2.4.C",inf)); }
void fitBjetJES(int ppPbPb=1, int cbinlo=12, int cbinhi=40){ if(!ppPbPb){ cbinlo=0; cbinhi=40; } gStyle->SetOptTitle(0); gStyle->SetOptStat(0); TFile *fL; if(!ppPbPb)fL=new TFile("histos/ppMC_hiReco_jetTrig_highPurity_JEC.root"); else fL=new TFile("histos/PbPbQCDMC_pt30by3_ipHICalibCentWeight.root"); // these are dummy files for pp TFile *fB=new TFile("histos/PbPbBMC_pt30by3_ipHICalibCentWeight.root"); TFile *fC=new TFile("histos/PbPbCMC_pt30by3_ipHICalibCentWeight.root"); TNtuple *tL = (TNtuple*) fL->Get("nt"); TNtuple *tB = (TNtuple*) fB->Get("nt"); TNtuple *tC = (TNtuple*) fC->Get("nt"); float jtptL, refptL, jtetaL, weightL, refparton_flavorForBL, binL; tL->SetBranchAddress("jtpt",&jtptL); tL->SetBranchAddress("jteta",&jtetaL); tL->SetBranchAddress("refpt",&refptL); tL->SetBranchAddress("weight",&weightL); if(ppPbPb)tL->SetBranchAddress("bin",&binL); tL->SetBranchAddress("refparton_flavorForB",&refparton_flavorForBL); float jtptB, refptB, jtetaB, weightB, refparton_flavorForBB, binB; tB->SetBranchAddress("jtpt",&jtptB); tB->SetBranchAddress("jteta",&jtetaB); tB->SetBranchAddress("refpt",&refptB); tB->SetBranchAddress("weight",&weightB); if(ppPbPb)tB->SetBranchAddress("bin",&binB); tB->SetBranchAddress("refparton_flavorForB",&refparton_flavorForBB); float jtptC, refptC, jtetaC, weightC, refparton_flavorForBC, binC; tC->SetBranchAddress("jtpt",&jtptC); tC->SetBranchAddress("jteta",&jtetaC); tC->SetBranchAddress("refpt",&refptC); tC->SetBranchAddress("weight",&weightC); if(ppPbPb)tC->SetBranchAddress("bin",&binC); tC->SetBranchAddress("refparton_flavorForB",&refparton_flavorForBC); TProfile *hL = new TProfile("hL","hL",250,50,300,0,10); TProfile *hB = new TProfile("hB","hB",250,50,300,0,10); TProfile *hC = new TProfile("hC","hC",250,50,300,0,10); hL->Sumw2(),hB->Sumw2(),hC->Sumw2(); for(int i=0;i<tL->GetEntries();i++){ tL->GetEntry(i); if(!ppPbPb) binL=39; if(fabs(jtetaL)<2 && binL>=cbinlo && binL<cbinhi) hL->Fill(refptL,jtptL/refptL,weightL); if(!ppPbPb){ if(fabs(jtetaL)<2 && binL>=cbinlo && binL<cbinhi && abs(refparton_flavorForBL)==5) hB->Fill(refptL,jtptL/refptL,weightL); if(fabs(jtetaL)<2 && binL>=cbinlo && binL<cbinhi && abs(refparton_flavorForBL)==4) hC->Fill(refptL,jtptL/refptL,weightL); } } if(ppPbPb){ for(int i=0;i<tB->GetEntries();i++){ tB->GetEntry(i); if(fabs(jtetaB)<2 && binB>=cbinlo && binB<cbinhi && abs(refparton_flavorForBB)==5) hB->Fill(refptB,jtptB/refptB,weightB); } for(int i=0;i<tC->GetEntries();i++){ tC->GetEntry(i); if(fabs(jtetaC)<2 && binC>=cbinlo && binC<cbinhi && abs(refparton_flavorForBC)==4) hC->Fill(refptC,jtptC/refptC,weightC); } } hL->SetMinimum(0.); hL->SetLineColor(kBlue); hB->SetLineColor(kRed); hC->SetLineColor(kGreen); hL->SetMarkerColor(kBlue); hB->SetMarkerColor(kRed); hC->SetMarkerColor(kGreen); //hL->SetMarkerStyle(4); //hB->SetMarkerStyle(4); //hC->SetMarkerStyle(4); hL->SetXTitle("genJet p_{T} (GeV/c)"); hL->SetYTitle("<reco p_{T} / gen p_{T} >"); hL->GetXaxis()->SetRangeUser(50.,199.999); hL->GetYaxis()->SetRangeUser(0.5,1.05); TCanvas *c1=new TCanvas("c1","c1",800,600); c1->SetGridx(1); c1->SetGridy(1); hL->Draw("e1"); hB->Draw("e1,same"); hC->Draw("e1,same"); TLegend *leg=new TLegend(0.4,0.15,0.9,0.45); leg->SetBorderSize(0); leg->SetFillStyle(0); if(ppPbPb&&cbinlo==0&&cbinhi==40)leg->SetHeader("Pythia+Hydjet, 0-100%"); leg->AddEntry(hL,"Inclusive jets","pl"); leg->AddEntry(hC,"c-jets","pl"); leg->AddEntry(hB,"b-jets","pl"); leg->Draw(); TCanvas *c2=new TCanvas("c2","c2",1); /* TH1F *hL2 = (TH1F*)hL->Clone("hL2"); TH1F *hB2 = (TH1F*)hB->Clone("hB2"); hL2->Add(hB2,-1); hL2->Draw(); */ TH1F *hcorr = new TH1F("hcorr","hcorr",250,50,300); hcorr->Sumw2(); for(int i=0;i<hL->GetNbinsX();i++){ cout<<" b resp "<<hB->GetBinContent(i+1)<<endl; cout<<" l resp "<<hL->GetBinContent(i+1)<<endl; cout<<" l offset "<<1.-hL->GetBinContent(i+1)<<endl; cout<<" corrected b resp "<<hB->GetBinContent(i+1)+1.-hL->GetBinContent(i+1)<<endl; float jesOffset = 1.-hL->GetBinContent(i+1); hcorr->SetBinContent(i+1,hB->GetBinContent(i+1)+jesOffset); hcorr->SetBinError(i+1,sqrt(hB->GetBinError(i+1)*hB->GetBinError(i+1)+hL->GetBinError(i+1)*hL->GetBinError(i+1))); } hcorr->SetMinimum(0.5); hcorr->SetMaximum(1.1); hcorr->SetLineColor(kRed); hcorr->SetMarkerColor(kRed); hcorr->SetMarkerStyle(4); hcorr->Draw(); TF1 *fCorr = new TF1("fCorr","[0]+[1]*log(x)+[2]*log(x)*log(x)",50,300); fCorr->SetLineWidth(1); fCorr->SetLineColor(kBlue); hcorr->Fit(fCorr); TFile *fout; if(ppPbPb) fout =new TFile(Form("bJEShistos/bJetScale_PbPb_Cent_fineBin_%d_%d.root",cbinlo,cbinhi),"recreate"); else fout =new TFile("bJEShistos/bJetScale_PP_fineBin.root","recreate"); hcorr->Write(); fCorr->Write(); fout->Close(); }
void calibrateEM() { // FIXME: There are two possibilities to execute the script: // i) root run_hadron_g4.C // root[] .L calibrateEM.C // root[] calibrateEM() // or ii) Include the basics from run_hadron_g4.C here and // execute simply: // root calibrateEM.C // Load basic libraries // Load basic libraries gROOT->LoadMacro("/opt/geant4_vmc.2.15a/examples/macro/basiclibs.C"); basiclibs(); // Load Geant4 libraries gROOT->LoadMacro("/opt/geant4_vmc.2.15a/examples/macro/g4libs.C"); g4libs(); // Load the tutorial application library gSystem->Load("libTutorialApplication"); // MC application TutorialApplication* app = new TutorialApplication("TutorialApplication", "Tutorial Application for HEP Lecture @EKP"); // configure Geant4 gROOT->LoadMacro("g4Config.C"); Config(); // instantiate graphical user interface for tutorial application new TutorialMainFrame(app); //FIXME: Load "CountChargedinScint.C" gROOT->ProcessLine(".L CountChargedinScint.C"); //FIXME: Initialize the geometry app->InitMC("geometry/calor(1,0.2)"); //FIXME: Set the primary particle to photon app->SetPrimaryPDG(22); // Profile histogram - will show us the mean numbers of counts in bins of the energy. // The given binning refers to the energy, the other binning will be inferred automatically. TProfile* hcounts = new TProfile("hcounts","Counts per particle energy", 10,0,10); hcounts->SetXTitle("energy [GeV]"); hcounts->SetYTitle("mean number of counts"); // FIXME loop over different particle momenta, and for each momentum simulate several events (e.g. 10) for(Int_t i = 0 ; i < 10 ; ++i) { for(Int_t k = 0 ; k < 10; k ++) { //FIXME: Set the momentum of the primary particle to p Double_t p = i; app->SetPrimaryMomentum(p); //FIXME: Run the simulation app->RunMC(); //FIXME: Fill both the momentum and the output from CountChargedinScint // into the profile histogram hcounts Double_t x = CountChargedinScint(); hcounts->Fill(p,x); } } TCanvas* c = new TCanvas(); c->cd(); hcounts->Draw(); TF1 *fitter = new TF1("fitf","[0]*x", 0,10); fitter->SetParameter(0,1.0); fitter->SetParNames("calibration factor"); //FIXME: Fit the histogram to get the calibration factor hcounts->Fit("fitf"); }
void balanceMetVsAj(TString infname = "dj_HCPR-J50U-hiGoodMergedTracks_OfficialSelv2_Final0_120_50.root",TCut myCut = "cent<30", char *title = "",bool drawLegend = false) { TFile *inf = new TFile(infname); TTree *t = (TTree*)inf->Get("ntjt"); const int nBin = 3; double bins[nBin+1] = {0.5,4,8,1000}; double colors[nBin] = {kOrange-8,kBlue-3,kRed}; // Selection cut TCut evtCut = "nljet>100&&abs(nljetacorr)<2&&aljet>50&&abs(aljetacorr)<2&&jdphi>2./3*TMath::Pi()&&!maskEvt"; cout << "Sel evt: " << t->GetEntries(evtCut&&myCut) << endl; TProfile *p[nBin]; for (int i=0;i<nBin;i++) { p[i] = new TProfile(Form("p%d",i),"",5,0.0001,0.49999); t->Project(Form("p%d",i),Form("-1*metxMerged%d:Aj",i), "1"*(evtCut&&myCut)); p[i]->SetLineColor(colors[i]); p[i]->SetMarkerColor(colors[i]); } TProfile *pall = new TProfile("pall","",5,0.0001,0.49999); pall->SetXTitle("A_{J}"); pall->SetYTitle("<#slash{p}_{T}^{#parallel}> (GeV/c)"); pall->GetXaxis()->CenterTitle(); pall->GetYaxis()->CenterTitle(); pall->SetNdivisions(505); t->Project("pall","-1*metx:Aj", "1"*(evtCut&&myCut)); pall->SetAxisRange(-50,50,"Y"); pall->SetMarkerSize(1); pall->Draw("E"); for (int i=0;i<nBin;++i) { p[i]->SetLineWidth(3); p[i]->Draw("e hist same"); } pall->Draw("E same"); // Legend TLegend *leg = new TLegend(0.10,0.68,0.70,0.96); leg->SetFillStyle(0); leg->SetBorderSize(0); leg->SetTextFont(63); leg->SetTextSize(16); leg->AddEntry(pall,Form("> %.1f GeV/c",bins[0]),"pl"); for (int i=0;i<nBin;++i) { if (i!=nBin-1){ leg->AddEntry(p[i],Form("%.1f - %.1f GeV/c",bins[i],bins[i+1]),"l"); } else { leg->AddEntry(p[i],Form("> %.1f GeV/c",bins[i]),"l"); } } if (drawLegend) leg->Draw(); TLine * l0 = new TLine(0,0,0.5,0); l0->SetLineStyle(2); l0->Draw(); TText *titleText = new TText(0.3,30,title); titleText->Draw(); }
void makePlot(char* canv) { t->SetBranchAddress("LM_PX1", &intree.LM_PX1); t->SetBranchAddress("LM_PX2", &intree.LM_PX2); t->SetBranchAddress("LM_PY1", &intree.LM_PY1); t->SetBranchAddress("LM_PY2", &intree.LM_PY2); t->SetBranchAddress("LM_P2_Integral", &intree.LM_P2_Integral); t->SetBranchAddress("time", &intree.timeline); t->Print(); if(entries<=0) entries = t->GetEntries(); char title[100]=0; sprintf(title,"%s runs 1100-1107",canv); TProfile *prof = new TProfile(title,title,24,0,entries); TProfile *prof1 = new TProfile(title,title,24,0,entries); TProfile *prof2 = new TProfile(title,title,24,0,entries); /************************************** * read entries ************************************** */ Double_t *ratio = new Double_t[entries]; Double_t *parmean = new Double_t[entries]; Double_t *p1 = new Double_t[entries]; Double_t *p2 = new Double_t[entries]; for (int j = 0; j < entries; ++j){ gSystem->Sleep (sleep); t->GetEntry(j); ratio[j] = intree.LM_PY1/intree.LM_PY2; p1[j] = intree.LM_PY1; p2[j] = intree.LM_PY2; //cout<<"entry "<<j<<" peak2 "<<intree.LM_PY2<<endl; } Double_t mean = TMath::Mean(entries,ratio); Double_t mean1 = TMath::Mean(entries,p1); Double_t mean2 = TMath::Mean(entries,p2); for (int j = 0; j < entries; ++j){ prof->Fill(j,(ratio[j]/mean-1)*100); prof1->Fill(j,(p1[j]/mean1-1)*100); prof2->Fill(j,(p2[j]/mean2-1)*100); } TCanvas *c1 = new TCanvas(canv,"frascatirun",900,700); c1->cd(); char axisXname[100]; sprintf(axisXname,"Time (Entries) (total: %i)",entries); prof->SetXTitle(axisXname); prof->SetYTitle("Variation (%)"); prof->SetMaximum(1); prof->SetMinimum(-1); prof->SetMarkerColor(4); prof->SetMarkerSize(1); prof->SetMarkerStyle(8); prof->SetStats(kFALSE); prof->Draw(); prof1->SetMarkerColor(5); prof1->SetMarkerSize(1); prof1->SetMarkerStyle(6); prof1->Draw("same"); prof2->SetMarkerColor(1); prof2->SetMarkerSize(1); prof2->SetMarkerStyle(7); prof2->Draw("same"); /* TLegend leg = new TLegend(0.1,0.7,0.48,0.9); leg->SetHeader("The Legend Title"); leg->AddEntry(h1,"Histogram filled with random numbers","f"); leg->AddEntry("f1","Function abs(#frac{sin(x)}{x})","l"); leg->AddEntry("gr","Graph with error bars","lep"); leg->Draw("same"); */ }
void plotMETVsJetPhi(int num=-1) { char *title=""; if (num!=-1) { title = Form("%d",num); } TFile *inf = new TFile("nt_dj_mix100_Gen.root"); TTree *tGen = (TTree*) inf->FindObjectAny("ntjt"); tGen->SetName("gen"); TFile *inf2 = new TFile("nt_dj_mix100.root"); TTree *tReco = (TTree*) inf2->FindObjectAny("ntjt"); tReco->SetName("reco"); TFile *inf3 = new TFile("nt_dj_HyUQ80v4_djcalo_genp_100_50.root"); TTree *tGen2 = (TTree*) inf3->FindObjectAny("ntjt"); tGen2->SetName("gen2"); TFile *inf4 = new TFile("dj_HyUQ80v4_djcalo_genp_100_50.root"); TTree *tDj = (TTree*) inf4->FindObjectAny("djTree"); tDj->SetName("dj"); TFile *inf5 = new TFile("nt_dj_data100_cor.root"); TTree *tRecoData = (TTree*) inf5->FindObjectAny("ntjt"); tRecoData->SetName("data"); TFile *inf6 = new TFile("dj_HCPR-J50U-hiGoodMergedTracks_OfficialSelv2_Final0_djcalo_100_50.root"); TTree *tDjData = (TTree*) inf6->FindObjectAny("djTree"); tDjData->SetName("djdata"); tGen->AddFriend(tReco); tGen->AddFriend(tGen2); tGen->AddFriend(tDj); tRecoData->AddFriend(tDjData); setupAlias(tGen); setupAlias(tReco); const int nBin = 10; double delta = 0.0; //shift // double Bins[nBin+1] = {0,1,2,2.2,2.4,2.6,2.8,3,PI}; // double BinsMC[nBin+1] = {0+delta,1+delta,2+delta,2.2+delta,2.4+delta,2.6+delta,2.8+delta,3+delta,PI+delta}; double Bins[nBin+1]; double BinsMC[nBin+1]; for (int i=0;i<nBin+1;i++) { Bins[i]=-PI+2*PI/(double)nBin*i; BinsMC[i]=-PI+2*PI/(double)nBin*i+delta; cout <<Bins[i]<<endl; } const int nPtBin = 6; double ptBins[nPtBin+1] = {0.5,1.0,1.5,4,8,20,1000}; TCanvas *c = new TCanvas("c","",600,600); TProfile *p = new TProfile("p","",nBin,BinsMC); TProfile *p2 = new TProfile("p2","",nBin,BinsMC); TProfile *p3 = new TProfile("p3","",nBin,BinsMC); TProfile *p4 = new TProfile("p4","",nBin,Bins); TCut evtCut = "nljet>120&&abs(nljetacorr)<1.6&&aljet>50&&abs(aljetacorr)<1.6&&!maskEvt&¢<30&&abs(jdphi)>2./3.*3.14159"; tGen->Draw(Form("-gen.metOutOfConex%s:nljphi+0.0>>p",title),"weight"*evtCut); tGen->Draw(Form("-gen2.metOutOfConex%s:nljphi+0.0>>p2",title),"weight"*evtCut); tGen->Draw(Form("-reco.metOutOfConex%s:nljphi+0.0>>p3",title),"weight"*evtCut); tRecoData->Draw(Form("-metOutOfConex%s:nljphi>>p4",title),"1"*evtCut); p->SetMarkerStyle(24); p2->SetMarkerStyle(25); p3->SetMarkerStyle(26); p4->SetMarkerStyle(20); p->SetAxisRange(-80,120,"Y"); p->Draw(); p2->SetMarkerColor(2); p2->SetLineColor(2); p3->SetMarkerColor(4); p3->SetLineColor(4); p2->Draw("same"); p3->Draw("same"); p4->Draw("same"); TLine *l = new TLine(Bins[0],0,PI,0); l->Draw(); p->SetXTitle("#phi_{Leading Jet}"); p->SetYTitle("<#slash{p}_{T}^{#parallel}> (GeV/c)"); // ==================== TLegend *leg = new TLegend(0.45,0.68,0.92,0.9); leg->SetFillStyle(0); leg->SetBorderSize(0); leg->SetTextFont(63); leg->SetTextSize(16); leg->AddEntry("p","Jets with |#eta|<1.6",""); if (num!=-1) { leg->AddEntry("p",Form("Tracks with %.1f<p_{T}<%.1f GeV/c",ptBins[num],ptBins[num+1]),""); } else { leg->AddEntry("p",Form("Tracks with %.1f<p_{T}<%.1f GeV/c",ptBins[0],ptBins[nPtBin]),""); } leg->AddEntry("p","#slash{p}_{T}^{#parallel} PYTHIA+HYDJET GEN Signal","pl"); leg->AddEntry("p2","#slash{p}_{T}^{#parallel} PYTHIA+HYDJET GEN S+B","pl"); leg->AddEntry("p3","#slash{p}_{T}^{#parallel} PYTHIA+HYDJET RECO","pl"); leg->AddEntry("p4","#slash{p}_{T}^{#parallel} Data RECO","pl"); leg->Draw(); c->SaveAs(Form("metOutOfCone%sVsJetPhi.gif",title)); c->SaveAs(Form("metOutOfCone%sVsJetPhi.eps",title)); }
//This macro is used to study (and calibrate) the radial dependence of the light signal. Tracks that originate at the center of the TPC are brighter than those on the side and this needs to be accounted for in energy reconstruction. void DCTPCTree::Loop() { TStopwatch timer; gROOT->SetStyle("Plain"); gStyle->SetEndErrorSize(3); gStyle->SetPalette(1,0); gStyle->SetLineWidth(2); gStyle->SetHistLineWidth(2); gStyle->SetOptStat(kFALSE); gStyle->SetOptFit(kTRUE); TH1::AddDirectory(false); TFile *outtree = new TFile("$BigDCTPC_calibration_input"); TTree *dctreepc = (TTree*)outtree->Get("dctpc_eventinfo"); DCTPCTree aStep(dctreepc); TH2D *hist_radialE=new TH2D("","",30,0,600,30,0,2.); TH2D *hist_energy=new TH2D("E", "E", 100, 0, 1000, 100, 0, 1000); TH2D *hist_energy2=new TH2D("E", "E", 100, 0, 1000, 100, 0, 1000); double recalibmesh = 1.; double recalibCCD = 1.; double recalibanode = 1.; double rstart=0.; double rend=0.; Long64_t nentries = dctreepc->GetEntries(); cout << "Number of Entries: " << nentries << endl; for (int event = 0; event<nentries; event++) { aStep.GetEntry(event); if(event%10000==0) cout<<((double)event/(double)nentries)*100.<<"%"<<endl; double rr=(pow(aStep.Track_x_pix,2)+pow(aStep.Track_y_pix,2))*pow(MMPERPIXEL/10.,2); //these cuts are meant to isolate short, fully contained tracks not originating from the rings. We want short tracks so that the radial position is well defined. if ( aStep.Edge==0 && aStep.Ntrig <=2 && TMath::Abs((aStep.Etrig_kev-aStep.Etrack_kev)/(aStep.Etrig_kev+aStep.Etrack_kev))<0.4 && TMath::Abs((aStep.Etrig_kev-aStep.Emesh_kev)/(aStep.Etrig_kev+aStep.Emesh_kev))<0.1 && aStep.Track_range_pix<80. ) { hist_radialE->Fill(rr,(aStep.Etrack_kev)/(aStep.Etrig_kev)); hist_energy->Fill(aStep.Etrack_kev,aStep.Etrig_kev); hist_energy2->Fill(aStep.Etrig_kev,aStep.Emesh_kev); } } new TCanvas; hist_radialE->SetXTitle("radius (pixels)"); hist_radialE->SetYTitle("E_{CCD}/E_{anode}"); hist_radialE->Draw("COLZ"); TProfile *prof = hist_radialE->ProfileX(); new TCanvas; prof->SetYTitle("E_{CCD}/E_{anode}"); prof->Draw(); //perform a simple fit that can be used for calibrating energy as a function fo radius TF1 *f1 = new TF1("f1","[0]/([1] +x)^[2]",0,440); prof->Fit("f1","R"); cout<<"Param 0: "<<f1->GetParameter(0)<<endl; cout<<"Param 1: "<<f1->GetParameter(1)<<endl; cout<<"Param 2: "<<f1->GetParameter(2)<<endl; //6.23665/pow(141.035+r,0.360402); TF1 *f2 = new TF1("f2","7.56874/(146.405+x)^0.388667",0,440); f2->Draw("SAME"); new TCanvas; hist_energy->Draw("COLZ"); new TCanvas; hist_energy2->Draw("COLZ"); }