void SetupStyle(); TH2* Get2DHistogramfromList(TList *pidqalist, const char* listname, const char* histoname); void AddFit(TH2* h2d); void PublishCanvas(TList *qaList, const char* det, const char* name, TString nadd=""); void SetupPadStyle(); void LoadLibs(); Int_t CheckLoadLibrary(const char* library); TCanvas *fCanvas=0x0; /* Example (require aliroot environment) root.exe -l -b -q $ALICE_ROOT/ANALYSIS/macros/MakePIDqaReport.C'("PIDqa.root")' */ void MakePIDqaReport(const char* inputFile, const char* outputFile="PIDqaReport.pdf") { // // Make a pdf file with the efficiency report // LoadLibs(); SetupStyle(); TFile f(inputFile); if (!f.IsOpen()){ printf("Could not open file '%s'\n",f.GetName()) return; } TList *qaList = (TList*) f.Get("PIDqa"); if (!qaList){ printf("Could not fine list 'PIDqa' in file '%s'\n",f.GetName()) return; } fCanvas=new TCanvas; TPDF p(outputFile); // // Invariant mass plots // // // Make QA info // // ITS PID PublishCanvas(qaList,"ITS","hNsigmaP_ITS_%s"); // TPC PID PublishCanvas(qaList,"TPC","hNsigmaP_TPC_%s"); // if (man->GetCurrentPeriod()=="11h"){ // PublishCanvas(qaList,"TPC","hNsigmaP_TPC_%s_Hybrid","Hybrid"); // PublishCanvas(qaList,"TPC","hNsigmaP_TPC_%s_OROChigh","OROChigh"); // } // TPC PID after 3 sigma TOF cut PublishCanvas(qaList,"TPC_TOF","hNsigmaP_TPC_TOF_%s"); // TOF PID PublishCanvas(qaList,"TOF","hNsigmaP_TOF_%s"); // TRD PID fCanvas->Divide(2,3); TH2 *hLikeP_TRD_3tls_electron=Get2DHistogramfromList(qaList,"TRD","hLikeP_TRD_3tls_electron"); TH2 *hLikeP_TRD_3tls_pion=Get2DHistogramfromList(qaList,"TRD","hLikeP_TRD_3tls_pion"); TH2 *hLikeP_TRD_4tls_electron=Get2DHistogramfromList(qaList,"TRD","hLikeP_TRD_4tls_electron"); TH2 *hLikeP_TRD_4tls_pion=Get2DHistogramfromList(qaList,"TRD","hLikeP_TRD_4tls_pion"); TH2 *hLikeP_TRD_5tls_electron=Get2DHistogramfromList(qaList,"TRD","hLikeP_TRD_5tls_electron"); TH2 *hLikeP_TRD_5tls_pion=Get2DHistogramfromList(qaList,"TRD","hLikeP_TRD_5tls_pion"); /* * cTRDnsigma[countcanvas]->cd(1); * TPaveText pt3TRD(.02,.02,.49,.52); * pt3TRD.SetTextAlign(11); * pt3TRD.SetTextSizePixels(16); * pt3TRD.AddText(Form(" TRD PID QA %s.%s.%d", first.Data(), man->GetCurrentPeriod().Data(), pass)); * pt3TRD.Draw(); */ fCanvas->cd(1); SetupPadStyle(); hLikeP_TRD_3tls_electron->Draw("colz"); fCanvas->cd(2); SetupPadStyle(); hLikeP_TRD_3tls_pion->Draw("colz"); fCanvas->cd(3); SetupPadStyle(); hLikeP_TRD_4tls_electron->Draw("colz"); fCanvas->cd(4); SetupPadStyle(); hLikeP_TRD_4tls_pion->Draw("colz"); fCanvas->cd(5); SetupPadStyle(); hLikeP_TRD_5tls_electron->Draw("colz"); fCanvas->cd(6); SetupPadStyle(); hLikeP_TRD_5tls_pion->Draw("colz"); fCanvas->Update(); fCanvas->Clear(); // TPC Response info TObjArray *qaInfo=(TObjArray*)PIDqa->FindObject("QAinfo"); TObjArray *tpcInfo=0x0; if (qaInfo && (tpcInfo=(TObjArray*)qaInfo->FindObject("TPC_info"))){ TObjArray *tpcSplineInfo=(TObjArray*)tpcInfo->FindObject("TPC_spline_names"); TObjArray *tpcConfigInfo=(TObjArray*)tpcInfo->FindObject("TPC_config_info"); fCanvas->Divide(1,2); TPaveText pt(.1,.1,.9,.9,"NDC"); pt.SetBorderSize(1); pt.SetFillColor(0); pt.SetTextSizePixels(16); if (tpcSplineInfo){ for (Int_t i=0; iGetEntriesFast();++i) pt.AddText(tpcSplineInfo->At(i)->GetName()); } TPaveText pt2(.1,.1,.9,.9,"NDC"); pt2.SetBorderSize(1); pt2.SetFillColor(0); pt2.SetTextSizePixels(16); if (tpcConfigInfo){ for (Int_t i=0; iGetEntriesFast();++i) pt2.AddText(tpcConfigInfo->At(i)->GetName()); } fCanvas->cd(1); pt.Draw(); fCanvas->cd(2); pt2.Draw(); fCanvas->Update(); fCanvas->Clear(); } delete qaList; p.Close(); delete fCanvas; } void SetupStyle() { const Int_t NCont=255; TStyle *st = new TStyle("mystyle","mystyle"); gROOT->GetStyle("Plain")->Copy((*st)); st->SetTitleX(0.1); st->SetTitleW(0.8); st->SetTitleH(0.08); st->SetStatX(.9); st->SetStatY(.9); st->SetNumberContours(NCont); st->SetPalette(1,0); st->SetOptStat("erm"); st->SetOptFit(0); st->SetGridColor(kGray+1); st->SetPadGridX(kTRUE); st->SetPadGridY(kTRUE); st->SetPadTickX(kTRUE); st->SetPadTickY(kTRUE); st->cd(); const Int_t NRGBs = 5; Double_t stops[NRGBs] = { 0.00, 0.34, 0.61, 0.84, 1.00 }; Double_t red[NRGBs] = { 0.00, 0.00, 0.87, 1.00, 0.51 }; Double_t green[NRGBs] = { 0.00, 0.81, 1.00, 0.20, 0.00 }; Double_t blue[NRGBs] = { 0.51, 1.00, 0.12, 0.00, 0.00 }; TColor::CreateGradientColorTable(NRGBs, stops, red, green, blue, NCont); } TH2* Get2DHistogramfromList(TList *pidqalist, const char* listname, const char* histoname) { TList *histolist = (TList *)pidqalist->FindObject(listname); if (!histolist) {printf(" list not found \n"); return 0x0; } TH2* histo = (TH2*)histolist->FindObject(histoname); // if (!histo) {printf(" histogram not found \n"); return 0x0; } return histo; } void AddFit(TH2* h2d) { // // Fit in slices and draw mean and sigma // TF1 *f1 = new TF1("f1", "gaus"); f1->SetRange(-1.5,1.5); TObjArray aSlices; h2d->FitSlicesY(f1, 0,-1, 0, "QNR",&aSlices); aSlices.SetOwner(1); TH1* hMean=(TH1*)aSlices.At(1); TH1* hSigma=(TH1*)aSlices.At(2); TH1* hChi2=(TH1*)aSlices.At(3); hChi2->Scale(1./10.); aSlices.AddAt(0x0,1); aSlices.AddAt(0x0,2); aSlices.AddAt(0x0,3); hMean->SetMarkerStyle(20); hMean->SetMarkerSize(0.3); hMean->SetOption("same"); h2d->GetListOfFunctions()->Add(hMean); hSigma->SetMarkerStyle(20); hSigma->SetMarkerSize(0.3); hSigma->SetOption("same"); hSigma->SetMarkerColor(kMagenta); h2d->GetListOfFunctions()->Add(hSigma); hChi2->SetOption("same"); hChi2->SetMarkerColor(kMagenta + 2); hChi2->SetLineColor(kMagenta + 2); h2d->GetListOfFunctions()->Add(hChi2); TLine *l=0x0; l=new TLine(h2d->GetXaxis()->GetXmin(),0,h2d->GetXaxis()->GetXmax(),0); l->SetLineStyle(2); h2d->GetListOfFunctions()->Add(l); l=new TLine(h2d->GetXaxis()->GetXmin(),1,h2d->GetXaxis()->GetXmax(),1); l->SetLineStyle(2); h2d->GetListOfFunctions()->Add(l); } void PublishCanvas(TList *qaList, const char* det, const char* name, TString nadd) { // // draw all nSigma + signal histo // TObjArray arrHistos; TPaveText pt(.1,.1,.9,.9,"NDC"); pt.SetBorderSize(1); pt.SetFillColor(0); pt.SetTextSizePixels(16); pt.AddText(Form("%s PID QA",det)); if (!nadd.IsNull()){ pt.AddText(nadd.Data()); nadd.Prepend("_"); } arrHistos.Add(&pt); TH2 *hSig=Get2DHistogramfromList(qaList,det,Form("hSigP_%s",det)); if (hSig){ hSig->SetOption("colz"); arrHistos.Add(hSig); } for (Int_t i=0;iSetOption("colz"); AddFit(h); arrHistos.Add(h); } Int_t nPads=arrHistos.GetEntriesFast(); Int_t nCols = (Int_t)TMath::Ceil( TMath::Sqrt(nPads) ); Int_t nRows = (Int_t)TMath::Ceil( (Double_t)nPads/(Double_t)nCols ); fCanvas->Divide(nCols,nRows); for (Int_t i=0; icd(i+1); SetupPadStyle(); arrHistos.At(i)->Draw(); } fCanvas->Update(); fCanvas->Clear(); } void SetupPadStyle() { gPad->SetLogx(); gPad->SetLogz(); gPad->SetGridx(); gPad->SetGridy(); gPad->SetTickx(); gPad->SetTicky(); } void LoadLibs() { CheckLoadLibrary("libCore"); CheckLoadLibrary("libPhysics"); CheckLoadLibrary("libMinuit"); CheckLoadLibrary("libGui"); CheckLoadLibrary("libXMLParser"); CheckLoadLibrary("libGeom"); CheckLoadLibrary("libVMC"); CheckLoadLibrary("libNet"); CheckLoadLibrary("libTree"); CheckLoadLibrary("libProof"); CheckLoadLibrary("libSTEERBase"); CheckLoadLibrary("libESD"); CheckLoadLibrary("libCDB"); CheckLoadLibrary("libRAWDatabase"); CheckLoadLibrary("libRAWDatarec"); CheckLoadLibrary("libANALYSIS"); CheckLoadLibrary("libSTEER"); CheckLoadLibrary("libSTAT"); CheckLoadLibrary("libAOD"); CheckLoadLibrary("libOADB"); CheckLoadLibrary("libANALYSISalice"); CheckLoadLibrary("libCORRFW"); CheckLoadLibrary("libTPCbase"); } Int_t CheckLoadLibrary(const char* library) { // checks if a library is already loaded, if not loads the library if (strlen(gSystem->GetLibraries(Form("%s.so", library), "", kFALSE)) > 0) return 1; return gSystem->Load(library); }