diff --git a/Trigger/TrigAnalysis/TrigInDetAnalysis/TrigInDetAnalysis/TrigObjectMatcher.h b/Trigger/TrigAnalysis/TrigInDetAnalysis/TrigInDetAnalysis/TrigObjectMatcher.h index 9dfa02a6a67b718eaac716511333b09fc04206fa..e1c7231c7b3b76937a155b5dc66ab9edd6413528 100644 --- a/Trigger/TrigAnalysis/TrigInDetAnalysis/TrigInDetAnalysis/TrigObjectMatcher.h +++ b/Trigger/TrigAnalysis/TrigInDetAnalysis/TrigInDetAnalysis/TrigObjectMatcher.h @@ -40,12 +40,20 @@ public: TrigObjectMatcher( TrackSelector* selector, const std::vector<TrackTrigObject>& objects, - bool (*select_function)(const TrackTrigObject& t)=0 ) + bool (*select_function)(const TrackTrigObject& )=0 ) : m_status(1) { const std::vector<TIDA::Track*> tracks = selector->tracks(); for ( int i=tracks.size() ; i-- ; ) if ( match( tracks[i]->id(), objects, select_function )==false ) selector->delete_track( tracks[i] ); } + TrigObjectMatcher( TrackSelector* selector, + const std::vector<TrackTrigObject>& objects, + bool (*select_function)(const TrackTrigObject& , TIDA::Track* )=0 ) + : m_status(1) { + const std::vector<TIDA::Track*> tracks = selector->tracks(); + for ( size_t i=tracks.size() ; i-- ; ) if ( match( tracks[i], objects, select_function )==false ) selector->delete_track( tracks[i] ); + } + virtual ~TrigObjectMatcher() { } @@ -88,6 +96,22 @@ private: } + bool match( TIDA::Track* track, const std::vector<TrackTrigObject>& objects, bool (*select_function)(const TrackTrigObject& , TIDA::Track* )=0 ) { + for ( size_t j=objects.size() ; j-- ; ) { + for ( size_t k=objects[j].children().size() ; k-- ; ) { + if ( track->id() == objects[j].children()[k] ) { + if ( select_function==0 || select_function(objects[j], track) ) { + m_objectmap.insert( map_type::value_type( track->id(), &objects[j] ) ); + return true; + } + else return false; + } + } + } + return false; + } + + private: int m_status; diff --git a/Trigger/TrigAnalysis/TrigInDetAnalysisUser/Analysis/src/rmain.cxx b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/Analysis/src/rmain.cxx index c8aefabc09ae57d90bdb02fd5acc8ce72b2f4fc2..00f64b55b8b9f36c51e4380744fd79a82f23a689 100644 --- a/Trigger/TrigAnalysis/TrigInDetAnalysisUser/Analysis/src/rmain.cxx +++ b/Trigger/TrigAnalysis/TrigInDetAnalysisUser/Analysis/src/rmain.cxx @@ -349,6 +349,17 @@ double ETmin = 0; bool SelectObjectET(const TrackTrigObject& t) { return std::fabs(t.pt())>ETmin; } +double ETovPTmin = 0; + +bool SelectObjectETovPT(const TrackTrigObject& tobj, TIDA::Track* t=0) { + bool ETselection = std::fabs(tobj.pt())>=ETmin; + bool ETovPTselection = true; + if ( t ) ETovPTselection = std::fabs(tobj.pt()/t->pT())>=ETovPTmin; + return ETselection&ETovPTselection; +} + + + int main(int argc, char** argv) { @@ -535,6 +546,7 @@ int main(int argc, char** argv) if ( inputdata.isTagDefined("pT") ) pT = inputdata.GetValue("pT"); if ( inputdata.isTagDefined("ET") ) ETmin = inputdata.GetValue("ET"); + if ( inputdata.isTagDefined("ETovPT") ) ETovPTmin = inputdata.GetValue("ETovPT"); /// here we set a pTMax value less than pT, then only set the max pT in the /// filter if we read a pTMax value *greater* than pT @@ -1620,8 +1632,12 @@ int main(int argc, char** argv) /// get objects if requested + // tom = true; + + ETovPTmin = ETmin; + if ( chains[ic].rois()[0].objects().size()>0 ) { - tom = TrigObjectMatcher( &refTracks, chains[ic].rois()[0].objects(), SelectObjectET ); + tom = TrigObjectMatcher( &refTracks, chains[ic].rois()[0].objects(), SelectObjectETovPT ); } break;