40 beamspotTag_(iConfig.getParameter<
edm::InputTag>(
"BeamSpotTag")),
42 muonTag_(iConfig.getParameter<
edm::InputTag>(
"CandTag")),
44 trackTag_(iConfig.getParameter<
edm::InputTag>(
"TrackTag")),
46 prevCandTag_(iConfig.getParameter<
edm::InputTag>(
"PreviousCandTag")),
47 prevCandToken_(consumes<
trigger::TriggerFilterObjectWithRefs>(prevCandTag_)),
48 minMasses_(iConfig.getParameter<
std::vector<double> >(
"MinMasses")),
49 maxMasses_(iConfig.getParameter<
std::vector<double> >(
"MaxMasses")),
50 checkCharge_(iConfig.getParameter<
bool>(
"checkCharge")),
51 minTrackPt_(iConfig.getParameter<double>(
"MinTrackPt")),
52 minTrackP_(iConfig.getParameter<double>(
"MinTrackP")),
53 maxTrackEta_(iConfig.getParameter<double>(
"MaxTrackEta")),
54 maxTrackDxy_(iConfig.getParameter<double>(
"MaxTrackDxy")),
55 maxTrackDz_(iConfig.getParameter<double>(
"MaxTrackDz")),
56 minTrackHits_(iConfig.getParameter<
int>(
"MinTrackHits")),
57 maxTrackNormChi2_(iConfig.getParameter<double>(
"MaxTrackNormChi2")),
59 max_DCAMuonTrack_(iConfig.getParameter<double>(
"MaxDCAMuonTrack")),
60 cutCowboys_(iConfig.getParameter<
bool>(
"CutCowboys"))
73 edm::LogError(
"HLTMuonTrackMassFilter") <<
"Inconsistency in definition of mass windows, " 74 <<
"no event will pass the filter";
79 std::ostringstream stream;
80 stream <<
"instantiated with parameters\n";
82 stream <<
" muonCandidates = " <<
muonTag_ <<
"\n";
83 stream <<
" trackCandidates = " <<
trackTag_ <<
"\n";
84 stream <<
" previousCandidates = " <<
prevCandTag_ <<
"\n";
85 stream <<
" saveTags= " <<
saveTags() <<
"\n";
86 stream <<
" mass windows =";
92 stream <<
" MinTrackP = " <<
minTrackP_ <<
"\n";
99 LogDebug(
"HLTMuonTrackMassFilter") << stream.str();
114 std::vector<double> temp1;
116 temp1.push_back(2.8);
117 desc.
add<std::vector<double> >(
"MinMasses",temp1);
120 std::vector<double> temp1;
122 temp1.push_back(3.4);
123 desc.
add<std::vector<double> >(
"MaxMasses",temp1);
125 desc.
add<
bool>(
"checkCharge",
true);
126 desc.
add<
double>(
"MinTrackPt",0.0);
127 desc.
add<
double>(
"MinTrackP",3.0);
128 desc.
add<
double>(
"MaxTrackEta",999.0);
129 desc.
add<
double>(
"MaxTrackDxy",999.0);
130 desc.
add<
double>(
"MaxTrackDz",999.0);
131 desc.
add<
int>(
"MinTrackHits",5);
132 desc.
add<
double>(
"MaxTrackNormChi2",10000000000.0);
133 desc.
add<
double>(
"MaxDCAMuonTrack",99999.9);
134 desc.
add<
bool>(
"CutCowboys",
false);
135 descriptions.
add(
"hltMuonTrackMassFilter",desc);
170 std::vector<reco::RecoChargedCandidateRef> prevMuonRefs;
172 std::vector<reco::RecoChargedCandidateRef> prevTrackRefs;
174 bool checkPrevTracks = prevTrackRefs.size()==prevMuonRefs.size();
182 std::vector<reco::RecoChargedCandidateRef> selectedMuonRefs;
183 selectedMuonRefs.reserve(muonHandle->size());
186 for (
unsigned int i=0;
i<muonHandle->size(); ++
i ) {
193 if (
find(prevMuonRefs.begin(),prevMuonRefs.end(),muonRef)==
194 prevMuonRefs.end() )
continue;
199 selectedMuonRefs.push_back(muonRef);
205 std::vector<reco::RecoChargedCandidateRef> selectedTrackRefs;
206 selectedTrackRefs.reserve(trackHandle->size());
208 for (
unsigned int i=0;
i<trackHandle->size(); ++
i ) {
232 selectedTrackRefs.push_back(trackRef);
240 unsigned int nCowboy(0);
241 unsigned int nComb(0);
245 for (
auto & selectedMuonRef : selectedMuonRefs) {
247 int qMuon = muon.
charge();
249 for (
auto & selectedTrackRef : selectedTrackRefs) {
284 if ( checkPrevTracks ) {
287 selectedTrackRef) )
continue;
290 for (
unsigned int j=0; j<
minMasses_.size(); ++j ) {
305 std::ostringstream stream;
306 stream <<
"Total number of combinations = " 308 <<
" , after charge " << nQ <<
" , after cutCowboy " << nCowboy <<
" , after mass " << nComb << std::endl;
309 stream <<
"Found " << nComb <<
" jpsi candidates with # / mass / q / pt / eta" << std::endl;
310 std::vector<reco::RecoChargedCandidateRef> muRefs;
311 std::vector<reco::RecoChargedCandidateRef> tkRefs;
317 if ( muRefs.size()==tkRefs.size() ) {
318 for (
unsigned int i=0;
i<muRefs.size(); ++
i ) {
319 p4Mu = muRefs[
i]->p4();
320 p4Tk = tkRefs[
i]->p4();
321 p4JPsi = p4Mu + p4Tk;
322 stream <<
" " <<
i <<
" " 324 << muRefs[
i]->charge()+tkRefs[
i]->charge() <<
" " 326 << p4JPsi.Eta() <<
"\n";
328 LogDebug(
"HLTMuonTrackMassFilter") << stream.str();
331 LogDebug(
"HLTMuonTrackMassFilter") <<
"different sizes for muon and track containers!!!";
340 std::vector<reco::RecoChargedCandidateRef>& prevTrackRefs,
347 if ( prevTrackRefs.empty() )
return true;
351 if ( prevMuonRefs.size()!=prevTrackRefs.size() )
return false;
353 if ( seedRef.
isNull() )
return false;
362 for (
size_t i=0;
i<prevMuonRefs.size(); ++
i ) {
364 if ( prevMuonRefs[
i]!=muonRef )
continue;
367 if ( prevTrackRef.
isNull() )
continue;
369 if (prevTrackRef==trackRef->track())
return true;
371 if ( seedRef->
nHits()!=prevTrackRef->recHitsSize() )
continue;
373 iseed = seedHits.first;
374 iprev = prevTrackRef->recHitsBegin();
375 prevTrackHitEnd = prevTrackRef->recHitsEnd();
376 bool identical(
true);
377 for ( ; iseed!=seedHits.second&&iprev!=prevTrackHitEnd; ++
iseed,++iprev ) {
378 if ( (*iseed).isValid()!=(**iprev).isValid() ||
386 if ( identical )
return true;
double minTrackP_
track p cut
float distance() const override
void getObjects(Vids &ids, VRphoton &refs) const
various physics-level getters:
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
double eta() const final
momentum pseudorapidity
bool checkCharge_
check opposite charge?
bool hltFilter(edm::Event &, const edm::EventSetup &, trigger::TriggerFilterObjectWithRefs &filterproduct) const override
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
TrajectoryStateClosestToPoint impactPointTSCP() const
const FreeTrajectoryState & theState() const
edm::InputTag trackTag_
RecoChargedCandidateCollection (tracks)
double pt() const final
transverse momentum
int charge() const final
electric charge
math::XYZPoint Point
point in the space
edm::EDGetTokenT< reco::BeamSpot > beamspotToken_
beamspot used for quality cuts
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
double maxTrackDz_
track lip cut w.r.t. beamspot
void addObject(int id, const reco::RecoEcalCandidateRef &ref)
setters for L3 collections: (id=physics type, and Ref<C>)
double maxTrackNormChi2_
normalized chi2 of track
#define DEFINE_FWK_MODULE(type)
bool status() const override
std::vector< double > minMasses_
lower mass limits
bool calculate(const TrajectoryStateOnSurface &sta, const TrajectoryStateOnSurface &stb) override
recHitContainer::const_iterator const_iterator
edm::InputTag muonTag_
RecoChargedCandidateCollection (muons)
std::pair< const_iterator, const_iterator > range
HLTMuonTrackMassFilter(const edm::ParameterSet &)
reco::TrackRef track() const override
reference to a track
const LorentzVector & p4() const final
four-momentum Lorentz vector
bool cutCowboys_
DCA between the two muons.
unsigned short numberOfValidHits() const
number of valid hits found
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isNull() const
Checks for null.
bool pairMatched(std::vector< reco::RecoChargedCandidateRef > &prevMuonRefs, std::vector< reco::RecoChargedCandidateRef > &prevTrackRefs, const reco::RecoChargedCandidateRef &muonRef, const reco::RecoChargedCandidateRef &trackRef) const
double dz() const
dz parameter (= dsz/cos(lambda)). This is the track z0 w.r.t (0,0,0) only if the refPoint is close to...
edm::EDGetTokenT< reco::RecoChargedCandidateCollection > muonToken_
RecoChargedCandidateCollection (muons)
std::vector< RecoChargedCandidate > RecoChargedCandidateCollection
collectin of RecoChargedCandidate objects
double p() const final
magnitude of momentum vector
static void makeHLTFilterDescription(edm::ParameterSetDescription &desc)
bool isNull() const
Checks for null.
void addCollectionTag(const edm::InputTag &collectionTag)
collectionTags
int minTrackHits_
valid hits on track
void add(std::string const &label, ParameterSetDescription const &psetDescription)
double minTrackPt_
track pt cut
unsigned int nHits() const
edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > prevCandToken_
filter objects from previous filter
std::vector< double > maxMasses_
higher mass limits
edm::EDGetTokenT< reco::RecoChargedCandidateCollection > trackToken_
RecoChargedCandidateCollection (tracks)
edm::InputTag prevCandTag_
filter objects from previous filter
double maxTrackDxy_
track tip cut w.r.t. beamspot
const Point & position() const
position
edm::InputTag beamspotTag_
beamspot used for quality cuts
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
double phi() const final
momentum azimuthal angle
math::XYZTLorentzVector LorentzVector
Lorentz vector.
double maxTrackEta_
track |eta| cut