-
Notifications
You must be signed in to change notification settings - Fork 4.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
adding trigger object based tag and probe DQM source
- Loading branch information
1 parent
d00b7b4
commit ba08068
Showing
10 changed files
with
715 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,305 @@ | ||
#include "TrigObjTnPHistColl.h" | ||
|
||
namespace{ | ||
std::vector<float> convertToFloat(const std::vector<double>& vecD){ | ||
std::vector<float> vecF; | ||
for(double x : vecD) vecF.push_back(x); | ||
return vecF; | ||
} | ||
} | ||
|
||
TrigObjTnPHistColl::TrigObjTnPHistColl(const edm::ParameterSet& config,edm::ConsumesCollector&& cc): | ||
tagCuts_(config.getParameter<std::vector<edm::ParameterSet>>("tagCuts")), | ||
probeCuts_(config.getParameter<std::vector<edm::ParameterSet>>("probeCuts")), | ||
tagFilters_(config.getParameter<edm::ParameterSet>("tagFilters")), | ||
collName_(config.getParameter<std::string>("collName")), | ||
folderName_(config.getParameter<std::string>("folderName")), | ||
histDefs_(config.getParameter<edm::ParameterSet>("histDefs")), | ||
evtTrigSel_(config.getParameter<edm::ParameterSet>("evtTrigSel"),cc) | ||
{ | ||
for(auto probeFilter : config.getParameter<std::vector<std::string> >("probeFilters")){ | ||
probeHists_.emplace_back(ProbeData(std::move(probeFilter))); | ||
} | ||
} | ||
|
||
edm::ParameterSetDescription TrigObjTnPHistColl::makePSetDescription() | ||
{ | ||
edm::ParameterSetDescription desc; | ||
desc.addVPSet("tagCuts",VarRangeCut<trigger::TriggerObject>::makePSetDescription(),std::vector<edm::ParameterSet>()); | ||
desc.addVPSet("probeCuts",VarRangeCut<trigger::TriggerObject>::makePSetDescription(),std::vector<edm::ParameterSet>()); | ||
desc.add<edm::ParameterSetDescription>("tagFilters",FilterSelector::makePSetDescription()); | ||
desc.add<std::string>("collName","stdTag"); | ||
desc.add<std::string>("folderName","HLT/EGM/TrigObjTnP"); | ||
desc.add<edm::ParameterSetDescription>("histDefs",HistDefs::makePSetDescription()); | ||
desc.add<std::vector<std::string>>("probeFilters",std::vector<std::string>()); | ||
|
||
edm::ParameterSetDescription trigEvtFlagDesc; | ||
trigEvtFlagDesc.add<bool>("andOr",false); | ||
trigEvtFlagDesc.add<unsigned int>("verbosityLevel",1); | ||
trigEvtFlagDesc.add<bool>("andOrDcs", false); | ||
trigEvtFlagDesc.add<edm::InputTag>("dcsInputTag", edm::InputTag("scalersRawToDigi") ); | ||
trigEvtFlagDesc.add<std::vector<int> >("dcsPartitions",{24,25,26,27,28,29}); | ||
trigEvtFlagDesc.add<bool>("errorReplyDcs", true); | ||
trigEvtFlagDesc.add<std::string>("dbLabel",""); | ||
trigEvtFlagDesc.add<bool>("andOrHlt", true); //true = OR, false = and | ||
trigEvtFlagDesc.add<edm::InputTag>("hltInputTag", edm::InputTag("TriggerResults::HLT") ); | ||
trigEvtFlagDesc.add<std::vector<std::string> >("hltPaths",{}); | ||
trigEvtFlagDesc.add<std::string>("hltDBKey",""); | ||
trigEvtFlagDesc.add<bool>("errorReplyHlt",false); | ||
desc.add<edm::ParameterSetDescription>("evtTrigSel",trigEvtFlagDesc); | ||
|
||
return desc; | ||
} | ||
|
||
void TrigObjTnPHistColl::bookHists(DQMStore::IBooker& iBooker) | ||
{ | ||
iBooker.setCurrentFolder(folderName_); | ||
for(auto& probe : probeHists_){ | ||
probe.bookHists(collName_,iBooker,histDefs_); | ||
} | ||
} | ||
|
||
void TrigObjTnPHistColl::fill(const trigger::TriggerEvent& trigEvt, | ||
const edm::Event& event,const edm::EventSetup& setup) | ||
{ | ||
if(evtTrigSel_.accept(event,setup)==false) return; | ||
|
||
auto tagTrigKeys = tagFilters_.getPassingKeys(trigEvt); | ||
for(auto& tagKey : tagTrigKeys){ | ||
const trigger::TriggerObject& tagObj = trigEvt.getObjects()[tagKey]; | ||
if(tagCuts_(tagObj)){ | ||
for(auto& probeColl : probeHists_) probeColl.fill(tagKey,trigEvt,probeCuts_); | ||
} | ||
} | ||
} | ||
|
||
//trigger::Keys is likely a vector containing 0-3 short ints (probably 10 max), | ||
// passing by value makes this much easier code wise (otherwise would have to | ||
//create a dummy empty vector) and shouldnt be too much of a performance hit | ||
const trigger::Keys TrigObjTnPHistColl::getKeys(const trigger::TriggerEvent& trigEvt,const std::string& filterName) | ||
{ | ||
edm::InputTag filterTag(filterName,"",trigEvt.usedProcessName()); | ||
trigger::size_type filterIndex = trigEvt.filterIndex(filterTag); | ||
if(filterIndex<trigEvt.sizeFilters()) return trigEvt.filterKeys(filterIndex); | ||
else return trigger::Keys(); | ||
} | ||
|
||
TrigObjTnPHistColl::FilterSelector::FilterSelector(const edm::ParameterSet& config): | ||
isAND_(config.getParameter<bool>("isAND")) | ||
{ | ||
auto filterSetConfigs = config.getParameter<std::vector<edm::ParameterSet>>("filterSets"); | ||
for(auto& filterSetConfig : filterSetConfigs) filterSets_.emplace_back(FilterSet(filterSetConfig)); | ||
} | ||
|
||
edm::ParameterSetDescription TrigObjTnPHistColl::FilterSelector::makePSetDescription() | ||
{ | ||
edm::ParameterSetDescription desc; | ||
desc.addVPSet("filterSets",FilterSet::makePSetDescription(),std::vector<edm::ParameterSet>()); | ||
desc.add<bool>("isAND",false); | ||
return desc; | ||
} | ||
|
||
const trigger::Keys TrigObjTnPHistColl::FilterSelector::getPassingKeys(const trigger::TriggerEvent& trigEvt)const | ||
{ | ||
trigger::Keys passingKeys; | ||
bool isFirstFilterSet = true; | ||
for(const auto& filterSet : filterSets_){ | ||
auto keysOfFilterSet = filterSet.getPassingKeys(trigEvt); | ||
if(isFirstFilterSet) passingKeys = keysOfFilterSet; | ||
else mergeTrigKeys(passingKeys,keysOfFilterSet,isAND_); | ||
isFirstFilterSet = false; | ||
} | ||
cleanTrigKeys(passingKeys); | ||
return passingKeys; | ||
} | ||
|
||
void TrigObjTnPHistColl::FilterSelector::mergeTrigKeys(trigger::Keys& keys,const trigger::Keys& keysToMerge,bool isAND) | ||
{ | ||
if(isAND){ | ||
for(auto& key : keys) { | ||
if(std::count(keysToMerge.begin(),keysToMerge.end(),key)==0){ | ||
key=std::numeric_limits<trigger::size_type>::max(); | ||
} | ||
} | ||
}else{ | ||
for(const auto key : keysToMerge){ | ||
keys.push_back(key); | ||
} | ||
} | ||
} | ||
|
||
void TrigObjTnPHistColl::FilterSelector::cleanTrigKeys(trigger::Keys& keys) | ||
{ | ||
std::sort(keys.begin(),keys.end()); | ||
std::unique(keys.begin(),keys.end()); | ||
while(!keys.empty() && keys.back()==std::numeric_limits<trigger::size_type>::max()){ | ||
keys.pop_back(); | ||
} | ||
} | ||
|
||
TrigObjTnPHistColl::FilterSelector::FilterSet::FilterSet(const edm::ParameterSet& config): | ||
filters_(config.getParameter<std::vector<std::string>>("filters")), | ||
isAND_(config.getParameter<bool>("isAND")) | ||
{ | ||
|
||
} | ||
|
||
edm::ParameterSetDescription TrigObjTnPHistColl::FilterSelector::FilterSet::makePSetDescription() | ||
{ | ||
edm::ParameterSetDescription desc; | ||
desc.add<std::vector<std::string> >("filters",std::vector<std::string>()); | ||
desc.add<bool>("isAND",true); | ||
return desc; | ||
} | ||
|
||
const trigger::Keys TrigObjTnPHistColl::FilterSelector::FilterSet::getPassingKeys(const trigger::TriggerEvent& trigEvt)const | ||
{ | ||
trigger::Keys passingKeys; | ||
bool firstFilter = true; | ||
for(const auto& filterName : filters_){ | ||
const trigger::Keys& trigKeys = getKeys(trigEvt,filterName); | ||
if(firstFilter) { | ||
passingKeys = trigKeys; | ||
firstFilter = false; | ||
}else mergeTrigKeys(passingKeys,trigKeys,isAND_); | ||
} | ||
cleanTrigKeys(passingKeys); | ||
|
||
return passingKeys; | ||
} | ||
|
||
TrigObjTnPHistColl::TrigObjVarF::TrigObjVarF(std::string varName):isAbs_(false) | ||
{ | ||
//first look for "Abs" at the end of the string | ||
auto absPos = varName.rfind("Abs"); | ||
if(absPos != std::string::npos && absPos+3 == varName.size() ) { | ||
isAbs_ = true; | ||
varName = varName.erase(absPos); | ||
} | ||
if(varName=="pt") varFunc_ = &trigger::TriggerObject::pt; | ||
else if(varName=="eta") varFunc_ = &trigger::TriggerObject::eta; | ||
else if(varName=="phi") varFunc_ = &trigger::TriggerObject::phi; | ||
else{ | ||
std::ostringstream msg; | ||
msg<<"var "<<varName<<" not recognised (use pt or p rather than et or e for speed!) "; | ||
if(isAbs_) msg<<" varName was \"Abs\" suffex cleaned where it tried to remove \"Abs\" at the end of the variable name "; | ||
msg <<__FILE__<<","<<__LINE__<<std::endl; | ||
throw cms::Exception("ConfigError") <<msg.str(); | ||
} | ||
} | ||
|
||
TrigObjTnPHistColl::HistFiller::HistFiller(const edm::ParameterSet& config): | ||
localCuts_(config.getParameter<std::vector<edm::ParameterSet> >("localCuts")), | ||
var_(config.getParameter<std::string>("var")) | ||
{ | ||
|
||
} | ||
|
||
edm::ParameterSetDescription TrigObjTnPHistColl::HistFiller::makePSetDescription() | ||
{ | ||
edm::ParameterSetDescription desc; | ||
desc.addVPSet("localCuts",VarRangeCut<trigger::TriggerObject>::makePSetDescription()); | ||
desc.add<std::string>("var","pt"); | ||
return desc; | ||
} | ||
|
||
void TrigObjTnPHistColl::HistFiller::operator()(const trigger::TriggerObject& probe,float mass, | ||
MonitorElement* hist) | ||
{ | ||
if(localCuts_(probe)) hist->Fill(var_(probe),mass); | ||
} | ||
|
||
|
||
|
||
TrigObjTnPHistColl::HistDefs::HistDefs(const edm::ParameterSet& config): | ||
massBins_(convertToFloat(config.getParameter<std::vector<double> >("massBins"))) | ||
{ | ||
const auto histConfigs = config.getParameter<std::vector<edm::ParameterSet> >("configs"); | ||
for(const auto& histConfig : histConfigs){ | ||
histData_.emplace_back(Data(histConfig)); | ||
} | ||
} | ||
|
||
edm::ParameterSetDescription TrigObjTnPHistColl::HistDefs::makePSetDescription() | ||
{ | ||
edm::ParameterSetDescription desc; | ||
desc.addVPSet("configs",Data::makePSetDescription(),std::vector<edm::ParameterSet>()); | ||
std::vector<double> massBins; | ||
for(float mass = 60;mass<=120;mass+=1) massBins.push_back(mass); | ||
desc.add<std::vector<double>>("massBins",massBins); | ||
return desc; | ||
} | ||
|
||
std::vector<std::pair<TrigObjTnPHistColl::HistFiller,MonitorElement*> > TrigObjTnPHistColl::HistDefs::bookHists(DQMStore::IBooker& iBooker,const std::string& name,const std::string& title)const | ||
{ | ||
std::vector<std::pair<HistFiller,MonitorElement*> > hists; | ||
for(const auto& data : histData_){ | ||
hists.push_back({data.filler(),data.book(iBooker,name,title,massBins_)}); | ||
} | ||
return hists; | ||
} | ||
|
||
TrigObjTnPHistColl::HistDefs::Data::Data(const edm::ParameterSet& config): | ||
histFiller_(config.getParameter<edm::ParameterSet>("filler")), | ||
bins_(convertToFloat(config.getParameter<std::vector<double> >("bins"))), | ||
nameSuffex_(config.getParameter<std::string>("nameSuffex")), | ||
titleSuffex_(config.getParameter<std::string>("titleSuffex")) | ||
{ | ||
|
||
} | ||
|
||
edm::ParameterSetDescription TrigObjTnPHistColl::HistDefs::Data::makePSetDescription() | ||
{ | ||
edm::ParameterSetDescription desc; | ||
desc.add<edm::ParameterSetDescription>("filler",TrigObjTnPHistColl::HistFiller::makePSetDescription()); | ||
desc.add<std::vector<double> >("bins",{-2.5,-1.5,0,1.5,2.5}); | ||
desc.add<std::string>("nameSuffex","_eta"); | ||
desc.add<std::string>("titleSuffex",";#eta;mass [GeV]"); | ||
return desc; | ||
} | ||
|
||
MonitorElement* TrigObjTnPHistColl::HistDefs::Data::book(DQMStore::IBooker& iBooker, | ||
const std::string& name,const std::string& title, | ||
const std::vector<float>& massBins)const | ||
{ | ||
return iBooker.book2D((name+nameSuffex_).c_str(),(title+titleSuffex_).c_str(), | ||
bins_.size()-1,bins_.data(),massBins.size()-1,massBins.data()); | ||
} | ||
|
||
void TrigObjTnPHistColl::HistColl::bookHists(DQMStore::IBooker& iBooker, | ||
const std::string& name,const std::string& title, | ||
const HistDefs& histDefs) | ||
{ | ||
hists_ = histDefs.bookHists(iBooker,name,title); | ||
} | ||
|
||
void TrigObjTnPHistColl::HistColl::fill(const trigger::TriggerObject& probe,float mass) | ||
{ | ||
for(auto& hist : hists_){ | ||
hist.first(probe,mass,hist.second); | ||
} | ||
} | ||
|
||
void TrigObjTnPHistColl::ProbeData::bookHists(const std::string& tagName, | ||
DQMStore::IBooker& iBooker, | ||
const HistDefs& histDefs) | ||
{ | ||
hists_.bookHists(iBooker,tagName+"_"+probeFilter_,tagName+"_"+probeFilter_,histDefs); | ||
} | ||
|
||
void TrigObjTnPHistColl::ProbeData::fill(const trigger::size_type tagKey,const trigger::TriggerEvent& trigEvt,const VarRangeCutColl<trigger::TriggerObject>& probeCuts) | ||
{ | ||
auto probeKeys = getKeys(trigEvt,probeFilter_); | ||
for(auto probeKey : probeKeys){ | ||
const trigger::TriggerObject& probe = trigEvt.getObjects()[probeKey]; | ||
if(tagKey != probeKey && probeCuts(probe) ){ | ||
const trigger::TriggerObject& tag = trigEvt.getObjects()[tagKey]; | ||
auto massFunc = [](float pt1,float eta1,float phi1,float pt2,float eta2,float phi2){ | ||
return std::sqrt( 2*pt1*pt2*( std::cosh(eta1-eta2) - std::cos(phi1-phi2) ) ); | ||
}; | ||
float mass = massFunc(tag.pt(),tag.eta(),tag.phi(),probe.pt(),probe.eta(),probe.phi()); | ||
hists_.fill(probe,mass); | ||
} | ||
} | ||
} | ||
|
Oops, something went wrong.