// Lange // September 29, 2006 // // Script to automate reference comparisons // // #include "TFile.h" #include "TKey.h" #include "TCollection.h" #include "TH1F.h" #include "TROOT.h" #include "TStyle.h" #include "TCanvas.h" #include #include #include #include #include void doRefCheck(TString file, bool makepsfiles=false, bool writeRef=false) { // read in root file TFile *f1=new TFile(file,"READ"); // f1->ls(); TKey *key; TIter nextkey(f1->GetListOfKeys()); std::vector names; while (key= (TKey*)nextkey()) { if ( strcmp(key->GetClassName(),"TH1F")!=0 ) continue; TH1F *h1=(TH1F*)key->ReadObj(); names.push_back((h1->GetName())); } if ( names.size()==0 ) { std::cout << "NO histograms found?? Missing file?\n"; return; } // read in references if they are found. std::map references; TString refFile=file; refFile+=".ref"; ifstream *infile=new ifstream(refFile.Data(),std::ios::in); char tChar[100]; std::vector datums; std::string refTitle; double refLow=0.; double refHigh=0.; while ( infile->good()) { infile->getline(tChar,100); if ( infile->good() ) { if ( strcmp(tChar,"start histogram")==0) { if ( datums.size() > 0 ) { TString tTitle="ref"; tTitle+=references.size(); TH1F *hTemp=new TH1F(tTitle,tTitle,datums.size()-2,refLow,refHigh); for ( unsigned int i=0; iSetBinContent(i,datums[i]); //std::cout << datums[i] << std::endl; } references[refTitle]=hTemp; datums.clear(); } infile->getline(tChar,100); refTitle=std::string(tChar); infile->getline(tChar,100); refLow=atof(tChar); infile->getline(tChar,100); refHigh=atof(tChar); } else{ datums.push_back(atof(tChar)); } } } if ( datums.size() > 0 ) { TString tTitle="ref"; tTitle+=references.size(); TH1F *hTemp=new TH1F(tTitle,tTitle,datums.size()-2,refLow,refHigh); for ( unsigned int i=0; iSetBinContent(i,datums[i]); references[refTitle]=hTemp; } gROOT->SetStyle("Plain"); // make plot background truly white gStyle->SetPalette(1); // palette set from violet to red, root chooses scale fstream *outf=0; if (writeRef) { TString refOut=file; refOut+=".ref.new"; outf=new fstream(refOut.Data(),std::ios::out); } for ( unsigned int i=0; iGet(names[i].c_str()); h1->SetMinimum(0.); h1->Draw(); TH1F *h2=references[std::string(h1->GetTitle())]; std::cout << "Histogram: " << h1->GetTitle(); if ( h2 != 0 ) { h2->SetLineColor(kRed); h2->Draw("same"); if ( h1->GetNbinsX() != h2->GetNbinsX() ) { std::cout << " reference has different binning! " << h1->GetNbinsX() << " " << h2->GetNbinsX() << std::endl; } else{ int nDiffs=0; for ( int i=0; iGetNbinsX(); i++ ) if ( h1->GetBinContent(i) != h2->GetBinContent(i) ) nDiffs++; if ( nDiffs > 0 ) std::cout << " has " << nDiffs << " bins that were different from reference" << std::endl; else std::cout << " agrees with reference\n"; } } else{ std::cout << " no reference found\n"; } TString title=h1->GetTitle(); if ( outf != 0 ) { (*outf) << "start histogram\n"; (*outf) << title.Data() << std::endl; (*outf) << h1->GetBinLowEdge(1) << std::endl << h1->GetBinLowEdge(1+h1->GetNbinsX()) << std::endl; for ( int j=0; j<= h1->GetNbinsX()+1; j++) (*outf) << h1->GetBinContent(j) << std::endl; } if ( makepsfiles ) { TString psName=file; psName+="_"; psName+=i; psName+=".ps"; can->Print(psName); } } if ( outf != 0 ) outf->close(); }