Go to the documentation of this file.00001
00009 #include "HLTrigger/Muon/interface/HLTMuonL1toL3TkPreFilter.h"
00010
00011 #include "DataFormats/Common/interface/Handle.h"
00012 #include "DataFormats/Common/interface/RefToBase.h"
00013
00014 #include "DataFormats/HLTReco/interface/TriggerFilterObjectWithRefs.h"
00015 #include "DataFormats/HLTReco/interface/TriggerRefsCollections.h"
00016
00017 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00018 #include "DataFormats/TrackReco/interface/Track.h"
00019 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidate.h"
00020 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidateFwd.h"
00021 #include "DataFormats/MuonReco/interface/MuonTrackLinks.h"
00022 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
00023 #include "DataFormats/MuonSeed/interface/L3MuonTrajectorySeed.h"
00024 #include "DataFormats/MuonSeed/interface/L3MuonTrajectorySeedCollection.h"
00025
00026
00027
00028
00029 using namespace std;
00030 using namespace edm;
00031 using namespace reco;
00032 using namespace trigger;
00033
00034 HLTMuonL1toL3TkPreFilter::HLTMuonL1toL3TkPreFilter(const ParameterSet& iConfig) :
00035 beamspotTag_ (iConfig.getParameter< edm::InputTag > ("BeamSpotTag")),
00036 candTag_ (iConfig.getParameter<InputTag > ("CandTag")),
00037 previousCandTag_ (iConfig.getParameter<InputTag > ("PreviousCandTag")),
00038 min_N_ (iConfig.getParameter<int> ("MinN")),
00039 max_Eta_ (iConfig.getParameter<double> ("MaxEta")),
00040 min_Nhits_ (iConfig.getParameter<int> ("MinNhits")),
00041 max_Dr_ (iConfig.getParameter<double> ("MaxDr")),
00042 max_Dz_ (iConfig.getParameter<double> ("MaxDz")),
00043 min_Pt_ (iConfig.getParameter<double> ("MinPt")),
00044 nsigma_Pt_ (iConfig.getParameter<double> ("NSigmaPt")),
00045 saveTag_ (iConfig.getUntrackedParameter<bool> ("SaveTag",true))
00046 {
00047
00048 LogDebug("HLTMuonL1toL3TkPreFilter")
00049 << " CandTag/MinN/MaxEta/MinNhits/MaxDr/MaxDz/MinPt/NSigmaPt : "
00050 << candTag_.encode()
00051 << " " << min_N_
00052 << " " << max_Eta_
00053 << " " << min_Nhits_
00054 << " " << max_Dr_
00055 << " " << max_Dz_
00056 << " " << min_Pt_
00057 << " " << nsigma_Pt_;
00058
00059
00060 produces<TriggerFilterObjectWithRefs>();
00061 }
00062
00063 HLTMuonL1toL3TkPreFilter::~HLTMuonL1toL3TkPreFilter()
00064 {
00065 }
00066
00067
00068
00069
00070
00071
00072 bool
00073 HLTMuonL1toL3TkPreFilter::filter(Event& iEvent, const EventSetup& iSetup)
00074 {
00075
00076
00077
00078
00079
00080
00081 auto_ptr<TriggerFilterObjectWithRefs>
00082 filterproduct (new TriggerFilterObjectWithRefs(path(),module()));
00083
00084
00085
00086 Handle<RecoChargedCandidateCollection> mucands;
00087 iEvent.getByLabel(candTag_,mucands);
00088 if(saveTag_)filterproduct->addCollectionTag(candTag_);
00089
00090 std::map<l1extra::L1MuonParticleRef, std::vector<RecoChargedCandidateRef> > L1toL3s;
00091 unsigned int n = 0;
00092 unsigned int maxN = mucands->size();
00093 for (;n!=maxN;n++){
00094 TrackRef tk = (*mucands)[n].track();
00095 edm::Ref<L3MuonTrajectorySeedCollection> l3seedRef = tk->seedRef().castTo<edm::Ref<L3MuonTrajectorySeedCollection> >();
00096 l1extra::L1MuonParticleRef l1mu = l3seedRef->l1Particle();
00097 L1toL3s[l1mu].push_back(RecoChargedCandidateRef(mucands,n));
00098 }
00099
00100
00101 Handle<TriggerFilterObjectWithRefs> previousLevelCands;
00102 iEvent.getByLabel (previousCandTag_,previousLevelCands);
00103 BeamSpot beamSpot;
00104 Handle<BeamSpot> recoBeamSpotHandle;
00105 iEvent.getByLabel(beamspotTag_,recoBeamSpotHandle);
00106 beamSpot = *recoBeamSpotHandle;
00107
00108
00109
00110 vector<l1extra::L1MuonParticleRef> vl1cands;
00111 previousLevelCands->getObjects(TriggerL1Mu,vl1cands);
00112
00113 std::map<l1extra::L1MuonParticleRef, std::vector<RecoChargedCandidateRef> > ::iterator L1toL3s_it = L1toL3s.begin();
00114 std::map<l1extra::L1MuonParticleRef, std::vector<RecoChargedCandidateRef> > ::iterator L1toL3s_end = L1toL3s.end();
00115 for (; L1toL3s_it!=L1toL3s_end; ++L1toL3s_it){
00116
00117 if (!triggeredAtL1(L1toL3s_it->first,vl1cands)) continue;
00118
00119
00120 unsigned int iTk=0;
00121 unsigned int maxItk=L1toL3s_it->second.size();
00122 for (; iTk!=maxItk; iTk++){
00123
00124 RecoChargedCandidateRef & cand=L1toL3s_it->second[iTk];
00125 TrackRef tk = cand->track();
00126
00127 if (fabs(tk->eta())>max_Eta_) continue;
00128
00129
00130 if (tk->numberOfValidHits()<min_Nhits_) continue;
00131
00132
00133
00134 if (fabs(tk->dxy(beamSpot.position()))>max_Dr_) continue;
00135
00136
00137 if (fabs(tk->dz())>max_Dz_) continue;
00138
00139
00140 double pt = tk->pt();
00141 double err0 = tk->error(0);
00142 double abspar0 = fabs(tk->parameter(0));
00143 double ptLx = pt;
00144
00145 if (abspar0>0) ptLx += nsigma_Pt_*err0/abspar0*pt;
00146 LogTrace("HLTMuonL1toL3TkPreFilter") << " ...Muon in loop, pt= "
00147 << pt << ", ptLx= " << ptLx;
00148 if (ptLx<min_Pt_) continue;
00149
00150
00151 filterproduct->addObject(TriggerMuon,cand);
00152 break;
00153 }
00154
00155 }
00156
00157
00158 vector<RecoChargedCandidateRef> vref;
00159 filterproduct->getObjects(TriggerMuon,vref);
00160 for (unsigned int i=0; i<vref.size(); i++ ) {
00161 TrackRef tk = vref[i]->track();
00162 LogDebug("HLTMuonL1toL3TkPreFilter")
00163 << " Track passing filter: pt= " << tk->pt() << ", eta: "
00164 << tk->eta();
00165 }
00166
00167
00168 const bool accept ((int)n >= min_N_);
00169
00170
00171 iEvent.put(filterproduct);
00172
00173 LogDebug("HLTMuonL1toL3TkPreFilter") << " >>>>> Result of HLTMuonL1toL3TkPreFilter is " << accept << ", number of muons passing thresholds= " << n;
00174
00175 return accept;
00176 }
00177 bool
00178 HLTMuonL1toL3TkPreFilter::triggeredAtL1(const l1extra::L1MuonParticleRef & l1mu,std::vector<l1extra::L1MuonParticleRef>& vcands)
00179 {
00180 bool ok=false;
00181
00182
00183 for (unsigned int i=0; i<vcands.size(); i++) {
00184
00185 if (vcands[i] == l1mu){
00186 ok=true;
00187 LogDebug("HLTMuonL1toL3TkPreFilter") << "The L1 mu triggered";
00188 break;}
00189 }
00190 return ok;
00191 }
00192