diff --git a/PhysicsAnalysis/SUSYPhys/SUSYTools/Root/Muons.cxx b/PhysicsAnalysis/SUSYPhys/SUSYTools/Root/Muons.cxx index e1e829699e615649557c3dab13303a16aecb6f65..9490220255523234ae6c7b8cb2c95684a5c9cbf8 100644 --- a/PhysicsAnalysis/SUSYPhys/SUSYTools/Root/Muons.cxx +++ b/PhysicsAnalysis/SUSYPhys/SUSYTools/Root/Muons.cxx @@ -121,8 +121,8 @@ StatusCode SUSYObjDef_xAOD::FillMuon(xAOD::Muon& input, float ptcut, float etacu dec_passSignalID(input) = false; // don't bother calibrating or computing WP - if ( input.pt() < 4e3 ) return StatusCode::SUCCESS; - + if ( input.pt() < 3e3 ) return StatusCode::SUCCESS; + ATH_MSG_VERBOSE( "MUON pt before calibration " << input.pt() ); ATH_MSG_VERBOSE( "MUON eta = " << input.eta() ); @@ -272,8 +272,8 @@ bool SUSYObjDef_xAOD::IsHighPtMuon(const xAOD::Muon& input) const // https://indico.cern.ch/event/397325/contribution/19/material/slides/0.pdf and // https://twiki.cern.ch/twiki/bin/view/Atlas/MuonSelectionTool { - if (input.pt() < 4e3){ - ATH_MSG_DEBUG("No HighPt check supported for muons below 4GeV! False."); + if (input.pt() < 3e3){ + ATH_MSG_DEBUG("No HighPt check supported for muons below 3GeV! False."); dec_passedHighPtCuts(input) = false; return false; } @@ -387,6 +387,10 @@ bool SUSYObjDef_xAOD::IsCosmicMuon(const xAOD::Muon& input, float z0cut, float d if (isoSF) { float sf_iso(1.); + if ( mu.pt() < 4e3 ) { + ATH_MSG_WARNING( "Muon pt: " << mu.pt()/1000. << "! Isolation SF is not available for Muon pt < 4GeV. Falling back to SF = 1." ); + return 1; + } if (m_muonIsolationSFTool.empty()) { ATH_MSG_WARNING(" GetSignalMuonSF: Attempt to retrieve isolation SF for unsupported working point " << m_muIso_WP); } else { @@ -406,6 +410,11 @@ bool SUSYObjDef_xAOD::IsCosmicMuon(const xAOD::Muon& input, float z0cut, float d double SUSYObjDef_xAOD::GetMuonTriggerEfficiency(const xAOD::Muon& mu, const std::string& trigExpr, const bool isdata) { double eff(1.); + + if ( mu.pt() < 4e3 ) { + ATH_MSG_WARNING( "Muon pt: " << mu.pt()/1000. << "! Trigger Eff is not available for Muon pt < 4GeV. Falling back to Eff = 1." ); + return 1; + } if (m_muonTriggerSFTool->getTriggerEfficiency(mu, eff, trigExpr, isdata) != CP::CorrectionCode::Ok) { ATH_MSG_WARNING("Problem retrieving signal muon trigger efficiency for " << trigExpr ); } diff --git a/PhysicsAnalysis/SUSYPhys/SUSYTools/Root/SUSYObjDef_xAOD.cxx b/PhysicsAnalysis/SUSYPhys/SUSYTools/Root/SUSYObjDef_xAOD.cxx index 0e6f0bad4d02cc384cb3bda40f2d244d1f466a69..c82ea6bfc97c88db9249ce75431623108a066708 100644 --- a/PhysicsAnalysis/SUSYPhys/SUSYTools/Root/SUSYObjDef_xAOD.cxx +++ b/PhysicsAnalysis/SUSYPhys/SUSYTools/Root/SUSYObjDef_xAOD.cxx @@ -90,8 +90,6 @@ using namespace xAOD; SUSYObjDef_xAOD::SUSYObjDef_xAOD( const std::string& name ) : asg::AsgMetadataTool( name ), - m_autoconfigPRW(false), - m_mcCampaign(""), m_dataSource(Undefined), m_jetInputType(xAOD::JetInput::Uncategorized), m_force_noElId(false), @@ -122,6 +120,8 @@ SUSYObjDef_xAOD::SUSYObjDef_xAOD( const std::string& name ) m_softTermParam(met::Random), m_treatPUJets(true), m_doPhiReso(true), + m_autoconfigPRW(false), + m_mcCampaign(""), m_muUncert(-99.), m_prwDataSF(1./1.03), // default for mc16, see: https://twiki.cern.ch/twiki/bin/viewauth/AtlasProtected/ExtendedPileupReweighting#Tool_Properties m_prwDataSF_UP(1.), // old value for mc15 (mc16 uncertainties still missing) @@ -472,6 +472,7 @@ SUSYObjDef_xAOD::SUSYObjDef_xAOD( const std::string& name ) declareProperty( "mcCampaign", m_mcCampaign ); declareProperty( "PRWConfigFiles", m_prwConfFiles ); declareProperty( "PRWLumiCalcFiles", m_prwLcalcFiles ); + declareProperty( "PRWActualMuFile", m_prwActualMuFile ); declareProperty( "PRWMuUncertainty", m_muUncert); // = 0.2); declareProperty( "PRWDataScaleFactor", m_prwDataSF); declareProperty( "PRWDataScaleFactorUP", m_prwDataSF_UP); @@ -714,89 +715,78 @@ StatusCode SUSYObjDef_xAOD::initialize() { } StatusCode SUSYObjDef_xAOD::autoconfigurePileupRWTool() { - // doing here some black magic to autoconfigure the pileup reweighting tool - std::string prwConfigFile = ""; + + std::string prwConfigFile(""); if ( !isData() && m_autoconfigPRW ) { - prwConfigFile = PathResolverFindCalibDirectory("dev/SUSYTools/PRW_AUTOCONFIG/files/"); - // :: + + prwConfigFile = PathResolverFindCalibDirectory("dev/SUSYTools/PRW_AUTOCONFIG_SIM/files/"); float dsid = -999; - std::string amiTag = ""; - std::string mcCampaignMD = ""; + std::string amiTag(""); + std::string mcCampaignMD(""); + std::string simType(""); const xAOD::FileMetaData* fmd = 0; - if( inputMetaStore()->contains<xAOD::FileMetaData>("FileMetaData") && inputMetaStore()->retrieve(fmd,"FileMetaData").isSuccess() ) { + + // let's use MetaData to extract sample information + if ( inputMetaStore()->contains<xAOD::FileMetaData>("FileMetaData") && inputMetaStore()->retrieve(fmd,"FileMetaData").isSuccess() ) { fmd->value(xAOD::FileMetaData::mcProcID, dsid); fmd->value(xAOD::FileMetaData::amiTag, amiTag); - if( amiTag.find("r9364")!=string::npos ) mcCampaignMD = "mc16a"; - else if( amiTag.find("r9781")!=string::npos ) mcCampaignMD = "mc16c"; - else if( amiTag.find("r10201")!=string::npos ) mcCampaignMD = "mc16d"; + simType = ( amiTag.find("a875")!=string::npos ? "AFII" : "FS" ); + if ( amiTag.find("r9364")!=string::npos ) mcCampaignMD = "mc16a"; + else if ( amiTag.find("r9781")!=string::npos ) mcCampaignMD = "mc16c"; + else if ( amiTag.find("r10201")!=string::npos ) mcCampaignMD = "mc16d"; else { - ATH_MSG_ERROR( "autoconfigurePileupRWTool(): unrecognized xAOD::FileMetaData::amiTag, \'" << amiTag << "'. Please check your input sample and make sure it's mc16a, c or d. If it is, contact the Background Forum conveners." ); + ATH_MSG_ERROR( "autoconfigurePileupRWTool(): unrecognized xAOD::FileMetaData::amiTag, \'" << amiTag << "'. Please check your input sample"); return StatusCode::FAILURE; } } else { #ifndef XAOD_STANDALONE - ATH_MSG_ERROR( "autoconfigurePileupRWTool(): access to FileMetaData failed, can't get mc channel number -> please get in touch with the Background Forum conveners reporting what sample you're running over." ); + ATH_MSG_ERROR( "autoconfigurePileupRWTool(): access to FileMetaData failed, can't get mc channel number."); return StatusCode::FAILURE; #else + // OK, this is a fall-back option without using MetaData but one has to manually set 'mcCampaign' property ATH_MSG_WARNING( "autoconfigurePileupRWTool(): access to FileMetaData failed -> getting the mc channel number (DSID) from the event store." ); const xAOD::EventInfo* evtInfo = 0; ATH_CHECK( evtStore()->retrieve( evtInfo, "EventInfo" ) ); dsid = evtInfo->mcChannelNumber(); + + if ( m_mcCampaign == "mc16a" || m_mcCampaign == "mc16c" || m_mcCampaign == "mc16d") { + std::string NoMetadataButPropertyOK(""); + NoMetadataButPropertyOK += "autoconfigurePileupRWTool(): 'mcCampaign' is used and passed to SUSYTools as '"; + NoMetadataButPropertyOK += m_mcCampaign; + NoMetadataButPropertyOK += "'. Autocongiguring PRW accordingly."; + ATH_MSG_WARNING( NoMetadataButPropertyOK ); + mcCampaignMD = m_mcCampaign; + } else { + ATH_MSG_ERROR( "autoconfigurePileupRWTool(): `mcCampaign' is not set properly."); + return StatusCode::FAILURE; + } + + simType = (isAtlfast() ? "AFII" : "FS"); #endif } - // :: - // Sanity checks - bool mc16X_GoodFromProperty = false; - bool mc16X_GoodFromMetadata = false; - if( m_mcCampaign == "mc16a" || m_mcCampaign == "mc16c" || m_mcCampaign == "mc16d") mc16X_GoodFromProperty = true; - if( mcCampaignMD == "mc16a" || mcCampaignMD == "mc16c" || mcCampaignMD == "mc16d") mc16X_GoodFromMetadata = true; - if( !mc16X_GoodFromMetadata && mc16X_GoodFromProperty ) { - // :: - std::string NoMetadataButPropertyOK(""); - NoMetadataButPropertyOK += "autoconfigurePileupRWTool(): access to FileMetaData failed, but the 'mcCampaign' property is passed to SUSYTools as '"; - NoMetadataButPropertyOK += m_mcCampaign; - NoMetadataButPropertyOK += "'. Autocongiguring PRW accordingly."; - ATH_MSG_WARNING( NoMetadataButPropertyOK ); - mcCampaignMD = m_mcCampaign; - // :: - } else if ( mc16X_GoodFromProperty && mc16X_GoodFromMetadata && m_mcCampaign != mcCampaignMD ) { - // :: - std::string MetadataAndPropertyConflict(""); - MetadataAndPropertyConflict += "autoconfigurePileupRWTool(): access to FileMetaData indicates a " + mcCampaignMD; - MetadataAndPropertyConflict += " sample, but the 'mcCampaign' property passed to SUSYTools is set to '" +m_mcCampaign; - MetadataAndPropertyConflict += "'. Prioritizing the value extracted from MetaData: PLEASE DOUBLE-CHECK the value you set the 'mcCampaign' property to!"; - m_mcCampaign = mcCampaignMD; - ATH_MSG_WARNING( MetadataAndPropertyConflict ); - // :: - } else if( !mc16X_GoodFromMetadata && !mc16X_GoodFromProperty ) { - // :: - std::string MetadataAndPropertyBAD(""); - MetadataAndPropertyBAD += "autoconfigurePileupRWTool(): access to FileMetaData failed, but don't panic. You can try to manually set the 'mcCampaign' SUSYTools property to "; - MetadataAndPropertyBAD += "'mc16a', 'mc16c' or 'mc16d' and restart your job. If you set it to any other string, you will still incur in this error."; - ATH_MSG_ERROR( MetadataAndPropertyBAD ); - return StatusCode::FAILURE; - // :: - } - // :: + // Retrieve the input file int DSID_INT = (int) dsid; - prwConfigFile += "pileup_" + mcCampaignMD + "_dsid" + std::to_string(DSID_INT) + ".root"; + prwConfigFile += "pileup_" + mcCampaignMD + "_dsid" + std::to_string(DSID_INT) + "_" + simType + ".root"; TFile testF(prwConfigFile.data(),"read"); if(testF.IsZombie()) { - ATH_MSG_WARNING( "autoconfigurePileupRWTool(): file not found -> " << prwConfigFile.data() << " ! Now trying with one of the background forum merged mc16 prw input files (it won't however work for signal samples!)." ); - // :: + ATH_MSG_WARNING( "autoconfigurePileupRWTool(): file not found -> " << prwConfigFile.data() ); + ATH_MSG_WARNING( "Now trying with one of the background forum merged mc16 prw input files (it won't however work for signal samples!)." ); prwConfigFile = PathResolverFindCalibDirectory("dev/SUSYTools/"); if ( mcCampaignMD == "mc16a" ) prwConfigFile += "merged_prw_mc16a_latest.root"; // SOON TO BE // else if ( mcCampaignMD == "mc16c" ) prwConfigFile += ''; // SOON TO BE // else if ( mcCampaignMD == "mc16d" ) prwConfigFile += ''; TFile testF2(prwConfigFile.data(),"read"); if(testF2.IsZombie()) { - ATH_MSG_ERROR( "autoconfigurePileupRWTool(): file not found -> " << prwConfigFile.data() << " ! Impossible to autocongigure PRW. Aborting." ); + ATH_MSG_ERROR( "autoconfigurePileupRWTool(): file not found -> " << prwConfigFile.data() << " ! Impossible to autoconfigure PRW. Aborting." ); return StatusCode::FAILURE; } } m_prwConfFiles.clear(); m_prwConfFiles.push_back( prwConfigFile ); + if ( mcCampaignMD == "mc16c" || mcCampaignMD == "mc16d") { + m_prwConfFiles.push_back( PathResolverFindCalibFile(m_prwActualMuFile) ); + } ATH_MSG_INFO( "autoconfigurePileupRWTool(): configuring PRW tool using " << prwConfigFile.data() ); } // Return gracefully @@ -1181,6 +1171,7 @@ StatusCode SUSYObjDef_xAOD::readConfig() configFromFile(m_treatPUJets, "METSig.TreatPUJets", rEnv, true); configFromFile(m_doPhiReso, "METSig.DoPhiReso", rEnv, true); // + configFromFile(m_prwActualMuFile, "PRW.ActualMuFile", rEnv, "GoodRunsLists/data17_13TeV/20180309/physics_25ns_Triggerno17e33prim.actualMu.OflLumi-13TeV-010.root"); configFromFile(m_muUncert, "PRW.MuUncertainty", rEnv, 0.2); // configFromFile(m_strictConfigCheck, "StrictConfigCheck", rEnv, false); diff --git a/PhysicsAnalysis/SUSYPhys/SUSYTools/SUSYTools/SUSYObjDef_xAOD.h b/PhysicsAnalysis/SUSYPhys/SUSYTools/SUSYTools/SUSYObjDef_xAOD.h index 389d914d61b82f09f10a1c57ae3fb610258d6373..0a84863ef77b628ea8357cf42985a8f5b0b5c3bb 100644 --- a/PhysicsAnalysis/SUSYPhys/SUSYTools/SUSYTools/SUSYObjDef_xAOD.h +++ b/PhysicsAnalysis/SUSYPhys/SUSYTools/SUSYTools/SUSYObjDef_xAOD.h @@ -425,9 +425,6 @@ namespace ST { std::vector<std::string> getElSFkeys(const std::string& mapFile) const; - bool m_autoconfigPRW; - std::string m_mcCampaign; - #ifdef XAOD_STANDALONE // more convenient for property setting DataSource m_dataSource; xAOD::JetInput::Type m_jetInputType; // permit switching between LC, PFlow, EM jets @@ -483,8 +480,13 @@ namespace ST { bool m_treatPUJets; bool m_doPhiReso; + bool m_autoconfigPRW; + std::string m_mcCampaign; + std::vector<std::string> m_prwConfFiles; std::vector<std::string> m_prwLcalcFiles; + std::string m_prwActualMuFile; + double m_muUncert; double m_prwDataSF; double m_prwDataSF_UP; diff --git a/PhysicsAnalysis/SUSYPhys/SUSYTools/util/SUSYToolsTester.cxx b/PhysicsAnalysis/SUSYPhys/SUSYTools/util/SUSYToolsTester.cxx index fd5e562f950e48e9dc9f4da1d1514bd0acb4fd78..bb4b858968b3b475c48778713e655f3a23d6b89c 100644 --- a/PhysicsAnalysis/SUSYPhys/SUSYTools/util/SUSYToolsTester.cxx +++ b/PhysicsAnalysis/SUSYPhys/SUSYTools/util/SUSYToolsTester.cxx @@ -132,7 +132,7 @@ int main( int argc, char* argv[] ) { /// READ CONFIG ------------ - int autoconfigPRW = -1; + int autoconfigPRW = 1; int isData = -1; int isAtlfast = -1; int NoSyst = 1; @@ -239,7 +239,7 @@ est.pool.root",relN,(isData?"Data":"MC"),SUSYx); std::vector<std::string> myGRLs; myGRLs.push_back(PathResolverFindCalibFile("GoodRunsLists/data15_13TeV/20170619/physics_25ns_21.0.19.xml")); myGRLs.push_back(PathResolverFindCalibFile("GoodRunsLists/data16_13TeV/20180129/physics_25ns_21.0.19.xml")); - //myGRLs.push_back(PathResolverFindCalibFile("GoodRunsLists/data17_13TeV/20171130/physics_25ns_Triggerno17e33prim.xml")); + myGRLs.push_back(PathResolverFindCalibFile("GoodRunsLists/data17_13TeV/20180309/physics_25ns_Triggerno17e33prim.xml")); ANA_CHECK( m_grl.setProperty("GoodRunsListVec", myGRLs) ); ANA_CHECK( m_grl.setProperty("PassThrough", false) ); @@ -271,7 +271,6 @@ est.pool.root",relN,(isData?"Data":"MC"),SUSYx); ANA_CHECK( objTool.setProperty("DataSource", datasource) ) ; if(!config_file.empty()) ANA_CHECK( objTool.setProperty("ConfigFile", config_file) ); - ANA_CHECK( objTool.setBoolProperty("METDoTrkSyst", true) ); ANA_CHECK( objTool.setBoolProperty("METDoCaloSyst", false) ); @@ -281,29 +280,34 @@ est.pool.root",relN,(isData?"Data":"MC"),SUSYx); //// **** AND SHOULD NOT BE USED FOR SERIOUS ANALYSIS **** //// //// //// /////////////////////////////////////////////////////////////////////////////////////////// - if ( autoconfigPRW != 1 ) { - std::vector<std::string> prw_conf; + std::vector<std::string> prw_conf; + if ( autoconfigPRW == 1 && !isAtlfast && !isData ) { + ANA_CHECK( objTool.setBoolProperty("AutoconfigurePRWTool", true) ); + } else { if (prw_file == "DUMMY") { prw_conf.push_back("dev/SUSYTools/merged_prw_mc16a_latest.root"); - //prw_conf.push_back("dev/SUSYTools/merged_prw_mc16c_latest.root"); - } - else { + } else { prw_conf = getTokens(prw_file,","); - // prw_conf.push_back(prw_file); } ANA_CHECK( objTool.setProperty("PRWConfigFiles", prw_conf) ); } + bool is_201516 = true; std::vector<std::string> prw_lumicalc; if (ilumicalc_file == "DUMMY") { - prw_lumicalc.push_back(PathResolverFindCalibFile("GoodRunsLists/data15_13TeV/20170619/PHYS_StandardGRL_All_Good_25ns_276262-284484_OflLumi-13TeV-008.root")); - prw_lumicalc.push_back(PathResolverFindCalibFile("GoodRunsLists/data16_13TeV/20180129/PHYS_StandardGRL_All_Good_25ns_297730-311481_OflLumi-13TeV-009.root")); - //prw_lumicalc.push_back(PathResolverFindCalibFile("GoodRunsLists/data17_13TeV/20171130/physics_25ns_Triggerno17e33prim.lumicalc.OflLumi-13TeV-001.root")); - } - else { + if (is_201516) { + ANA_CHECK( objTool.setProperty( "mcCampaign", "mc16a" ) ); + prw_lumicalc.push_back(PathResolverFindCalibFile("GoodRunsLists/data15_13TeV/20170619/PHYS_StandardGRL_All_Good_25ns_276262-284484_OflLumi-13TeV-008.root")); + prw_lumicalc.push_back(PathResolverFindCalibFile("GoodRunsLists/data16_13TeV/20180129/PHYS_StandardGRL_All_Good_25ns_297730-311481_OflLumi-13TeV-009.root")); + } else { + ANA_CHECK( objTool.setProperty( "mcCampaign", "mc16d" ) ); + prw_lumicalc.push_back(PathResolverFindCalibFile("GoodRunsLists/data17_13TeV/20180309/physics_25ns_Triggerno17e33prim.lumicalc.OflLumi-13TeV-010.root")); + } + } else { prw_lumicalc = getTokens(ilumicalc_file,","); } ANA_CHECK( objTool.setProperty("PRWLumiCalcFiles", prw_lumicalc) ); + /////////////////////////////////////////////////////////////////////////////////////////// //Guess shower type for btagging MC/MC SFs @@ -321,12 +325,6 @@ est.pool.root",relN,(isData?"Data":"MC"),SUSYx); if (debug) objTool.msg().setLevel( MSG::VERBOSE ); ANA_CHECK(objTool.setBoolProperty("DebugMode", (bool)debug) ); - // autoconfiguring PRW tool - if ( autoconfigPRW==1 ) { - objTool.setBoolProperty("AutoconfigurePRWTool", true); - //objTool.setProperty("mcCampaign", "mc16a"); - } - if ( objTool.initialize() != StatusCode::SUCCESS) { Error( APP_NAME, "Cannot initialize SUSYObjDef_xAOD..." ); Error( APP_NAME, "Exiting... " ); @@ -1000,7 +998,8 @@ est.pool.root",relN,(isData?"Data":"MC"),SUSYx); bool passTMtest = false; TString muTrig2015 = "HLT_mu20_iloose_L1MU15_OR_HLT_mu50"; //"HLT_mu18_mu8noL1"; //"HLT_mu20_iloose_L1MU15_OR_HLT_mu50"; - TString muTrig2016 = "HLT_mu24_imedium"; //"HLT_mu20_mu8noL1"; //HLT_mu20_iloose_L1MU15_OR_HLT_mu50 + TString muTrig2016 = "HLT_mu26_ivarmedium_OR_HLT_mu50"; + TString muTrig2017 = "HLT_mu26_ivarmedium_OR_HLT_mu50"; for (const auto& mu : *muons) { if ( mu->auxdata<char>("passOR") == 0 ) { @@ -1031,8 +1030,10 @@ est.pool.root",relN,(isData?"Data":"MC"),SUSYx); if(!isData){ if(objTool.treatAsYear()==2015) passTMtest |= objTool.IsTrigMatched(mu, muTrig2015.Copy().ReplaceAll("_OR_","").Data()); - else + else if(objTool.treatAsYear()==2016) passTMtest |= objTool.IsTrigMatched(mu, muTrig2016.Copy().ReplaceAll("_OR_","").Data()); + else + passTMtest |= objTool.IsTrigMatched(mu, muTrig2017.Copy().ReplaceAll("_OR_","").Data()); } else{ passTMtest |= objTool.IsTrigMatched(mu, muTrig2016.Copy().ReplaceAll("_OR_","").Data()); @@ -1097,8 +1098,10 @@ est.pool.root",relN,(isData?"Data":"MC"),SUSYx); //std::cout << "MUON BEFORE SF = " << muonSF << " " << objTool.treatAsYear() << " " << objTool.GetRandomRunNumber() << " " << objTool.GetPileupWeight() << std::endl; if(objTool.treatAsYear()==2015) muonSF = objTool.GetTotalMuonSF(*muons, true, true, muTrig2015.Data()); - else + else if(objTool.treatAsYear()==2016) muonSF = objTool.GetTotalMuonSF(*muons, true, true, muTrig2016.Data()); + else + muonSF = objTool.GetTotalMuonSF(*muons, true, true, muTrig2017.Data()); //std::cout << "MUON AFTER SF = " << muonSF << " " << objTool.treatAsYear() << " " << objTool.GetRandomRunNumber() << " " << objTool.GetPileupWeight() << std::endl; }