diff --git a/PhysicsAnalysis/AnalysisCommon/PileupReweighting/Root/PileupReweightingTool.cxx b/PhysicsAnalysis/AnalysisCommon/PileupReweighting/Root/PileupReweightingTool.cxx index 3e99eadd428981bd0c6126fdb7b9631829b6e104..4bead74f05bc4110064a9ede1ee82f5b90d5f9ea 100644 --- a/PhysicsAnalysis/AnalysisCommon/PileupReweighting/Root/PileupReweightingTool.cxx +++ b/PhysicsAnalysis/AnalysisCommon/PileupReweighting/Root/PileupReweightingTool.cxx @@ -25,10 +25,10 @@ namespace CP { -PileupReweightingTool::PileupReweightingTool( const std::string& name ) :CP::TPileupReweighting(name.c_str()), asg::AsgTool( name ), - m_inConfigMode(false), - m_upTool(), m_downTool(), m_systUp("PRW_DATASF", 1 ), m_systDown("PRW_DATASF", -1), - m_activeTool(this), +PileupReweightingTool::PileupReweightingTool( const std::string& name ) :CP::TPileupReweighting(name.c_str()), asg::AsgTool( name ), + m_inConfigMode(false), + m_upTool(), m_downTool(), m_systUp("PRW_DATASF", 1 ), m_systDown("PRW_DATASF", -1), + m_activeTool(this), m_noWeightsMode(false), #ifdef XAOD_STANDALONE m_defaultWeightTool( new McEventWeight( "DefaultWeightTool" ) ), @@ -56,9 +56,9 @@ PileupReweightingTool::PileupReweightingTool( const std::string& name ) :CP::TPi declareProperty("DataScaleFactorUP",m_upVariation=1./0.99,"Set to a value representing the 'up' fluctuation - will report a PRW_DATASF uncertainty to Systematic Registry"); declareProperty("DataScaleFactorDOWN",m_downVariation=1./1.07,"Set to a value representing the 'down' fluctuation - will report a PRW_DATASF uncertainty to Systematic Registry"); declareProperty("VaryRandomRunNumber",m_varyRunNumber=false,"If true, then when doing systematic variations, RandomRunNumber will fluctuate as well. Off by default as believed to lead to overestimated uncertainties"); - + declareProperty("PeriodAssignments", m_customPeriods={284500,222222,324300,300000,324300,344495,310000,344496,999999}, "Specify period number assignments to run numbers ranges - this is usually an expert option"); - + declareProperty("GRLTool", m_grlTool, "If you provide a GoodRunsListSelectionTool, any information from lumicalc files will be automatically filtered" ); declareProperty("TrigDecisionTool",m_tdt, "When using the getDataWeight method, the TDT will be used to check decisions before prescale. Alternatively do expert()->SetTriggerBit('trigger',0) to flag which triggers are not fired before prescale (assumed triggers are fired if not specified)"); @@ -87,7 +87,7 @@ PileupReweightingTool::PileupReweightingTool( const std::string& name ) :CP::TPi #ifndef XAOD_STANDALONE //rootcore can't do this yet! void PileupReweightingTool::updateHandler(Property& p) { - //call the original update handler + //call the original update handler this->msg_update_handler(p); EnableDebugging(this->msgLvl(MSG::DEBUG)); } @@ -102,8 +102,8 @@ bool PileupReweightingTool::passTriggerBeforePrescale(const TString& trigger) co if(m_tdt.empty()){ ATH_MSG_INFO("the TDT is empty, so we're reverting to the TPileupReweighting method"); - return TPileupReweighting::passTriggerBeforePrescale(trigger); - + return TPileupReweighting::passTriggerBeforePrescale(trigger); + } ATH_MSG_VERBOSE("Checking tdt decision of " << trigger); //Note that the trigger *must* be a rerun trigger if this result is to be valid ... could check this in the trigconf is absolutely necessary @@ -111,18 +111,21 @@ bool PileupReweightingTool::passTriggerBeforePrescale(const TString& trigger) co //if it's not rerun, all we will get back here is the TAP result ATH_MSG_DEBUG( "HEATHER DEBUG trigger string: " << trigger); std::string trigger_str = std::string(trigger.Data()); - + std::string delimiter = "_L1"; std::string trigger_hlt = trigger_str.substr(0, trigger_str.find(delimiter)); - std::string trigger_l1 = trigger_str.erase(0, trigger_str.find(delimiter) +1); + std::string trigger_l1 = trigger_str.erase(0, trigger_str.find(delimiter) +1); + + if (trigger_l1 == "L1LFV-MU6") trigger_l1 = "L1_LFV-MU6"; //testing + ATH_MSG_DEBUG(" L1 string " << trigger_l1); ATH_MSG_DEBUG(" HLT string " << trigger_hlt); - + ATH_MSG_DEBUG(" L1 passed? " << m_tdt->isPassed( trigger_l1 )); - ATH_MSG_DEBUG(" HLT passed? " << m_tdt->isPassed( trigger_hlt, 1/*TrigDefs::requireDecision*/ )); + ATH_MSG_DEBUG(" HLT passed? " << m_tdt->isPassed( trigger_hlt, 1/*TrigDefs::requireDecision*/ )); //ATH_MSG_DEBUG("HEATHER DEBUG trigger string: " << trigger); return (m_tdt->isPassed( trigger_l1 ) && m_tdt->isPassed( trigger_hlt, 1/*TrigDefs::requireDecision*/ )); - + //return m_tdt->isPassed( trigger.Data() , 37 /*physics|allowRessurectedDecision*/ ); //FIXME: need Trigger people to move Condition.h to interface package! } @@ -141,10 +144,10 @@ CP::SystematicSet PileupReweightingTool::recommendedSystematics() const { return affectingSystematics(); } -CP::SystematicCode PileupReweightingTool::applySystematicVariation( const CP::SystematicSet& systConfig ) { +CP::SystematicCode PileupReweightingTool::applySystematicVariation( const CP::SystematicSet& systConfig ) { if(systConfig.find( m_systUp ) != systConfig.end() && systConfig.find( m_systDown ) != systConfig.end()) { - ATH_MSG_ERROR("Errr... what the!? You're trying to do both PRW_DATASF directions at the same time!!!??"); - return SystematicCode::Unsupported; + ATH_MSG_ERROR("Errr... what the!? You're trying to do both PRW_DATASF directions at the same time!!!??"); + return SystematicCode::Unsupported; } if(systConfig.find( m_systUp ) != systConfig.end()) { if(!m_upTool) { ATH_MSG_ERROR("Requested up variation of PRW_DATASF, but not configured to do this :-("); return SystematicCode::Unsupported; } @@ -159,22 +162,22 @@ CP::SystematicCode PileupReweightingTool::applySystematicVariation( const CP::Sy } -float PileupReweightingTool::getCorrectedAverageInteractionsPerCrossing( const xAOD::EventInfo& eventInfo, bool includeDataScaleFactor ) { +float PileupReweightingTool::getCorrectedAverageInteractionsPerCrossing( const xAOD::EventInfo& eventInfo, bool includeDataScaleFactor ) { if(eventInfo.eventType(xAOD::EventInfo::IS_SIMULATION)) { return eventInfo.averageInteractionsPerCrossing(); //no correction needed for MC } float out = CP::TPileupReweighting::GetLumiBlockMu(eventInfo.runNumber(),eventInfo.lumiBlock()); if(out<0) return out; //will be -1 - return out * ( (includeDataScaleFactor) ? m_activeTool->GetDataScaleFactor() : 1.); + return out * ( (includeDataScaleFactor) ? m_activeTool->GetDataScaleFactor() : 1.); } - -float PileupReweightingTool::getCorrectedActualInteractionsPerCrossing( const xAOD::EventInfo& eventInfo, bool includeDataScaleFactor ) { + +float PileupReweightingTool::getCorrectedActualInteractionsPerCrossing( const xAOD::EventInfo& eventInfo, bool includeDataScaleFactor ) { if(eventInfo.eventType(xAOD::EventInfo::IS_SIMULATION)) { return eventInfo.actualInteractionsPerCrossing(); //no correction needed for MC } float correctedMu = CP::TPileupReweighting::GetLumiBlockMu(eventInfo.runNumber(),eventInfo.lumiBlock()); if(correctedMu<0) return correctedMu; //will be -1 - return eventInfo.actualInteractionsPerCrossing() * (correctedMu/eventInfo.averageInteractionsPerCrossing()) * ( (includeDataScaleFactor) ? m_activeTool->GetDataScaleFactor() : 1.); + return eventInfo.actualInteractionsPerCrossing() * (correctedMu/eventInfo.averageInteractionsPerCrossing()) * ( (includeDataScaleFactor) ? m_activeTool->GetDataScaleFactor() : 1.); } @@ -200,7 +203,7 @@ StatusCode PileupReweightingTool::initialize() { AddPeriod(period[0],period[1],period[2]); } - //see if we need variations + //see if we need variations if(m_upVariation && (m_prwFiles.size()+m_lumicalcFiles.size())!=0) { m_upTool.reset( new TPileupReweighting((name()+"_upVariation").c_str()) ); m_upTool->SetParentTool(this); @@ -222,7 +225,7 @@ StatusCode PileupReweightingTool::initialize() { //should we set the period config (file maker mode) if(m_prwFiles.size()+m_lumicalcFiles.size()==0) { m_inConfigMode=true; - ATH_MSG_INFO("In Config file making mode."); + ATH_MSG_INFO("In Config file making mode."); if(m_usePeriodConfig!="auto" && m_usePeriodConfig!="") { /*m_tool->*/UsePeriodConfig(m_usePeriodConfig); } @@ -242,7 +245,7 @@ StatusCode PileupReweightingTool::initialize() { if(m_upTool) m_upTool->UsePeriodConfig("MC16"); if(m_downTool) m_downTool->UsePeriodConfig("MC16"); } - + for(unsigned int j=0;j<m_prwFiles.size();j++) { ATH_MSG_VERBOSE("Locating File: " << m_prwFiles[j]); std::string file = PathResolverFindCalibFile(m_prwFiles[j]); @@ -271,9 +274,9 @@ StatusCode PileupReweightingTool::initialize() { if(m_downTool) m_downTool->UsePeriodConfig("MC16"); } } - + for(unsigned int j=0;j<m_lumicalcFiles.size();j++) { - //see if there's a trigger at the end of the filename .. format is "file:trigger" + //see if there's a trigger at the end of the filename .. format is "file:trigger" TString myFile = m_lumicalcFiles[j]; TString myTrigger = (myFile.Contains(':')) ? TString(myFile(myFile.Last(':')+1,myFile.Length()-myFile.Last(':'))) : TString("None"); myFile = (myFile.Contains(':')) ? TString(myFile(0,myFile.Last(':'))) : myFile; @@ -286,7 +289,7 @@ StatusCode PileupReweightingTool::initialize() { } } - //register ourselves with the systematic registry! + //register ourselves with the systematic registry! CP::SystematicRegistry& registry = CP::SystematicRegistry::getInstance(); if( registry.registerSystematics( *this ) != CP::SystematicCode::Ok ) return StatusCode::FAILURE; @@ -317,30 +320,30 @@ StatusCode PileupReweightingTool::finalize() { /*m_tool->*/WriteToFile(fileName); } else { //write to the histsvc stream instead ... - + ServiceHandle<ITHistSvc> histSvc("THistSvc",name()); CHECK( histSvc.retrieve() ); TTree *outTreeMC=0; TTree *outTreeData=0; - Int_t channel = 0;UInt_t runNumber = 0; + Int_t channel = 0;UInt_t runNumber = 0; std::vector<UInt_t> pStarts; std::vector<UInt_t> pEnds; std::vector<UInt_t>* pStartsPtr = &pStarts; std::vector<UInt_t>* pEndsPtr = &pEnds; Char_t histName[150]; - - //loop over periods ... periods only get entry in table if they have an input histogram + + //loop over periods ... periods only get entry in table if they have an input histogram for(auto period : m_periods) { if(!period.second) continue; //should never happen, but just in case! if(period.first<0) continue; //avoid the global run number - if(period.first != period.second->id) continue; //skips redirects + if(period.first != period.second->id) continue; //skips redirects runNumber = period.first; pStarts.clear(); pEnds.clear(); - if(period.second->subPeriods.size()==0) { - pStarts.push_back(period.second->start); pEnds.push_back(period.second->end); + if(period.second->subPeriods.size()==0) { + pStarts.push_back(period.second->start); pEnds.push_back(period.second->end); } else { for(auto subp : period.second->subPeriods) { @@ -365,11 +368,11 @@ StatusCode PileupReweightingTool::finalize() { } } - //loop over data + //loop over data for(auto& run : m_runs) { runNumber = run.first; if(run.second.inputHists.find("None")==run.second.inputHists.end()) continue; - + TH1* hist = run.second.inputHists["None"].release(); strncpy(histName,hist->GetName(),sizeof(histName)-1); CHECK( histSvc->regHist(TString::Format("/%s/PileupReweighting/%s",m_configStream.c_str(),hist->GetName()).Data(),hist) ); @@ -395,7 +398,7 @@ StatusCode PileupReweightingTool::finalize() { #endif } - m_upTool.reset(); m_downTool.reset(); + m_upTool.reset(); m_downTool.reset(); return StatusCode::SUCCESS; } @@ -432,9 +435,9 @@ int PileupReweightingTool::fill( const xAOD::EventInfo& eventInfo ) { } int PileupReweightingTool::fill( const xAOD::EventInfo& eventInfo, Double_t x, Double_t y) { - - //auto-detect the period config if necessary - if(m_usePeriodConfig=="auto" && !m_doneConfigs[eventInfo.runNumber()]) { //try autodetect based on runnum of first event ... + + //auto-detect the period config if necessary + if(m_usePeriodConfig=="auto" && !m_doneConfigs[eventInfo.runNumber()]) { //try autodetect based on runnum of first event ... //if data, we only need to ensure a binning is done ... for now, we assume the MC15 binning if(!eventInfo.eventType(xAOD::EventInfo::IS_SIMULATION)) { if(!m_emptyHistogram) { SetUniformBinning(100,0,100.); } //use a default binning @@ -475,7 +478,7 @@ StatusCode PileupReweightingTool::apply(const xAOD::EventInfo& eventInfo, bool m //just copy the value over for MC eventInfo.auxdecor<float>(m_prefix+"corrected_averageInteractionsPerCrossing") = eventInfo.averageInteractionsPerCrossing(); - //decorate with standard PileupWeight + //decorate with standard PileupWeight if(!m_noWeightsMode) { double weight = /*m_tool->*/getCombinedWeight( eventInfo ); if(m_unrepresentedDataAction==2) weight *= getUnrepresentedDataWeight( eventInfo ); @@ -501,13 +504,13 @@ float PileupReweightingTool::getDataWeight(const xAOD::EventInfo& eventInfo, con } if(!mu_dependent) return /*m_tool->*/m_activeTool->GetDataWeight(eventInfo.runNumber(), trigger); - + double correctedMu = getCorrectedAverageInteractionsPerCrossing(eventInfo,false); if(correctedMu<0) { ATH_MSG_ERROR("Unrecognised run+lumiblock number (" << eventInfo.runNumber() << "," << eventInfo.lumiBlock() << ") ... please ensure your lumicalc files are complete! Returning 1."); return 1; } - + return /*m_tool->*/m_activeTool->GetDataWeight( eventInfo.runNumber(), trigger, correctedMu/*use the 'correct' mu instead of the one from the file!!*/ ); } @@ -516,7 +519,7 @@ float PileupReweightingTool::getCombinedWeight( const xAOD::EventInfo& eventInfo float out = getCombinedWeight(eventInfo); if(!out) return out; //don't try to evaluate DataWeight if our PRW is 0 ... means there is no data available at that mu anyway ATH_MSG_DEBUG("Get combined weight returned: " << out); - + //need to use the random run number ... only used to pick the subperiod, but in run2 so far we only have one subperiod unsigned int randomRunNum = (eventInfo.isAvailable<unsigned int>(m_prefix+"RandomRunNumber")) ? eventInfo.auxdataConst<unsigned int>(m_prefix+"RandomRunNumber") : getRandomRunNumber( eventInfo, mu_dependent ); if(!mu_dependent){ @@ -524,7 +527,7 @@ float PileupReweightingTool::getCombinedWeight( const xAOD::EventInfo& eventInfo } else { out *= m_activeTool->GetPrescaleWeight( randomRunNum, trigger, getCorrectedAverageInteractionsPerCrossing(eventInfo,false) /*use the 'correct' mu instead of the one from the file!!*/, m_useRunDependentPrescaleWeight /*run-dependent*/ ); ATH_MSG_DEBUG("Get now * prescale weight, returned: " << out); - } + } return out; }