#include #include #include #include #include #include #include #include #include #include #include #include #include #include "stdio.h" #include "string" #include "TStyle.h" #include "Riostream.h" #include "TAxis.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::cout; using std::endl; typedef vector array1b; typedef vector array1s; typedef vector array1tf; typedef vector array1tt; typedef vector array1d; typedef vector array1i; typedef vector array1tc; typedef vector array1tel; typedef vector< vector< TH1F* > > array2th1f; array1s TuplePaths; array1s LegendNames; array1s FileNames; array1i Colors; array1i FillStyles; array1s Vars; array1tf Files; array1tt Trees; array1d VarLower; array1d VarUpper; array1i VarBins; array1d Weights; array1tel EntryLists; array1s Units; array1b Axis; array1i lw; TFile *outFile; UInt_t loadFiles(std::string filename); UInt_t loadVars(std::string filename); int main(int argc, char *argv[]){ if(argc != 8){ cout << "Stacker: Quick and easy plotting tool, Conor Fitzpatrick 2008" << endl; cout << "Usage: stacker files.txt vars.txt rows cols width height outputdir stackargs" << endl; } std::string filelistName = argv[1]; std::string varlistName = argv[2]; UInt_t PlotRows = atoi(argv[3]); UInt_t PlotCols = atoi(argv[4]); UInt_t CanvWidth = atoi(argv[5]); UInt_t CanvHeight = atoi(argv[6]); TString outputDir = argv[7]; gSystem->mkdir( outputDir ); outFile = new TFile(outputDir+"/plots.root","RECREATE"); TString * stackargs = new TString(argv[8]); UInt_t nFiles = loadFiles(filelistName); UInt_t nVars = loadVars(varlistName); UInt_t ppp = PlotRows * PlotCols; gStyle->SetFrameBorderMode(0); gStyle->SetCanvasBorderMode(0); gStyle->SetPadBorderMode(0); gStyle->SetPadColor(0); gStyle->SetCanvasColor(0); gStyle->SetStatColor(0); gStyle->SetTitleFillColor(0); gStyle->SetFillColor(0); gStyle->SetFrameFillColor(0); // gStyle->SetOptStat(0); UInt_t nVarsDone = 0; UInt_t page = 0; while(nVarsDoneSetFillColor(0); c->Divide(PlotCols,PlotRows); c->Update(); for(UInt_t v = 0; vcd(v+1); gPad->SetFillColor(0); TPaveStats *stats[nFiles]; THStack *hs = new THStack(Vars[nVarsDone],Vars[nVarsDone]); TLegend *legend = new TLegend(0.15,0.85,0.30,0.70); cout << "pad = " << v << endl; for(UInt_t f=0; fDraw(Vars[nVarsDone]+">>"+Vars[nVarsDone]+" "+LegendNames[f]); Histo->SetLineColor(Colors[f]); Histo->SetFillColor(Colors[f]); Histo->SetFillStyle(FillStyles[f]); Histo->SetLineWidth(lw[f]); Histo->SetStats(true); c->Update(); stats[f] = new TPaveStats(); stats[f] = (TPaveStats*)Histo->GetListOfFunctions()->FindObject("stats"); stats[f]->SetTextColor(Colors[f]); Histo->Scale(Weights[f]); hs->Add(Histo); legend->AddEntry(Histo,LegendNames[f],"f"); } if(Axis[nVarsDone]){ gPad->SetLogy(); } gStyle->SetStatX(999.); hs->Draw(*stackargs); c->Update(); hs->GetXaxis()->SetTitle(Units[nVarsDone]); hs->GetYaxis()->SetTitle("Candidates"); Double_t x1 = 0.825; Double_t x2 = 0.975; Double_t y1 = 0.825; Double_t y2 = 0.975; for(UInt_t g=0; gSetX1NDC(x1); stats[g]->SetX2NDC(x2); stats[g]->SetY1NDC(y1); stats[g]->SetY2NDC(y2); y1 = y1 - 0.165; y2 = y2 - 0.165; stats[g]->Draw(); } nVarsDone++; if(v==0){ legend->SetShadowColor(0); legend->SetLineColor(0); legend->SetTextSize(0.05); legend->SetFillColor(0); legend->Draw(); } } c->Update(); } page++; c->Write(); //gStyle->SetPaperSize(52,40); c->Print(outputDir+"/"+canvName+".png"); c->Print(outputDir+"/"+canvName+".eps"); c->Print(outputDir+"/"+canvName+".pdf"); c->Print(outputDir+"/"+canvName+".svg"); delete c; } outFile->Write(); outFile->Close(); } UInt_t loadFiles(std::string filename){ ifstream fileStream; std::string lineread; TString line; UInt_t nlines =0; TString word; char* delimiters = " "; fileStream.open(filename.c_str()); if (!fileStream){ std::cout << "Error in opening file list" << std::endl; return EXIT_FAILURE; } while(!line.ReadLine(fileStream).eof()){ TObjArray* Strings = line.Tokenize(delimiters); TIter iString(Strings); TObjString* os=0; os=(TObjString*)iString(); if(!os->GetString().BeginsWith('#')){ Files.push_back(TFile::Open(os->GetString())); os=(TObjString*)iString(); TuplePaths.push_back(os->GetString()); Trees.push_back((TTree*)Files.back()->Get(TuplePaths.back())); os=(TObjString*)iString(); LegendNames.push_back(os->GetString()); os=(TObjString*)iString(); Colors.push_back(atoi(os->GetString())); os=(TObjString*)iString(); FillStyles.push_back(atoi(os->GetString())); os=(TObjString*)iString(); if(os->GetString()=="N"){ Double_t norm = 1.0/(Double_t)Trees.back()->GetEntries(); cout << "Normalising " << LegendNames.back() << " to unit area. Normalisation factor:" << norm << endl; Weights.push_back(norm); }else{ Weights.push_back(atof(os->GetString())); } os=(TObjString*)iString(); lw.push_back(atoi(os->GetString())); nlines++; } } return nlines; } UInt_t loadVars(std::string filename){ ifstream fileStream; std::string lineread; TString line; UInt_t nlines =0; TString word; char* delimiters = " "; fileStream.open(filename.c_str()); if (!fileStream){ std::cout << "Error in opening var list" << std::endl; return EXIT_FAILURE; } while(!line.ReadLine(fileStream).eof()){ TObjArray* Strings = line.Tokenize(delimiters); TIter iString(Strings); TObjString* os=0; os=(TObjString*)iString(); if(!os->GetString().BeginsWith('#')){ Vars.push_back(os->GetString()); os=(TObjString*)iString(); VarLower.push_back(atof(os->GetString())); os=(TObjString*)iString(); VarUpper.push_back(atof(os->GetString())); os=(TObjString*)iString(); VarBins.push_back(atoi(os->GetString())); os=(TObjString*)iString(); Units.push_back(os->GetString()); os=(TObjString*)iString(); if(os->GetString() == "log"){Axis.push_back(true);}else{Axis.push_back(false);} nlines++; } } return nlines; }