CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/DQMOffline/Trigger/interface/EgHLTTrigTools.h

Go to the documentation of this file.
00001 #ifndef DQMOFFLINE_TRIGGER_EGHLTTRIGTOOLS
00002 #define DQMOFFLINE_TRIGGER_EGHLTTRIGTOOLS
00003 
00004 #include "DQMOffline/Trigger/interface/EgHLTTrigCodes.h"
00005 #include "DataFormats/HLTReco/interface/TriggerEvent.h"
00006 #include "DataFormats/Common/interface/Handle.h"
00007 #include "DataFormats/Math/interface/deltaR.h"
00008 
00009 class HLTConfigProvider;
00010 
00011 namespace egHLT {
00012   
00013   namespace trigTools {
00014     TrigCodes::TrigBitSet getFiltersPassed(const std::vector<std::pair<std::string,int> >& filters,const trigger::TriggerEvent* trigEvt,const std::string& hltTag);
00015     
00016     template<class T> void setFiltersObjPasses(std::vector<T>& objs,const std::vector<std::string>& filters,const std::vector<std::pair<std::string,std::string> >& l1PreAndSeedFilters,const TrigCodes::TrigBitSet& evtTrigBits,const trigger::TriggerEvent* trigEvt,const std::string& hltTag );
00017     
00018     template<class T, class U> void fillHLTposition(T& obj,U& hltData,const std::vector<std::string>& filters,const trigger::TriggerEvent* trigEvt,const std::string& hltTag );
00019     int getMinNrObjsRequiredByFilter(const std::string& filterName); //slow function, call at begin job and cache results
00020 
00021     //reads hlt config and works out which are the active last filters stored in trigger summary, is sorted
00022     void getActiveFilters(const HLTConfigProvider& hltConfig,std::vector<std::string>& activeFilters,std::vector<std::string>& activeEleFilters,std::vector<std::string>& activeEle2LegFilters,std::vector<std::string>& activePhoFilters,std::vector<std::string>& activePho2LegFilters);
00023     //---Morse test--------
00024     //void getPhoton30(const HLTConfigProvider& hltConfig,std::vector<std::string>& activeFilters);
00025     //------------------
00026     //filters a list of filternames removing any filters which are not in active filters, assumes active filters is sorted
00027     void filterInactiveTriggers(std::vector<std::string>& namesToFilter,std::vector<std::string>& activeFilters);
00028     //filters a list of filterName1:filterName2 removing any entry for which either filter is not in activeFilters, assumes active filters is sorted
00029     void filterInactiveTightLooseTriggers(std::vector<std::string>& namesToFilter,const std::vector<std::string>& activeFilters);
00030 
00031     void translateFiltersToPathNames(const HLTConfigProvider& hltConfig,const std::vector<std::string>& filters,std::vector<std::string>& paths);
00032     std::string getL1SeedFilterOfPath(const HLTConfigProvider& hltConfig,const std::string& path);
00033 
00034     //looks for string Et and then looks for a number after that (currently the standard of all E/g triggers)
00035     //returns 0 if unsuccessful
00036     float getEtThresFromName(const std::string& trigName);
00037     float getSecondEtThresFromName(const std::string& trigName);
00038   }
00039   
00040   //I have the horrible feeling that I'm converting into an intermediatry format and then coverting back again
00041   //Okay how this works
00042   //1) create a TrigBitSet for each particle set to 0 initally
00043   //2) loop over each filter, for each particle that passes the filter, set the appropriate bit in the TrigBitSet
00044   //3) after that, loop over each particle setting that its TrigBitSet which has been calculated
00045   //4) because L1 pre-scaled paths are special, we only set those if an event wide trigger has been set
00046   template <class T>
00047   void trigTools::setFiltersObjPasses(std::vector<T>& particles,const std::vector<std::string>& filters,
00048                                       const std::vector<std::pair<std::string,std::string> >& l1PreAndSeedFilters,
00049                                       const TrigCodes::TrigBitSet& evtTrigBits,
00050                                       const trigger::TriggerEvent* trigEvt,const std::string& hltTag)
00051   {
00052     std::vector<TrigCodes::TrigBitSet> partTrigBits(particles.size());
00053     const double maxDeltaR=0.1;
00054     for(size_t filterNrInVec=0;filterNrInVec<filters.size();filterNrInVec++){
00055       size_t filterNrInEvt = trigEvt->filterIndex(edm::InputTag(filters[filterNrInVec],"",hltTag).encode());
00056       const TrigCodes::TrigBitSet filterCode = TrigCodes::getCode(filters[filterNrInVec].c_str());
00057       
00058       if(filterNrInEvt<trigEvt->sizeFilters()){ //filter found in event, something passes it
00059         const trigger::Keys& trigKeys = trigEvt->filterKeys(filterNrInEvt);  //trigger::Keys is actually a vector<uint16_t> holding the position of trigger objects in the trigger collection passing the filter
00060         const trigger::TriggerObjectCollection & trigObjColl(trigEvt->getObjects());
00061         for(size_t partNr=0;partNr<particles.size();partNr++){
00062           for(trigger::Keys::const_iterator keyIt=trigKeys.begin();keyIt!=trigKeys.end();++keyIt){
00063             float trigObjEta = trigObjColl[*keyIt].eta();
00064             float trigObjPhi = trigObjColl[*keyIt].phi();
00065             if (reco::deltaR(particles[partNr].eta(),particles[partNr].phi(),trigObjEta,trigObjPhi) < maxDeltaR){
00066             partTrigBits[partNr] |= filterCode;
00067             }//end dR<maxDeltaR trig obj match test
00068           }//end loop over all objects passing filter
00069         }//end loop over particles
00070       }//end check if filter is present
00071     }//end loop over all filters
00072     
00073     //okay the first element is the key, the second is the filter that exists in trigger event
00074     for(size_t l1FilterNrInVec=0;l1FilterNrInVec<l1PreAndSeedFilters.size();l1FilterNrInVec++){
00075       const TrigCodes::TrigBitSet filterCode = TrigCodes::getCode(l1PreAndSeedFilters[l1FilterNrInVec].first.c_str());
00076       if((filterCode&evtTrigBits)==filterCode){ //check that filter has fired in the event
00077    
00078         size_t filterNrInEvt = trigEvt->filterIndex(edm::InputTag(l1PreAndSeedFilters[l1FilterNrInVec].second,"",hltTag).encode());
00079         
00080         if(filterNrInEvt<trigEvt->sizeFilters()){ //filter found in event, something passes it
00081           const trigger::Keys& trigKeys = trigEvt->filterKeys(filterNrInEvt);  //trigger::Keys is actually a vector<uint16_t> holding the position of trigger objects in the trigger collection passing the filter
00082           const trigger::TriggerObjectCollection & trigObjColl(trigEvt->getObjects());
00083           for(size_t partNr=0;partNr<particles.size();partNr++){
00084             for(trigger::Keys::const_iterator keyIt=trigKeys.begin();keyIt!=trigKeys.end();++keyIt){
00085               float trigObjEta = trigObjColl[*keyIt].eta();
00086               float trigObjPhi = trigObjColl[*keyIt].phi();
00087               if (reco::deltaR(particles[partNr].eta(),particles[partNr].phi(),trigObjEta,trigObjPhi) < maxDeltaR){
00088                 partTrigBits[partNr] |= filterCode;
00089               }//end dR<maxDeltaR trig obj match test
00090             }//end loop over all objects passing filter
00091           }//end loop over particles
00092         }//end check if filter is present
00093       }//end check if path has fired in the event
00094     }//end loop over all filters 
00095     
00096     for(size_t partNr=0;partNr<particles.size();partNr++) particles[partNr].setTrigBits(partTrigBits[partNr]);
00097     
00098   }
00099 
00100 
00101  template <class T, class U>
00102   void trigTools::fillHLTposition(T& particle,
00103                                   U& hltData,
00104                                   const std::vector<std::string>& filters,
00105                                   const trigger::TriggerEvent* trigEvt,
00106                                   const std::string& hltTag)
00107 {
00108   std::vector<TrigCodes::TrigBitSet> partTrigBits(1);
00109   const double maxDeltaR=0.1;
00110   for(size_t filterNrInVec=0;filterNrInVec<filters.size();filterNrInVec++){
00111     size_t filterNrInEvt = trigEvt->filterIndex(edm::InputTag(filters[filterNrInVec],"",hltTag).encode());
00112     //const TrigCodes::TrigBitSet filterCode = TrigCodes::getCode(filters[filterNrInVec].c_str()); 
00113     if(filterNrInEvt<trigEvt->sizeFilters()){ //filter found in event, something passes it
00114       const trigger::Keys& trigKeys = trigEvt->filterKeys(filterNrInEvt);  //trigger::Keys is actually a vector<uint16_t> holding the position of trigger objects in the trigger collection passing the filter
00115       const trigger::TriggerObjectCollection & trigObjColl(trigEvt->getObjects());
00116       for(trigger::Keys::const_iterator keyIt=trigKeys.begin();keyIt!=trigKeys.end();++keyIt){
00117         float trigObjEta = trigObjColl[*keyIt].eta();
00118         float trigObjPhi = trigObjColl[*keyIt].phi();
00119         float trigObjE = trigObjColl[*keyIt].energy();
00120         if (reco::deltaR(particle.superCluster()->eta(),particle.superCluster()->phi(),trigObjEta,trigObjPhi) < maxDeltaR){
00121           hltData.HLTeta=trigObjEta;
00122           hltData.HLTphi=trigObjPhi;
00123           hltData.HLTenergy=trigObjE;
00124         }//end dR<maxDeltaR trig obj match test
00125       }//end loop over all objects passing filter`
00126     }//end check if filter is present
00127   }//end check if path has fired in the event
00128 }//end loop over all filters 
00129   
00130 }//end namespace declaration
00131 
00132 #endif
00133