void rescale2SM4(bool armed, const char* filename, double ecms=7., double mass=-1) { unsigned int debug = 1; std::vector<std::string> histnames; histnames.clear(); if( debug>0 ){ std::cout << "file = " << filename << std::setw(10); std::cout << "mass = " << mass << std::setw(10); std::cout << "armed = " << armed << std::endl; } TFile* file = new TFile(filename, "update"); TIter nextDirectory(file->GetListOfKeys()); std::vector<std::string> buffer; TKey* idir; while((idir = (TKey*)nextDirectory())){ buffer.clear(); if( idir->IsFolder() ){ file->cd(); // make sure to start in directory head if( debug>1 ){ std::cout << "Found directory: " << idir->GetName() << std::endl; } if( file->GetDirectory(idir->GetName()) ){ file->cd(idir->GetName()); // change to sub-directory buffer = signalList(idir->GetName(), "", debug); } // append to the vector of histograms to be rescaled for(std::vector<std::string>::const_iterator elem=buffer.begin(); elem!=buffer.end(); ++elem){ histnames.push_back(*elem); } if(debug>1){ std::cout << "added " << buffer.size() << " elements to histnames [" << histnames.size() << "] for directory " << idir->GetName() << std::endl; } } } // pick up histograms which are not kept in an extra folder file->cd(); buffer.clear(); buffer = signalList("", "", debug); // append to the vector of histograms to be rescaled for(std::vector<std::string>::const_iterator elem=buffer.begin(); elem!=buffer.end(); ++elem){ histnames.push_back(*elem); } if(debug>1){ std::cout << "added " << buffer.size() << " elements to histnames [" << histnames.size() << "] for file head" << std::endl; } HiggsCSandWidth smx; HiggsCSandWidthSM4 sm4; for(std::vector<std::string>::const_iterator hist=histnames.begin(); hist!=histnames.end(); ++hist){ int type = 0; // determine mass from hostogram name std::string strippedName = (hist->find("/")!=std::string::npos ? hist->substr(hist->find("/")+1) : *hist); std::string massName; if(strippedName.find("ggH")!=std::string::npos) { massName = strippedName.substr(3, 3); type = 1; } if(strippedName.find("qqH")!=std::string::npos) { massName = strippedName.substr(3, 3); type = 2; } if(strippedName.find("VH" )!=std::string::npos) { massName = strippedName.substr(2, 3); type = 3; } if( type==0 ) { std::cout << "not supported process" << std::endl; continue; } else { file->cd(); float mdx = atof(massName.c_str()); TH1F* h = (TH1F*)file->Get(hist->c_str()); float smxXS = type==1 ? smx.HiggsCS(type, mdx, ecms, true) : 0.; float smxBR = smx.HiggsBR(2, mdx, true); float sm4XS = type==1 ? sm4.HiggsCS(type, mdx, ecms, true) : 0.; float sm4BR = sm4.HiggsBR(2, mdx, true); if( debug>1 ){ std::cout << " -- hist = " << std::setw(10) << h->GetName() << std::endl << " -- type = " << std::setw(10) << type << std::endl << " -- mass = " << std::setw(10) << mdx << std::endl << " -- SM = " << std::setw(10) << smxXS*smxBR << " (BR = " << smxBR << ")" << std::endl << " -- SM4 = " << std::setw(10) << sm4XS*sm4BR << " (BR = " << sm4BR << ")" << std::endl << " -- scale = " << std::setw(10) << (type==1 ? sm4XS*sm4BR/(smxXS*smxBR) : 0) << std::endl << std::endl; } if( type==1 ){ h->Scale(sm4XS*sm4BR/(smxXS*smxBR)); } //scaling old style //if( type==2 ){ h->Scale(sm4BR/smxBR); } //if( type==3 ){ h->Scale(sm4BR/smxBR); } // scaling new style if( type==2 ){ h->Scale(0.); } if( type==3 ){ h->Scale(0.); } if(armed){ if(hist->find("/")!=std::string::npos){ file->cd(hist->substr(0, hist->find("/")).c_str()); } else{ file->cd(); } h->Write(strippedName.c_str(), TObject::kOverwrite); } } } file->Close(); return; }
void rescaleSignal(bool armed, double scale, const char* filename, const char* pattern="", unsigned int debug=0) { std::vector<std::string> histnames; histnames.clear(); if( debug>0 ){ std::cout << "file = " << filename << std::endl; std::cout << "scale = " << scale << std::endl; std::cout << "armed = " << armed << std::endl; } TFile* file = new TFile(filename, "update"); TIter nextDirectory(file->GetListOfKeys()); std::vector<std::string> buffer; TKey* idir; while((idir = (TKey*)nextDirectory())){ buffer.clear(); if( idir->IsFolder() ){ file->cd(); // make sure to start in directory head if( debug>0 ){ std::cout << "Found directory: " << idir->GetName() << std::endl; } if( file->GetDirectory(idir->GetName()) ){ file->cd(idir->GetName()); // change to sub-directory buffer = signalList(idir->GetName(), pattern, debug); } // append to the vector of histograms to be rescaled for(std::vector<std::string>::const_iterator elem=buffer.begin(); elem!=buffer.end(); ++elem){ histnames.push_back(*elem); } if(debug>1){ std::cout << "added " << buffer.size() << " elements to histnames [" << histnames.size() << "] for directory " << idir->GetName() << std::endl; } } } // pick up files which are not kept in an extra folder file->cd(); buffer.clear(); buffer = signalList("", pattern, debug); // append to the vector of histograms to be rescaled for(std::vector<std::string>::const_iterator elem=buffer.begin(); elem!=buffer.end(); ++elem){ histnames.push_back(*elem); } if(debug>1){ std::cout << "added " << buffer.size() << " elements to histnames [" << histnames.size() << "] for file head" << std::endl; } for(std::vector<std::string>::const_iterator hist=histnames.begin(); hist!=histnames.end(); ++hist){ file->cd(); TH1F* h = (TH1F*)file->Get(hist->c_str()); std::string histName; if(hist->find("/")!=std::string::npos){ histName = hist->substr(hist->find("/")+1); } else{ histName = *hist; } TH1F* hout = (TH1F*)h->Clone(histName.c_str()); if(debug>1){ std::cout << "...folder : " << hist->substr(0, hist->find("/")).c_str() << std::endl; std::cout << "...histogram : " << hout->GetName () << " / " << hist->c_str() << std::endl; std::cout << "...old scale : " << hout->Integral() << std::endl; } hout->Scale(scale); if(match(pattern, "data")){ //make sure to have an integer integral when rescaling data yields hout->Scale(int(hout->Integral())/hout->Integral()); } if(debug>1){ std::cout << "...new scale : " << hout->Integral() << std::endl; } if(armed){ if(hist->find("/")!=std::string::npos){ file->cd(hist->substr(0, hist->find("/")).c_str()); } else{ file->cd(); } std::cout << "writing to file: " << hout->GetName() << std::endl; hout->Write(hist->substr(hist->find("/")+1).c_str(), TObject::kOverwrite); } } file->Close(); return; }
void changeAxis(bool armed, TString iExprMatch,float iMin, const char* filename, const char* pattern="", unsigned int debug=0) { std::vector<std::string> histnames; histnames.clear(); if( debug>0 ){ std::cout << "file = " << filename << std::endl; std::cout << "old = " << iExprMatch.Data() << std::endl; std::cout << "armed = " << armed << std::endl; } TFile* file = new TFile(filename, "update"); TIter nextDirectory(file->GetListOfKeys()); std::vector<std::string> buffer; TKey* idir; while((idir = (TKey*)nextDirectory())){ buffer.clear(); if( idir->IsFolder() ){ file->cd(); // make sure to start in directory head if( debug>0 ){ std::cout << "Found directory: " << idir->GetName() << std::endl; } if( file->GetDirectory(idir->GetName()) ){ file->cd(idir->GetName()); // change to sub-directory buffer = signalList(idir->GetName(), pattern,iExprMatch.Data(), debug); } // append to the vector of histograms to be rescaled for(std::vector<std::string>::const_iterator elem=buffer.begin(); elem!=buffer.end(); ++elem){ histnames.push_back(*elem); } if(debug>1){ std::cout << "added " << buffer.size() << " elements to histnames [" << histnames.size() << "] for directory " << idir->GetName() << std::endl; } } } // pick up files which are not kept in an extra folder file->cd(); buffer.clear(); buffer = signalList("", pattern,iExprMatch.Data(), debug); // append to the vector of histograms to be rescaled for(std::vector<std::string>::const_iterator elem=buffer.begin(); elem!=buffer.end(); ++elem){ histnames.push_back(*elem); } if(debug>1){ std::cout << "added " << buffer.size() << " elements to histnames [" << histnames.size() << "] for file head" << std::endl; } for(std::vector<std::string>::const_iterator hist=histnames.begin(); hist!=histnames.end(); ++hist){ file->cd(); TH1F* h = (TH1F*)file->Get(hist->c_str()); std::string histName; if(hist->find("/")!=std::string::npos){ histName = hist->substr(hist->find("/")+1); } else{ histName = *hist; } TH1F* hout = (TH1F*)h->Clone(histName.c_str()); if(debug>1){ std::cout << "...folder : " << hist->substr(0, hist->find("/")).c_str() << std::endl; std::cout << "...histogram : " << hout->GetName () << " / " << hist->c_str() << std::endl; } for(int i0 = 0; i0 < hout->GetNbinsX()+1; i0++) if(hout->GetXaxis()->GetBinCenter(i0) < iMin) hout->SetBinContent(i0,0); if(debug>1){ std::cout << "...new name : " << hout->GetName() << std::endl; std::cout << "...new title : " << hout->GetTitle() << std::endl; } if(armed){ if(hist->find("/")!=std::string::npos){ file->cd(hist->substr(0, hist->find("/")).c_str()); } else{ file->cd(); } std::cout << "writing to file: " << hout->GetName() << " -- " << hist->substr(hist->find("/")+1).c_str() << std::endl; hout->Write(hist->substr(hist->find("/")+1).c_str(), TObject::kOverwrite); } } file->Close(); return; }