// ============================================================================ StatusCode Gaudi::Utils::Histos::fromXml ( TH2F& result , const std::string& input ) { // result.Reset() ; // RESET old histogram // _Xml<TH2F> _xml ; std::auto_ptr<TH2F> histo = _xml ( input ) ; if ( 0 == histo.get() ) { return StatusCode::FAILURE ; } // RETURN // result.Reset() ; histo->Copy ( result ) ; // return StatusCode::SUCCESS ; }
RooHistPdf *nllToL(TH2F* hist){ TH2F *h = (TH2F*) hist->Clone(TString(hist->GetName())+"_L"); h->Reset(); Double_t min=1e20, max=0; for(Int_t iBinX=1; iBinX <= hist->GetNbinsX(); iBinX++){ for(Int_t iBinY=1; iBinY <= hist->GetNbinsY(); iBinY++){ Double_t binContent=hist->GetBinContent(iBinX, iBinY); if(min>binContent && binContent!=0) min=binContent; if(max<binContent) max=binContent; } } for(Int_t iBinX=1; iBinX <= hist->GetNbinsX(); iBinX++){ for(Int_t iBinY=1; iBinY <= hist->GetNbinsY(); iBinY++){ Double_t binContent=hist->GetBinContent(iBinX, iBinY); Double_t b = binContent <= 0 ? 0 : exp(-binContent+min+50); if(binContent != 0 && binContent-min<100) std::cout << iBinX << "\t" << iBinY << "\t" << binContent << "\t" << -binContent+min << "\t" << b << std::endl; //h->Fill(hist->GetXaxis()->GetBinLowEdge(iBinX), hist->GetYaxis()->GetBinLowEdge(iBinY),b); h->SetBinContent(iBinX, iBinY,b); } } RooRealVar *var1 = new RooRealVar("constTerm","",0.1); RooRealVar *var2 = new RooRealVar("alpha","",0.1); RooDataHist *dataHist = new RooDataHist(TString(hist->GetName())+"_dataHist",hist->GetTitle(), RooArgSet(*var1,*var2), h); RooHistPdf *histPdf = new RooHistPdf(TString(hist->GetName())+"_histPdf",hist->GetTitle(), RooArgSet(*var1,*var2), *dataHist); //delete dataHist; return histPdf; }
void make(TDirectory & out, TObject * o) { TDirectory * dir; TH1F * th1f; TH1D * th1d; TH2F * th2f; TH2D * th2d; out.cd(); if((dir = dynamic_cast<TDirectory*>(o)) != 0) { TDirectory * outDir = out.mkdir(dir->GetName(), dir->GetTitle()); TIter next(dir->GetListOfKeys()); TKey *key; while( (key = dynamic_cast<TKey*>(next())) ) { string className(key->GetClassName()); string name(key->GetName()); TObject * obj = dir->Get(name.c_str()); if(obj == 0) { cerr <<"error: key " << name << " not found in directory " << dir->GetName() << endl; exit(-1); } make(*outDir, obj); } } else if((th1f = dynamic_cast<TH1F*>(o)) != 0) { TH1F *h = (TH1F*) th1f->Clone(); h->Reset(); h->Sumw2(); h->SetDirectory(&out); } else if((th1d = dynamic_cast<TH1D*>(o)) != 0) { TH1D *h = (TH1D*) th1d->Clone(); h->Reset(); h->Sumw2(); h->SetDirectory(&out); } else if((th2f = dynamic_cast<TH2F*>(o)) != 0) { TH2F *h = (TH2F*) th2f->Clone(); h->Reset(); h->Sumw2(); h->SetDirectory(&out); } else if((th2d = dynamic_cast<TH2D*>(o)) != 0) { TH2D *h = (TH2D*) th2d->Clone(); h->Reset(); h->Sumw2(); h->SetDirectory(&out); } }
// Method by pointer TH2F* eff2(TH2F* h1, TH2F* h2, const char* name="eff"){ // first, verify that all histograms have same binning // nx is the number of visible bins // nxtot = nx+2 includes underflow and overflow Int_t nx = h1->GetNbinsX(); if (h2->GetNbinsX() != nx) { cout << "Histograms must have same number of bins" << endl; return 0; } // get the new histogram TH2F* temp = (TH2F*) h1->Clone(name); temp->SetTitle(name); temp->Reset(); temp->Sumw2(); // Do the calculation temp->Divide(h2,h1,1.,1.,"B"); // Done return temp; }
void combinePlots(char* sample = "T2tt" , int x = 1, bool print = false){ bool shift = true; bool smooth = false; char* filename = ""; char* outfilename = ""; char* label = ""; float xaxismin = 0; float yaxismax = 250.0; if( TString(sample).Contains("T2tt") ){ label = "pp #rightarrow #tilde{t} #tilde{t}, #tilde{t} #rightarrow t #chi_{1}^{0}"; outfilename = "combinePlots_T2tt.root"; xaxismin = 200.0; yaxismax = 250.0; filename = "T2tt_histos_trigweight.root"; } else if( TString(sample).Contains("T2bw") ){ label = "pp #rightarrow #tilde{t} #tilde{t}, #tilde{t} #rightarrow b #chi_{1}^{#pm} #rightarrow b W #chi_{1}^{0}"; if( x==25 ){ xaxismin = 360.0; outfilename = "combinePlots_T2bw_x25.root"; filename = "T2bw_x25_histos.root"; } if( x==50 ){ xaxismin = 180.0; outfilename = "combinePlots_T2bw_x75.root"; filename = "T2bw_x50_histos.root"; } if( x==75 ){ xaxismin = 120.0; outfilename = "combinePlots_T2bw_x75.root"; filename = "T2bw_x75_histos.root"; smooth = true; } } else{ cout << "ERROR! unrecognized sample " << sample << endl; exit(0); } cout << "--------------------------------------" << endl; cout << "Opening " << filename << endl; cout << "Writing to " << outfilename << endl; cout << "Label " << label << endl; cout << "--------------------------------------" << endl; TFile *file = TFile::Open(filename); const unsigned int ncuts = 7; TH2F* hxsec[ncuts]; TH2F* hxsec_exp[ncuts]; TH2F* hxsec_expp1[ncuts]; TH2F* hxsec_expm1[ncuts]; TH2F* hxsec_best; TH2F* hbest; TH2F* hxsec_best_exp; TH2F* hxsec_best_expp1; TH2F* hxsec_best_expm1; for( unsigned int i = 0 ; i < ncuts ; ++i ){ hxsec[i] = (TH2F*) file->Get(Form("hxsec_%i",i)); hxsec_exp[i] = (TH2F*) file->Get(Form("hxsec_exp_%i",i)); hxsec_expp1[i] = (TH2F*) file->Get(Form("hxsec_expp1_%i",i)); hxsec_expm1[i] = (TH2F*) file->Get(Form("hxsec_expm1_%i",i)); if( i == 0 ){ hxsec_best = (TH2F*) hxsec[i]->Clone("hxsec_best"); hxsec_best->Reset(); hbest = (TH2F*) hxsec[i]->Clone("hbest"); hbest->Reset(); hxsec_best_exp = (TH2F*) hxsec[i]->Clone("hxsec_best_exp"); hxsec_best_exp->Reset(); hxsec_best_expp1 = (TH2F*) hxsec[i]->Clone("hxsec_best_expp1"); hxsec_best_expp1->Reset(); hxsec_best_expm1 = (TH2F*) hxsec[i]->Clone("hxsec_best_expm1"); hxsec_best_expm1->Reset(); } } for( int xbin = 1 ; xbin <= hxsec_best->GetXaxis()->GetNbins() ; ++xbin ){ for( int ybin = 1 ; ybin <= hxsec_best->GetYaxis()->GetNbins() ; ++ybin ){ cout << "xbin ybin " << xbin << " " << ybin << endl; if( hxsec_exp[0]->GetBinContent(xbin,ybin) < 1e-10 ) continue; int best_ul = 0; float min_exp_ul = hxsec_exp[0]->GetBinContent(xbin,ybin); cout << "exp0 " << hxsec_exp[0]->GetBinContent(xbin,ybin) << endl; for( unsigned int i = 1 ; i < ncuts ; ++i ){ if( hxsec_exp[i]->GetBinContent(xbin,ybin) < 1e-10 ) continue; cout << "exp" << i << " " << hxsec_exp[i]->GetBinContent(xbin,ybin) << endl; if( hxsec_exp[i]->GetBinContent(xbin,ybin) < min_exp_ul ){ min_exp_ul = hxsec_exp[i]->GetBinContent(xbin,ybin); best_ul = i; } } hxsec_best->SetBinContent(xbin,ybin,hxsec[best_ul]->GetBinContent(xbin,ybin)); hxsec_best_exp->SetBinContent(xbin,ybin,hxsec_exp[best_ul]->GetBinContent(xbin,ybin)); hxsec_best_expp1->SetBinContent(xbin,ybin,hxsec_expp1[best_ul]->GetBinContent(xbin,ybin)); hxsec_best_expm1->SetBinContent(xbin,ybin,hxsec_expm1[best_ul]->GetBinContent(xbin,ybin)); hbest->SetBinContent(xbin,ybin,best_ul+1); cout << "best ul " << best_ul << " " << min_exp_ul << endl; cout << "obs limit " << hxsec[best_ul]->GetBinContent(xbin,ybin) << endl << endl << endl; } } TCanvas *can1 = new TCanvas("can1","",800,600); can1->cd(); TLatex *t = new TLatex(); t->SetNDC(); //------------------------------- // cross section limit //------------------------------- if( smooth ){ smoothHist( hxsec_best ); smoothHist( hbest ); } blankHist( hxsec_best , 200 ); TH2F* hxsec_best_shifted = shiftHist( hxsec_best ); TH2F* hdummy = (TH2F*) hxsec_best->Clone("hdummy"); hdummy->Reset(); //hxsec_best->Reset(); // if( shift ){ // hxsec_best = shiftHist( hxsec_best ); //} // cout << endl << "observed" << endl; // plot1D( hxsec_best ); // cout << endl << "observed (+1)" << endl; // plot1D( hxsec_best_obsp1 ); // cout << endl << "observed (-1)" << endl; // plot1D( hxsec_best_obsm1 ); // cout << endl << "expected" << endl; // plot1D( hxsec_best_exp ); // cout << endl << "expected (+1)" << endl; // plot1D( hxsec_best_expp1 ); // cout << endl << "expected (-1)" << endl; // plot1D( hxsec_best_expm1 ); gPad->SetTopMargin(0.1); gPad->SetRightMargin(0.2); gPad->SetLogz(); hdummy->GetXaxis()->SetLabelSize(0.035); hdummy->GetYaxis()->SetLabelSize(0.035); hdummy->GetZaxis()->SetLabelSize(0.035); hdummy->GetYaxis()->SetTitle("m_{#chi^{0}_{1}} [GeV]"); hdummy->GetYaxis()->SetTitleOffset(0.9); hdummy->GetXaxis()->SetTitle("m_{ #tilde{t}} [GeV]"); hdummy->GetZaxis()->SetTitle("95% CL UL on #sigma#timesBF [pb]"); hdummy->GetZaxis()->SetTitleOffset(0.8); hdummy->GetXaxis()->SetRangeUser(xaxismin,590); hdummy->GetYaxis()->SetRangeUser(0,yaxismax); //hdummy->Draw("colz"); hdummy->SetMinimum(0.01); hdummy->SetMaximum(10); hxsec_best_shifted->SetMinimum(0.01); hxsec_best_shifted->SetMaximum(10); hdummy->SetMaximum(10); hdummy->Draw(); hxsec_best_shifted->Draw("samecolz"); hdummy->Draw("axissame"); // TGraph* gr = getRefXsecGraph(hxsec_best , "T2tt", 1.0); // TGraph* gr_exp = getRefXsecGraph(hxsec_best_exp , "T2tt", 1.0); // TGraph* gr_expp1 = getRefXsecGraph(hxsec_best_expp1 , "T2tt", 1.0); // TGraph* gr_expm1 = getRefXsecGraph(hxsec_best_expm1 , "T2tt", 1.0); // TGraph* gr_obsp1 = getRefXsecGraph(hxsec_best , "T2tt", 1.15); // TGraph* gr_obsm1 = getRefXsecGraph(hxsec_best , "T2tt", 0.85); TGraph* gr = new TGraph(); TGraph* gr_exp = new TGraph(); TGraph* gr_expp1 = new TGraph(); TGraph* gr_expm1 = new TGraph(); TGraph* gr_obsp1 = new TGraph(); TGraph* gr_obsm1 = new TGraph(); if( TString(sample).Contains("T2tt") ){ gr = T2tt_observed(); gr_exp = T2tt_expected(); gr_expp1 = T2tt_expectedP1(); gr_expm1 = T2tt_expectedM1(); gr_obsp1 = T2tt_observedP1(); gr_obsm1 = T2tt_observedM1(); } else if( TString(sample).Contains("T2bw") && x==75 ){ gr = T2bw_x75_observed(); gr_exp = T2bw_x75_expected(); gr_expp1 = T2bw_x75_expectedP1(); gr_expm1 = T2bw_x75_expectedM1(); gr_obsp1 = T2bw_x75_observedP1(); gr_obsm1 = T2bw_x75_observedM1(); } else if( TString(sample).Contains("T2bw") && x==50 ){ gr = T2bw_x50_observed(); gr_exp = T2bw_x50_expected(); gr_expp1 = T2bw_x50_expectedP1(); gr_expm1 = T2bw_x50_expectedM1(); gr_obsp1 = T2bw_x50_observedP1(); gr_obsm1 = T2bw_x50_observedM1(); } gr->SetLineWidth(6); gr_exp->SetLineWidth(4); gr_exp->SetLineStyle(7); gr_expp1->SetLineWidth(3); gr_expp1->SetLineStyle(3); gr_expm1->SetLineWidth(3); gr_expm1->SetLineStyle(3); gr_exp->SetLineColor(4); gr_expp1->SetLineColor(4); gr_expm1->SetLineColor(4); gr_obsp1->SetLineStyle(2); gr_obsm1->SetLineStyle(2); gr_obsp1->SetLineWidth(3); gr_obsm1->SetLineWidth(3); gr_exp->Draw(); gr_expp1->Draw(); gr_expm1->Draw(); gr_obsp1->Draw(); gr_obsm1->Draw(); gr->Draw(); // cout << endl << "observed" << endl; // printGraph(gr); // cout << endl << "observed (+1)" << endl; // printGraph(gr_obsp1); // cout << endl << "observed (-1)" << endl; // printGraph(gr_obsm1); // cout << endl << "expected" << endl; // printGraph(gr_exp); // cout << endl << "expected (+1)" << endl; // printGraph(gr_expp1); // cout << endl << "expected (-1)" << endl; // printGraph(gr_expm1); // TLegend *leg = new TLegend(0.2,0.6,0.65,0.8); // leg->AddEntry(gr, "observed","l"); // leg->AddEntry(gr_exp, "median expected (#pm1#sigma)","l"); // //leg->AddEntry(gr_expp1, "expected (#pm1#sigma)","l"); // leg->SetFillColor(0); // leg->SetBorderSize(0); // leg->Draw(); /* t->SetTextSize(0.04); t->DrawLatex(0.20,0.72 ,"NLO-NLL exclusions"); t->DrawLatex(0.27,0.67,"Observed #pm1#sigma^{theory}"); t->DrawLatex(0.27,0.62,"Expected #pm1#sigma"); t->DrawLatex(0.19,0.84,label); t->DrawLatex(0.19,0.79,"unpolarized top quarks"); */ t->SetTextSize(0.035); t->DrawLatex(0.18,0.79,"50 / 50 t_{L} / t_{R} mixture"); t->DrawLatex(0.18,0.84,label); t->SetTextSize(0.04); t->DrawLatex(0.50,0.85 ,"NLO-NLL exclusions"); t->DrawLatex(0.55,0.80,"Observed #pm1#sigma^{theory}"); t->DrawLatex(0.55,0.75,"Expected #pm1#sigma"); t->SetTextSize(0.045); if( TString(sample).Contains("T2bw") && x==25 ) t->DrawLatex(0.15,0.04,"m_{#chi_{1}^{#pm}} = 0.25 m_{ #tilde{t}} + 0.75 m_{#chi_{1}^{0}}"); if( TString(sample).Contains("T2bw") && x==50 ) t->DrawLatex(0.15,0.04,"m_{#chi_{1}^{#pm}} = 0.5 m_{ #tilde{t}} + 0.5 m_{#chi_{1}^{0}}"); if( TString(sample).Contains("T2bw") && x==75 ) t->DrawLatex(0.15,0.04,"m_{#chi_{1}^{#pm}} = 0.75 m_{ #tilde{t}} + 0.25 m_{#chi_{1}^{0}}"); //float offset = 40.0; float xoffset = 405.0; float yoffset = 213.0; float length = 30.0; float yspace1 = 5; float yspace2 = 17; if( TString(sample).Contains("T2bw") && x==75 ) xoffset -= 30.0; // median expected //TLine *line22 = new TLine(xaxismin+xoffset+25, 310-yoffset, xaxismin+xoffset+65, 310-yoffset); TLine *line22 = new TLine(xoffset,yoffset,xoffset+length,yoffset); line22->SetLineWidth(4); line22->SetLineColor(4); line22->SetLineStyle(7); line22->Draw(); // expected +/-1sigma //TLine *line23 = new TLine(xaxismin+xoffset+25, 317-yoffset, xaxismin+xoffset+65, 317-yoffset); TLine *line23 = new TLine(xoffset,yoffset+yspace1,xoffset+length,yoffset+yspace1); line23->SetLineWidth(3); line23->SetLineColor(4); line23->SetLineStyle(3); line23->Draw(); // expected +/-1sigma //TLine *line24 = new TLine(xaxismin+xoffset+25, 303-yoffset, xaxismin+xoffset+65, 303-yoffset); TLine *line24 = new TLine(xoffset,yoffset-yspace1,xoffset+length,yoffset-yspace1); line24->SetLineWidth(3); line24->SetLineColor(4); line24->SetLineStyle(3); line24->Draw(); // median observed //TLine *line25 = new TLine(xaxismin+xoffset+25, 335-yoffset, xaxismin+xoffset+65, 335-yoffset); TLine *line25 = new TLine(xoffset,yoffset+yspace2,xoffset+length,yoffset+yspace2); line25->SetLineWidth(6); line25->SetLineColor(1); line25->SetLineStyle(1); line25->Draw(); //TLine *line26 = new TLine(xaxismin+xoffset+25, 342-yoffset, xaxismin+xoffset+65, 342-yoffset); TLine *line26 = new TLine(xoffset,yoffset+yspace1+yspace2,xoffset+length,yoffset+yspace1+yspace2); line26->SetLineWidth(2); line26->SetLineColor(1); line26->SetLineStyle(2); line26->Draw(); //TLine *line27 = new TLine(xaxismin+xoffset+25, 328-yoffset, xaxismin+xoffset+65, 328-yoffset); TLine *line27 = new TLine(xoffset,yoffset-yspace1+yspace2,xoffset+length,yoffset-yspace1+yspace2); line27->SetLineWidth(2); line27->SetLineColor(1); line27->SetLineStyle(2); line27->Draw(); t->SetTextSize(0.04); t->DrawLatex(0.18,0.94,"CMS Preliminary #sqrt{s} = 8 TeV, #scale[0.6]{#int}Ldt = 9.7 fb^{-1}"); /* //------------------------------- // best signal region //------------------------------- TCanvas *can2 = new TCanvas("can2","",600,600); can2->cd(); hbest->Draw("colz"); hbest->Draw("sametext"); gPad->SetTopMargin(0.1); gPad->SetRightMargin(0.2); hbest->SetMaximum(7); hbest->GetXaxis()->SetLabelSize(0.035); hbest->GetYaxis()->SetLabelSize(0.035); hbest->GetZaxis()->SetLabelSize(0.035); hbest->GetYaxis()->SetTitle("m_{#chi^{0}_{1}} [GeV]"); hbest->GetXaxis()->SetTitle("m_{ #tilde{t}} [GeV]"); hbest->GetXaxis()->SetRangeUser(xaxismin,590); hbest->GetYaxis()->SetRangeUser(0,400); hbest->GetZaxis()->SetTitle("best signal region"); t->SetTextSize(0.035); t->DrawLatex(0.18,0.92,"CMS Preliminary #sqrt{s} = 8 TeV, #scale[0.6]{#int}Ldt = 9.7 fb^{-1}"); t->SetTextSize(0.04); t->DrawLatex(0.19,0.83,label); t->DrawLatex(0.2,0.75,"1 = SRA"); t->DrawLatex(0.2,0.70,"2 = SRB"); t->DrawLatex(0.2,0.65,"3 = SRC"); t->DrawLatex(0.2,0.60,"4 = SRD"); t->DrawLatex(0.2,0.55,"5 = SRE"); t->DrawLatex(0.2,0.50,"6 = SRF"); t->DrawLatex(0.2,0.45,"7 = SRG"); if( TString(sample).Contains("T2bw") && x==25 ) t->DrawLatex(0.15,0.03,"m_{#chi_{1}^{#pm}} = 0.25 m_{ #tilde{t}} + 0.75 m_{#chi_{1}^{0}}"); if( TString(sample).Contains("T2bw") && x==50 ) t->DrawLatex(0.15,0.03,"m_{#chi_{1}^{#pm}} = 0.5 m_{ #tilde{t}} + 0.5 m_{#chi_{1}^{0}}"); if( TString(sample).Contains("T2bw") && x==75 ) t->DrawLatex(0.15,0.03,"m_{#chi_{1}^{#pm}} = 0.75 m_{ #tilde{t}} + 0.25 m_{#chi_{1}^{0}}"); //------------------------------- // excluded regions //------------------------------- int nbinsx = 120; float xmin = -5; float xmax = 1195; int nbinsy = 120; float ymin = -5; float ymax = 1195; TFile* f = TFile::Open("stop_xsec.root"); TH1F* refxsec = (TH1F*) f->Get("h_stop_xsec"); TH2F* hexcl = new TH2F("hexcl" , "hexcl" , nbinsx , xmin , xmax , nbinsy , ymin , ymax ); TH2F* hexcl_obsp1 = new TH2F("hexcl_obsp1" , "hexcl_obsp1" , nbinsx , xmin , xmax , nbinsy , ymin , ymax ); TH2F* hexcl_obsm1 = new TH2F("hexcl_obsm1" , "hexcl_obsm1" , nbinsx , xmin , xmax , nbinsy , ymin , ymax ); TH2F* hexcl_exp = new TH2F("hexcl_exp" , "hexcl_exp" , nbinsx , xmin , xmax , nbinsy , ymin , ymax ); TH2F* hexcl_expp1 = new TH2F("hexcl_expp1" , "hexcl_expp1" , nbinsx , xmin , xmax , nbinsy , ymin , ymax ); TH2F* hexcl_expm1 = new TH2F("hexcl_expm1" , "hexcl_expm1" , nbinsx , xmin , xmax , nbinsy , ymin , ymax ); for( unsigned int ibin = 1 ; ibin <= nbinsx ; ibin++ ){ for( unsigned int jbin = 1 ; jbin <= nbinsy ; jbin++ ){ //float mg = hxsec_best->GetXaxis()->GetBinCenter(ibin); float mg = hexcl->GetXaxis()->GetBinCenter(ibin); int bin = refxsec->FindBin(mg); float xsec = refxsec->GetBinContent(bin); float xsec_up = refxsec->GetBinContent(bin) + refxsec->GetBinError(bin); float xsec_dn = refxsec->GetBinContent(bin) - refxsec->GetBinError(bin); float xsecul = hxsec_best->GetBinContent(ibin,jbin); float xsecul_exp = hxsec_best_exp->GetBinContent(ibin,jbin); float xsecul_expp1 = hxsec_best_expp1->GetBinContent(ibin,jbin); float xsecul_expm1 = hxsec_best_expm1->GetBinContent(ibin,jbin); // cout << endl; // cout << "mg xsec " << mg << " " << xsec << endl; // cout << "xsec: obs exp expp1 expm1 " << xsecul << " " << xsecul_exp << " " << xsecul_expp1 << " " << xsecul_expm1 << endl; if( xsecul < 1.e-10 ) continue; hexcl->SetBinContent(ibin,jbin,0); if( xsec > xsecul ) hexcl->SetBinContent(ibin,jbin,1); hexcl_exp->SetBinContent(ibin,jbin,0); if( xsec > xsecul_exp ) hexcl_exp->SetBinContent(ibin,jbin,1); hexcl_expp1->SetBinContent(ibin,jbin,0); if( xsec > xsecul_expp1 ) hexcl_expp1->SetBinContent(ibin,jbin,1); hexcl_expm1->SetBinContent(ibin,jbin,0); if( xsec > xsecul_expm1 ) hexcl_expm1->SetBinContent(ibin,jbin,1); hexcl_obsp1->SetBinContent(ibin,jbin,0); if( xsec_up > xsecul ) hexcl_obsp1->SetBinContent(ibin,jbin,1); hexcl_obsm1->SetBinContent(ibin,jbin,0); if( xsec_dn > xsecul ) hexcl_obsm1->SetBinContent(ibin,jbin,1); } } TCanvas *can3 = new TCanvas("can3","can3",1200,800); can3->Divide(3,2); t->SetTextSize(0.07); gr->SetMarkerColor(6); gr_obsp1->SetMarkerColor(6); gr_obsm1->SetMarkerColor(6); gr_exp->SetMarkerColor(6); gr_expp1->SetMarkerColor(6); gr_expm1->SetMarkerColor(6); can3->cd(1); gPad->SetGridx(); gPad->SetGridy(); hexcl->GetXaxis()->SetTitle("stop mass [GeV]"); hexcl->GetYaxis()->SetTitle("#chi_{1}^{0} mass [GeV]"); hexcl->GetXaxis()->SetRangeUser(xaxismin,600); hexcl->GetYaxis()->SetRangeUser(0,200); hexcl->Draw("colz"); gr->Draw("lp"); t->DrawLatex(0.3,0.8,"observed"); can3->cd(2); gPad->SetGridx(); gPad->SetGridy(); hexcl_obsp1->GetXaxis()->SetTitle("stop mass [GeV]"); hexcl_obsp1->GetYaxis()->SetTitle("#chi_{1}^{0} mass [GeV]"); hexcl_obsp1->GetXaxis()->SetRangeUser(xaxismin,600); hexcl_obsp1->GetYaxis()->SetRangeUser(0,200); hexcl_obsp1->Draw("colz"); gr_obsp1->Draw("lp"); t->DrawLatex(0.3,0.8,"observed (+1#sigma)"); can3->cd(3); gPad->SetGridx(); gPad->SetGridy(); hexcl_obsm1->GetXaxis()->SetTitle("stop mass [GeV]"); hexcl_obsm1->GetYaxis()->SetTitle("#chi_{1}^{0} mass [GeV]"); hexcl_obsm1->GetXaxis()->SetRangeUser(xaxismin,600); hexcl_obsm1->GetYaxis()->SetRangeUser(0,200); hexcl_obsm1->Draw("colz"); gr_obsm1->Draw("lp"); t->DrawLatex(0.3,0.8,"observed (-1#sigma)"); can3->cd(4); gPad->SetGridx(); gPad->SetGridy(); hexcl_exp->GetXaxis()->SetTitle("stop mass [GeV]"); hexcl_exp->GetYaxis()->SetTitle("#chi_{1}^{0} mass [GeV]"); hexcl_exp->GetXaxis()->SetRangeUser(xaxismin,600); hexcl_exp->GetYaxis()->SetRangeUser(0,200); hexcl_exp->Draw("colz"); gr_exp->Draw("lp"); t->DrawLatex(0.3,0.8,"expected"); can3->cd(5); gPad->SetGridx(); gPad->SetGridy(); hexcl_expp1->GetXaxis()->SetTitle("stop mass [GeV]"); hexcl_expp1->GetYaxis()->SetTitle("#chi_{1}^{0} mass [GeV]"); hexcl_expp1->GetXaxis()->SetRangeUser(xaxismin,600); hexcl_expp1->GetYaxis()->SetRangeUser(0,200); hexcl_expp1->Draw("colz"); gr_expp1->Draw("lp"); t->DrawLatex(0.3,0.8,"expected (+1#sigma)"); can3->cd(6); gPad->SetGridx(); gPad->SetGridy(); hexcl_expm1->GetXaxis()->SetTitle("stop mass [GeV]"); hexcl_expm1->GetYaxis()->SetTitle("#chi_{1}^{0} mass [GeV]"); hexcl_expm1->GetXaxis()->SetRangeUser(xaxismin,600); hexcl_expm1->GetYaxis()->SetRangeUser(0,200); hexcl_expm1->Draw("colz"); gr_expm1->Draw("lp"); t->DrawLatex(0.3,0.8,"expected (-1#sigma)"); */ if( print ){ if ( TString(sample).Contains("T2tt") ){ can1->Print("../../plots/combinePlots_T2tt.pdf"); //can2->Print("../../plots/combinePlots_T2tt_bestSignalRegion.pdf"); //can3->Print("../../plots/combinePlots_T2tt_excludedPoints.pdf"); } else if( TString(sample).Contains("T2bw") ){ can1->Print(Form("../../plots/combinePlots_T2bw_x%i.pdf",x)); //can2->Print(Form("../../plots/combinePlots_T2bw_x%i_bestSignalRegion.pdf",x)); //can3->Print(Form("../../plots/combinePlots_T2bw_x%i_excludedPoints.pdf",x)); } } TFile* fout = TFile::Open(Form("%s_x%icombinePlots.root",sample,x),"RECREATE"); fout->cd(); hxsec_best->Write(); hxsec_best_exp->Write(); gr->Write(); fout->Close(); }
void PlotChargeFieldFocus2D( const TString &sim, Int_t time, Int_t zoom=2, Int_t Nbins=2, const TString &options="") { #ifdef __CINT__ gSystem->Load("libplasma.so"); #endif PlasmaGlob::Initialize(); // Palettes! gROOT->Macro("PlasmaPalettes.C"); // Init Units table PUnits::UnitsTable::Get(); // Load PData PData *pData = PData::Get(sim.Data()); pData->LoadFileNames(time); if(!pData->IsInit()) return; TString opt = options; // More makeup if(opt.Contains("grid")) { gStyle->SetPadGridX(1); gStyle->SetPadGridY(1); } gStyle->SetTitleFont(42); gStyle->SetStatFont(42); gStyle->SetTextFont(42); gStyle->SetTitleFont(42,"xyz"); gStyle->SetLabelFont(42,"xyz"); // Some plasma constants Double_t n0 = pData->GetPlasmaDensity(); Double_t kp = pData->GetPlasmaK(); Double_t skindepth = 1.; if(kp!=0.0) skindepth = 1/kp; Double_t E0 = pData->GetPlasmaE0(); // Some beam properties: Float_t Ebeam = pData->GetBeamEnergy() * PUnits::MeV; Float_t gamma = Ebeam / PConst::ElectronMassE; Float_t vbeam = TMath::Sqrt(1 - 1/(gamma*gamma)); // cout << Form(" - Bunch gamma = %8.4f", gamma ) << endl; // cout << Form(" - Bunch velocity = %8.4f c", vbeam ) << endl; Float_t nb = pData->GetBeamDensity(); // Time in OU Float_t Time = pData->GetRealTime(); // z start of the plasma in normalized units. Float_t zStartPlasma = pData->GetPlasmaStart()*kp; // z start of the beam in normalized units. Float_t zStartBeam = pData->GetBeamStart()*kp; // z start of the neutral in normalized units. Float_t zStartNeutral = pData->GetNeutralStart()*kp; // z end of the neutral in normalized units. Float_t zEndNeutral = pData->GetNeutralEnd()*kp; if(opt.Contains("center")) { Time -= zStartPlasma; if(opt.Contains("comov")) // Centers on the head of the beam. Time += zStartBeam; } Float_t shiftz = pData->Shift(opt); // cout << "Shift = " << shiftz << endl; // Calculate the "axis range" in number of bins. If Nbins==0 a RMS width is taken. Double_t rms0 = pData->GetBeamRmsY() * kp; if(pData->IsCyl()) rms0 = pData->GetBeamRmsR() * kp; Int_t FirstyBin = 0; Int_t LastyBin = 0; if(Nbins==0) { Nbins = TMath::Nint(rms0 / pData->GetDX(1)); } // Slice width limits. if(!pData->IsCyl()) { FirstyBin = pData->GetNX(1)/2 + 1 - Nbins; LastyBin = pData->GetNX(1)/2 + Nbins; } else { FirstyBin = 1; LastyBin = Nbins; } // ------------------------------------------------------------------------------- // Get charge density histos Int_t Nspecies = pData->NSpecies(); TH2F **hDen2D = new TH2F*[Nspecies]; TH1F **hDen1D = new TH1F*[Nspecies]; for(Int_t i=0;i<Nspecies;i++) { hDen2D[i] = NULL; hDen1D[i] = NULL; if(!pData->GetChargeFileName(i)) continue; cout << Form(" Getting charge density of specie: ") << i << endl; char hName[24]; sprintf(hName,"hDen2D_%i",i); hDen2D[i] = (TH2F*) gROOT->FindObject(hName); if(hDen2D[i]) delete hDen2D[i]; if(!pData->Is3D()) hDen2D[i] = pData->GetCharge(i,opt); else hDen2D[i] = pData->GetCharge2DSliceZY(i,-1,Nbins,opt+"avg"); // cout << Form(" Charge density of specie '%s' loaded into histogram '%s'",pData->GetSpeciesName(i).c_str(),hName) << endl; hDen2D[i]->SetName(hName); hDen2D[i]->GetXaxis()->CenterTitle(); hDen2D[i]->GetYaxis()->CenterTitle(); hDen2D[i]->GetZaxis()->CenterTitle(); if(opt.Contains("comov")) hDen2D[i]->GetXaxis()->SetTitle("#zeta [c/#omega_{p}]"); else hDen2D[i]->GetXaxis()->SetTitle("z [c/#omega_{p}]"); if(pData->IsCyl()) hDen2D[i]->GetYaxis()->SetTitle("r [c/#omega_{p}]"); else hDen2D[i]->GetYaxis()->SetTitle("y [c/#omega_{p}]"); hDen2D[i]->GetZaxis()->SetTitle("n [n_{0}]"); if(!opt.Contains("1dline")) continue; sprintf(hName,"hDen1D_%i",i); hDen1D[i] = (TH1F*) gROOT->FindObject(hName); if(hDen1D[i]) delete hDen1D[i]; if(pData->Is3D()) { hDen1D[i] = pData->GetH1SliceZ3D(pData->GetChargeFileName(i)->c_str(),"charge",-1,Nbins,-1,Nbins,opt+"avg"); } else if(pData->IsCyl()) { // Cylindrical: The first bin with r>0 is actually the number 1 (not the 0). hDen1D[i] = pData->GetH1SliceZ(pData->GetChargeFileName(i)->c_str(),"charge",1,Nbins,opt+"avg"); } else { // 2D cartesian hDen1D[i] = pData->GetH1SliceZ(pData->GetChargeFileName(i)->c_str(),"charge",-1,Nbins,opt+"avg"); } // cout << Form(" Charge density of specie '%s' loaded into histogram '%s'",pData->GetSpeciesName(i).c_str(),hName) << endl; hDen1D[i]->SetName(hName); hDen1D[i]->GetXaxis()->CenterTitle(); hDen1D[i]->GetYaxis()->CenterTitle(); if(opt.Contains("comov")) hDen1D[i]->GetXaxis()->SetTitle("#zeta [c/#omega_{p}]"); else hDen1D[i]->GetXaxis()->SetTitle("z [c/#omega_{p}]"); hDen1D[i]->GetYaxis()->SetTitle("n [n_{0}]"); } // Get electric fields const Int_t Nfields = 3; TH2F **hE2D = new TH2F*[Nfields]; TH1F **hE1D = new TH1F*[Nfields]; for(Int_t i=0;i<Nfields;i++) { hE2D[i] = NULL; hE1D[i] = NULL; if(!pData->GetEfieldFileName(i)) continue; cout << Form(" Getting electric field number ") << i+1 << endl; char hName[24]; sprintf(hName,"hE2D_%i",i); hE2D[i] = (TH2F*) gROOT->FindObject(hName); if(hE2D[i]) delete hE2D[i]; if(!pData->Is3D()) hE2D[i] = pData->GetEField(i,opt); else hE2D[i] = pData->GetEField2DSliceZY(i,-1,Nbins,opt+"avg"); hE2D[i]->SetName(hName); hE2D[i]->GetXaxis()->CenterTitle(); hE2D[i]->GetYaxis()->CenterTitle(); hE2D[i]->GetZaxis()->CenterTitle(); if(opt.Contains("comov")) hE2D[i]->GetXaxis()->SetTitle("#zeta [c/#omega_{p}]"); else hE2D[i]->GetXaxis()->SetTitle("z [c/#omega_{p}]"); if(pData->IsCyl()) hE2D[i]->GetYaxis()->SetTitle("r [c/#omega_{p}]"); else hE2D[i]->GetYaxis()->SetTitle("y [c/#omega_{p}]"); if(i==0) hE2D[i]->GetZaxis()->SetTitle("E_{z} [E_{0}]"); else if(i==1) hE2D[i]->GetZaxis()->SetTitle("E_{y} [E_{0}]"); else if(i==2) hE2D[i]->GetZaxis()->SetTitle("E_{x} [E_{0}]"); if(!opt.Contains("1dline")) continue; sprintf(hName,"hE1D_%i",i); hE1D[i] = (TH1F*) gROOT->FindObject(hName); if(hE1D[i]) delete hE1D[i]; // 1D histograms char nam[3]; sprintf(nam,"e%i",i+1); if(pData->Is3D()) { if(i==0) hE1D[i] = pData->GetH1SliceZ3D(pData->GetEfieldFileName(i)->c_str(),nam,-1,Nbins,-1,Nbins,opt+"avg"); else hE1D[i] = pData->GetH1SliceZ3D(pData->GetEfieldFileName(i)->c_str(),nam,-Nbins,Nbins,-Nbins,Nbins,opt+"avg"); } else if(pData->IsCyl()) { // Cylindrical: The first bin with r>0 is actually the number 1 (not the 0). hE1D[i] = pData->GetH1SliceZ(pData->GetEfieldFileName(i)->c_str(),nam,1,Nbins,opt+"avg"); } else { // 2D cartesian if(i==0) hE1D[i] = pData->GetH1SliceZ(pData->GetEfieldFileName(i)->c_str(),nam,-1,Nbins,opt+"avg"); else hE1D[i] = pData->GetH1SliceZ(pData->GetEfieldFileName(i)->c_str(),nam,-Nbins,Nbins,opt+"avg"); } hE1D[i]->SetName(hName); if(opt.Contains("comov")) hE1D[i]->GetXaxis()->SetTitle("#zeta [c/#omega_{p}]"); else hE1D[i]->GetXaxis()->SetTitle("z [c/#omega_{p}]"); if(i==0) hE1D[i]->GetYaxis()->SetTitle("E_{z} [E_{0}]"); else if(i==1) hE1D[i]->GetYaxis()->SetTitle("E_{y} [E_{0}]"); else if(i==2) hE1D[i]->GetYaxis()->SetTitle("E_{x} [E_{0}]"); } // Now, combine the electric field components into the total |E| // and calculate ionization probability for He: // Outter Helium electron Double_t Eion0 = 24.59 * PUnits::eV; Double_t Z = 1; Double_t l = 0; Double_t m = 0; TH1F *hIonProb1D = NULL; if(opt.Contains("ionprob")) { hIonProb1D = (TH1F*) hE1D[0]->Clone("hIonProb1D"); hIonProb1D->Reset(); Int_t NbinsX = hE1D[0]->GetNbinsX(); for(Int_t j=1;j<=NbinsX;j++) { Double_t E1 = hE1D[0]->GetBinContent(j); Double_t E2 = hE1D[1]->GetBinContent(j); Double_t E3 = hE1D[2]->GetBinContent(j); Double_t E = TMath::Sqrt(E1*E1+E2*E2+E3*E3); E *= E0; Double_t IonProb = (PFunc::ADK(E,Eion0,Z,l,m)/PUnits::atomictime)*PUnits::femtosecond; hIonProb1D->SetBinContent(j,IonProb); } hIonProb1D->GetYaxis()->SetTitle("W_{ADK} [fs^{-1}]"); } // Tunning the Histograms // --------------------- // Chaning to user units: // -------------------------- if(opt.Contains("units") && n0) { for(Int_t i=0;i<Nspecies;i++) { if(!hDen2D[i]) continue; Int_t NbinsX = hDen2D[i]->GetNbinsX(); Float_t xMin = skindepth * hDen2D[i]->GetXaxis()->GetXmin() / PUnits::um; Float_t xMax = skindepth * hDen2D[i]->GetXaxis()->GetXmax() / PUnits::um; Int_t NbinsY = hDen2D[i]->GetNbinsY(); Float_t yMin = skindepth * hDen2D[i]->GetYaxis()->GetXmin() / PUnits::um; Float_t yMax = skindepth * hDen2D[i]->GetYaxis()->GetXmax() / PUnits::um; hDen2D[i]->SetBins(NbinsX,xMin,xMax,NbinsY,yMin,yMax); // for(Int_t j=0;j<hDen2D[i]->GetNbinsX();j++) { // for(Int_t k=0;k<hDen2D[i]->GetNbinsY();k++) { // hDen2D[i]->SetBinContent(j,k, hDen2D[i]->GetBinContent(j,k) * n0 / (1e15/PUnits::cm3) ); // } // } if(pData->IsCyl()) hDen2D[i]->GetYaxis()->SetTitle("r [#mum]"); else hDen2D[i]->GetYaxis()->SetTitle("y [#mum]"); if(opt.Contains("comov")) hDen2D[i]->GetXaxis()->SetTitle("#zeta [#mum]"); else hDen2D[i]->GetXaxis()->SetTitle("z [#mum]"); // hDen2D[i]->GetZaxis()->SetTitle("n [10^{15}/cm^{3}]"); if(!hDen1D[i]) continue; hDen1D[i]->SetBins(NbinsX,xMin,xMax); if(opt.Contains("comov")) hDen1D[i]->GetXaxis()->SetTitle("#zeta [#mum]"); else hDen1D[i]->GetXaxis()->SetTitle("z [#mum]"); } for(Int_t i=0;i<Nfields;i++) { Int_t NbinsX = hE2D[i]->GetNbinsX(); Float_t xMin = skindepth * hE2D[i]->GetXaxis()->GetXmin() / PUnits::um; Float_t xMax = skindepth * hE2D[i]->GetXaxis()->GetXmax() / PUnits::um; Int_t NbinsY = hE2D[i]->GetNbinsY(); Float_t yMin = skindepth * hE2D[i]->GetYaxis()->GetXmin() / PUnits::um; Float_t yMax = skindepth * hE2D[i]->GetYaxis()->GetXmax() / PUnits::um; hE2D[i]->SetBins(NbinsX,xMin,xMax,NbinsY,yMin,yMax); if(hE1D[i]) hE1D[i]->SetBins(NbinsX,xMin,xMax); for(Int_t j=0;j<hE2D[i]->GetNbinsX();j++) { for(Int_t k=0;k<hE2D[i]->GetNbinsY();k++) { hE2D[i]->SetBinContent(j,k, hE2D[i]->GetBinContent(j,k) * ( E0 / (PUnits::GV/PUnits::m) ) ); } if(!hE1D[i]) continue; hE1D[i]->SetBinContent(j, hE1D[i]->GetBinContent(j) * ( E0 / (PUnits::GV) ) ); } if(pData->IsCyl()) hE2D[i]->GetYaxis()->SetTitle("r [#mum]"); else hE2D[i]->GetYaxis()->SetTitle("y [#mum]"); if(opt.Contains("comov")) hE2D[i]->GetXaxis()->SetTitle("#zeta [#mum]"); else hE2D[i]->GetXaxis()->SetTitle("z [#mum]"); if(i==0) hE2D[i]->GetZaxis()->SetTitle("E_{z} [GV/m]"); else if(i==1) hE2D[i]->GetZaxis()->SetTitle("E_{y} [GV/m]"); else if(i==2) hE2D[i]->GetZaxis()->SetTitle("E_{x} [GV/m]"); if(!hE1D[i]) continue; if(opt.Contains("comov")) hE1D[i]->GetXaxis()->SetTitle("#zeta [mm]"); else hE1D[i]->GetXaxis()->SetTitle("z [mm]"); if(i==0) hE1D[i]->GetYaxis()->SetTitle("E_{z} [GV/m]"); else if(i==1) hE1D[i]->GetYaxis()->SetTitle("E_{y} [GV/m]"); else if(i==2) hE1D[i]->GetYaxis()->SetTitle("E_{x} [GV/m]"); } if(hIonProb1D) { Int_t NbinsX = hIonProb1D->GetNbinsX(); Float_t xMin = skindepth * hIonProb1D->GetXaxis()->GetXmin() / PUnits::um; Float_t xMax = skindepth * hIonProb1D->GetXaxis()->GetXmax() / PUnits::um; hIonProb1D->SetBins(NbinsX,xMin,xMax); } } // --------------------------------------------------- Vertical Zoom ------------ Float_t range = (hDen2D[0]->GetYaxis()->GetXmax() - hDen2D[0]->GetYaxis()->GetXmin())/zoom; Float_t midPoint = (hDen2D[0]->GetYaxis()->GetXmax() + hDen2D[0]->GetYaxis()->GetXmin())/2.; Double_t ymin = midPoint-range/2; Double_t ymax = midPoint+range/2; if(pData->IsCyl()) { ymin = hDen2D[0]->GetYaxis()->GetXmin(); ymax = range; } hDen2D[0]->GetYaxis()->SetRangeUser(ymin,ymax); hE2D[0]->GetYaxis()->SetRangeUser(ymin,ymax); hE2D[1]->GetYaxis()->SetRangeUser(ymin,ymax); // ------------- z Zoom --------------------------------- Plasma palette ----------- // Set the range of the plasma charge density histogram for maximum constrast // using a dynamic palette wich adjust the nominal value to a certain color. Float_t density = 1; // if(opt.Contains("units") && n0) // density = n0 / (1e17/PUnits::cm3); Float_t Base = density; Float_t BaseB = TMath::Nint(100*(nb/n0))/100.0; Float_t gMax = hDen2D[0]->GetMaximum(); Float_t gMin = (0.1001) * Base; if(BaseB<Base) gMin = (0.1001) * BaseB; if(gMax<Base) gMax = 1.1*Base; Float_t *Max = new Float_t[Nspecies]; Float_t *Min = new Float_t[Nspecies]; for(Int_t i=0;i<Nspecies;i++) { if(!hDen2D[i]) continue; Max[i] = hDen2D[i]->GetMaximum(); Min[i] = 0.01*Max[i]; // if(i==1) = Min[i] = 1.001E-4; if(i==2) Min[i] = 1.001E-3; if(Max[i]>gMax) gMax = Max[i]; hDen2D[i]->GetZaxis()->SetRangeUser(Min[i],Max[i]); } hDen2D[0]->GetZaxis()->SetRangeUser(gMin,gMax); // if(hDen2D[1]) { // hDen2D[1]->GetZaxis()->SetRangeUser(gMin,Max[1]); // } // if(Nspecies>=3) { // if(hDen2D[2]) { // hDen2D[2]->GetZaxis()->SetRangeUser(gMin,Max[2]); // } // } // Dynamic plasma palette const Int_t plasmaDNRGBs = 3; const Int_t plasmaDNCont = 128; Double_t basePos = 0.5; if(gMax!=gMin) { if(opt.Contains("logz")) { Float_t a = 1.0/(TMath::Log10(gMax)-TMath::Log10(gMin)); Float_t b = TMath::Log10(gMin); basePos = a*(TMath::Log10(Base) - b); } else { basePos = (1.0/(gMax-gMin))*(Base - gMin); } } Double_t plasmaDStops[plasmaDNRGBs] = { 0.00, basePos, 1.00 }; Double_t plasmaDRed[plasmaDNRGBs] = { 0.99, 0.90, 0.00 }; Double_t plasmaDGreen[plasmaDNRGBs] = { 0.99, 0.90, 0.00 }; Double_t plasmaDBlue[plasmaDNRGBs] = { 0.99, 0.90, 0.00 }; PPalette * plasmaPalette = (PPalette*) gROOT->FindObject("plasma"); plasmaPalette->CreateGradientColorTable(plasmaDNRGBs, plasmaDStops, plasmaDRed, plasmaDGreen, plasmaDBlue, plasmaDNCont); // Change the range of z axis for the fields to be symmetric. Float_t Emax = hE2D[0]->GetMaximum(); Float_t Emin = hE2D[0]->GetMinimum(); if(Emax > TMath::Abs(Emin)) Emin = -Emax; else Emax = -Emin; hE2D[0]->GetZaxis()->SetRangeUser(Emin,Emax); Emax = hE2D[1]->GetMaximum(); Emin = hE2D[1]->GetMinimum(); if(Emax > TMath::Abs(Emin)) Emin = -Emax; else Emax = -Emin; hE2D[1]->GetZaxis()->SetRangeUser(Emin,Emax); // "Axis range" in Osiris units: Double_t ylow = hDen2D[1]->GetYaxis()->GetBinLowEdge(FirstyBin); Double_t yup = hDen2D[1]->GetYaxis()->GetBinUpEdge(LastyBin); Double_t xmin = hDen2D[1]->GetXaxis()->GetXmin(); Double_t xmax = hDen2D[1]->GetXaxis()->GetXmax(); TLine *lineYzero = new TLine(xmin,0.0,xmax,0.0); lineYzero->SetLineColor(kGray+2); lineYzero->SetLineStyle(2); TLine *lineYup = new TLine(xmin,yup,xmax,yup); lineYup->SetLineColor(kGray+1); lineYup->SetLineStyle(2); TLine *lineYdown = new TLine(xmin,ylow,xmax,ylow); lineYdown->SetLineColor(kGray+1); lineYdown->SetLineStyle(2); zStartPlasma -= shiftz; zStartNeutral -= shiftz; zEndNeutral -= shiftz; if(opt.Contains("units")) { zStartPlasma *= skindepth / PUnits::um; zStartNeutral *= skindepth / PUnits::um; zEndNeutral *= skindepth / PUnits::um; } // cout << "Start plasma = " << zStartPlasma << endl; TLine *lineStartPlasma = new TLine(zStartPlasma,ymin,zStartPlasma,ymax); lineStartPlasma->SetLineColor(kRed); lineStartPlasma->SetLineStyle(1); lineStartPlasma->SetLineWidth(2); // cout << "Start plasma = " << zStartNeutral << endl; TLine *lineStartNeutral = new TLine(zStartNeutral,ymin,zStartNeutral,ymax); lineStartNeutral->SetLineColor(kGray+1); lineStartNeutral->SetLineStyle(1); lineStartNeutral->SetLineWidth(2); // cout << "End plasma = " << zEndNeutral << endl; TLine *lineEndNeutral = new TLine(zEndNeutral,ymin,zEndNeutral,ymax); lineEndNeutral->SetLineColor(kGray+1); lineEndNeutral->SetLineStyle(2); lineEndNeutral->SetLineWidth(2); // Plotting // ----------------------------------------------- // Canvas setup TCanvas *C; if(opt.Contains("hres") && !opt.Contains("pdf")) // high resolution for plain grahics output. C = new TCanvas("C","2D Charge density, Accelerating and focusing fields",1500,2000); else C = new TCanvas("C","2D Charge density, Accelerating and focusing fields",750,1000); // Palettes setup TExec *exPlasma = new TExec("exPlasma","plasmaPalette->cd();"); TExec *exHot = new TExec("exHot","hotPalette->cd();"); TExec *exElec = new TExec("exElec","electronPalette->cd();"); TExec *exField = new TExec("exField","rbow2Palette->cd();"); // Text objects TPaveText *textTime = new TPaveText(0.7,0.83,0.85,0.90,"NDC"); PlasmaGlob::SetPaveTextStyle(textTime,32); char ctext[128]; if(opt.Contains("units") && n0) sprintf(ctext,"z = %5.1f #mum", Time * skindepth / PUnits::um); else sprintf(ctext,"t = %5.1f #omega_{p}^{-1}",Time); textTime->AddText(ctext); TPaveText *textDen = new TPaveText(0.13,0.83,0.38,0.90,"NDC"); PlasmaGlob::SetPaveTextStyle(textDen,12); textDen->SetTextColor(kOrange+10); if(opt.Contains("units") && n0) sprintf(ctext,"n_{0} = %5.2f x 10^{15} / cm^{3}", 1e-15 * n0 * PUnits::cm3); else if(pData->GetBeamDensity() && n0) sprintf(ctext,"n_{b}/n_{0} = %5.2f", pData->GetBeamDensity()/n0); textDen->AddText(ctext); TPaveText *textWav = new TPaveText(0.13,0.75,0.38,0.82,"NDC"); PlasmaGlob::SetPaveTextStyle(textWav,12); textWav->SetTextColor(kGray+2); sprintf(ctext,"#lambda_{p} = %5.3f mm", skindepth * TMath::TwoPi() / PUnits::um); textWav->AddText(ctext); // Actual Plotting! // ------------------------------------------------------------ // Output file TString fOutName = Form("./%s/Plots/ChargeFieldFocus2D/ChargeFieldFocus2D",pData->GetPath().c_str()); fOutName += Form("-%s_%i",pData->GetName(),time); // Setup Pad layout: Double_t lMargin = 0.10; Double_t rMargin = 0.12; Double_t bMargin = 0.10; Double_t tMargin = 0.02; Double_t vSpacing = 0.01; Double_t hStep = (1.-lMargin-rMargin); Double_t vStep = (1.-bMargin-tMargin)/3.; TPad *pad[3]; // top plots pad[0] = new TPad("padt", "padt",0.00, bMargin + 2.*vStep + vSpacing, lMargin+hStep+rMargin, 1.00); pad[0]->SetLeftMargin(1./(lMargin+hStep)*lMargin); pad[0]->SetRightMargin(1./(rMargin+hStep)*rMargin); pad[0]->SetBottomMargin(0.0); pad[0]->SetTopMargin(1./(tMargin+vStep)*tMargin); pad[0]->Draw(); // middle plots pad[1] = new TPad("padm", "padm",0.00, bMargin + vStep + vSpacing, lMargin + hStep + rMargin, bMargin + 2.*vStep ); pad[1]->SetLeftMargin(1./(lMargin+hStep)*lMargin); pad[1]->SetRightMargin((1./(rMargin+hStep)*rMargin)); pad[1]->SetBottomMargin(0.0); pad[1]->SetTopMargin(0.); pad[1]->Draw(); // bottom plots pad[2] = new TPad("padb", "padb",0.00, 0.,lMargin+hStep+rMargin,bMargin+vStep); pad[2]->SetLeftMargin(1./(lMargin+hStep)*lMargin); pad[2]->SetRightMargin((1./(rMargin+hStep)*rMargin)); pad[2]->SetBottomMargin(1./(bMargin+vStep)*bMargin); pad[2]->SetTopMargin(0.); pad[2]->Draw(); // Draw! pad[0]->cd(); // <---------------------------------------------- Top Plot --------- if(opt.Contains("logz")) { pad[0]->SetLogz(1); } else { pad[0]->SetLogz(0); } pad[0]->SetFrameLineWidth(3); TH2F *hFrame = (TH2F*) gROOT->FindObject("hFrame1"); if(hFrame) delete hFrame; hFrame = (TH2F*) hDen2D[0]->Clone("hFrame1"); hFrame->Reset(); hFrame->GetXaxis()->SetLabelOffset(999); hFrame->GetYaxis()->SetTitleSize(0.075); hFrame->GetYaxis()->SetTitleOffset(0.65); hFrame->GetYaxis()->SetLabelSize(0.065); hFrame->GetYaxis()->SetLabelOffset(0.02); hFrame->GetYaxis()->SetTickLength(0.02); hFrame->GetZaxis()->SetTitleSize(0.06); hFrame->GetZaxis()->SetTitleOffset(0.45); hFrame->GetZaxis()->SetLabelSize(0.06); hFrame->GetZaxis()->SetTickLength(0.02); // hFrame->GetZaxis()->SetNdivisions(505); hFrame->Draw("col"); if(Nspecies>=3) { if(hDen2D[2]) { exHot->Draw(); hDen2D[2]->Draw("colz same"); } } exPlasma->Draw(); hDen2D[0]->Draw("colz same"); if(hDen2D[1]) { exElec->Draw(); hDen2D[1]->Draw("colz same"); } if(opt.Contains("1dline")) { lineYzero->Draw(); lineYdown->Draw(); lineYup->Draw(); } if(zStartPlasma>xmin && zStartPlasma<xmax) lineStartPlasma->Draw(); if(zStartNeutral>xmin && zStartNeutral<xmax) lineStartNeutral->Draw(); if(zEndNeutral>xmin && zEndNeutral<xmax) lineEndNeutral->Draw(); pad[0]->Update(); TPaletteAxis *palette = NULL; for(Int_t i=0;i<Nspecies;i++) { if(!hDen2D[i]) continue; palette = (TPaletteAxis*) hDen2D[i]->GetListOfFunctions()->FindObject("palette"); if(!palette) continue; Float_t y1 = gPad->GetBottomMargin(); Float_t y2 = 1 - gPad->GetTopMargin(); Float_t x1 = gPad->GetLeftMargin(); Float_t x2 = 1 - gPad->GetRightMargin(); palette->SetY2NDC( (i+1)*(y2-y1)/Nspecies + y1); palette->SetY1NDC( i*(y2-y1)/Nspecies + y1); palette->SetX1NDC(x2 + 0.005); palette->SetX2NDC(x2 + 0.03); palette->SetTitleOffset(0.65); palette->SetTitleSize(0.07); palette->SetLabelSize(0.065); palette->SetBorderSize(2); palette->SetLineColor(1); } // 1D charge density plots: Float_t yaxismin = pad[0]->GetUymin(); Float_t yaxismax = pad[0]->GetUymin() + 0.33*(pad[0]->GetUymax() - pad[0]->GetUymin()) - 0.00; // Float_t denmin = (0.1001) * density; Float_t denmin = gMin; Float_t denmax = gMax; if(opt.Contains("logz")) { denmin = TMath::Log10(denmin); denmax = TMath::Log10(denmax); } for(Int_t i=0;i<Nspecies;i++) { if(!hDen1D[i]) continue; Float_t slope = (yaxismax - yaxismin)/(denmax - denmin); for(Int_t j=0;j<hDen1D[i]->GetNbinsX();j++) { Float_t content = hDen1D[i]->GetBinContent(j+1); if(opt.Contains("logz")) content = TMath::Log10(content); if(content<denmin) hDen1D[i]->SetBinContent(j+1,yaxismin); else hDen1D[i]->SetBinContent(j+1,(content - denmin) * slope + yaxismin); } hDen1D[i]->SetLineWidth(2); if(i==1) { hDen1D[i]->SetLineColor(PlasmaGlob::elecLine); hDen1D[i]->Draw("same C"); } else if (i==2) { hDen1D[i]->SetLineColor(kOrange+8); hDen1D[i]->Draw("same C"); } } textTime->Draw(); // textDen->Draw(); // textWav->Draw(); pad[0]->RedrawAxis(); pad[1]->cd(); // <--------------------------------------------- Mid Plot pad[1]->SetFrameLineWidth(3); TH2F *hFrame2 = (TH2F*) gROOT->FindObject("hFrame2"); if(hFrame2) delete hFrame2; hFrame2 = (TH2F*) hE2D[0]->Clone("hFrame2"); hFrame2->Reset(); Float_t yFactor = pad[0]->GetAbsHNDC()/pad[1]->GetAbsHNDC(); hFrame2->GetXaxis()->SetLabelOffset(999); hFrame2->GetYaxis()->SetTitleSize(0.075*yFactor); hFrame2->GetYaxis()->SetTitleOffset(0.65/yFactor); hFrame2->GetYaxis()->SetLabelSize(0.0650*yFactor); hFrame2->GetYaxis()->SetLabelOffset(0.02/yFactor); hFrame2->GetYaxis()->SetTickLength(0.02/yFactor); hE2D[0]->GetZaxis()->SetTitleSize(0.06*yFactor); hE2D[0]->GetZaxis()->SetTitleOffset(0.45/yFactor); hE2D[0]->GetZaxis()->SetLabelSize(0.06*yFactor); hE2D[0]->GetZaxis()->SetTickLength(0.02/yFactor); // hFrame2->GetZaxis()->SetNdivisions(505); hFrame2->Draw("col"); exField->Draw(); hE2D[0]->Draw("colz same"); if(opt.Contains("1dline")) { lineYzero->Draw(); lineYdown->Draw(); lineYup->Draw(); } if(zStartPlasma>xmin && zStartPlasma<xmax) lineStartPlasma->Draw(); if(zStartNeutral>xmin && zStartNeutral<xmax) lineStartNeutral->Draw(); if(zEndNeutral>xmin && zEndNeutral<xmax) lineEndNeutral->Draw(); pad[1]->Update(); palette = (TPaletteAxis*) hE2D[0]->GetListOfFunctions()->FindObject("palette"); Float_t y1 = pad[1]->GetBottomMargin(); Float_t y2 = 1 - pad[1]->GetTopMargin(); Float_t x2 = 1 - pad[1]->GetRightMargin(); palette->SetY2NDC(y2 - 0.01); palette->SetY1NDC(y1 + 0.01); palette->SetX1NDC(x2 + 0.005); palette->SetX2NDC(x2 + 0.03); palette->SetTitleSize(0.07*yFactor); palette->SetTitleOffset(0.65/yFactor); palette->SetLabelSize(0.065*yFactor); palette->SetBorderSize(2); palette->SetLineColor(1); // 1D electric field plots: if(hE1D[0]) { // yaxismin = pad[1]->GetUymin() + 0.16666*(pad[1]->GetUymax() - pad[1]->GetUymin()); // yaxismax = pad[1]->GetUymax() - 0.16666*(pad[1]->GetUymax() - pad[1]->GetUymin()); Float_t yaxismin = pad[1]->GetUymin(); Float_t yaxismax = pad[1]->GetUymax(); Float_t emin = hE1D[0]->GetMinimum(); Float_t emax = hE1D[0]->GetMaximum(); //Float_t slope = (yaxismax - yaxismin)/(emax - emin); Float_t slope = yaxismin/emin; for(Int_t j=0;j<hE1D[0]->GetNbinsX();j++) { Float_t content = hE1D[0]->GetBinContent(j+1); hE1D[0]->SetBinContent(j+1,(content - emin) * slope + yaxismin); } hE1D[0]->SetLineWidth(2); hE1D[0]->SetLineColor(PlasmaGlob::elecLine); // hE1D[0]->SetLineColor(kGray+2); hE1D[0]->Draw("same C"); } // Plot ionization probability: if(hIonProb1D) { Float_t ionmin = 0; Float_t ionmax = hIonProb1D->GetMaximum(); Float_t slope = yaxismax/ionmax; for(Int_t j=0;j<hIonProb1D->GetNbinsX();j++) { Float_t content = hIonProb1D->GetBinContent(j+1); hIonProb1D->SetBinContent(j+1,content * slope); } hIonProb1D->SetLineWidth(2); hIonProb1D->SetLineColor(kGray+2); hIonProb1D->Draw("same C"); } pad[1]->RedrawAxis(); pad[2]->cd(); // <--------------------------------------------- Bottom Plot pad[2]->SetFrameLineWidth(3); TH2F *hFrame3 = (TH2F*) gROOT->FindObject("hFrame3"); if(hFrame3) delete hFrame3; hFrame3 = (TH2F*) hE2D[1]->Clone("hFrame3"); hFrame3->Reset(); yFactor = pad[0]->GetAbsHNDC()/pad[2]->GetAbsHNDC(); hFrame3->GetXaxis()->SetTitleSize(0.075); hFrame3->GetXaxis()->SetLabelSize(0.070); hFrame3->GetYaxis()->SetTitleSize(0.075*yFactor); hFrame3->GetYaxis()->SetTitleOffset(0.65/yFactor); hFrame3->GetYaxis()->SetLabelSize(0.0650*yFactor); hFrame3->GetYaxis()->SetLabelOffset(0.02/yFactor); hFrame3->GetYaxis()->SetTickLength(0.02/yFactor); hE2D[1]->GetZaxis()->SetTitleSize(0.06*yFactor); hE2D[1]->GetZaxis()->SetTitleOffset(0.45/yFactor); hE2D[1]->GetZaxis()->SetLabelSize(0.06*yFactor); hE2D[1]->GetZaxis()->SetTickLength(0.02/yFactor); // hE2D[1]->GetZaxis()->SetNdivisions(505); hFrame3->Draw("col"); exField->Draw(); hE2D[1]->Draw("colz same"); if(opt.Contains("1dline")) { lineYzero->Draw(); lineYup->Draw(); } if(zStartPlasma>xmin && zStartPlasma<xmax) lineStartPlasma->Draw(); if(zStartNeutral>xmin && zStartNeutral<xmax) lineStartNeutral->Draw(); if(zEndNeutral>xmin && zEndNeutral<xmax) lineEndNeutral->Draw(); pad[2]->Update(); palette = (TPaletteAxis*)hE2D[1]->GetListOfFunctions()->FindObject("palette"); y1 = pad[2]->GetBottomMargin(); y2 = 1 - pad[2]->GetTopMargin(); x2 = 1 - pad[2]->GetRightMargin(); palette->SetY2NDC(y2 - 0.01); palette->SetY1NDC(y1 + 0.01); palette->SetX1NDC(x2 + 0.005); palette->SetX2NDC(x2 + 0.03); palette->SetTitleSize(0.07*yFactor); palette->SetTitleOffset(0.65/yFactor); palette->SetLabelSize(0.065*yFactor); palette->SetBorderSize(2); palette->SetLineColor(1); // 1D electric field plots: if(hE1D[1]) { // yaxismin = pad[2]->GetUymin() + 0.16666*(pad[2]->GetUymax() - pad[2]->GetUymin()); // yaxismax = pad[2]->GetUymax() - 0.16666*(pad[2]->GetUymax() - pad[2]->GetUymin()); Float_t yaxismin = pad[2]->GetUymin(); Float_t yaxismax = pad[2]->GetUymax(); Float_t emin = hE1D[1]->GetMinimum(); Float_t emax = hE1D[1]->GetMaximum(); Float_t slope = yaxismin/emin; for(Int_t j=0;j<hE1D[1]->GetNbinsX();j++) { Float_t content = hE1D[1]->GetBinContent(j+1); hE1D[1]->SetBinContent(j+1,(content - emin) * slope + yaxismin); } hE1D[1]->SetLineWidth(2); //hE1D[1]->SetLineStyle(2); // hE1D[1]->SetLineColor(kGray+2); hE1D[1]->SetLineColor(PlasmaGlob::elecLine); hE1D[1]->Draw("same C"); } // Plot ionization probability: if(hIonProb1D) { Float_t ionmin = 0; Float_t ionmax = hIonProb1D->GetMaximum(); Float_t slope = yaxismax/ionmax; for(Int_t j=0;j<hIonProb1D->GetNbinsX();j++) { Float_t content = hIonProb1D->GetBinContent(j+1); hIonProb1D->SetBinContent(j+1,content * slope); } hIonProb1D->SetLineWidth(2); hIonProb1D->SetLineColor(kGray+2); hIonProb1D->Draw("same C"); } pad[2]->RedrawAxis(); C->cd(); // Print to a file PlasmaGlob::imgconv(C,fOutName,opt); // --------------------------------------------------------- }
void combineBins(int mass, double scale_factor = 1.0){ //mass = mass of tprime quark //define some parameters //char fname[100]={"data/mujets_821/tprime_mujets_2D_821ipb.root"}; //input file name char fname[100]={"data/ejets_3560/tprime_ejets_2D_3560ipb.root"}; //input file name char oname[256]; //output file name char sname[100]; //name of signal histogram //sprintf(oname,"data/mujets_821/tprime_%i_mujets_2D_821ipb_merged_15jul2011test.root",mass); sprintf(oname,"data/mujets_821/tprime_%i_mujets_2D_821ipb_merged_test.root",mass); sprintf(sname,"TPrime%i_HtvsMfit",mass); char bname[20][100]={ //array of data and background histograms "Data_HtvsMfit", //data histogram must be first in this list "TTjets_HtvsMfit", "Ewk_HtvsMfit", "TPrime%i_HtvsMfit_JESup", "TPrime%i_HtvsMfit_JESdown", "TTjets_HtvsMfit_JESup", "TTjets_HtvsMfit_JESdown", "Ewk_HtvsMfit_JESup", "Ewk_HtvsMfit_JESdown" }; int nb=9; //number of histograms in list int n_skip=3; // starting with this index, do not consider for background normalization float femax=0.20; //max fractional error in each bin of background histogram TFile *f = TFile::Open(fname); if (f==NULL) { printf("Cannot open file '%s'\n",fname); return; } TH2F* hs; f->GetObject(sname,hs); // Gena: scale signal template to proper cross section hs->Scale(scale_factor); if (hs==NULL) { printf("Cannot find histogram '%s' in '%s'\n",sname,fname); return; } //figure out the binning int nx = hs->GetNbinsX()+2; int ny = hs->GetNbinsY()+2; // cross check printout std::cout << "2D hist name: " << hs->GetName() << std::endl; std::cout << "Integral with overflow: " << hs->Integral(0,nx-1,0,ny-1) << std::endl; std::cout << "Integral no overflow: " << hs->Integral(1,nx-2,1,ny-2) << std::endl << std::endl; TH2F *hb = (TH2F*)hs->Clone(); hb->SetName("hb"); hb->Reset(); TH2F *hX[20]; for (int i=0;i<nb;i++){ std::string sBName(bname[i]); // GENA: get names for signal JES histos if (sBName.find("TPrime")!=std::string::npos || sBName.find("Tprime")!=std::string::npos || sBName.find("tprime")!=std::string::npos){ sprintf(bname[i],sBName.c_str(),mass); std::cout << bname[i] << std::endl; } f->GetObject(bname[i],hX[i]); // GENA: scale JES signal templates to proper cross section if (sBName.find("TPrime")!=std::string::npos || sBName.find("Tprime")!=std::string::npos || sBName.find("tprime")!=std::string::npos){ hX[i]->Scale(scale_factor); } if (hX[i]==NULL) { printf("Cannot find histogram '%s' in '%s'\n",bname[i],fname); return; } //hX[i]->Print("base"); std::cout << "2D hist name: " << hX[i]->GetName() << std::endl; std::cout << "Integral with overflow: " << hX[i]->Integral(0,nx-1,0,ny-1) << std::endl; std::cout << "Integral no overflow: " << hX[i]->Integral(1,nx-2,1,ny-2) << std::endl << std::endl; //sum all background histograms into hb; do not add the data histogram if (i>0 && i<n_skip) hb->Add(hX[i]); } //figure out the binning //int nx = hs->GetNbinsX()+2; //int ny = hs->GetNbinsY()+2; int nbin=nx*ny; std::cout << "number of bins: x="<<nx<<", y="<<ny<<std::endl; //book some 1d histograms with the same number of bins for diagnostics TH1F *h1sb = new TH1F("h1sb","h1sb",nbin,0,nbin); TH1F *h1s = new TH1F("h1s","h1s",nbin,0,nbin); TH1F *h1b = new TH1F("h1b","h1b",nbin,0,nbin); // GENA: vector to create 2D->1D bin map std::vector<std::vector<int> > vMap(nbin); float xs,xb; //xsb holds the s/b values for each bin //xx are the histogram contents //(0=signal, 1=total background, 2=data, 3...nb-1=individual backgrounds) GENA: nb+1 ? float xsb[30000],xx[30000][20],xe[30000][20]; int ibin; double _sum = 0.0; for (int i=0;i<nx;i++){ for (int j=0;j<ny;j++){ ibin=hs->GetBin(i,j); // GENA: Will fill each bin with its original index vMap[ibin].push_back(ibin); xs=hs->GetBinContent(ibin); xb=hb->GetBinContent(ibin); //compute signal/background if (xb>0) { xsb[ibin]=xs/xb; }else{ if (xs>0){ xsb[ibin]=999; }else{ xsb[ibin]=0; } } xx[ibin][0]=xs; xe[ibin][0]=hs->GetBinError(ibin); xx[ibin][1]=xb; xe[ibin][1]=hb->GetBinError(ibin); for (int k=0;k<nb;k++){ xx[ibin][k+2]=hX[k]->GetBinContent(ibin); xe[ibin][k+2]=hX[k]->GetBinError(ibin); } if (xb>0) h1sb->SetBinContent(ibin,xs/xb); h1s->SetBinContent(ibin,xx[ibin][0]); h1s->SetBinError(ibin,xe[ibin][0]); h1b->SetBinContent(ibin,xx[ibin][1]); h1b->SetBinError(ibin,xe[ibin][1]); _sum += xx[ibin][0]; } } std::cout << "SUM: " << _sum << std::endl; //sort all histogram bins in decreasing s/b int nswap=1; float xtmp; // GENA: for bin map int ibin_tmp; while (nswap>0) { nswap=0; for (int i=0;i<nbin-1;i++) { if (xsb[i]<xsb[i+1]){ xtmp=xsb[i]; xsb[i]=xsb[i+1]; xsb[i+1]=xtmp; // GENA: for bin map ibin_tmp = vMap[i][0]; vMap[i][0] = vMap[i+1][0]; vMap[i+1][0] = ibin_tmp; for (int j=0;j<nb+2;j++){ xtmp=xx[i][j]; xx[i][j]=xx[i+1][j]; xx[i+1][j]=xtmp; xtmp=xe[i][j]; xe[i][j]=xe[i+1][j]; xe[i+1][j]=xtmp; } nswap=nswap+1; } } } //these histograms have the bins ordered in decrerasing s/b for diagnostics TH1F *h1sb1 = new TH1F("h1sb1","h1sb1",nbin,0,nbin); TH1F *h1fe1 = new TH1F("h1fe1","h1fe1",nbin,0,nbin); TH1F *h1s1 = new TH1F("h1s1","h1s1",nbin,0,nbin); TH1F *h1b1 = new TH1F("h1b1","h1b1",nbin,0,nbin); for (int i=0;i<nbin;i++){ h1sb1->SetBinContent(i+1,xsb[i]); if (xx[i][1]>0) h1fe1->SetBinContent(i+1,xe[i][1]/xx[i][1]); h1s1->SetBinContent(i+1,xx[i][0]); h1s1->SetBinError(i+1,xe[i][0]); h1b1->SetBinContent(i+1,xx[i][1]); h1b1->SetBinError(i+1,xe[i][1]); } //combine bins starting with the highest s/b until the fractional error in //the total backround in every bin is smaller than femax int ncomb=1; //float xtmp; float fe=0; while (ncomb>0) { ncomb=0; for (int i=0;i<nbin-1;i++){ if (xx[i][1]>0){ fe=xe[i][1]/xx[i][1]; //fractional error in background }else{ fe=1; } if (fe>femax){ // GENA: write down bin for (std::vector<int>::const_iterator vi=vMap[i+1].begin(); vi != vMap[i+1].end(); ++vi){ vMap[i].push_back(*vi); } //move all successive bins up vMap.erase(vMap.begin()+i+1); for (int k=0;k<nb+2;k++){ //add the next bin xx[i][k]=xx[i][k]+xx[i+1][k]; xe[i][k]=sqrt(xe[i][k]*xe[i][k]+xe[i+1][k]*xe[i+1][k]); for (int j=i+1;j<nbin-1;j++){ //move all successive bins up xx[j][k]=xx[j+1][k]; xe[j][k]=xe[j+1][k]; } } ncomb++; nbin=nbin-1; //decrease the total number of bins } } } //GENA: open the map file std::ofstream mapFile; mapFile.open("bin.map"); int bin_count = 0; for (std::vector<std::vector<int> >::const_iterator i=vMap.begin(); i != vMap.end(); ++i){ mapFile << " " << i-vMap.begin()+1 << ":"; for(std::vector<int>::const_iterator j=i->begin(); j != i->end(); ++j){ mapFile << " " << *j; ++bin_count; } mapFile << std::endl; } //GENA: close the map file mapFile.close(); //these are the output histograms TFile *f2 = TFile::Open(oname,"recreate"); TH1F *h1feb2 = new TH1F("h1fe2","h1fe2",nbin,0,nbin); TH1F *h1s2 = new TH1F(sname,sname,nbin,0,nbin); TH1F *h1b2 = new TH1F("h1b2","h1b2",nbin,0,nbin); TH1F *h1X2[20]; for (int i=0;i<nb;i++){ h1X2[i] = new TH1F(bname[i],bname[i],nbin,0,nbin); } for (int i=0;i<nbin;i++){ h1feb2->SetBinContent(i+1,xe[i][1]/xx[i][1]); h1s2->SetBinContent(i+1,xx[i][0]); h1s2->SetBinError(i+1,xe[i][0]); h1b2->SetBinContent(i+1,xx[i][1]); h1b2->SetBinError(i+1,xe[i][1]); for (int j=0;j<nb;j++){ h1X2[j]->SetBinContent(i+1,xx[i][j+2]); h1X2[j]->SetBinError(i+1,xe[i][j+2]); } } std::cout << "Merged 1D hist name: " << h1s2->GetName() << std::endl; std::cout << "Integral with overflow: " << h1s2->Integral(0,nbin+1) << std::endl; std::cout << "Integral no overflow: " << h1s2->Integral(1,nbin) << std::endl << std::endl; h1s2->Write(); for (int j=0;j<nb;j++){ std::cout << "Merged 1D hist name: " << h1X2[j]->GetName() << std::endl; std::cout << "Integral with overflow: " << h1X2[j]->Integral(0,nbin+1) << std::endl; std::cout << "Integral no overflow: " << h1X2[j]->Integral(1,nbin) << std::endl << std::endl; h1X2[j]->Write(); } h1s2->Print("base"); f2->Close(); f->Close(); std::cout << "map size: " << vMap.size() << " combined bins" << std::endl; std::cout << "total bins merged: " << bin_count << std::endl; }
int main (int argc, char **argv) { /// Mc Ntuplas TString input = Form("/data1/rgerosa/NTUPLES_FINAL_CALIB/MC/WJetsToLNu_DYJetsToLL_7TeV-madgraph-tauola_Fall11_All.root"); /// MC Calibration result E/p TString input2 = Form("/data1/rgerosa/L3_Weight/MC_WJets/EB_Z_recoFlag/WJetsToLNu_DYJetsToLL_7TeV-madgraph-tauola_Fall11_Z_noEP.root"); TApplication* theApp = new TApplication("Application",&argc, argv); TFile *f = new TFile(input,""); TTree *inputTree = (TTree*)f->Get("ntu"); TFile *f2 = new TFile(input2,""); TH2F *h_scale_EB = (TH2F*)f2->Get("h_scale_EB"); TH2F *hcmap = (TH2F*) h_scale_EB->Clone("hcmap"); hcmap -> Reset("ICEMS"); hcmap -> ResetStats(); /// Taking infos std::vector<float>* ele1_recHit_E=0; std::vector<float>* ele2_recHit_E=0; std::vector<int>* ele1_recHit_hashedIndex=0; std::vector<int>* ele2_recHit_hashedIndex=0; std::vector<int>* ele1_recHit_flag=0; std::vector<int>* ele2_recHit_flag=0; float ele1_E_true,ele2_E_true; float ele1_tkP,ele2_tkP; int ele1_isEB, ele2_isEB; float ele1_fbrem,ele2_fbrem; int isW, isZ; inputTree->SetBranchAddress("ele1_recHit_E", &ele1_recHit_E); inputTree->SetBranchAddress("ele2_recHit_E", &ele2_recHit_E); inputTree->SetBranchAddress("ele1_recHit_hashedIndex", &ele1_recHit_hashedIndex); inputTree->SetBranchAddress("ele2_recHit_hashedIndex", &ele2_recHit_hashedIndex); inputTree->SetBranchAddress("ele1_recHit_flag", &ele1_recHit_flag); inputTree->SetBranchAddress("ele2_recHit_flag", &ele2_recHit_flag); inputTree->SetBranchAddress("ele1_E_true", &ele1_E_true); inputTree->SetBranchAddress("ele2_E_true", &ele2_E_true); inputTree->SetBranchAddress("ele1_tkP", &ele1_tkP); inputTree->SetBranchAddress("ele2_tkP", &ele2_tkP); inputTree->SetBranchAddress("ele1_isEB", &ele1_isEB); inputTree->SetBranchAddress("ele2_isEB", &ele2_isEB); inputTree->SetBranchAddress("ele1_fbrem", &ele1_fbrem); inputTree->SetBranchAddress("ele2_fbrem", &ele2_fbrem); inputTree->SetBranchAddress("isW", &isW); inputTree->SetBranchAddress("isZ", &isZ); TProfile2D* mapMomentum = new TProfile2D("mapMomentum","mapMomentum",360,0,360,170,-85,85); TProfile2D* mapfbrem = new TProfile2D("mapfbrem","mapfbrem",360,0,360,170,-85,85); /// Make fbrem and p/ptrue map cycling on MC --> all the events for(Long64_t i=0; i< inputTree->GetEntries(); i++) { inputTree->GetEntry(i); if (!(i%100000))std::cerr<<i; if (!(i%10000)) std::cerr<<"."; if (ele1_isEB == 1 && (isW==1 || isZ==1)) { double E_seed=0; int seed_hashedIndex, iseed; for (unsigned int iRecHit = 0; iRecHit < ele1_recHit_E->size(); iRecHit++ ) { if(ele1_recHit_E -> at(iRecHit) > E_seed && ele1_recHit_flag->at(iRecHit) < 4 ) /// control if this recHit is good { seed_hashedIndex=ele1_recHit_hashedIndex -> at(iRecHit); iseed=iRecHit; E_seed=ele1_recHit_E -> at(iRecHit); ///! Seed search } } int eta_seed = GetIetaFromHashedIndex(seed_hashedIndex); int phi_seed = GetIphiFromHashedIndex(seed_hashedIndex); if(ele1_tkP>0 && ele1_E_true>0 && abs(ele1_tkP/ele1_E_true)<2. && abs(ele1_tkP/ele1_E_true)>0.5) mapMomentum->Fill(phi_seed,eta_seed,abs(ele1_tkP/ele1_E_true)); mapfbrem->Fill(phi_seed,eta_seed,abs(ele1_fbrem)); } if (ele2_isEB == 1 && isZ==1) { double E_seed=0; int seed_hashedIndex, iseed; for (unsigned int iRecHit = 0; iRecHit < ele2_recHit_E->size(); iRecHit++ ) { if(ele2_recHit_E -> at(iRecHit) > E_seed && ele2_recHit_flag->at(iRecHit) < 4 ) /// control if this recHit is good { seed_hashedIndex=ele2_recHit_hashedIndex -> at(iRecHit); iseed=iRecHit; E_seed=ele2_recHit_E -> at(iRecHit); ///! Seed search } } int eta_seed = GetIetaFromHashedIndex(seed_hashedIndex); int phi_seed = GetIphiFromHashedIndex(seed_hashedIndex); if(ele2_tkP>0 && ele2_E_true>0 && abs(ele2_tkP/ele2_E_true)<2. && abs(ele2_tkP/ele2_E_true)>0.5) mapMomentum->Fill(phi_seed,eta_seed,abs(ele2_tkP/ele2_E_true)); mapfbrem->Fill(phi_seed,eta_seed,abs(ele2_fbrem)); } } /// Map of IC normalized in eta rings std::vector< std::pair<int,int> > TT_centre ; TT_centre.push_back(std::pair<int,int> (58,49)); TT_centre.push_back(std::pair<int,int> (53,109)); TT_centre.push_back(std::pair<int,int> (8,114)); TT_centre.push_back(std::pair<int,int> (83,169)); TT_centre.push_back(std::pair<int,int> (53,174)); TT_centre.push_back(std::pair<int,int> (63,194)); TT_centre.push_back(std::pair<int,int> (83,224)); TT_centre.push_back(std::pair<int,int> (73,344)); TT_centre.push_back(std::pair<int,int> (83,358)); TT_centre.push_back(std::pair<int,int> (-13,18)); TT_centre.push_back(std::pair<int,int> (-18,23)); TT_centre.push_back(std::pair<int,int> (-8,53)); TT_centre.push_back(std::pair<int,int> (-3,63)); TT_centre.push_back(std::pair<int,int> (-53,128)); TT_centre.push_back(std::pair<int,int> (-53,183)); TT_centre.push_back(std::pair<int,int> (-83,193)); TT_centre.push_back(std::pair<int,int> (-74,218)); TT_centre.push_back(std::pair<int,int> (-8,223)); TT_centre.push_back(std::pair<int,int> (-68,303)); TT_centre.push_back(std::pair<int,int> (-43,328)); /// Mean over phi corrected skipping dead channel for (int iEta = 1 ; iEta < h_scale_EB->GetNbinsY()+1; iEta ++) { float SumIC = 0; int numIC = 0; for(int iPhi = 1 ; iPhi < h_scale_EB->GetNbinsX()+1 ; iPhi++) { bool isGood = CheckxtalIC(h_scale_EB,iPhi,iEta); bool isGoodTT = CheckxtalTT(iPhi,iEta,TT_centre); if(isGood && isGoodTT) { SumIC = SumIC + h_scale_EB->GetBinContent(iPhi,iEta); numIC ++ ; } } //fede: skip bad channels and bad TTs for (int iPhi = 1; iPhi< h_scale_EB->GetNbinsX()+1 ; iPhi++) { if(numIC==0 || SumIC==0) continue; bool isGood = CheckxtalIC(h_scale_EB,iPhi,iEta); bool isGoodTT = CheckxtalTT(iPhi,iEta,TT_centre); if (!isGood || !isGoodTT) continue; hcmap->SetBinContent(iPhi,iEta,h_scale_EB->GetBinContent(iPhi,iEta)/(SumIC/numIC)); } } /// ratio map TH2F* ratioMap = (TH2F*) hcmap -> Clone("ratioMap"); ratioMap->Reset(); for( int i =0 ; i<hcmap->GetNbinsX() ; i++){ for( int j=0; j<hcmap->GetNbinsY() ; j++){ if(hcmap->GetBinContent(i,j)!=0 && mapMomentum->GetBinContent(i,j)!=0) ratioMap->SetBinContent(i+1,j+1,mapMomentum->GetBinContent(i,j)/hcmap->GetBinContent(i,j)); } } /// Profile along phi taking into account dead channels TGraphErrors *coeffEBp = new TGraphErrors(); TGraphErrors *coeffEBm = new TGraphErrors(); for (int iPhi =1; iPhi< hcmap->GetNbinsX()+1 ; iPhi++){ double SumEBp =0, SumEBm=0; double iEBp=0, iEBm=0; for(int iEta = 1; iEta<hcmap->GetNbinsY()+1 ; iEta++){ if(hcmap->GetBinContent(iPhi,iEta)==0)continue; if(iEta>85) {SumEBp=SumEBp+mapMomentum->GetBinContent(iPhi,iEta)/hcmap->GetBinContent(iPhi,iEta); iEBp++;} else{ SumEBm=SumEBm+mapMomentum->GetBinContent(iPhi,iEta)/hcmap->GetBinContent(iPhi,iEta); iEBm++;} } coeffEBp->SetPoint(iPhi-1,iPhi-1,SumEBp/iEBp); coeffEBm->SetPoint(iPhi-1,iPhi-1,SumEBm/iEBm); } TFile* outputGraph = new TFile("output/GraphFor_P_Correction.root","RECREATE"); outputGraph->cd(); coeffEBp->Write("coeffEBp"); coeffEBm->Write("coeffEBm"); outputGraph->Close(); gROOT->Reset(); gROOT->SetStyle("Plain"); gStyle->SetPadTickX(1); gStyle->SetPadTickY(1); gStyle->SetOptTitle(1); gStyle->SetOptStat(0); gStyle->SetOptFit(0); gStyle->SetFitFormat("6.3g"); gStyle->SetPalette(1); gStyle->SetTextFont(42); gStyle->SetTextSize(0.05); gStyle->SetTitleFont(42,"xyz"); gStyle->SetTitleSize(0.05); gStyle->SetLabelFont(42,"xyz"); gStyle->SetLabelSize(0.05); gStyle->SetTitleXOffset(0.8); gStyle->SetTitleYOffset(1.1); gROOT->ForceStyle(); TCanvas* c1 = new TCanvas("mapMomentum","mapMomentum",1); c1->cd(); mapMomentum->GetXaxis()->SetTitle("#phi"); mapMomentum->GetXaxis()->SetNdivisions(20); c1->SetGridx(); mapMomentum->GetYaxis()->SetTitle("#eta"); mapMomentum->GetZaxis()->SetRangeUser(0.7,1.3); mapMomentum->Draw("colz"); TCanvas* c2 = new TCanvas("mapfbrem","mapfbrem",1); c2->cd(); mapfbrem->GetXaxis()->SetTitle("#phi"); mapfbrem->GetYaxis()->SetTitle("#eta"); mapfbrem->GetXaxis()->SetNdivisions(20); c2->SetGridx(); mapfbrem->GetZaxis()->SetRangeUser(0.,0.7); mapfbrem->Draw("colz"); TCanvas* c3 = new TCanvas("ratioMap","ratioMap",1); c3->cd(); ratioMap->GetXaxis()->SetTitle("#phi"); ratioMap->GetYaxis()->SetTitle("#eta"); ratioMap->GetXaxis()->SetNdivisions(20); c3->SetGridx(); ratioMap->GetZaxis()->SetRangeUser(0.7,1.3); ratioMap->Draw("colz"); TCanvas* c4 = new TCanvas("coeffEB","coeffEB",1); c4->cd(); coeffEBp->GetXaxis()->SetTitle("#phi"); coeffEBp->GetYaxis()->SetTitle("p/p_{true}"); coeffEBp -> SetMarkerStyle(20); coeffEBp -> SetMarkerSize(1); coeffEBp -> SetMarkerColor(kRed+1); coeffEBp -> SetLineColor(kRed+1); c4->SetGridx(); c4->SetGridy(); ratioMap->Draw("ap"); coeffEBm->GetXaxis()->SetTitle("#phi"); coeffEBm->GetYaxis()->SetTitle("p/p_{true}"); coeffEBm -> SetMarkerStyle(20); coeffEBm -> SetMarkerSize(1); coeffEBm -> SetMarkerColor(kBlue+1); coeffEBm -> SetLineColor(kBlue+1); coeffEBm->Draw("ap same"); theApp->Run(); return 0; }
int MakeTree(Float_t mySR = 105089){ TH1::SetDefaultSumw2(true); if(pcp)cout<<"going to set inputs"<<endl; TString mainDir = "/nfs/dust/cms/user/fcost/store/Bonsai/Optimization/"; const int NSamples = 5; TString sample[NSamples]; sample[0] = "T2tb"; sample[1] = "DiLep"; sample[2] = "OneLep"; sample[3] = "WJets"; sample[4] = "Rare"; std::vector<Float_t> SRs; SRs.push_back(mySR); TFile* cutFile = new TFile( "../1Step/"+sample[1]+"_optimization-1Step.root", "READ"); TTree* cutTree; cutFile->GetObject( "Optimization", cutTree); Float_t mtCut = 0.; Float_t nJetCut = 0.; Float_t topnessCut = 0.; Float_t mt2wCut = 0.; Float_t yCut = 0.; Float_t dphiCut = 0.; Float_t drlblCut = 0.; Float_t drlbgCut = 0.; Float_t chi2Cut = 0.; Float_t metCut = 0.; Float_t m3Cut = 0.; Float_t centralityCut = 0.; Float_t mlbCut = 0.; cutTree->SetBranchAddress( "mtCut", &mtCut); cutTree->SetBranchAddress( "nJetCut", &nJetCut); cutTree->SetBranchAddress( "topnessCut", &topnessCut); cutTree->SetBranchAddress( "mt2wCut", &mt2wCut); cutTree->SetBranchAddress( "yCut", &yCut); cutTree->SetBranchAddress( "dphiCut", &dphiCut); cutTree->SetBranchAddress( "drlblCut", &drlblCut); cutTree->SetBranchAddress( "drlbgCut", &drlbgCut); cutTree->SetBranchAddress( "chi2Cut", &chi2Cut); cutTree->SetBranchAddress( "metCut", &metCut); cutTree->SetBranchAddress( "m3Cut", &m3Cut); cutTree->SetBranchAddress( "centralityCut", ¢ralityCut); cutTree->SetBranchAddress( "mlbCut", &mlbCut); Float_t lumi=19500.; Float_t weight = 1.; ///////////////////////////////////////////////////// // Variable Definition ///////////////////////////////////////////////////// Float_t xs = 0.; Float_t globalWeight = 0.; Float_t FE = 0.; Float_t triggerWeight = 0.; Float_t puWeight = 0.; Float_t isrWeight = 0.; Float_t topPtWeight = 0.; Float_t lepFromTop = 0.; Float_t charginos = 0.; Float_t njets = 0.; Float_t jet1 = 0.; Float_t jet2 = 0.; Float_t jet3 = 0.; Float_t jet4 = 0.; Float_t nbjets = 0.; Float_t bjet1 = 0.; Float_t bjetHighestDisc = 0.; Float_t lPt = 0.; Float_t lEta = 0.; Float_t lRelIso = 0.; Float_t isoTrack = 0.; Float_t tauVeto = 0.; Float_t rawmet = 0.; Float_t typeImet = 0.; Float_t phiCorrMet = 0.; Float_t ht = 0.; Float_t htRatio = 0.; Float_t meff = 0.; Float_t y = 0.; Float_t mt = 0.; Float_t mlb1 = 0.; Float_t mlb = 0.; Float_t m3b = 0.; Float_t m3 = 0.; Float_t centrality = 0.; Float_t mt2w = 0.; Float_t hadChi2 = 0.; Float_t topness = 0.; Float_t dphimin = 0.; Float_t drlb1 = 0.; Float_t drlbmin = 0.; Float_t mStop = 0.; Float_t mLSP = 0.; Int_t pdgIdLep1 = 0; Char_t kinRegionFlag = false; Char_t searchRegionFlag = false; ///////////////////////////////////////////////////// // Input Definition ///////////////////////////////////////////////////// TFile* inFile[NSamples]; TTree* inTree[NSamples]; for (int iSample = 0; iSample < NSamples; iSample++){ TString inFileName = mainDir; inFileName += "/"; inFileName += sample[iSample]; inFileName +=".root"; inFile[iSample] = new TFile(inFileName,"READ"); inTree[iSample] = (TTree*)inFile[iSample]->Get("NoSystematic/bonsai"); inTree[iSample]->SetBranchAddress( "xs", &xs); inTree[iSample]->SetBranchAddress( "GlobalWeight", &globalWeight); inTree[iSample]->SetBranchAddress( "FE", &FE); inTree[iSample]->SetBranchAddress( "TriggerWeight", &triggerWeight); inTree[iSample]->SetBranchAddress( "PUWeight", &puWeight); inTree[iSample]->SetBranchAddress( "isrWeight", &isrWeight); inTree[iSample]->SetBranchAddress( "topPtWeight", &topPtWeight); inTree[iSample]->SetBranchAddress( "LepFromTop", &lepFromTop); inTree[iSample]->SetBranchAddress( "Charginos", &charginos); inTree[iSample]->SetBranchAddress( "njets", &njets); inTree[iSample]->SetBranchAddress( "jet1", &jet1); inTree[iSample]->SetBranchAddress( "jet2", &jet2); inTree[iSample]->SetBranchAddress( "jet3", &jet3); inTree[iSample]->SetBranchAddress( "jet4", &jet4); inTree[iSample]->SetBranchAddress( "nbjets", &nbjets); inTree[iSample]->SetBranchAddress( "bjet1", &bjet1); inTree[iSample]->SetBranchAddress( "bjetHighestDisc", &bjetHighestDisc); inTree[iSample]->SetBranchAddress( "lPt", &lPt); inTree[iSample]->SetBranchAddress( "lEta", &lEta); inTree[iSample]->SetBranchAddress( "lRelIso", &lRelIso); inTree[iSample]->SetBranchAddress( "phiCorrMet", &phiCorrMet); inTree[iSample]->SetBranchAddress( "ht", &ht); inTree[iSample]->SetBranchAddress( "htRatio", &htRatio); inTree[iSample]->SetBranchAddress( "meff", &meff); inTree[iSample]->SetBranchAddress( "y", &y); inTree[iSample]->SetBranchAddress( "mt", &mt); inTree[iSample]->SetBranchAddress( "mlb1", &mlb1); inTree[iSample]->SetBranchAddress( "mlb", &mlb); inTree[iSample]->SetBranchAddress( "m3b", &m3b); inTree[iSample]->SetBranchAddress( "m3", &m3); inTree[iSample]->SetBranchAddress( "centrality", ¢rality); inTree[iSample]->SetBranchAddress( "mt2w", &mt2w); inTree[iSample]->SetBranchAddress( "hadChi2", &hadChi2); inTree[iSample]->SetBranchAddress( "topness", &topness); inTree[iSample]->SetBranchAddress( "dphimin", &dphimin); inTree[iSample]->SetBranchAddress( "drlb1", &drlb1); inTree[iSample]->SetBranchAddress( "drlbmin", &drlbmin); inTree[iSample]->SetBranchAddress( "mStop", &mStop); inTree[iSample]->SetBranchAddress( "mLSP", &mLSP); inTree[iSample]->SetBranchAddress("pdgIdLep1",&pdgIdLep1); inTree[iSample]->SetBranchAddress("kinRegion",&kinRegionFlag); inTree[iSample]->SetBranchAddress("searchRegionPost",&searchRegionFlag); } ///////////////////////////////////////////////////// // Output Definition ///////////////////////////////////////////////////// TString outFileName = "MakeTree/"; outFileName += mySR; outFileName += ".root"; TFile* outFile = new TFile( outFileName, "RECREATE"); outFile->cd(); TTree* outTree = new TTree("Optimization", "Optimization subTree"); Int_t SR = 0; TH2F *tt = new TH2F( "tt", "tt",30,62.5,812.5, 15, -12.5, 362.5); TH2F *tb = new TH2F( "tb", "tb",30,62.5,812.5, 15, -12.5, 362.5); TH2F *bb = new TH2F( "bb", "bb",30,62.5,812.5, 15, -12.5, 362.5); TH2F *sig_tot = new TH2F( "sig_tot", "sig_tot",30,62.5,812.5, 15, -12.5, 362.5); Float_t bkg[NSamples - 1] = {}; Float_t bkg2[NSamples - 1] = {}; outTree->Branch( "SR", &SR, "SR/I"); outTree->Branch( "mtCut", &mtCut, "mtCut/F"); outTree->Branch( "njetCut", &nJetCut, "njetCut/F"); outTree->Branch( "topnessCut", &topnessCut, "topnessCut/F"); outTree->Branch( "mt2wCut", &mt2wCut, "mt2wCut/F"); outTree->Branch( "yCut", &yCut, "yCut/F"); outTree->Branch( "dphiCut", &dphiCut, "dphiCut/F"); outTree->Branch( "drlblCut", &drlblCut, "drlblCut/F"); outTree->Branch( "drlbgCut", &drlbgCut, "drlbgCut/F"); outTree->Branch( "chi2Cut", &chi2Cut, "chi2Cut/F"); outTree->Branch( "metCut", &metCut, "metCut/F"); outTree->Branch( "m3Cut", &m3Cut, "m3Cut/F"); outTree->Branch( "centralityCut", ¢ralityCut, "centralityCut/F"); outTree->Branch( "mlbCut", &mlbCut, "mlbCut/F"); outTree->Branch("tt","TH2F",&tt,32000,0); outTree->Branch("tb","TH2F",&tb,32000,0); outTree->Branch("bb","TH2F",&bb,32000,0); outTree->Branch("sig_tot","TH2F",&sig_tot,32000,0); outTree->Branch( "diLep", &bkg[0], "diLep/F"); outTree->Branch("oneLep", &bkg[1], "oneLep/F"); outTree->Branch( "wJets", &bkg[2], "wJets/F"); outTree->Branch( "rare", &bkg[3], "rare/F"); outTree->Branch( "diLep2", &bkg2[0], "diLep2/F"); outTree->Branch("oneLep2", &bkg2[1], "oneLep2/F"); outTree->Branch( "wJets2", &bkg2[2], "wJets2/F"); outTree->Branch( "rare2", &bkg2[3], "rare2/F"); ///////////////////////////////////////////////////// // Event Loop ///////////////////////////////////////////////////// for( int isr = 0; isr < (int) SRs.size(); isr++){ SR = SRs.at(isr); cutTree->GetEntry(SR); cout<<endl; cout<<"SR id "<<SR<<" "<<endl; cout<<"mtCut = "<<mtCut<<endl; cout<<"nJetCut = "<<nJetCut<<endl; cout<<"topnessCut = "<<topnessCut<<endl; cout<<"mt2wCut = "<<mt2wCut<<endl; cout<<"yCut = "<<yCut<<endl; cout<<"dphiCut = "<<dphiCut<<endl; cout<<"drlblCut = "<<drlblCut<<endl; cout<<"drlbgCut = "<<drlbgCut<<endl; cout<<"chi2Cut = "<<chi2Cut<<endl; cout<<"metCut = "<<metCut<<endl; cout<<"m3Cut = "<<mlbCut<<endl; cout<<"centralityCut = "<<centralityCut<<endl; cout<<"mlbCut = "<<mlbCut<<endl; tt->Reset(); tb->Reset(); bb->Reset(); for (int iSample = 1; iSample < NSamples; iSample++){ bkg[iSample-1] = 0.; bkg2[iSample-1] = 0.; } for (int iSample = 0; iSample < NSamples; iSample++){ Int_t N = inTree[iSample]->GetEntries(); ///////////////////////////////////////////////////// // Event Loop ///////////////////////////////////////////////////// for (int ievt=0;ievt<N;++ievt){ inTree[iSample]->GetEntry(ievt); weight = globalWeight * triggerWeight * puWeight * lumi; if (iSample < 0.001 ) { if (charginos < 0.001 && FE > 0.999) continue; weight *= isrWeight; } if (iSample < 2.001 && iSample > 0.999) weight *= topPtWeight; if (iSample < 0.001){ sig_tot->SetBinContent( sig_tot->FindBin(mStop, mLSP), xs * lumi); } if (lRelIso > 0.1) continue; if (!searchRegionFlag) continue; if (mt < mtCut) continue; if (njets < nJetCut) continue; if (topness < topnessCut) continue; if (mt2w < mt2wCut) continue; if (y < yCut) continue; if (dphimin < dphiCut) continue; if (drlb1 > drlblCut) continue; if (drlb1 < drlbgCut) continue; if (hadChi2 > chi2Cut) continue; if (phiCorrMet < metCut) continue; if (m3 < m3Cut) continue; if (centrality < centralityCut) continue; if (mlb > mlbCut) continue; if (iSample < 0.001){ if (charginos == 0) tt->Fill( mStop, mLSP, weight); if (charginos == 1) tb->Fill( mStop, mLSP, weight); if (charginos == 2) bb->Fill( mStop, mLSP, weight); } else{ bkg[iSample-1] += weight; bkg2[iSample-1] += weight * weight; } } } outTree->Fill(); } cout<<endl; outFile->cd(); outTree->Write(); outFile->Close(); for (int iSample = 0; iSample < NSamples; iSample++) inFile[iSample]->Close(); cutFile->Close(); return 0; }
void L1JetEmulator(TString forest_input = "/mnt/hadoop/cms/store/user/luck/L1Emulator/HydjetMB_502TeV_740pre8_MCHI2_74_V3_HiForestAndEmulator_v5.root", TString outFileName = "Hydjet502_JetResults.root") { std::cout << "Processing file: " << forest_input << std::endl; std::cout << "Saving to: " << outFileName << std::endl; L1EmulatorSimulator::cand regions[396]; // ************ this block makes regions out of towers const int nEta = 22; const int nPhi = 18; TChain *fTowerTree = new TChain("rechitanalyzer/tower","fTowerTree"); TChain *fEvtTree = new TChain("hiEvtAnalyzer/HiTree","fEvtTree"); fTowerTree->Add(forest_input); fEvtTree->Add(forest_input); TChain *l1Tree = new TChain("L1UpgradeAnalyzer/L1UpgradeTree","l1Tree"); l1Tree->Add(forest_input); TChain *fSkimTree = new TChain("skimanalysis/HltTree"); fSkimTree->Add(forest_input); Int_t l1_event, l1_run, l1_lumi; Int_t region_hwPtOriginal[396], region_hwEtaOriginal[396], region_hwPhiOriginal[396]; l1Tree->SetBranchAddress("event",&l1_event); l1Tree->SetBranchAddress("lumi",&l1_lumi); l1Tree->SetBranchAddress("run",&l1_run); l1Tree->SetBranchAddress("region_hwPt", region_hwPtOriginal); l1Tree->SetBranchAddress("region_hwEta", region_hwEtaOriginal); l1Tree->SetBranchAddress("region_hwPhi", region_hwPhiOriginal); Int_t f_evt, f_run, f_lumi,f_pcollisionEventSelection,f_pHBHENoiseFilter; fEvtTree->SetBranchAddress("evt",&f_evt); fEvtTree->SetBranchAddress("run",&f_run); fEvtTree->SetBranchAddress("lumi",&f_lumi); fSkimTree->SetBranchAddress("pcollisionEventSelection",&f_pcollisionEventSelection); fSkimTree->SetBranchAddress("pHBHENoiseFilter",&f_pHBHENoiseFilter); Int_t f_nTow = -1; Float_t f_eta[10000]; Float_t f_phi[10000]; Float_t f_et[10000]; fTowerTree->SetBranchAddress("eta" , &f_eta); fTowerTree->SetBranchAddress("phi" , &f_phi); fTowerTree->SetBranchAddress("et" , &f_et); fTowerTree->SetBranchAddress("n" , &f_nTow); Double_t rctEtaMap[23] = {-5.100, -4.500, -4.000, -3.500, -3.000, -2.172, -1.740, -1.392, -1.044, -0.696, -0.348, 0.000, 0.348, 0.696, 1.044, 1.392, 1.740, 2.172, 3.000, 3.500, 4.000, 4.500, 5.10}; Double_t rctPhiMap[20] = {-1*TMath::Pi(), -2.967060, -2.617990, -2.268930, -1.919860, -1.570800, -1.221730, -0.872665, -0.523599, -0.174533, 0.174533, 0.523599, 0.872665, 1.221730, 1.570800, 1.919860, 2.268930, 2.617990, 2.96706, TMath::Pi()}; TH2F* hFtmp = new TH2F("Ftmp", "F_tmp" , nEta , rctEtaMap, nPhi+1, rctPhiMap); TH2F* hFtmpReb = new TH2F("FtmpReb", "F_tmpReb", nEta , 0, nEta , nPhi , 0, nPhi); // ********************************************** TFile *outFile = TFile::Open(outFileName,"RECREATE"); TTree *outTree = new TTree("L1UpgradeTree","L1UpgradeTree"); Int_t run, lumi, evt,pcollisionEventSelection,pHBHENoiseFilter; Int_t region_hwPt_[396], region_hwPhi_[396], region_hwEta_[396]; Int_t region_hwPtOriginal_[396], region_hwPhiOriginal_[396], region_hwEtaOriginal_[396]; outTree->Branch("run",&run,"run/I"); outTree->Branch("lumi",&lumi,"lumi/I"); outTree->Branch("event",&evt,"event/I"); outTree->Branch("pcollisionEventSelection",&pcollisionEventSelection,"pcollisionEventSelection/I"); outTree->Branch("pHBHENoiseFilter",&pHBHENoiseFilter,"pHBHENoiseFilter/I"); outTree->Branch("region_hwPt",region_hwPt_,"region_hwPt[396]/I"); outTree->Branch("region_hwPhi",region_hwPhi_,"region_hwPhi[396]/I"); outTree->Branch("region_hwEta",region_hwEta_,"region_hwEta[396]/I"); outTree->Branch("region_hwPtOriginal",region_hwPtOriginal_,"region_hwPtOriginal[396]/I"); outTree->Branch("region_hwPhiOriginal",region_hwPhiOriginal_,"region_hwPhiOriginal[396]/I"); outTree->Branch("region_hwEtaOriginal",region_hwEtaOriginal_,"region_hwEtaOriginal[396]/I"); Long64_t l_entries = fTowerTree->GetEntries(); for(Long64_t j = 0; j < l_entries; ++j) { fTowerTree->GetEntry(j); fEvtTree->GetEntry(j); l1Tree->GetEntry(j); for (int i=0;i<396;i++){ region_hwPtOriginal_[i]=region_hwPtOriginal[i]; region_hwPhiOriginal_[i]=region_hwPhiOriginal[i]; region_hwEtaOriginal_[i]=region_hwEtaOriginal[i]; } run = f_run; evt = f_evt; lumi = f_lumi; pcollisionEventSelection=(int)(f_pcollisionEventSelection); pHBHENoiseFilter=(int)(f_pHBHENoiseFilter); for(int itow = 0; itow < f_nTow; ++itow) { hFtmp->Fill(f_eta[itow], f_phi[itow], f_et[itow]); } for(int ieta = 0; ieta < nEta; ++ieta) { double content = 0.; for(int iphi = 0; iphi < nPhi; ++iphi) { if(iphi == 0 ) content = hFtmp->GetBinContent(ieta+1,1) + hFtmp->GetBinContent(ieta+1,19); else content = hFtmp->GetBinContent(ieta+1,iphi+1); if(iphi < 9) hFtmpReb->SetBinContent(ieta+1, iphi+10, content); else if(iphi >= 9 && iphi < 18) hFtmpReb->SetBinContent(ieta+1, iphi-8, content); } } int nReg = 0; for(int ieta = 0; ieta < nEta; ++ieta) { for(int iphi = 0; iphi < nPhi; ++iphi) { regions[nReg].pt = hFtmpReb->GetBinContent(ieta+1, iphi+1) * 2.0; regions[nReg].eta = ieta; regions[nReg].phi = iphi; region_hwPt_[nReg] = regions[nReg].pt; region_hwEta_[nReg] = regions[nReg].eta; region_hwPhi_[nReg] = regions[nReg].phi; nReg++; } } hFtmpReb->Reset(); hFtmp->Reset(); outTree->Fill(); } outTree->Write(); //lFile->Close(); outFile->Close(); }
void PlotPhaseSpace2D( const TString &sim, Int_t time, UInt_t index = 0, const TString &phaname = "p1x1", const TString &options="") { PlasmaGlob::Initialize(); TString opt = options; // Palettes! gROOT->Macro("PlasmaPalettes.C"); if(opt.Contains("grid")) { gStyle->SetPadGridX(1); gStyle->SetPadGridY(1); } gStyle->SetPadRightMargin(0.20); // Margin for palettes in 2D histos gStyle->SetLabelFont(42,"xyz"); // Load PData PData *pData = PData::Get(sim.Data()); pData->LoadFileNames(time); if(!pData->IsInit()) return; Bool_t CYL = kFALSE; if(sim.Contains("cyl")) CYL = kTRUE; Bool_t ThreeD = kFALSE; if(sim.Contains("3D")) ThreeD = kTRUE; // Some plasma constants Double_t n0 = pData->GetPlasmaDensity(); Double_t kp = pData->GetPlasmaK(); Double_t skindepth = 1.; if(kp!=0.0) skindepth = 1/kp; Double_t E0 = pData->GetPlasmaE0(); // Some beam properties: Float_t Ebeam = pData->GetBeamEnergy() * PUnits::MeV; Float_t gamma = Ebeam / PConst::ElectronMassE; Float_t vbeam = TMath::Sqrt(1 - 1/(gamma*gamma)); // cout << Form(" - Bunch gamma = %8.4f", gamma ) << endl; // cout << Form(" - Bunch velocity = %8.4f c", vbeam ) << endl; // Time in OU Float_t Time = pData->GetRealTime(); // z start of the plasma in normalized units. Float_t zStartPlasma = pData->GetPlasmaStart()*kp; // z start of the beam in normalized units. Float_t zStartBeam = pData->GetBeamStart()*kp; if(opt.Contains("center")) { Time -= zStartPlasma; if(opt.Contains("comov")) // Centers on the head of the beam. Time += zStartBeam; } // Labeling... char xname[24]; char yname[24]; if(phaname.Contains("p1x1")) { sprintf(xname,"z"); sprintf(yname,"p_{z}"); } else if(phaname.Contains("p2x2")) { sprintf(xname,"y"); sprintf(yname,"p_{y}"); } char xunits[24]; char yunits[24]; if(opt.Contains("units")) { sprintf(xunits,"#mum"); sprintf(yunits,"MeV/c"); } else { sprintf(xunits,"c/#omega_{p}"); sprintf(yunits,"m_{e}/c"); } char xaxisname[24]; char yaxisname[24]; sprintf(xaxisname,"%s [%s]",xname,xunits); sprintf(yaxisname,"%s [%s]",yname,yunits); // Get charge density histos UInt_t Nspecies = pData->NSpecies(); TH2F *hPha2D = NULL; for(UInt_t i=0;i<Nspecies;i++) { if(i!=index) continue; for(UInt_t j=0;j<pData->NPhaseSpaces();j++) { if(!pData->GetPhasespaceFileName(i,j)) continue; if(!strcmp(phaname.Data(),pData->GetPhasespaceName(j).c_str())) { char hName[24]; sprintf(hName,"hPha_%i_%s",i,phaname.Data()); hPha2D = (TH2F*) gROOT->FindObject(hName); if(hPha2D) delete hPha2D; hPha2D = pData->GetPhasespace(i,j,opt); hPha2D->SetName(hName); continue; } } hPha2D->GetXaxis()->CenterTitle(); hPha2D->GetYaxis()->CenterTitle(); hPha2D->GetZaxis()->CenterTitle(); hPha2D->GetXaxis()->SetTitle(xaxisname); hPha2D->GetYaxis()->SetTitle(yaxisname); if(i==0) hPha2D->GetZaxis()->SetTitle("#LTn_{e}#GT [n_{0}]"); else hPha2D->GetZaxis()->SetTitle("#LTn_{b}#GT [n_{0}]"); } // Emittance and others // we assume that longitudinal variable is comoving for the range. Double_t xMin = 15.0; Double_t xMax = 35.0; Double_t yMin = 1500.0; Double_t yMax = 2400.0; UInt_t NBINX = hPha2D->GetNbinsX(); UInt_t NBINY = hPha2D->GetNbinsY(); Double_t dx = hPha2D->GetXaxis()->GetBinWidth(1); Double_t dy = hPha2D->GetYaxis()->GetBinWidth(1); Double_t xmean = 0.0; Double_t ymean = 0.0; Double_t xmean2 = 0.0; Double_t ymean2 = 0.0; Double_t xymean = 0.0; Double_t Ntotal = 0.0; for(UInt_t i=1;i<=NBINX;i++) { Double_t x = hPha2D->GetXaxis()->GetBinCenter(i); // if(x<xMin || x>xMax) continue; for(UInt_t j=1;j<=NBINY;j++) { Double_t y = hPha2D->GetYaxis()->GetBinCenter(j); // if(y<yMin || y>yMax) continue; Double_t value = TMath::Abs(hPha2D->GetBinContent(i,j)); xmean += x*value; ymean += y*value; xmean2 += x*x*value; ymean2 += y*y*value; xymean += x*y*value; Ntotal += value; } } // hPha2D->GetXaxis()->SetRangeUser(xMin,xMax); // hPha2D->GetYaxis()->SetRangeUser(yMin,yMax); xmean /= Ntotal; ymean /= Ntotal; xmean2 /= Ntotal; ymean2 /= Ntotal; xymean /= Ntotal; Double_t xrms2 = xmean2 - xmean*xmean; Double_t yrms2 = ymean2 - ymean*ymean; Double_t xyrms2 = xymean - xmean*ymean; Double_t xrms = TMath::Sqrt(xrms2); Double_t yrms = TMath::Sqrt(yrms2); Double_t xyrms = TMath::Sqrt(xyrms2); Double_t emittance = TMath::Sqrt( xrms2*yrms2 - xyrms2); cout << " Bunch properties: " << endl; cout << Form(" xMean = %7.3f yMean = %7.3f",xmean,ymean) << endl; cout << Form(" xRms = %7.3f yRms = %7.3f",xrms,yrms) << endl; cout << Form(" Emittance = %7.3f",emittance) << endl; // Set palette: PPalette * pPalette = (PPalette*) gROOT->FindObject("electron0"); Float_t Max = hPha2D->GetMaximum(); Float_t Min = hPha2D->GetMinimum(); hPha2D->GetZaxis()->SetRangeUser(Min,Max); // Plotting // ----------------------------------------------- // Canvas setup TCanvas *C; if(opt.Contains("hres") && !opt.Contains("pdf")) // high resolution for plain grahics output. C = new TCanvas("C","2D Phasespace",1000,625); else C = new TCanvas("C","2D Phasespace",800,500); // Text objects TPaveText *textTime = new TPaveText(0.50,0.85,0.77,0.9,"NDC"); PlasmaGlob::SetPaveTextStyle(textTime,32); char ctext[128]; if(opt.Contains("units") && pData->GetPlasmaDensity()) sprintf(ctext,"Z = %5.1f mm", 1e3 * pData->GetPlasmaSkinDepth() * Time); else sprintf(ctext,"T = %5.1f #omega_{p}^{-1}",Time); textTime->AddText(ctext); TPaveText *textDen = new TPaveText(0.15,0.85,0.48,0.9,"NDC"); PlasmaGlob::SetPaveTextStyle(textDen,12); textDen->SetTextColor(kOrange+10); if(opt.Contains("units") && pData->GetPlasmaDensity()) sprintf(ctext,"n_{0} = %5.2f x 10^{15} / cc", 1e-6 * 1e-15 * pData->GetPlasmaDensity()); else if(pData->GetBeamDensity() && pData->GetPlasmaDensity()) sprintf(ctext,"n_{b}/n_{0} = %5.2f", pData->GetBeamDensity()/pData->GetPlasmaDensity()); textDen->AddText(ctext); TPaveText *textWav = new TPaveText(0.15,0.85,0.48,0.9,"NDC"); PlasmaGlob::SetPaveTextStyle(textWav,12); textWav->SetTextColor(kGray+2); sprintf(ctext,"#lambda_{p} = %5.3f mm", 1e3 * pData->GetPlasmaWaveLength()); textWav->AddText(ctext); TPaveText *textEmit = new TPaveText(0.50,0.65,0.77,0.80,"NDC"); PlasmaGlob::SetPaveTextStyle(textEmit,32); textEmit->SetTextColor(kGray+1); sprintf(ctext,"#LT%s#GT_{rms} = %5.3f %s",xname,xrms,xunits); textEmit->AddText(ctext); sprintf(ctext,"#LT%s#GT_{rms} = %5.3f %s",yname,yrms,yunits); textEmit->AddText(ctext); sprintf(ctext,"#epsilon_{N} = %5.3f #mum",emittance); textEmit->AddText(ctext); // Actual Plotting! // ------------------------------------------------------------ // Output file TString fOutName = Form("./%s/Plots/Phase2D-%s/Phase2D-%s",sim.Data(),phaname.Data(),phaname.Data()); fOutName += Form("-%s_%i",sim.Data(),time); C->cd(); gPad->SetFrameLineWidth(3); TH2F *hFrame = (TH2F*) gROOT->FindObject("hFrame1"); if(hFrame) delete hFrame; hFrame = (TH2F*) hPha2D->Clone("hFrame1"); hFrame->Reset(); hFrame->Draw("col"); hPha2D->Draw("colz same"); gPad->Update(); textTime->Draw(); textDen->Draw(); if(opt.Contains("units")) textWav->Draw(); textEmit->Draw(); gPad->RedrawAxis(); C->cd(); // Print to a file PlasmaGlob::imgconv(C,fOutName,opt); // --------------------------------------------------------- }
void PlotField2D( const TString &sim, Int_t time, Int_t index = 0, Int_t zoom=2, const TString &options="") { PlasmaGlob::Initialize(); TString opt = options; // Palettes! gROOT->Macro("PlasmaPalettes.C"); if(opt.Contains("grid")) { gStyle->SetPadGridX(1); gStyle->SetPadGridY(1); } gStyle->SetPadRightMargin(0.20); // Margin for palettes in 2D histos gStyle->SetLabelFont(42,"xyz"); // Load PData PData *pData = PData::Get(sim.Data()); pData->LoadFileNames(time); if(!pData->IsInit()) return; Bool_t CYL = kFALSE; if(sim.Contains("cyl")) CYL = kTRUE; Bool_t ThreeD = kFALSE; if(sim.Contains("3D")) ThreeD = kTRUE; // Some plasma constants Double_t n0 = pData->GetPlasmaDensity(); Double_t kp = pData->GetPlasmaK(); Double_t skindepth = 1.; if(kp!=0.0) skindepth = 1/kp; Double_t E0 = pData->GetPlasmaE0(); // Some beam properties: Float_t Ebeam = pData->GetBeamEnergy() * PUnits::MeV; Float_t gamma = Ebeam / PConst::ElectronMassE; Float_t vbeam = TMath::Sqrt(1 - 1/(gamma*gamma)); // cout << Form(" - Bunch gamma = %8.4f", gamma ) << endl; // cout << Form(" - Bunch velocity = %8.4f c", vbeam ) << endl; // Time in OU Float_t Time = pData->GetRealTime(); // z start of the plasma in normalized units. Float_t zStartPlasma = pData->GetPlasmaStart()*kp; // z start of the beam in normalized units. Float_t zStartBeam = pData->GetBeamStart()*kp; if(opt.Contains("center")) { Time -= zStartPlasma; if(opt.Contains("comov")) // Centers on the head of the beam. Time += zStartBeam; } // Get field histos const Int_t Nfields = 3; TH2F **hE2D = new TH2F*[Nfields]; for(Int_t i=0;i<Nfields;i++) { hE2D[i] = NULL; if(i!=index) continue; if(!pData->GetEfieldFileName(i)) continue; char hName[24]; sprintf(hName,"hE2D_%i",i); hE2D[i] = (TH2F*) gROOT->FindObject(hName); if(hE2D[i]) delete hE2D[i]; if(!ThreeD) hE2D[i] = pData->GetEField(i,opt); else hE2D[i] = pData->GetEField2DSliceZY(i,-1,1); hE2D[i]->SetName(hName); hE2D[i]->GetXaxis()->CenterTitle(); hE2D[i]->GetYaxis()->CenterTitle(); hE2D[i]->GetZaxis()->CenterTitle(); if(opt.Contains("comov")) hE2D[i]->GetXaxis()->SetTitle("#zeta [c/#omega_{p}]"); else hE2D[i]->GetXaxis()->SetTitle("z [c/#omega_{p}]"); if(CYL) hE2D[i]->GetYaxis()->SetTitle("r [c/#omega_{p}]"); else hE2D[i]->GetYaxis()->SetTitle("y [c/#omega_{p}]"); if(i==0) hE2D[i]->GetZaxis()->SetTitle("E_{z} [E_{0}]"); else if(i==1) hE2D[i]->GetZaxis()->SetTitle("E_{y} [E_{0}]"); else if(i==2) hE2D[i]->GetZaxis()->SetTitle("E_{x} [E_{0}]"); } // Tunning the Histograms // --------------------- // Chaning to user units: // -------------------------- if(opt.Contains("units") && n0) { for(Int_t i=0;i<Nfields;i++) { if(i!=index) continue; Int_t NbinsX = hE2D[i]->GetNbinsX(); Float_t xMin = skindepth * hE2D[i]->GetXaxis()->GetXmin() / PUnits::mm; Float_t xMax = skindepth * hE2D[i]->GetXaxis()->GetXmax() / PUnits::mm; Int_t NbinsY = hE2D[i]->GetNbinsY(); Float_t yMin = skindepth * hE2D[i]->GetYaxis()->GetXmin() / PUnits::mm; Float_t yMax = skindepth * hE2D[i]->GetYaxis()->GetXmax() / PUnits::mm; hE2D[i]->SetBins(NbinsX,xMin,xMax,NbinsY,yMin,yMax); for(Int_t j=0;j<hE2D[i]->GetNbinsX();j++) { for(Int_t k=0;k<hE2D[i]->GetNbinsY();k++) { hE2D[i]->SetBinContent(j,k, hE2D[i]->GetBinContent(j,k) * ( E0 / (PUnits::GV/PUnits::m) ) ); } } if(CYL) hE2D[i]->GetYaxis()->SetTitle("r [mm]"); else hE2D[i]->GetYaxis()->SetTitle("y [mm]"); if(opt.Contains("comov")) hE2D[i]->GetXaxis()->SetTitle("#zeta [mm]"); else hE2D[i]->GetXaxis()->SetTitle("z [mm]"); if(i==0) hE2D[i]->GetZaxis()->SetTitle("E_{z} [GV/m]"); else if(i==1) hE2D[i]->GetZaxis()->SetTitle("E_{y} [GV/m]"); else if(i==2) hE2D[i]->GetZaxis()->SetTitle("E_{x} [GV/m]"); } } // Change the range of z axis for the fields to be symmetric. Float_t Emax = hE2D[index]->GetMaximum(); Float_t Emin = hE2D[index]->GetMinimum(); if(Emax > TMath::Abs(Emin)) Emin = -Emax; else Emax = -Emin; hE2D[index]->GetZaxis()->SetRangeUser(Emin,Emax); // Plotting // ----------------------------------------------- // Canvas setup TCanvas *C; if(opt.Contains("hres") && !opt.Contains("pdf")) // high resolution for plain grahics output. C = new TCanvas("C","2D Electric field",1000,625); else C = new TCanvas("C","2D Electric field",800,500); // Palettes setup TExec *exField = new TExec("exField","rbowgrayPalette->cd();"); // Text objects TPaveText *textTime = new TPaveText(0.50,0.85,0.77,0.9,"NDC"); PlasmaGlob::SetPaveTextStyle(textTime,32); char ctext[128]; if(opt.Contains("units") && pData->GetPlasmaDensity()) sprintf(ctext,"Z = %5.1f mm", 1e3 * pData->GetPlasmaSkinDepth() * Time); else sprintf(ctext,"T = %5.1f #omega_{p}^{-1}",Time); textTime->AddText(ctext); TPaveText *textDen = new TPaveText(0.15,0.85,0.48,0.9,"NDC"); PlasmaGlob::SetPaveTextStyle(textDen,12); textDen->SetTextColor(kOrange+10); if(opt.Contains("units") && pData->GetPlasmaDensity()) sprintf(ctext,"n_{0} = %5.2f x 10^{15} / cc", 1e-6 * 1e-15 * pData->GetPlasmaDensity()); else if(pData->GetBeamDensity() && pData->GetPlasmaDensity()) sprintf(ctext,"n_{b}/n_{0} = %5.2f", pData->GetBeamDensity()/pData->GetPlasmaDensity()); textDen->AddText(ctext); TPaveText *textWav = new TPaveText(0.12,0.78,0.45,0.83,"NDC"); PlasmaGlob::SetPaveTextStyle(textWav,12); textWav->SetTextColor(kGray+2); sprintf(ctext,"#lambda_{p} = %5.3f mm", 1e3 * pData->GetPlasmaWaveLength()); textWav->AddText(ctext); // Actual Plotting! // ------------------------------------------------------------ // Output file TString fOutName = Form("./%s/Plots/Field2D/Field2D",sim.Data()); fOutName += Form("-%s_%i",sim.Data(),time); C->cd(); gPad->SetFrameLineWidth(3); TH2F *hFrame = (TH2F*) gROOT->FindObject("hFrame1"); if(hFrame) delete hFrame; hFrame = (TH2F*) hE2D[index]->Clone("hFrame1"); hFrame->Reset(); hFrame->Draw("col"); exField->Draw(); hE2D[index]->Draw("colz same"); gPad->Update(); textTime->Draw(); textDen->Draw(); if(opt.Contains("units")) textWav->Draw(); gPad->RedrawAxis(); C->cd(); // Print to a file PlasmaGlob::imgconv(C,fOutName,opt); // --------------------------------------------------------- }
void PlotPotential2D( const TString &sim, Int_t time, Int_t zoom=2, Int_t Nbins=2, const TString &options="") { #ifdef __CINT__ gSystem->Load("libplasma.so"); #endif PlasmaGlob::Initialize(); // Palettes! gROOT->Macro("PlasmaPalettes.C"); // Init Units table PUnits::UnitsTable::Get(); // Load PData PData *pData = PData::Get(sim.Data()); pData->LoadFileNames(time); if(!pData->IsInit()) return; TString opt = options; // More makeup gStyle->SetPadGridY(0); if(opt.Contains("gridx")) { gStyle->SetPadGridX(1); } if(opt.Contains("gridy")) { gStyle->SetPadGridY(1); } // Some plasma constants Double_t n0 = pData->GetPlasmaDensity(); Double_t omegap = pData->GetPlasmaFrequency(); Double_t timedepth = 1.; if(omegap!=0.0) timedepth = 1/omegap; Double_t kp = pData->GetPlasmaK(); Double_t skindepth = 1.; if(kp!=0.0) skindepth = 1/kp; Double_t E0 = pData->GetPlasmaE0(); // Some beam properties: Double_t Ebeam = pData->GetBeamEnergy(); Double_t gamma = pData->GetBeamGamma(); Double_t vbeam = pData->GetBeamVelocity(); cout << Form(" - Bunch gamma = %8.4f", gamma ) << endl; cout << Form(" - Bunch velocity = %8.4f c", vbeam ) << endl; // Other parameters Float_t trapPotential = 1.0 - (1.0/gamma); cout << Form(" - Trap. potential = %8.4f mc2/e",trapPotential) << endl; cout << endl; // Time in OU Float_t Time = pData->GetRealTime(); // z start of the plasma in normalized units. Float_t zStartPlasma = pData->GetPlasmaStart()*kp; // z start of the beam in normalized units. Float_t zStartBeam = pData->GetBeamStart()*kp; // z start of the neutral in normalized units. Float_t zStartNeutral = pData->GetNeutralStart()*kp; // z end of the neutral in normalized units. Float_t zEndNeutral = pData->GetNeutralEnd()*kp; if(opt.Contains("center")) { Time -= zStartPlasma; if(opt.Contains("comov")) // Centers on the head of the beam. Time += zStartBeam; } Float_t shiftz = pData->Shift(opt); // cout << "Shift = " << shiftz << endl; // Calculate the "axis range" in number of bins. If Nbins==0 a RMS width is taken. Double_t rms0 = pData->GetBeamRmsY() * kp; if(pData->IsCyl()) rms0 = pData->GetBeamRmsR() * kp; Int_t FirstyBin = 0; Int_t LastyBin = 0; if(Nbins==0) { if(rms0>0.0) Nbins = TMath::Nint(rms0 / pData->GetDX(1)); else Nbins = 1; } // Slice width limits. if(!pData->IsCyl()) { FirstyBin = pData->GetNX(1)/2 + 1 - Nbins; LastyBin = pData->GetNX(1)/2 + Nbins; } else { FirstyBin = 1; LastyBin = Nbins; } // ---------------------------------------------------------------------------------- // Get charge density histos Int_t Nspecies = pData->NSpecies(); TH2F **hDen2D = new TH2F*[Nspecies]; // Get charge density on-axis TH1F **hDen1D = new TH1F*[Nspecies]; // And electric current (integrated) TH1F **hCur1D = new TH1F*[Nspecies]; for(Int_t i=0; i<Nspecies; i++) { hDen2D[i] = NULL; if(!pData->GetChargeFileName(i)) continue; cout << Form(" Getting charge density of specie: ") << i << endl; char hName[24]; sprintf(hName,"hDen2D_%i",i); hDen2D[i] = (TH2F*) gROOT->FindObject(hName); if(hDen2D[i]) delete hDen2D[i]; if(!pData->Is3D()) hDen2D[i] = pData->GetCharge(i,opt); else hDen2D[i] = pData->GetCharge2DSliceZY(i,-1,Nbins,opt+"avg"); hDen2D[i]->SetName(hName); hDen2D[i]->GetXaxis()->CenterTitle(); hDen2D[i]->GetYaxis()->CenterTitle(); hDen2D[i]->GetZaxis()->CenterTitle(); if(opt.Contains("comov")) hDen2D[i]->GetXaxis()->SetTitle("k_{p} #zeta"); else hDen2D[i]->GetXaxis()->SetTitle("k_{p} z"); if(pData->IsCyl()) hDen2D[i]->GetYaxis()->SetTitle("k_{p} r"); else hDen2D[i]->GetYaxis()->SetTitle("k_{p} y"); hDen2D[i]->GetZaxis()->SetTitle("n [n_{0}]"); hDen1D[i] = NULL; hCur1D[i] = NULL; if(!pData->GetEfieldFileName(i)) continue; sprintf(hName,"hDen1D_%i",i); hDen1D[i] = (TH1F*) gROOT->FindObject(hName); if(hDen1D[i]) delete hDen1D[i]; // 1D histograms if(pData->Is3D()) { hDen1D[i] = pData->GetH1SliceZ3D(pData->GetChargeFileName(i)->c_str(),"charge",-1,Nbins,-1,Nbins,opt+"avg"); } else if(pData->IsCyl()) { // Cylindrical: The first bin with r>0 is actually the number 1 (not the 0). hDen1D[i] = pData->GetH1SliceZ(pData->GetChargeFileName(i)->c_str(),"charge",1,Nbins,opt+"avg"); } else { // 2D cartesian hDen1D[i] = pData->GetH1SliceZ(pData->GetChargeFileName(i)->c_str(),"charge",-1,Nbins,opt+"avg"); } hDen1D[i]->SetName(hName); // if(hDen1D[i]) delete hDen1D[i]; // hDen1D[i] = (TH1F*) hE2D[i]->ProjectionX(hName,FirstyBin,LastyBin); // hDen1D[i]->Scale(1.0/(LastyBin-FirstyBin+1)); if(opt.Contains("comov")) hDen1D[i]->GetXaxis()->SetTitle("#zeta [c/#omega_{p}]"); else hDen1D[i]->GetXaxis()->SetTitle("z [c/#omega_{p}]"); if(i==0) hDen1D[i]->GetYaxis()->SetTitle("n/n_{0}"); else if(i==1) hDen1D[i]->GetYaxis()->SetTitle("n_{b}/n_{0}"); else hDen1D[i]->GetYaxis()->SetTitle("n_{i}/n_{0}"); // Get the current: if(i==0) continue; sprintf(hName,"hCur1D_%i",i); hCur1D[i] = (TH1F*) gROOT->FindObject(hName); if(hCur1D[i]) delete hCur1D[i]; if(opt.Contains("curr")) { // To get the current is needed to read in a wider transverse range which includes all the charge. Int_t NbinsT = 100; if(pData->Is3D()) { hCur1D[i] = pData->GetH1SliceZ3D(pData->GetChargeFileName(i)->c_str(),"charge",-1,NbinsT,-1,NbinsT,opt+"int"); } else if(pData->IsCyl()) { // Cylindrical: The first bin with r>0 is actually the number 1 (not the 0). hCur1D[i] = pData->GetH1SliceZ(pData->GetChargeFileName(i)->c_str(),"charge",1,NbinsT,opt+"int"); } else { // 2D cartesian hCur1D[i] = pData->GetH1SliceZ(pData->GetChargeFileName(i)->c_str(),"charge",-1,NbinsT,opt+"int"); } hCur1D[i]->SetName(hName); if(opt.Contains("comov")) { hCur1D[i]->GetXaxis()->SetTitle("#zeta [c/#omega_{p}]"); hCur1D[i]->GetYaxis()->SetTitle("dn/d#zeta [(n_{0}/k_{p}^{3}) (#omega_{p}/c)]"); } else { hCur1D[i]->GetXaxis()->SetTitle("z [c/#omega_{p}]"); hCur1D[i]->GetYaxis()->SetTitle("dn/dz [(n_{0}/k_{p}^{3}) (#omega_{p}/c)]"); } Int_t NB = hCur1D[i]->GetNbinsX(); Float_t dx = (hCur1D[i]->GetBinLowEdge(1)-hCur1D[i]->GetBinLowEdge(NB+1))/NB; // hCur1D[i]->Scale(dx); Float_t Charge = hCur1D[i]->Integral() * dx; cout << Form(" Integrated charge of specie %3i = %8.4f n0 * kp^-3",i,Charge) << endl; } } // Get electric fields 2D const Int_t Nfields = 3; TH2F **hE2D = new TH2F*[Nfields]; TH1F **hE1D = new TH1F*[Nfields]; TH2F *hV2D = NULL; TH1F *hV1D = NULL; for(Int_t i=0; i<Nfields; i++) { hE2D[i] = NULL; hE1D[i] = NULL; if(!pData->GetEfieldFileName(i)) continue; cout << Form(" Getting electric field number ") << i+1 << endl; char hName[24]; sprintf(hName,"hE2D_%i",i); hE2D[i] = (TH2F*) gROOT->FindObject(hName); if(hE2D[i]) delete hE2D[i]; if(!pData->Is3D()) hE2D[i] = pData->GetEField(i,opt); else hE2D[i] = pData->GetEField2DSliceZY(i,-1,Nbins,opt+"avg"); hE2D[i]->SetName(hName); hE2D[i]->GetXaxis()->CenterTitle(); hE2D[i]->GetYaxis()->CenterTitle(); hE2D[i]->GetZaxis()->CenterTitle(); if(opt.Contains("comov")) hE2D[i]->GetXaxis()->SetTitle("k_{p} #zeta"); else hE2D[i]->GetXaxis()->SetTitle("k_{p} z"); if(pData->IsCyl()) hE2D[i]->GetYaxis()->SetTitle("k_{p} r"); else hE2D[i]->GetYaxis()->SetTitle("k_{p} y"); if(i==0) hE2D[i]->GetZaxis()->SetTitle("E_{z}/E_{0}"); else if(i==1) hE2D[i]->GetZaxis()->SetTitle("E_{y}/E_{0}"); else if(i==2) hE2D[i]->GetZaxis()->SetTitle("E_{x}/E_{0}"); sprintf(hName,"hE1D_%i",i); hE1D[i] = (TH1F*) gROOT->FindObject(hName); if(hE1D[i]) delete hE1D[i]; // 1D histograms char nam[3]; sprintf(nam,"e%i",i+1); if(pData->Is3D()) { if(i==0) hE1D[i] = pData->GetH1SliceZ3D(pData->GetEfieldFileName(i)->c_str(),nam,-1,Nbins,-1,Nbins,opt+"avg"); else hE1D[i] = pData->GetH1SliceZ3D(pData->GetEfieldFileName(i)->c_str(),nam,-Nbins,Nbins,-Nbins,Nbins,opt+"avg"); } else if(pData->IsCyl()) { // Cylindrical: The first bin with r>0 is actually the number 1 (not the 0). hE1D[i] = pData->GetH1SliceZ(pData->GetEfieldFileName(i)->c_str(),nam,1,Nbins,opt+"avg"); } else { // 2D cartesian if(i==0) hE1D[i] = pData->GetH1SliceZ(pData->GetEfieldFileName(i)->c_str(),nam,-1,Nbins,opt+"avg"); else hE1D[i] = pData->GetH1SliceZ(pData->GetEfieldFileName(i)->c_str(),nam,-Nbins,Nbins,opt+"avg"); } hE1D[i]->SetName(hName); if(opt.Contains("comov")) hE1D[i]->GetXaxis()->SetTitle("#zeta [c/#omega_{p}]"); else hE1D[i]->GetXaxis()->SetTitle("z [c/#omega_{p}]"); if(i==0) hE1D[i]->GetYaxis()->SetTitle("E_{z} [E_{0}]"); else if(i==1) hE1D[i]->GetYaxis()->SetTitle("E_{y} [E_{0}]"); else if(i==2) hE1D[i]->GetYaxis()->SetTitle("E_{x} [E_{0}]"); // Alternative // if(hE1D[i]) delete hE1D[i]; // hE1D[i] = (TH1F*) hE2D[i]->ProjectionX(hName,FirstyBin,LastyBin); // hE1D[i]->Scale(1.0/(LastyBin-FirstyBin+1)); if(i==0) { Int_t NbinsX = hE2D[i]->GetNbinsX(); Int_t NbinsY = hE2D[i]->GetNbinsY(); Float_t dx = pData->GetDX(0); sprintf(hName,"hV2D"); hV2D = (TH2F*) hE2D[i]->Clone(hName); hV2D->Reset(); sprintf(hName,"hV1D"); hV1D = (TH1F*) hE1D[i]->Clone(hName); hV1D->Reset(); for(Int_t j=NbinsY; j>0; j--) { Double_t integral = 0.0; for(Int_t k=NbinsX; k>0; k--) { integral += hE2D[i]->GetBinContent(k,j) * dx; hV2D->SetBinContent(k,j,integral); } } Double_t integral = 0.0; for(Int_t k=NbinsX; k>0; k--) { integral += hE1D[i]->GetBinContent(k) * dx; hV1D->SetBinContent(k,integral); } } } // Now, combine the electric field components into the total |E| // and calculate ionization probability for He: // Outter Helium electron Double_t Eion0 = 24.59 * PUnits::eV; Double_t Z = 1; TH2F *hETotal2D = (TH2F*) hE2D[0]->Clone("hETotal2D"); hETotal2D->Reset(); TH2F *hIonProb2D = (TH2F*) hE2D[0]->Clone("hIonProb2D"); hIonProb2D->Reset(); TH1F *hETotal1D = (TH1F*) hE1D[0]->Clone("hETotal1D"); hETotal1D->Reset(); TH1F *hIonProb1D = (TH1F*) hE1D[0]->Clone("hIonProb1D"); hIonProb1D->Reset(); { Int_t NbinsX = hE2D[0]->GetNbinsX(); Int_t NbinsY = hE2D[0]->GetNbinsY(); for(Int_t j=0; j<NbinsX; j++) { for(Int_t k=0; k<NbinsY; k++) { Double_t E1 = hE2D[0]->GetBinContent(j,k); Double_t E2 = hE2D[1]->GetBinContent(j,k); Double_t E3 = hE2D[2]->GetBinContent(j,k); Double_t E = TMath::Sqrt(E1*E1+E2*E2+E3*E3); hETotal2D->SetBinContent(j,k,E); E *= E0; // Double_t IonProb = (PFunc::ADK(E,Eion0,Z,l,m)/PUnits::atomictime)*PUnits::femtosecond; Double_t IonProb = PFunc::ADK_ENG(E,Eion0,Z) * PUnits::femtosecond; // if(IonProb>1) IonProb = 1.0; // cout << "Ion prob = " << IonProb << endl; hIonProb2D->SetBinContent(j,k,IonProb); } Double_t E1 = hE1D[0]->GetBinContent(j); Double_t E2 = hE1D[1]->GetBinContent(j); Double_t E3 = hE1D[2]->GetBinContent(j); Double_t E = TMath::Sqrt(E1*E1+E2*E2+E3*E3); hETotal1D->SetBinContent(j,E); E *= E0; // Double_t IonProb = (PFunc::ADK(E,Eion0,Z,l,m)/PUnits::atomictime)*PUnits::femtosecond; Double_t IonProb = PFunc::ADK_ENG(E,Eion0,Z) * PUnits::femtosecond; // cout << "Ion prob = " << IonProb << endl; hIonProb1D->SetBinContent(j,IonProb); } } hETotal2D->GetZaxis()->SetTitle("E [E_{0}]"); hIonProb2D->GetZaxis()->SetTitle("W_{ADK} [fs^{-1}]"); hETotal1D->GetYaxis()->SetTitle("E [E_{0}]"); hIonProb1D->GetYaxis()->SetTitle("W_{ADK} [fs^{-1}]"); // Tunning the Histograms // --------------------- // Chaning to user units: // -------------------------- if(opt.Contains("units") && n0) { for(Int_t i=0; i<Nspecies; i++) { if(!hDen2D[i]) continue; Int_t NbinsX = hDen2D[i]->GetNbinsX(); Float_t xMin = skindepth * hDen2D[i]->GetXaxis()->GetXmin() / PUnits::um; Float_t xMax = skindepth * hDen2D[i]->GetXaxis()->GetXmax() / PUnits::um; Int_t NbinsY = hDen2D[i]->GetNbinsY(); Float_t ymin = skindepth * hDen2D[i]->GetYaxis()->GetXmin() / PUnits::um; Float_t ymax = skindepth * hDen2D[i]->GetYaxis()->GetXmax() / PUnits::um; hDen2D[i]->SetBins(NbinsX,xMin,xMax,NbinsY,ymin,ymax); // for(Int_t j=0;j<hDen2D[i]->GetNbinsX();j++) { // for(Int_t k=0;k<hDen2D[i]->GetNbinsY();k++) { // hDen2D[i]->SetBinContent(j,k, hDen2D[i]->GetBinContent(j,k) * n0 / (1e17/PUnits::cm3) ); // } // } if(pData->IsCyl()) hDen2D[i]->GetYaxis()->SetTitle("r [#mum]"); else hDen2D[i]->GetYaxis()->SetTitle("y [#mum]"); if(opt.Contains("comov")) hDen2D[i]->GetXaxis()->SetTitle("#zeta [#mum]"); else hDen2D[i]->GetXaxis()->SetTitle("z [#mum]"); // if(i==0) // hDen2D[i]->GetZaxis()->SetTitle("n_{e} [10^{17}/cm^{3}]"); // else if(i==1) // hDen2D[i]->GetZaxis()->SetTitle("n_{b} [10^{17}/cm^{3}]"); // else // hDen2D[i]->GetZaxis()->SetTitle("n_{i} [10^{17}/cm^{3}]"); hDen1D[i]->SetBins(NbinsX,xMin,xMax); // for(Int_t j=0;j<hDen1D[i]->GetNbinsX();j++) { // hDen1D[i]->SetBinContent(j, hDen1D[i]->GetBinContent(j) * n0 / (1e17/PUnits::cm3) ); // } if(opt.Contains("comov")) hDen1D[i]->GetXaxis()->SetTitle("#zeta [#mum]"); else hDen1D[i]->GetXaxis()->SetTitle("z [#mum]"); if(hCur1D[i]) { hCur1D[i]->SetBins(NbinsX,xMin,xMax); Double_t binSize = (xMax - xMin)/NbinsX; // bin size in um. Double_t dV = skindepth * skindepth * skindepth; Double_t lightspeed = PConst::c_light / (PUnits::um/PUnits::femtosecond); hCur1D[i]->Scale(TMath::Abs(n0 * dV * (PConst::ElectronCharge/PUnits::picocoulomb) * (kp * PConst::c_light * PUnits::femtosecond))); hCur1D[i]->GetYaxis()->SetTitle("I[kA]"); hCur1D[i]->GetYaxis()->SetTitle(""); if(opt.Contains("comov")) hCur1D[i]->GetXaxis()->SetTitle("#zeta [#mum]"); else hCur1D[i]->GetXaxis()->SetTitle("z [#mum]"); Float_t Charge = hCur1D[i]->Integral() * (binSize / lightspeed); cout << Form(" Integrated charge of specie %3i = %8f pC",i,Charge) << endl; } } for(Int_t i=0; i<Nfields; i++) { Int_t NbinsX = hE2D[i]->GetNbinsX(); Float_t xMin = skindepth * hE2D[i]->GetXaxis()->GetXmin() / PUnits::um; Float_t xMax = skindepth * hE2D[i]->GetXaxis()->GetXmax() / PUnits::um; Int_t NbinsY = hE2D[i]->GetNbinsY(); Float_t ymin = skindepth * hE2D[i]->GetYaxis()->GetXmin() / PUnits::um; Float_t ymax = skindepth * hE2D[i]->GetYaxis()->GetXmax() / PUnits::um; hE2D[i]->SetBins(NbinsX,xMin,xMax,NbinsY,ymin,ymax); hE1D[i]->SetBins(NbinsX,xMin,xMax); for(Int_t j=0; j<hE2D[i]->GetNbinsX(); j++) { for(Int_t k=0; k<hE2D[i]->GetNbinsY(); k++) { hE2D[i]->SetBinContent(j,k, hE2D[i]->GetBinContent(j,k) * ( E0 / (PUnits::GV/PUnits::m) ) ); } hE1D[i]->SetBinContent(j, hE1D[i]->GetBinContent(j) * ( E0 / (PUnits::GV/PUnits::m) ) ); } if(pData->IsCyl()) hE2D[i]->GetYaxis()->SetTitle("r [#mum]"); else hE2D[i]->GetYaxis()->SetTitle("y [#mum]"); if(opt.Contains("comov")) hE2D[i]->GetXaxis()->SetTitle("#zeta [#mum]"); else hE2D[i]->GetXaxis()->SetTitle("z [#mum]"); if(i==0) hE2D[i]->GetZaxis()->SetTitle("E_{z} [GV/m]"); else if(i==1) hE2D[i]->GetZaxis()->SetTitle("E_{y} [GV/m]"); else if(i==2) hE2D[i]->GetZaxis()->SetTitle("E_{x} [GV/m]"); if(opt.Contains("comov")) hE1D[i]->GetXaxis()->SetTitle("#zeta [mm]"); else hE1D[i]->GetXaxis()->SetTitle("z [mm]"); if(i==0) hE1D[i]->GetYaxis()->SetTitle("E_{z} [GV/m]"); else if(i==1) hE1D[i]->GetYaxis()->SetTitle("E_{y} [GV/m]"); else if(i==2) hE1D[i]->GetYaxis()->SetTitle("E_{x} [GV/m]"); if(i==0) { hV2D->SetBins(NbinsX,xMin,xMax,NbinsY,ymin,ymax); hETotal2D->SetBins(NbinsX,xMin,xMax,NbinsY,ymin,ymax); hIonProb2D->SetBins(NbinsX,xMin,xMax,NbinsY,ymin,ymax); hV1D->SetBins(NbinsX,xMin,xMax); hETotal1D->SetBins(NbinsX,xMin,xMax); hIonProb1D->SetBins(NbinsX,xMin,xMax); for(Int_t j=0; j<NbinsX; j++) { for(Int_t k=0; k<NbinsY; k++) { hV2D->SetBinContent(j,k, hV2D->GetBinContent(j,k) * E0 * skindepth / (PUnits::MV)); hETotal2D->SetBinContent(j,k, hETotal2D->GetBinContent(j,k) * ( E0 / (PUnits::GV/PUnits::m) ) ); } hV1D->SetBinContent(j, hV1D->GetBinContent(j) * ( E0 * skindepth / (PUnits::MV) ) ); hETotal1D->SetBinContent(j, hETotal1D->GetBinContent(j) * ( E0 / (PUnits::GV/PUnits::m) ) ); } if(pData->IsCyl()) { hV2D->GetYaxis()->SetTitle("r [#mum]"); hETotal2D->GetYaxis()->SetTitle("r [#mum]"); } else { hV2D->GetYaxis()->SetTitle("y [#mum]"); hETotal2D->GetYaxis()->SetTitle("y [#mum]"); } if(opt.Contains("comov")) { hV2D->GetXaxis()->SetTitle("#zeta [#mum]"); hV1D->GetXaxis()->SetTitle("#zeta [#mum]"); hETotal2D->GetXaxis()->SetTitle("#zeta [#mum]"); hETotal1D->GetXaxis()->SetTitle("#zeta [#mum]"); } else { hV2D->GetXaxis()->SetTitle("z [#mum]"); hV2D->GetXaxis()->SetTitle("z [#mum]"); hETotal2D->GetXaxis()->SetTitle("z [#mum]"); hETotal1D->GetXaxis()->SetTitle("z [#mum]"); } hV2D->GetZaxis()->SetTitle("#Psi-#Psi_{t} [MV]"); hV1D->GetYaxis()->SetTitle("#Psi-#Psi_{t} [MV]"); hETotal2D->GetZaxis()->SetTitle("E [GV/m]"); hETotal1D->GetYaxis()->SetTitle("E [GV/m]"); } } } // --------------------------------------------------- Vertical Zoom ------------ Float_t yRange = (hDen2D[0]->GetYaxis()->GetXmax() - hDen2D[0]->GetYaxis()->GetXmin())/zoom; Float_t midPoint = (hDen2D[0]->GetYaxis()->GetXmax() + hDen2D[0]->GetYaxis()->GetXmin())/2.; Float_t yMin = midPoint-yRange/2; Float_t yMax = midPoint+yRange/2; if(pData->IsCyl()) { yMin = pData->GetXMin(1); yMax = yRange; } for(Int_t i=0; i<Nspecies; i++) { if(!hDen2D[i]) continue; hDen2D[i]->GetYaxis()->SetRangeUser(yMin,yMax); } for(Int_t i=0; i<Nfields; i++) { if(!hE2D[i]) continue; hE2D[i]->GetYaxis()->SetRangeUser(yMin,yMax); } hETotal2D->GetYaxis()->SetRangeUser(yMin,yMax); Float_t xMin = hDen2D[0]->GetXaxis()->GetXmin(); Float_t xMax = hDen2D[0]->GetXaxis()->GetXmax(); Float_t xRange = xMax - xMin; // ------------- z Zoom --------------------------------- Plasma palette ----------- // Set the range of the plasma charge density histogram for maximum constrast // using a dynamic palette wich adjust the nominal value to a certain color. Float_t density = 1; Float_t Base = density; Float_t *Max = new Float_t[Nspecies]; Float_t *Min = new Float_t[Nspecies]; for(Int_t i=0; i<Nspecies; i++) { if(!hDen2D[i]) continue; Max[i] = hDen2D[i]->GetMaximum(); Min[i] = 1.01E-1 * Base; if(i==1) Min[i] = 1.01E-1 * Base; if(i==2) Min[i] = 1.01E-4 * Base; hDen2D[i]->GetZaxis()->SetRangeUser(Min[i],Max[i]); } // Dynamic plasma palette const Int_t plasmaDNRGBs = 3; const Int_t plasmaDNCont = 64; Float_t basePos = 0.5; if(Max[0]!=Min[0]) { if(opt.Contains("logz")) { Float_t a = 1.0/(TMath::Log10(Max[0])-TMath::Log10(Min[0])); Float_t b = TMath::Log10(Min[0]); basePos = a*(TMath::Log10(Base) - b); } else { basePos = (1.0/(Max[0]-Min[0]))*(Base - Min[0]); } } Double_t plasmaDStops[plasmaDNRGBs] = { 0.00, basePos, 1.00 }; Double_t plasmaDRed[plasmaDNRGBs] = { 0.99, 0.90, 0.00 }; Double_t plasmaDGreen[plasmaDNRGBs] = { 0.99, 0.90, 0.00 }; Double_t plasmaDBlue[plasmaDNRGBs] = { 0.99, 0.90, 0.00 }; PPalette * plasmaPalette = (PPalette*) gROOT->FindObject("plasma"); plasmaPalette->CreateGradientColorTable(plasmaDNRGBs, plasmaDStops, plasmaDRed, plasmaDGreen, plasmaDBlue, plasmaDNCont); // Change the range of z axis for the fields to be symmetric. Float_t *Emax = new Float_t[Nfields]; Float_t *Emin = new Float_t[Nfields]; for(Int_t i=0; i<Nfields; i++) { Emax[i] = hE2D[i]->GetMaximum(); Emin[i] = hE2D[i]->GetMinimum(); if(Emax[i] > TMath::Abs(Emin[i])) Emin[i] = -Emax[i]; else Emax[i] = -Emin[i]; hE2D[i]->GetZaxis()->SetRangeUser(Emin[i],Emax[i]); } // Potential if(opt.Contains("units")) { trapPotential *= ( E0 * skindepth / (PUnits::MV) ); } Float_t Vmin = hV1D->GetMinimum(); { // Shift potential Int_t NbinsX = hV2D->GetNbinsX(); Int_t NbinsY = hV2D->GetNbinsY(); for(Int_t j=0; j<NbinsX; j++) { for(Int_t k=0; k<NbinsY; k++) { hV2D->SetBinContent(j,k, hV2D->GetBinContent(j,k) - Vmin -trapPotential); } hV1D->SetBinContent(j, hV1D->GetBinContent(j) - Vmin -trapPotential); } } Vmin = hV1D->GetMinimum(); Float_t Vmax = hV1D->GetMaximum(); // Dynamic potential palette const Int_t potPNRGBs = 5; const Int_t potPNCont = 64; Float_t zeroPos = -Vmin/(Vmax-Vmin); Double_t potPStops[potPNRGBs] = { 0.00, zeroPos-3.0/potPNCont,zeroPos, zeroPos+3.0/potPNCont, 1.00 }; Double_t potPRed[potPNRGBs] = { 0.518, 0.965, 0.90, 0.498, 0.106 }; Double_t potPGreen[potPNRGBs] = { 0.078, 0.925, 0.90, 0.718, 0.078 }; Double_t potPBlue[potPNRGBs] = { 0.106, 0.353, 0.90, 0.780, 0.518 }; PPalette * potentialPalette = (PPalette*) gROOT->FindObject("rbow2inv"); potentialPalette->CreateGradientColorTable(potPNRGBs, potPStops, potPRed, potPGreen, potPBlue, potPNCont); // Extract contours TCanvas* c = new TCanvas("c","Contour List",0,0,600,600); c->cd(); // Potential TH2F *hV2Dc = (TH2F*) hV2D->Clone("hV2Dc"); const Int_t Ncontours = 25; Double_t contours[Ncontours]; for(Int_t i=0; i<Ncontours; i++) { contours[i] = i*(trapPotential/5.0) - trapPotential; } hV2Dc->SetContour(Ncontours, contours); hV2Dc->Draw("cont list"); c->Update(); TObjArray *contsV2D = (TObjArray*) gROOT->GetListOfSpecials()->FindObject("contours"); TClonesArray graphsV2D("TGraph",Ncontours); { Int_t ncontours = contsV2D->GetSize(); TList* clist = NULL; Int_t nGraphs = 0; TGraph *gr = NULL; for(Int_t i = 0; i < ncontours; i++) { if(i==0) continue; clist = (TList*) contsV2D->At(i); for(Int_t j = 0 ; j < clist->GetSize(); j++) { gr = (TGraph*) clist->At(j); if(!gr) continue; gr->SetLineWidth(1); gr->SetLineColor(kGray+1); if( !((i)%5) ) { gr->SetLineWidth(2); gr->SetLineColor(kGray+2); } new(graphsV2D[nGraphs]) TGraph(*gr) ; nGraphs++; } } } // Ion probability hIonProb2D->GetZaxis()->SetRangeUser(0.00501,80); TH2F *hIonProb2Dc = (TH2F*) hIonProb2D->Clone("hIonProb2Dc"); const Int_t NcontI = 4; Double_t contI[NcontI] = {0.01,0.1,1.0,10.0}; hIonProb2Dc->SetContour(NcontI, contI); hIonProb2Dc->Draw("cont list"); c->Update(); TObjArray *contsI2D = (TObjArray*) gROOT->GetListOfSpecials()->FindObject("contours"); TClonesArray graphsI2D("TGraph",NcontI); { Int_t ncontours = contsI2D->GetSize(); TList* clist = NULL; Int_t nGraphs = 0; TGraph *gr = NULL; for(Int_t i = 0; i < ncontours; i++) { clist = (TList*) contsI2D->At(i); for(Int_t j = 0 ; j < clist->GetSize(); j++) { gr = (TGraph*) clist->At(j); if(!gr) continue; if( !(i%2) ) { gr->SetLineWidth(1); gr->SetLineStyle(2); gr->SetLineColor(kOrange-3); } else { gr->SetLineWidth(1); gr->SetLineStyle(1); gr->SetLineColor(kOrange-3); } new(graphsI2D[nGraphs]) TGraph(*gr) ; nGraphs++; } } } // "Axis range" in Osiris units: Double_t ylow = hDen2D[0]->GetYaxis()->GetBinLowEdge(FirstyBin); Double_t yup = hDen2D[0]->GetYaxis()->GetBinUpEdge(LastyBin); Double_t xmin = hDen2D[0]->GetXaxis()->GetXmin(); Double_t xmax = hDen2D[0]->GetXaxis()->GetXmax(); TLine *lineYzero = new TLine(xmin,0.0,xmax,0.0); lineYzero->SetLineColor(kGray+2); lineYzero->SetLineStyle(2); TLine *lineYup = new TLine(xmin,yup,xmax,yup); lineYup->SetLineColor(kGray+1); lineYup->SetLineStyle(2); TLine *lineYdown = new TLine(xmin,ylow,xmax,ylow); lineYdown->SetLineColor(kGray+1); lineYdown->SetLineStyle(2); zStartPlasma -= shiftz; zStartNeutral -= shiftz; zEndNeutral -= shiftz; if(opt.Contains("units")) { zStartPlasma *= skindepth / PUnits::um; zStartNeutral *= skindepth / PUnits::um; zEndNeutral *= skindepth / PUnits::um; } // cout << "Start plasma = " << zStartPlasma << endl; TLine *lineStartPlasma = new TLine(zStartPlasma,yMin,zStartPlasma,yMax); lineStartPlasma->SetLineColor(kGray+2); lineStartPlasma->SetLineStyle(2); lineStartPlasma->SetLineWidth(3); // cout << "Start plasma = " << zStartNeutral << endl; TLine *lineStartNeutral = new TLine(zStartNeutral,yMin,zStartNeutral,yMax); lineStartNeutral->SetLineColor(kGray+1); lineStartNeutral->SetLineStyle(2); lineStartNeutral->SetLineWidth(3); // cout << "End plasma = " << zEndNeutral << endl; TLine *lineEndNeutral = new TLine(zEndNeutral,yMin,zEndNeutral,yMax); lineEndNeutral->SetLineColor(kGray+1); lineEndNeutral->SetLineStyle(2); lineEndNeutral->SetLineWidth(3); // Plotting // ----------------------------------------------- // Canvas setup TCanvas *C = new TCanvas("C","2D Charge density and Electric field",750,666); // Palettes setup TExec *exPlasma = new TExec("exPlasma","plasmaPalette->cd();"); TExec *exElec = new TExec("exElec","redelectronPalette->cd();"); TExec *exHot = new TExec("exHot","hotPalette->cd();"); TExec *exField = new TExec("exField","rbow2Palette->cd();"); TExec *exFieldT = new TExec("exFieldT","redPalette->cd();"); TExec *exIonP = new TExec("exIonP","redPalette->cd();"); TExec *exPot = new TExec("exPot","rbow2invPalette->cd();"); // Actual Plotting! // ------------------------------------------------------------ // Output file TString fOutName = Form("./%s/Plots/Potential2D/Potential2D",pData->GetPath().c_str()); fOutName += Form("-%s_%i",pData->GetName(),time); // Setup Pad layout: Float_t lMargin = 0.15; Float_t rMargin = 0.18; Float_t bMargin = 0.15; Float_t tMargin = 0.04; Float_t factor = 1.0; PlasmaGlob::CanvasAsymPartition(C,2,lMargin,rMargin,bMargin,tMargin,factor); TPad *pad[2]; TString sLabels[] = {"(a)","(b)"}; // Text objects TPaveText **textLabel = new TPaveText*[2]; C->cd(0); char pname[16]; sprintf(pname,"pad_%i",1); pad[0] = (TPad*) gROOT->FindObject(pname); pad[0]->Draw(); pad[0]->cd(); // <---------------------------------------------- Top Plot --------- if(opt.Contains("logz")) { pad[0]->SetLogz(1); } else { pad[0]->SetLogz(0); } pad[0]->SetFrameLineWidth(3); pad[0]->SetTickx(1); // Re-range: for(Int_t i=0; i<Nspecies; i++) { if(!hDen2D[i]) continue; hDen2D[i]->GetYaxis()->SetRangeUser(yMin -(factor-1)*yRange, yMax); } TH2F *hFrame = (TH2F*) gROOT->FindObject("hFrame1"); if(hFrame) delete hFrame; hFrame = (TH2F*) hDen2D[0]->Clone("hFrame1"); hFrame->Reset(); hFrame->SetLabelFont(42,"xyz"); hFrame->SetTitleFont(42,"xyz"); hFrame->GetYaxis()->SetNdivisions(505); hFrame->GetYaxis()->SetLabelSize(0.085); hFrame->GetYaxis()->SetTitleSize(0.09); hFrame->GetYaxis()->SetTitleOffset(0.7); hFrame->GetYaxis()->SetTickLength(0.02); hFrame->GetXaxis()->SetLabelOffset(999.); hFrame->GetXaxis()->SetTitleOffset(999.); hFrame->GetXaxis()->SetTickLength(0.04); // Frame asymmetry: hFrame->Draw("col"); // hDen2D[0]->GetZaxis()->SetNdivisions(505); // Injected electrons if any if(Nspecies>=3) { if(hDen2D[2]) { exHot->Draw(); hDen2D[2]->Draw("colz same"); } } // Plasma hDen2D[0]->GetZaxis()->SetTitleFont(42); exPlasma->Draw(); hDen2D[0]->Draw("colz same"); // Beam driver. if(hDen2D[1]) { // hDen2D[1]->GetZaxis()->SetNdivisions(505); exElec->Draw(); hDen2D[1]->Draw("colz same"); } { TGraph *gr = (TGraph*) graphsV2D.At(4); gr->Draw("C"); } { TGraph *gr = (TGraph*) graphsI2D.At(1); gr->Draw("C"); } if(opt.Contains("1dline")) { lineYzero->Draw(); lineYdown->Draw(); lineYup->Draw(); } if(opt.Contains("sline")) { if(zStartPlasma>xmin && zStartPlasma<xmax) lineStartPlasma->Draw(); if(zStartNeutral>xmin && zStartNeutral<xmax) lineStartNeutral->Draw(); if(zEndNeutral>xmin && zEndNeutral<xmax) lineEndNeutral->Draw(); } // lineYdown->Draw(); // lineYup->Draw(); // Palettes re-arrangement pad[0]->Update(); Float_t y1 = pad[0]->GetBottomMargin(); Float_t y2 = 1 - pad[0]->GetTopMargin(); Float_t x1 = pad[0]->GetLeftMargin(); Float_t x2 = 1 - pad[0]->GetRightMargin(); TPaletteAxis *palette = NULL; if(Nspecies>=3) { if(hDen2D[2]) { palette = (TPaletteAxis*)hDen2D[2]->GetListOfFunctions()->FindObject("palette"); } } if(palette) { palette->SetY2NDC(y2 - 0.00); palette->SetY1NDC(0.66*(y1+y2) + 0.00); palette->SetX1NDC(x2 + 0.005); palette->SetX2NDC(x2 + 0.03); // palette->SetTitleFont(42); // palette->SetTitleOffset(0.85); palette->SetTitleOffset(999.9); palette->SetTitleSize(0.075); palette->SetLabelFont(42); palette->SetLabelSize(0.075); palette->SetLabelOffset(0.001); palette->SetBorderSize(2); palette->SetLineColor(1); } palette = (TPaletteAxis*)hDen2D[0]->GetListOfFunctions()->FindObject("palette"); if(palette) { palette->SetY2NDC(0.66*(y1+y2) - 0.00); palette->SetY1NDC(0.33*(y1+y2) + 0.00); palette->SetX1NDC(x2 + 0.005); palette->SetX2NDC(x2 + 0.03); // palette->SetTitleFont(42); palette->SetTitleOffset(0.80); palette->SetTitleSize(0.075); palette->SetLabelFont(42); palette->SetLabelSize(0.075); palette->SetLabelOffset(0.001); palette->SetBorderSize(2); palette->SetLineColor(1); } palette = (TPaletteAxis*)hDen2D[1]->GetListOfFunctions()->FindObject("palette"); if(palette) { palette->SetY2NDC(0.33*(y1+y2) - 0.00); palette->SetY1NDC(y1 + 0.00); palette->SetX1NDC(x2 + 0.005); palette->SetX2NDC(x2 + 0.03); //palette->SetTitleFont(42); //palette->SetTitleOffset(0.85); palette->SetTitleOffset(999.9); palette->SetTitleSize(0.075); palette->SetLabelFont(42); palette->SetLabelSize(0.075); palette->SetLabelOffset(0.001); palette->SetBorderSize(2); palette->SetLineColor(1); } // 1D charge density plots: Float_t yaxismin = pad[0]->GetUymin(); Float_t yaxismax = pad[0]->GetUymin() + 0.33*(pad[0]->GetUymax() - pad[0]->GetUymin()) - 0.00; Float_t denmin = Min[1]; Float_t denmax = Max[1]; if(opt.Contains("logz")) { denmin = TMath::Log10(denmin); denmax = TMath::Log10(denmax); } Float_t curmin = 0.0; Float_t curmax = 0.0; if(opt.Contains("curr")) { curmin = 0.0; curmax = hCur1D[1]->GetMaximum(); cout << Form(" Maximum driver current = %6.2f kA ", curmax) << endl ; if(Nspecies>=3) if(hCur1D[2]) cout << Form(" Maximum witness current = %6.2f kA ", hCur1D[2]->GetMaximum()) << endl ; // Round for better plotting curmax = 0.1*TMath::Nint(curmax*10); } for(Int_t i=0; i<Nspecies; i++) { if(!hDen1D[i]) continue; Float_t slope = (yaxismax - yaxismin)/(denmax - denmin); for(Int_t j=0; j<hDen1D[i]->GetNbinsX(); j++) { Float_t content = hDen1D[i]->GetBinContent(j+1); if(opt.Contains("logz")) content = TMath::Log10(content); if(content<denmin) hDen1D[i]->SetBinContent(j+1,yaxismin); else hDen1D[i]->SetBinContent(j+1,(content - denmin) * slope + yaxismin); } if(hCur1D[i]) { slope = (yaxismax - yaxismin)/(curmax - curmin); for(Int_t j=0; j<hCur1D[i]->GetNbinsX(); j++) { Float_t content = hCur1D[i]->GetBinContent(j+1); if(content<curmin) hCur1D[i]->SetBinContent(j+1,yaxismin); else hCur1D[i]->SetBinContent(j+1,(content - curmin) * slope + yaxismin); } } } // Plasma on-axis density: // hDen1D[0]->SetLineWidth(2); // hDen1D[0]->SetLineColor(kGray+1); // // // PlasmaGlob::SetH1Style(hDen1D[0],1); // hDen1D[0]->Draw("same C"); if(opt.Contains("curr")) { hCur1D[1]->SetLineWidth(2); hCur1D[1]->SetLineColor(PlasmaGlob::elecLine); hCur1D[1]->Draw("same C"); } else { hDen1D[1]->SetLineWidth(2); hDen1D[1]->SetLineColor(PlasmaGlob::elecLine); // hDen1D[1]->Draw("same C"); } if(Nspecies>=3) { if(hDen1D[2]) { if(opt.Contains("curr")) { hCur1D[2]->SetLineWidth(2); hCur1D[2]->SetLineColor(kOrange+8); hCur1D[2]->Draw("same C"); } else { hDen1D[2]->SetLineWidth(2); hDen1D[2]->SetLineColor(kOrange+8); // hDen1D[2]->Draw("same C"); } } } // Current axis TGaxis *axis = NULL; if(opt.Contains("curr")) { axis = new TGaxis(xMax-xRange/6.0,yMin - (factor-1)*yRange, xMax-xRange/6.0,yaxismax, 0.001,curmax,503,"+LS"); axis->SetLineWidth(1); axis->SetLineColor(kGray+3);//PlasmaGlob::elecLine); axis->SetLabelColor(kGray+3);//PlasmaGlob::elecLine); axis->SetLabelSize(0.06); axis->SetLabelOffset(0.01); axis->SetLabelFont(42); axis->SetTitleColor(kGray+3);//PlasmaGlob::elecLine); axis->SetTitleSize(0.06); axis->SetTitleOffset(0.6); axis->SetTitleFont(42); axis->SetTickSize(0.03); axis->SetTitle("I [kA]"); axis->CenterTitle(); axis->SetNdivisions(505); axis->Draw(); } TPaveText *textTime = new TPaveText(xMax - 0.3*xRange, yMax-0.15*yRange, xMax-0.1, yMax-0.05*yRange); //x2-0.17,y2-0.12,x2-0.02,y2-0.02,"NDC"); PlasmaGlob::SetPaveTextStyle(textTime,32); char ctext[128]; if(opt.Contains("units") && n0) sprintf(ctext,"z = %5.1f #mum", Time * skindepth / PUnits::um); else sprintf(ctext,"t = %5.1f #omega_{p}^{-1}",Time); textTime->SetTextFont(42); textTime->AddText(ctext); textTime->Draw(); // textDen->Draw(); // if(opt.Contains("units")) // textWav->Draw(); textLabel[0] = new TPaveText(xMin + 0.02*xRange, yMax-0.2*yRange, xMin+0.30*xRange, yMax-0.05*yRange); PlasmaGlob::SetPaveTextStyle(textLabel[0],12); textLabel[0]->SetTextFont(42); textLabel[0]->AddText(sLabels[0]); textLabel[0]->Draw(); pad[0]->RedrawAxis(); C->cd(0); sprintf(pname,"pad_%i",0); pad[1] = (TPad*) gROOT->FindObject(pname); pad[1]->Draw(); pad[1]->cd(); // <--------------------------------------------------------- Bottom Plot pad[1]->SetFrameLineWidth(3); pad[1]->SetTickx(1); hFrame = (TH2F*) gROOT->FindObject("hFrame2"); if(hFrame) delete hFrame; hFrame = (TH2F*) hDen2D[0]->Clone("hFrame2"); hFrame->Reset(); Float_t yFactor = pad[0]->GetAbsHNDC()/pad[1]->GetAbsHNDC(); hFrame->GetYaxis()->SetLabelSize(yFactor*0.085); hFrame->GetYaxis()->SetTitleSize(yFactor*0.09); hFrame->GetYaxis()->SetTitleOffset(0.7/yFactor); hFrame->GetYaxis()->SetTickLength(0.02/yFactor); hFrame->GetXaxis()->SetTitleSize(0.10); hFrame->GetXaxis()->SetLabelSize(0.08); hFrame->GetXaxis()->SetLabelOffset(0.02); hFrame->GetXaxis()->SetTitleOffset(1.0); hFrame->GetXaxis()->SetTickLength(0.04*yFactor); hFrame->SetLabelFont(42,"xyz"); hFrame->SetTitleFont(42,"xyz"); hFrame->Draw("col"); // hE2D[0]->GetZaxis()->SetNdivisions(505); hV2D->GetZaxis()->SetTitleFont(42); hV2D->GetZaxis()->SetTickLength(0.02/yFactor); exPot->Draw(); hV2D->Draw("col z same"); for(Int_t i=0; i<graphsV2D.GetEntriesFast(); i++) { TGraph *gr = (TGraph*) graphsV2D.At(i); if(!gr) continue; gr->Draw("C"); } for(Int_t i=0; i<graphsI2D.GetEntriesFast(); i++) { //if(i!=2) continue; TGraph *gr = (TGraph*) graphsI2D.At(i); if(!gr) continue; gr->Draw("C"); } if(opt.Contains("1dline")) { lineYzero->Draw(); lineYdown->Draw(); lineYup->Draw(); } if(opt.Contains("sline")) { if(zStartPlasma>xmin && zStartPlasma<xmax) lineStartPlasma->Draw(); if(zStartNeutral>xmin && zStartNeutral<xmax) lineStartNeutral->Draw(); if(zEndNeutral>xmin && zEndNeutral<xmax) lineEndNeutral->Draw(); } pad[1]->Update(); y1 = pad[1]->GetBottomMargin(); y2 = 1 - pad[1]->GetTopMargin(); x1 = pad[1]->GetLeftMargin(); x2 = 1 - pad[1]->GetRightMargin(); palette = (TPaletteAxis*)hV2D->GetListOfFunctions()->FindObject("palette"); if(palette) { palette->SetY2NDC(y2 - 0.00); palette->SetY1NDC(y1 + 0.00); palette->SetX1NDC(x2 + 0.005); palette->SetX2NDC(x2 + 0.03); // palette->SetTitleFont(42); palette->SetTitleSize(yFactor*0.075); palette->SetTitleOffset(0.80/yFactor); palette->SetLabelSize(yFactor*0.075); palette->SetLabelFont(42); palette->SetLabelOffset(0.01/yFactor); palette->SetBorderSize(2); palette->SetLineColor(1); } pad[1]->RedrawAxis(); textLabel[1] = new TPaveText(xMin + 0.02*xRange, yMax-0.2*yRange, xMin+0.30*xRange, yMax-0.05*yRange); PlasmaGlob::SetPaveTextStyle(textLabel[1],12); textLabel[1]->SetTextFont(42); textLabel[1]->AddText(sLabels[1]); textLabel[1]->Draw(); C->cd(); // Print to a file PlasmaGlob::imgconv(C,fOutName,opt); // --------------------------------------------------------- PlasmaGlob::DestroyCanvases(); }
int InputForLimits(){ TH1::SetDefaultSumw2(true); if(pcp)cout<<"going to set inputs"<<endl; Int_t NBR = 3; Float_t BR[] = { 1., 0.75, 0.5}; TFile* bkgFile = new TFile( "../../BkgPrediction/BkgPrediction.root", "READ"); TTree* bkgTree; bkgFile->GetObject( "ElAndMu", bkgTree); Float_t bkg = 0.; Float_t bkgTotUnc = 0.; Float_t obs = 0.; bkgTree->SetBranchAddress( "srData", &obs); bkgTree->SetBranchAddress( "srAllBkgCorr", &bkg); bkgTree->SetBranchAddress( "TotUnc", &bkgTotUnc); TFile* sigFile = new TFile( "../../SignalSystematics/SignalSys.root", "READ"); std::vector<std::vector<TString> > sysColl; std::vector<TString> sys; sys.push_back(TString("JES_Up")); sys.push_back(TString("JES_Down")); sysColl.push_back(sys); sys.clear(); sys.push_back(TString("BTagReweight_UpBC")); sys.push_back(TString("BTagReweight_DownBC")); sysColl.push_back(sys); sys.clear(); sys.push_back(TString("BTagReweight_UpLight")); sys.push_back(TString("BTagReweight_DownLight")); sysColl.push_back(sys); std::vector<TString> decayMode; decayMode.push_back(TString("tt")); decayMode.push_back(TString("tb")); decayMode.push_back(TString("bb")); Systematics* systematics[3]; TString dirname; TString histoname; TDirectory* srDir; TDirectory* histoDir; TFile* outFile = new TFile( "InputForLimits.root", "RECREATE"); TDirectory* outBRDir; TDirectory* outSRDir; TH1F* datah = new TH1F( "data", "data", 1, 0., 1.); TH1F* bkgh = new TH1F( "bkg", "bkg", 1, 0., 1.); TH2F* sigh; TH2F* sig_toth; TH2F* effh; TH2F* sigLh; TH2F* effLh; TH2F* sigRh; TH2F* effRh; TH2F* jesh; TH2F* btagBCh; TH2F* btagLighth; TH2F* btagh; TH2F* sysh; TH2F* unch; TH2F* jesPercenth; TH2F* btagBCPercenth; TH2F* btagLightPercenth; TH2F* btagPercenth; TH2F* sysPercenth; TH2F* uncPercenth; Float_t sig = 0.; Float_t stat = 0.; Float_t jes = 0.; Float_t bc = 0.; Float_t light = 0.; Float_t unc = 0.; int N = bkgTree->GetEntries(); for ( int ibr = 0; ibr < NBR; ibr++){ dirname = ""; dirname += BR[ibr]; outFile->mkdir(dirname); outBRDir = outFile->GetDirectory(dirname); for ( int iSR = 0; iSR < 9; iSR++){ bkgTree->GetEntry(iSR); datah->SetBinContent( 1, obs); bkgh->SetBinContent( 1, bkg); bkgh->SetBinError( 1, bkgTotUnc); dirname = ""; dirname += iSR; outBRDir->mkdir(dirname); outSRDir = outBRDir->GetDirectory(dirname); dirname = ""; dirname += iSR; dirname += ".root"; srDir = sigFile->GetDirectory( dirname); for ( int isys = 0; isys < (int) sysColl.size(); isys++){ systematics[isys] = new Systematics(); systematics[isys]->BR = BR[ibr]; histoDir = srDir->GetDirectory( "NoSystematic"); for ( int idecay = 0; idecay < (int) decayMode.size(); idecay++){ histoDir->GetObject( decayMode.at(idecay), systematics[isys]->h[idecay]); histoDir->GetObject( decayMode.at(idecay) + "l", systematics[isys]->Lh); histoDir->GetObject( decayMode.at(idecay) + "r", systematics[isys]->Rh); } histoDir->GetObject( decayMode.at(0) + "l", systematics[isys]->Lh); histoDir->GetObject( decayMode.at(0) + "r", systematics[isys]->Rh); histoDir->GetObject( "sig_tot", systematics[isys]->sig_toth); for ( int ishift = 0; ishift < 2; ishift++){ histoDir = srDir->GetDirectory(sysColl.at(isys).at(ishift)); for ( int idecay = 0; idecay < (int) decayMode.size(); idecay++){ histoDir->GetObject( decayMode.at(idecay), systematics[isys]->shifth[ishift][idecay]); } } systematics[isys]->Calc(); } sig_toth = new TH2F( *systematics[0]->sig_toth); sig_toth->SetName("sig_tot"); sig_toth->SetTitle("sig_tot"); sigh = new TH2F( *systematics[0]->sigh); sigh->SetName("sig"); sigh->SetTitle("sig"); effh = new TH2F( *systematics[0]->effh); effh->SetName("eff"); effh->SetTitle("eff"); sigLh = new TH2F( *systematics[0]->sigRh); sigLh->SetName("sigL"); sigLh->SetTitle("sigL"); effLh = new TH2F( *systematics[0]->effLh); effLh->SetName("effL"); effLh->SetTitle("effL"); sigRh = new TH2F( *systematics[0]->sigRh); sigRh->SetName("sigR"); sigRh->SetTitle("sigR"); effRh = new TH2F( *systematics[0]->effRh); effRh->SetName("effR"); effRh->SetTitle("effR"); jesh = new TH2F( *systematics[0]->sysh); jesh->SetName("jes"); jesh->SetTitle("jes"); btagBCh = new TH2F( *systematics[1]->sysh); btagBCh->SetName("btagBC"); btagBCh->SetTitle("btagBC"); btagLighth = new TH2F( *systematics[2]->sysh); btagLighth->SetName("btagLight"); btagLighth->SetTitle("btagLight"); btagh = new TH2F( *btagBCh); btagh->Reset(); btagh->SetName("btag"); btagh->SetTitle("btag"); sysh = new TH2F( *jesh); sysh->Reset(); sysh->SetName("sys"); sysh->SetTitle("sys"); unch = new TH2F( *jesh); unch->Reset(); unch->SetName("unc"); unch->SetTitle("unc"); jesPercenth = new TH2F( *systematics[0]->sysh); jesPercenth->SetName("jesPercent"); jesPercenth->SetTitle("jesPercent"); jesPercenth->Divide( sigh); jesPercenth->Scale( 100.); btagBCPercenth = new TH2F( *systematics[1]->sysh); btagBCPercenth->SetName("btagBCPercent"); btagBCPercenth->SetTitle("btagBCPercent"); btagBCPercenth->Divide( sigh); btagBCPercenth->Scale( 100.); btagLightPercenth = new TH2F( *systematics[2]->sysh); btagLightPercenth->SetName("btagLightPercent"); btagLightPercenth->SetTitle("btagLightPercent"); btagLightPercenth->Divide( sigh); btagLightPercenth->Scale( 100.); btagPercenth = new TH2F( *btagBCh); btagPercenth->Reset(); btagPercenth->SetName("btagPercent"); btagPercenth->SetTitle("btagPercent"); sysPercenth = new TH2F( *jesh); sysPercenth->Reset(); sysPercenth->SetName("sysPercent"); sysPercenth->SetTitle("sysPercent"); uncPercenth = new TH2F( *jesh); uncPercenth->Reset(); uncPercenth->SetName("uncPercent"); uncPercenth->SetTitle("uncPercent"); for (int ibin = 0; ibin < sigh->GetSize(); ibin++){ sig = sigh->GetBinContent( ibin); stat = sigh->GetBinError( ibin); jes = jesh->GetBinContent(ibin); bc = btagBCh->GetBinContent(ibin); light = btagLighth->GetBinContent(ibin); unc = sqrt( bc * bc + light * light); btagh->SetBinContent( ibin, unc); btagPercenth->SetBinContent( ibin, unc / sig * 100.); unc = sqrt( jes * jes + bc * bc + light * light + sig * sig * (0.044 * 0.044 + // Lumi 0.03 * 0.03 + // Trigger 0.05 * 0.05 // Lep Id ) ); sysh->SetBinContent( ibin, unc); sysPercenth->SetBinContent( ibin, unc / sig * 100.); unc = sqrt( jes * jes + bc * bc + light * light + stat * stat + sig * sig * (0.044 * 0.044 + // Lumi 0.03 * 0.03 + // Trigger 0.05 * 0.05 // Lep Id ) ); unch->SetBinContent( ibin, unc); uncPercenth->SetBinContent( ibin, unc / sig * 100.); } outSRDir->cd(); datah->Write(); bkgh->Write(); sig_toth->Write(); sigh->Write(); effh->Write(); sigLh->Write(); effLh->Write(); sigRh->Write(); effRh->Write(); jesh->Write(); btagBCh->Write(); btagLighth->Write(); btagh->Write(); sysh->Write(); unch->Write(); jesPercenth->Write(); btagBCPercenth->Write(); btagLightPercenth->Write(); btagPercenth->Write(); sysPercenth->Write(); uncPercenth->Write(); } } delete systematics[0]; delete systematics[1]; delete systematics[2]; outFile->Close(); sigFile->Close(); bkgFile->Close(); return 0; }
void PlotCharge2D( const TString &sim, Int_t time, Int_t index = 0, Int_t zoom=2, Int_t Nbins=2, const TString &options="") { #ifdef __CINT__ gSystem->Load("libplasma.so"); #endif PlasmaGlob::Initialize(); // Palettes! gROOT->Macro("PlasmaPalettes.C"); // Init Units table PUnits::UnitsTable::Get(); // Load PData PData *pData = PData::Get(sim.Data()); pData->LoadFileNames(time); if(!pData->IsInit()) return; TString opt = options; // More makeup if(opt.Contains("grid")) { gStyle->SetPadGridX(1); gStyle->SetPadGridY(1); } gStyle->SetTitleFont(42); gStyle->SetStatFont(42); gStyle->SetTextFont(42); gStyle->SetTitleFont(42,"xyz"); gStyle->SetLabelFont(42,"xyz"); // Some plasma constants Double_t n0 = pData->GetPlasmaDensity(); Double_t kp = pData->GetPlasmaK(); Double_t skindepth = 1.; if(kp!=0.0) skindepth = 1/kp; Double_t E0 = pData->GetPlasmaE0(); // Some beam properties: Float_t Ebeam = pData->GetBeamEnergy() * PUnits::MeV; Float_t gamma = Ebeam / PConst::ElectronMassE; Float_t vbeam = TMath::Sqrt(1 - 1/(gamma*gamma)); // cout << Form(" - Bunch gamma = %8.4f", gamma ) << endl; // cout << Form(" - Bunch velocity = %8.4f c", vbeam ) << endl; Float_t nb = pData->GetBeamDensity(); // Time in OU Float_t Time = pData->GetRealTime(); // z start of the plasma in normalized units. Float_t zStartPlasma = pData->GetPlasmaStart()*kp; // z start of the beam in normalized units. Float_t zStartBeam = pData->GetBeamStart()*kp; // z start of the neutral in normalized units. Float_t zStartNeutral = pData->GetNeutralStart()*kp; // z end of the neutral in normalized units. Float_t zEndNeutral = pData->GetNeutralEnd()*kp; if(opt.Contains("center")) { Time -= zStartPlasma; if(opt.Contains("comov")) // Centers on the head of the beam. Time += zStartBeam; } Float_t shiftz = pData->Shift(opt); // cout << "Shift = " << shiftz << endl; // Calculate the "axis range" in number of bins. If Nbins==0 a RMS width is taken. Double_t rms0 = pData->GetBeamRmsY() * kp; if(pData->IsCyl()) rms0 = pData->GetBeamRmsR() * kp; Int_t FirstyBin = 0; Int_t LastyBin = 0; if(Nbins==0) { Nbins = TMath::Nint(rms0 / pData->GetDX(1)); } // Slice width limits. if(!pData->IsCyl()) { FirstyBin = pData->GetNX(1)/2 + 1 - Nbins; LastyBin = pData->GetNX(1)/2 + Nbins; } else { FirstyBin = 1; LastyBin = Nbins; } // ------------------------------------------------------------------------------- // Get charge density histos Int_t Nspecies = pData->NSpecies(); TH2F **hDen2D = new TH2F*[Nspecies]; for(Int_t i=0;i<Nspecies;i++) { hDen2D[i] = NULL; if(i!=index) continue; if(!pData->GetChargeFileName(i)) continue; char hName[24]; sprintf(hName,"hDen_%i",i); hDen2D[i] = (TH2F*) gROOT->FindObject(hName); if(hDen2D[i]) delete hDen2D[i]; if(!pData->Is3D()) hDen2D[i] = pData->GetCharge(i,opt); else hDen2D[i] = pData->GetCharge2DSliceZY(i,-1,Nbins,opt+"avg"); hDen2D[i]->SetName(hName); hDen2D[i]->GetXaxis()->CenterTitle(); hDen2D[i]->GetYaxis()->CenterTitle(); hDen2D[i]->GetZaxis()->CenterTitle(); hDen2D[i]->GetXaxis()->SetTitle("z [c/#omega_{p}]"); hDen2D[i]->GetYaxis()->SetTitle("y [c/#omega_{p}]"); if(i==0) hDen2D[i]->GetZaxis()->SetTitle("n_{e} [n_{0}]"); else hDen2D[i]->GetZaxis()->SetTitle("n_{b} [n_{0}]"); // ------------------------------------------------------------------------------------ } // Tunning the Histograms // --------------------- // Chaning to user units: // -------------------------- if(opt.Contains("units") && n0) { for(Int_t i=0;i<Nspecies;i++) { if(i!=index) continue; Int_t NbinsX = hDen2D[i]->GetNbinsX(); Float_t xMin = skindepth * hDen2D[i]->GetXaxis()->GetXmin() / PUnits::um; Float_t xMax = skindepth * hDen2D[i]->GetXaxis()->GetXmax() / PUnits::um; Int_t NbinsY = hDen2D[i]->GetNbinsY(); Float_t yMin = skindepth * hDen2D[i]->GetYaxis()->GetXmin() / PUnits::um; Float_t yMax = skindepth * hDen2D[i]->GetYaxis()->GetXmax() / PUnits::um; hDen2D[i]->SetBins(NbinsX,xMin,xMax,NbinsY,yMin,yMax); // for(Int_t j=0;j<hDen2D[i]->GetNbinsX();j++) { // for(Int_t k=0;k<hDen2D[i]->GetNbinsY();k++) { // hDen2D[i]->SetBinContent(j,k, hDen2D[i]->GetBinContent(j,k) * n0 / (1e15/PUnits::cm3) ); // } // } if(pData->IsCyl()) hDen2D[i]->GetYaxis()->SetTitle("r [#mum]"); else hDen2D[i]->GetYaxis()->SetTitle("y [#mum]"); if(opt.Contains("comov")) hDen2D[i]->GetXaxis()->SetTitle("#zeta [#mum]"); else hDen2D[i]->GetXaxis()->SetTitle("z [#mum]"); // if(i==0) // hDen2D[i]->GetZaxis()->SetTitle("n [10^{15}/cm^{3}]"); // else // hDen2D[i]->GetZaxis()->SetTitle("n_{b} [10^{15}/cm^{3}]"); } } // --------------------------------------------------- Vertical Zoom ------------ Float_t range = (hDen2D[index]->GetYaxis()->GetXmax() - hDen2D[index]->GetYaxis()->GetXmin())/zoom; Float_t midPoint = (hDen2D[index]->GetYaxis()->GetXmax() + hDen2D[index]->GetYaxis()->GetXmin())/2.; Double_t ymin = midPoint-range/2; Double_t ymax = midPoint+range/2; if(pData->IsCyl()) { ymin = hDen2D[index]->GetYaxis()->GetXmin(); ymax = range; } for(Int_t i=0;i<Nspecies;i++) { if(!hDen2D[i]) continue; hDen2D[i]->GetYaxis()->SetRangeUser(ymin,ymax); } // ------------- z Zoom --------------------------------- Plasma palette ----------- // Set the range of the plasma charge density histogram for maximum constrast // using a dynamic palette wich adjust the nominal value to a certain color. Float_t density = 1; Float_t Base = density; Float_t *Max = new Float_t[Nspecies]; Float_t *Min = new Float_t[Nspecies]; for(Int_t i=0;i<Nspecies;i++) { if(!hDen2D[i]) continue; Max[i] = hDen2D[i]->GetMaximum(); Min[i] = 1.01E-1 * Base; if(i==2) Min[i] = 1.01E-3 * Base; if(sim.Contains("pitz")) { if(i==0) { if(Max[i]<2) { Min[i] = Base - (Max[i] - Base); } } else if(i==1) { Min[i] = 0.501E-3 * Base; } } hDen2D[i]->GetZaxis()->SetRangeUser(Min[i],Max[i]); } // Dynamic plasma palette const Int_t plasmaDNRGBs = 3; const Int_t plasmaDNCont = 64; Double_t basePos = 0.5; if(Max[index]!=Min[index]) { if(opt.Contains("logz")) { Float_t a = 1.0/(TMath::Log10(Max[index])-TMath::Log10(Min[index])); Float_t b = TMath::Log10(Min[index]); basePos = a*(TMath::Log10(Base) - b); } else { basePos = (1.0/(Max[index]-Min[index]))*(Base - Min[index]); } } Double_t plasmaDStops[plasmaDNRGBs] = { 0.00, basePos, 1.00 }; Double_t plasmaDRed[plasmaDNRGBs] = { 0.99, 0.90, 0.00 }; Double_t plasmaDGreen[plasmaDNRGBs] = { 0.99, 0.90, 0.00 }; Double_t plasmaDBlue[plasmaDNRGBs] = { 0.99, 0.90, 0.00 }; PPalette * plasmaPalette = (PPalette*) gROOT->FindObject("plasma"); plasmaPalette->CreateGradientColorTable(plasmaDNRGBs, plasmaDStops, plasmaDRed, plasmaDGreen, plasmaDBlue, plasmaDNCont); // Plotting // ----------------------------------------------- // Canvas setup TCanvas *C; if(opt.Contains("hres") && !opt.Contains("pdf")) // high resolution for plain grahics output. C = new TCanvas("C","2D Charge",1000,625); else C = new TCanvas("C","2D Charge",800,500); // Actual Plotting! // ------------------------------------------------------------ // Output file TString fOutName = Form("./%s/Plots/Charge2D/Charge2D",sim.Data()); fOutName += Form("-%s_%i",sim.Data(),time); C->cd(); // Setup Pad layout: Float_t lMargin = 0.15; Float_t rMargin = 0.18; Float_t bMargin = 0.17; Float_t tMargin = 0.04; gPad->SetLeftMargin(lMargin); gPad->SetRightMargin(rMargin); gPad->SetBottomMargin(bMargin); gPad->SetTopMargin(tMargin); // Text objects Float_t y1 = gPad->GetBottomMargin(); Float_t y2 = 1 - gPad->GetTopMargin(); Float_t x1 = gPad->GetLeftMargin(); Float_t x2 = 1 - gPad->GetRightMargin(); TPaveText *textTime = new TPaveText(x2-0.17,y2-0.12,x2-0.02,y2-0.02,"NDC"); PlasmaGlob::SetPaveTextStyle(textTime,32); char ctext[128]; if(opt.Contains("units") && n0) sprintf(ctext,"z = %5.1f #mum", Time * skindepth / PUnits::um); else sprintf(ctext,"t = %5.1f #omega_{p}^{-1}",Time); textTime->AddText(ctext); TPaveText *textDen = new TPaveText(x1+0.02,y2-0.12,x1+0.22,y2-0.02,"NDC"); PlasmaGlob::SetPaveTextStyle(textDen,12); textDen->SetTextColor(kOrange+10); if(opt.Contains("units") && n0) sprintf(ctext,"n_{0} = %5.2f x 10^{17} / cm^{3}", 1e-17 * n0 * PUnits::cm3); else if(pData->GetBeamDensity() && n0) sprintf(ctext,"n_{b}/n_{0} = %5.2f", pData->GetBeamDensity()/n0); textDen->AddText(ctext); if(opt.Contains("logz")) { gPad->SetLogz(1); } else { gPad->SetLogz(0); } gPad->SetFrameLineWidth(3); TH2F *hFrame = (TH2F*) gROOT->FindObject("hFrame1"); if(hFrame) delete hFrame; hFrame = (TH2F*) hDen2D[index]->Clone("hFrame1"); hFrame->Reset(); hFrame->GetXaxis()->SetTitleSize(0.07); hFrame->GetXaxis()->SetLabelSize(0.065); hFrame->GetXaxis()->SetLabelOffset(0.02); hFrame->GetXaxis()->SetTitleOffset(1.0); hFrame->GetYaxis()->SetTitleSize(0.07); hFrame->GetYaxis()->SetTitleOffset(1.0); hFrame->GetYaxis()->SetLabelSize(0.065); hFrame->GetYaxis()->SetLabelOffset(0.02); hFrame->GetYaxis()->SetTickLength(0.02); hFrame->Draw("col"); hDen2D[index]->GetZaxis()->SetTitleSize(0.06); hDen2D[index]->GetZaxis()->SetTitleOffset(1.0); hDen2D[index]->GetZaxis()->SetLabelSize(0.06); hDen2D[index]->GetZaxis()->SetTickLength(0.02); // hDen2D[index]->GetZaxis()->SetNdivisions(505); hDen2D[index]->Draw("colz same"); gPad->Update(); textTime->Draw(); textDen->Draw(); gPad->RedrawAxis(); C->cd(); // Print to a file PlasmaGlob::imgconv(C,fOutName,opt); // --------------------------------------------------------- }
void PlotField2D( const TString &sim, Int_t time, Int_t index = 0, Float_t zoom=2, Int_t Nbins=2, const TString &options="") { #ifdef __CINT__ gSystem->Load("libptools.so"); #endif // Load PData PData *pData = PData::Get(sim.Data()); pData->LoadFileNames(time); if(!pData->IsInit()) return; // Refresh and Style PGlobals::Initialize(); // Coloured palettes gROOT->Macro("PPalettes.C"); TString opt = options; // More makeup if(opt.Contains("grid")) { gStyle->SetPadGridX(1); gStyle->SetPadGridY(1); } gStyle->SetTitleFont(42); gStyle->SetStatFont(42); gStyle->SetTextFont(42); gStyle->SetTitleFont(42,"xyz"); gStyle->SetLabelFont(42,"xyz"); // Some plasma constants Double_t n0 = pData->GetPlasmaDensity(); Double_t kp = pData->GetPlasmaK(); Double_t skindepth = 1.; if(kp!=0.0) skindepth = 1/kp; Double_t E0 = pData->GetPlasmaE0(); // Some beam properties: Float_t Ebeam = pData->GetBeamEnergy() * PUnits::MeV; Float_t gamma = Ebeam / PConst::ElectronMassE; Float_t vbeam = TMath::Sqrt(1 - 1/(gamma*gamma)); // cout << Form(" - Bunch gamma = %8.4f", gamma ) << endl; // cout << Form(" - Bunch velocity = %8.4f c", vbeam ) << endl; Float_t nb = pData->GetBeamDensity(); // Time in OU Float_t Time = pData->GetRealTime(); // z start of the plasma in normalized units. Float_t zStartPlasma = pData->GetPlasmaStart()*kp; // z start of the beam in normalized units. Float_t zStartBeam = pData->GetBeamStart()*kp; // z start of the neutral in normalized units. Float_t zStartNeutral = pData->GetNeutralStart()*kp; // z end of the neutral in normalized units. Float_t zEndNeutral = pData->GetNeutralEnd()*kp; if(opt.Contains("center")) { Time -= zStartPlasma; if(opt.Contains("comov")) // Centers on the head of the beam. Time += zStartBeam; } Float_t shiftz = pData->Shift(opt); // cout << "Shift = " << shiftz << endl; // Calculate the "axis range" in number of bins. If Nbins==0 a RMS width is taken. Double_t rms0 = pData->GetBeamRmsY() * kp; if(pData->IsCyl()) rms0 = pData->GetBeamRmsR() * kp; Int_t FirstyBin = 0; Int_t LastyBin = 0; if(Nbins==0) { Nbins = TMath::Nint(rms0 / pData->GetDX(1)); } // Slice width limits. if(!pData->IsCyl()) { FirstyBin = pData->GetNX(1)/2 + 1 - Nbins; LastyBin = pData->GetNX(1)/2 + Nbins; } else { FirstyBin = 1; LastyBin = Nbins; } // ------------------------------------------------------------------------------- // Get field histos const Int_t Nfields = 3; TH2F **hE2D = new TH2F*[Nfields]; for(Int_t i=0;i<Nfields;i++) { hE2D[i] = NULL; if(i!=index) continue; if(!pData->GetEfieldFileName(i)) continue; char hName[24]; sprintf(hName,"hE2D_%i",i); hE2D[i] = (TH2F*) gROOT->FindObject(hName); if(hE2D[i]) delete hE2D[i]; if(!pData->Is3D()) hE2D[i] = pData->GetEField(i,opt); else hE2D[i] = pData->GetEField2DSliceZY(i,-1,Nbins,opt+"avg"); hE2D[i]->SetName(hName); hE2D[i]->GetXaxis()->CenterTitle(); hE2D[i]->GetYaxis()->CenterTitle(); hE2D[i]->GetZaxis()->CenterTitle(); if(opt.Contains("comov")) hE2D[i]->GetXaxis()->SetTitle("k_{p} #zeta"); else hE2D[i]->GetXaxis()->SetTitle("k_{p} z"); if(pData->IsCyl()) hE2D[i]->GetYaxis()->SetTitle("k_{p} r"); else hE2D[i]->GetYaxis()->SetTitle("k_{p} x"); if(i==0) hE2D[i]->GetZaxis()->SetTitle("E_{z} / E_{0}"); else if(i==1) hE2D[i]->GetZaxis()->SetTitle("E_{y} / E_{0}"); else if(i==2) hE2D[i]->GetZaxis()->SetTitle("E_{x} / E_{0}"); } // Tunning the Histograms // --------------------- // Chaning to user units: // -------------------------- if(opt.Contains("units") && n0) { for(Int_t i=0;i<Nfields;i++) { if(i!=index) continue; Int_t NbinsX = hE2D[i]->GetNbinsX(); Float_t xMin = skindepth * hE2D[i]->GetXaxis()->GetXmin() / PUnits::um; Float_t xMax = skindepth * hE2D[i]->GetXaxis()->GetXmax() / PUnits::um; Int_t NbinsY = hE2D[i]->GetNbinsY(); Float_t yMin = skindepth * hE2D[i]->GetYaxis()->GetXmin() / PUnits::um; Float_t yMax = skindepth * hE2D[i]->GetYaxis()->GetXmax() / PUnits::um; hE2D[i]->SetBins(NbinsX,xMin,xMax,NbinsY,yMin,yMax); for(Int_t j=0;j<hE2D[i]->GetNbinsX();j++) { for(Int_t k=0;k<hE2D[i]->GetNbinsY();k++) { hE2D[i]->SetBinContent(j,k, hE2D[i]->GetBinContent(j,k) * ( E0 / (PUnits::GV/PUnits::m) ) ); } } if(pData->IsCyl()) hE2D[i]->GetYaxis()->SetTitle("r [#mum]"); else hE2D[i]->GetYaxis()->SetTitle("x [#mum]"); if(opt.Contains("comov")) hE2D[i]->GetXaxis()->SetTitle("#zeta [#mum]"); else hE2D[i]->GetXaxis()->SetTitle("z [#mum]"); if(i==0) hE2D[i]->GetZaxis()->SetTitle("E_{z} [GV/m]"); else if(i==1) hE2D[i]->GetZaxis()->SetTitle("E_{y} [GV/m]"); else if(i==2) hE2D[i]->GetZaxis()->SetTitle("E_{x} [GV/m]"); } } // --------------------------------------------------- Vertical Zoom ------------ Float_t yRange = (hE2D[index]->GetYaxis()->GetXmax() - hE2D[index]->GetYaxis()->GetXmin())/zoom; Float_t midPoint = (hE2D[index]->GetYaxis()->GetXmax() + hE2D[index]->GetYaxis()->GetXmin())/2.; Float_t yMin = midPoint-yRange/2; Float_t yMax = midPoint+yRange/2; if(pData->IsCyl()) { yMin = hE2D[index]->GetYaxis()->GetXmin(); yMax = yRange; } hE2D[index]->GetYaxis()->SetRangeUser(yMin,yMax); Float_t xMin = hE2D[index]->GetXaxis()->GetXmin(); Float_t xMax = hE2D[index]->GetXaxis()->GetXmax(); Float_t xRange = xMax - xMin; // Change the range of z axis for the fields to be symmetric. Float_t Emax = hE2D[index]->GetMaximum(); Float_t Emin = hE2D[index]->GetMinimum(); if(Emax > TMath::Abs(Emin)) Emin = -Emax; else Emax = -Emin; hE2D[index]->GetZaxis()->SetRangeUser(Emin,Emax); PPalette * plasmaPalette = (PPalette*) gROOT->FindObject("rbowwhite"); plasmaPalette->cd(); // Plotting // ----------------------------------------------- // Canvas setup TCanvas *C = new TCanvas("C","2D electric",800,500); // Actual Plotting! // ------------------------------------------------------------ // Output file TString fname; if(index<3) fname = Form("E%i",index+1); TString fOutName = Form("./%s/Plots/Field2D/Field2D-%s",sim.Data(),fname.Data()); fOutName += Form("-%s_%i",sim.Data(),time); C->cd(); // Setup Pad layout: Float_t lMargin = 0.15; Float_t rMargin = 0.18; Float_t bMargin = 0.20; Float_t tMargin = 0.06; gPad->SetLeftMargin(lMargin); gPad->SetRightMargin(rMargin); gPad->SetBottomMargin(bMargin); gPad->SetTopMargin(tMargin); if(opt.Contains("logz")) { gPad->SetLogz(1); } else { gPad->SetLogz(0); } gPad->SetFrameLineWidth(2); // Define the frames for plotting Int_t fonttype = 43; Int_t fontsize = 28; Int_t tfontsize = 30; Float_t txoffset = 1.3; Float_t lxoffset = 0.02; Float_t tyoffset = 1.0; Float_t lyoffset = 0.01; Float_t tylength = 0.02; Float_t txlength = 0.04; TH2F *hFrame = (TH2F*) gROOT->FindObject("hFrame"); if(hFrame) delete hFrame; hFrame = (TH2F*) hE2D[index]->Clone("hFrame"); hFrame->Reset(); // Format for y axis hFrame->GetYaxis()->SetTitleFont(fonttype); hFrame->GetYaxis()->SetTitleSize(tfontsize); hFrame->GetYaxis()->SetTitleOffset(tyoffset); hFrame->GetYaxis()->SetLabelFont(fonttype); hFrame->GetYaxis()->SetLabelSize(fontsize); hFrame->GetYaxis()->SetLabelOffset(lyoffset); hFrame->GetYaxis()->SetTickLength(tylength); // Format for x axis hFrame->GetXaxis()->SetTitleFont(fonttype); hFrame->GetXaxis()->SetTitleSize(tfontsize+2); hFrame->GetXaxis()->SetTitleOffset(txoffset); hFrame->GetXaxis()->SetLabelFont(fonttype); hFrame->GetXaxis()->SetLabelSize(fontsize+2); hFrame->GetXaxis()->SetLabelOffset(lxoffset); hFrame->GetXaxis()->SetTickLength(txlength); hFrame->Draw("col"); // hE2D[index]->GetZaxis()->SetNdivisions(505); hE2D[index]->GetZaxis()->SetTitleFont(fonttype); hE2D[index]->Draw("colz same"); // Re-touchs gPad->Update(); Float_t y1 = gPad->GetBottomMargin(); Float_t y2 = 1 - gPad->GetTopMargin(); Float_t x1 = gPad->GetLeftMargin(); Float_t x2 = 1 - gPad->GetRightMargin(); Float_t gap = 0.005; TPaletteAxis *palette = (TPaletteAxis*)hE2D[index]->GetListOfFunctions()->FindObject("palette"); if(palette) { palette->SetY2NDC(y2 - gap); palette->SetY1NDC(y1 + gap); palette->SetX1NDC(x2 + 0.005); palette->SetX2NDC(x2 + 0.03); palette->SetTitleOffset(tyoffset); palette->SetTitleSize(tfontsize); palette->SetLabelFont(fonttype); palette->SetLabelSize(fontsize); if(opt.Contains("logz")) palette->SetLabelOffset(0); else palette->SetLabelOffset(lyoffset); palette->SetBorderSize(2); palette->SetLineColor(1); } // Text objects TPaveText *textTime = new TPaveText(xMax - 0.30*xRange, yMax-0.10*yRange, xMax-0.02*xRange, yMax-0.02*yRange); PGlobals::SetPaveTextStyle(textTime,32); char ctext[128]; if(opt.Contains("units") && n0) sprintf(ctext,"z = %5.1f #mum", Time * skindepth / PUnits::um); else sprintf(ctext,"#omega_{p} t = %5.1f",Time); textTime->AddText(ctext); TPaveText *textDen = new TPaveText(xMin + 0.02*xRange, yMax-0.10*yRange, xMin + 0.40*xRange, yMax-0.02*yRange); PGlobals::SetPaveTextStyle(textDen,12); textDen->SetTextColor(kOrange+10); if(opt.Contains("units") && n0) { sprintf(ctext,"n_{0} = %5.2f x 10^{17} / cm^{3}", 1e-17 * n0 * PUnits::cm3); textDen->AddText(ctext); textDen->Draw(); } textTime->Draw(); gPad->RedrawAxis(); C->cd(); // Print to a file PGlobals::imgconv(C,fOutName,opt); // --------------------------------------------------------- }