CMS 3D CMS Logo

HLTmumutkVtxProducer.cc
Go to the documentation of this file.
1 #include <algorithm>
2 #include <cmath>
3 #include <vector>
4 
18 #include "HLTmumutkVtxProducer.h"
19 
20 using namespace edm;
21 using namespace reco;
22 using namespace std;
23 using namespace trigger;
24 
25 // ----------------------------------------------------------------------
27  : transientTrackRecordToken_(esConsumes(edm::ESInputTag("", "TransientTrackBuilder"))),
28  muCandTag_(iConfig.getParameter<edm::InputTag>("MuCand")),
29  muCandToken_(consumes<reco::RecoChargedCandidateCollection>(muCandTag_)),
30  trkCandTag_(iConfig.getParameter<edm::InputTag>("TrackCand")),
31  trkCandToken_(consumes<reco::RecoChargedCandidateCollection>(trkCandTag_)),
32  previousCandTag_(iConfig.getParameter<edm::InputTag>("PreviousCandTag")),
33  previousCandToken_(consumes<trigger::TriggerFilterObjectWithRefs>(previousCandTag_)),
34  mfName_(iConfig.getParameter<std::string>("SimpleMagneticField")),
35  idealMagneticFieldRecordToken_(esConsumes(edm::ESInputTag("", mfName_))),
36  thirdTrackMass_(iConfig.getParameter<double>("ThirdTrackMass")),
37  maxEta_(iConfig.getParameter<double>("MaxEta")),
38  minPt_(iConfig.getParameter<double>("MinPt")),
39  minInvMass_(iConfig.getParameter<double>("MinInvMass")),
40  maxInvMass_(iConfig.getParameter<double>("MaxInvMass")),
41  minD0Significance_(iConfig.getParameter<double>("MinD0Significance")),
42  overlapDR_(iConfig.getParameter<double>("OverlapDR")),
43  beamSpotTag_(iConfig.getParameter<edm::InputTag>("BeamSpotTag")),
44  beamSpotToken_(consumes<reco::BeamSpot>(beamSpotTag_)) {
45  produces<VertexCollection>();
46 }
47 
48 // ----------------------------------------------------------------------
50 
53  desc.add<edm::InputTag>("MuCand", edm::InputTag("hltMuTracks"));
54  desc.add<edm::InputTag>("TrackCand", edm::InputTag("hltMumukAllConeTracks"));
55  desc.add<edm::InputTag>("PreviousCandTag", edm::InputTag("hltDisplacedmumuFilterDoubleMu4Jpsi"));
56  desc.add<std::string>("SimpleMagneticField", "");
57  desc.add<double>("ThirdTrackMass", 0.493677);
58  desc.add<double>("MaxEta", 2.5);
59  desc.add<double>("MinPt", 3.0);
60  desc.add<double>("MinInvMass", 0.0);
61  desc.add<double>("MaxInvMass", 99999.);
62  desc.add<double>("MinD0Significance", 0.0);
63  desc.add<double>("OverlapDR", 1.44e-4);
64  desc.add<edm::InputTag>("BeamSpotTag", edm::InputTag("hltOfflineBeamSpot"));
65  descriptions.add("HLTmumutkVtxProducer", desc);
66 }
67 
68 // ----------------------------------------------------------------------
70  const double MuMass(0.106);
71  const double MuMass2(MuMass * MuMass);
72  const double thirdTrackMass2(thirdTrackMass_ * thirdTrackMass_);
73 
74  // get hold of muon trks
76  iEvent.getByToken(muCandToken_, mucands);
77 
78  // get the transient track builder
79  auto const& theB = iSetup.getHandle(transientTrackRecordToken_);
80 
81  //get the beamspot position
82  edm::Handle<reco::BeamSpot> recoBeamSpotHandle;
83  iEvent.getByToken(beamSpotToken_, recoBeamSpotHandle);
84 
85  //get the b field
86  auto const& bFieldHandle = iSetup.getHandle(idealMagneticFieldRecordToken_);
87  const MagneticField* magField = bFieldHandle.product();
88  TSCBLBuilderNoMaterial blsBuilder;
89 
90  // get track candidates around displaced muons
92  iEvent.getByToken(trkCandToken_, trkcands);
93 
94  unique_ptr<VertexCollection> vertexCollection(new VertexCollection());
95 
96  // Ref to Candidate object to be recorded in filter object
100 
101  double e1, e2, e3;
103 
104  if (mucands->size() < 2)
105  return;
106  if (trkcands->empty())
107  return;
108 
109  RecoChargedCandidateCollection::const_iterator mucand1;
110  RecoChargedCandidateCollection::const_iterator mucand2;
111  RecoChargedCandidateCollection::const_iterator trkcand;
112 
113  // get the objects passing the previous filter
115  iEvent.getByToken(previousCandToken_, previousCands);
116 
117  vector<RecoChargedCandidateRef> vPrevCands;
118  previousCands->getObjects(TriggerMuon, vPrevCands);
119 
120  for (mucand1 = mucands->begin(); mucand1 != mucands->end(); ++mucand1) {
121  TrackRef trk1 = mucand1->get<TrackRef>();
122  LogDebug("HLTmumutkVtxProducer") << " 1st muon: q*pt= " << trk1->charge() * trk1->pt() << ", eta= " << trk1->eta()
123  << ", hits= " << trk1->numberOfValidHits();
124 
125  //first check if this muon passed the previous filter
126  if (!checkPreviousCand(trk1, vPrevCands))
127  continue;
128 
129  // eta and pt cut
130  if (fabs(trk1->eta()) > maxEta_)
131  continue;
132  if (trk1->pt() < minPt_)
133  continue;
134 
135  mucand2 = mucand1;
136  ++mucand2;
137  for (; mucand2 != mucands->end(); mucand2++) {
138  TrackRef trk2 = mucand2->get<TrackRef>();
139 
140  LogDebug("HLTDisplacedMumukFilter") << " 2nd muon: q*pt= " << trk2->charge() * trk2->pt()
141  << ", eta= " << trk2->eta() << ", hits= " << trk2->numberOfValidHits();
142 
143  //first check if this muon passed the previous filter
144  if (!checkPreviousCand(trk2, vPrevCands))
145  continue;
146  // eta and pt cut
147  if (fabs(trk2->eta()) > maxEta_)
148  continue;
149  if (trk2->pt() < minPt_)
150  continue;
151 
152  //loop on track collection
153  for (trkcand = trkcands->begin(); trkcand != trkcands->end(); ++trkcand) {
154  TrackRef trk3 = trkcand->get<TrackRef>();
155  if (overlap(trk1, trk3))
156  continue;
157  if (overlap(trk2, trk3))
158  continue;
159 
160  LogDebug("HLTDisplacedMumukFilter") << " 3rd track: q*pt= " << trk3->charge() * trk3->pt()
161  << ", eta= " << trk3->eta() << ", hits= " << trk3->numberOfValidHits();
162 
163  // eta and pt cut
164  if (fabs(trk3->eta()) > maxEta_)
165  continue;
166  if (trk3->pt() < minPt_)
167  continue;
168 
169  // Combined system
170  e1 = sqrt(trk1->momentum().Mag2() + MuMass2);
171  e2 = sqrt(trk2->momentum().Mag2() + MuMass2);
172  e3 = sqrt(trk3->momentum().Mag2() + thirdTrackMass2);
173 
174  p1 = Particle::LorentzVector(trk1->px(), trk1->py(), trk1->pz(), e1);
175  p2 = Particle::LorentzVector(trk2->px(), trk2->py(), trk2->pz(), e2);
176  p3 = Particle::LorentzVector(trk3->px(), trk3->py(), trk3->pz(), e3);
177 
178  p = p1 + p2 + p3;
179 
180  //invariant mass cut
181  double invmass = abs(p.mass());
182  LogDebug("HLTDisplacedMumukFilter") << " Invmass= " << invmass;
183  if (invmass < minInvMass_)
184  continue;
185  if (invmass > maxInvMass_)
186  continue;
187 
188  // do the vertex fit
189  vector<TransientTrack> t_tks;
190  t_tks.push_back((*theB).build(&trk1));
191  t_tks.push_back((*theB).build(&trk2));
192  t_tks.push_back((*theB).build(&trk3));
193  if (t_tks.size() != 3)
194  continue;
195 
196  FreeTrajectoryState InitialFTS = initialFreeState(*trk3, magField);
197  TrajectoryStateClosestToBeamLine tscb(blsBuilder(InitialFTS, *recoBeamSpotHandle));
198  double d0sig = tscb.transverseImpactParameter().significance();
199  if (d0sig < minD0Significance_)
200  continue;
201 
202  KalmanVertexFitter kvf;
203  TransientVertex tv = kvf.vertex(t_tks);
204  if (!tv.isValid())
205  continue;
206  Vertex vertex = tv;
207 
208  // put vertex in the event
209  vertexCollection->push_back(vertex);
210  }
211  }
212  }
214 }
215 
218  GlobalPoint gpos(pos);
219  Basic3DVector<float> mom(tk.momentum());
220  GlobalVector gmom(mom);
221  GlobalTrajectoryParameters par(gpos, gmom, tk.charge(), field);
223  return FreeTrajectoryState(par, err);
224 }
225 
226 bool HLTmumutkVtxProducer::overlap(const TrackRef& trackref1, const TrackRef& trackref2) {
227  if (deltaR(trackref1->eta(), trackref1->phi(), trackref2->eta(), trackref2->phi()) < overlapDR_)
228  return true;
229  return false;
230 }
231 
233  const vector<RecoChargedCandidateRef>& refVect) const {
234  bool ok = false;
235  for (auto& i : refVect) {
236  if (i->get<TrackRef>() == trackref) {
237  ok = true;
238  break;
239  }
240  }
241  return ok;
242 }
Vector3DBase
Definition: Vector3DBase.h:8
ConfigurationDescriptions.h
TSCBLBuilderNoMaterial.h
TrajectoryStateClosestToBeamLine
Definition: TrajectoryStateClosestToBeamLine.h:15
trigger::TriggerFilterObjectWithRefs
Definition: TriggerFilterObjectWithRefs.h:35
KalmanVertexFitter::vertex
CachingVertex< 5 > vertex(const std::vector< reco::TransientTrack > &tracks) const override
Definition: KalmanVertexFitter.h:49
HLTmumutkVtxProducer.h
mps_fire.i
i
Definition: mps_fire.py:428
edm::ESInputTag
Definition: ESInputTag.h:87
FreeTrajectoryState.h
GlobalTrajectoryParameters.h
MessageLogger.h
KalmanVertexFitter.h
HLTmumutkVtxProducer::initialFreeState
static FreeTrajectoryState initialFreeState(const reco::Track &, const MagneticField *)
Definition: HLTmumutkVtxProducer.cc:216
TransientVertex::isValid
bool isValid() const
Definition: TransientVertex.h:195
edm
HLT enums.
Definition: AlignableModifier.h:19
AlCaHLTBitMon_ParallelJobs.p
p
Definition: AlCaHLTBitMon_ParallelJobs.py:153
reco::VertexCollection
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
pos
Definition: PixelAliasList.h:18
HLT_FULL_cff.InputTag
InputTag
Definition: HLT_FULL_cff.py:89285
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
edm::Ref::get
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:232
reco
fixed size matrix
Definition: AlignmentAlgorithmBase.h:45
convertSQLiteXML.ok
bool ok
Definition: convertSQLiteXML.py:98
edm::Handle
Definition: AssociativeIterator.h:50
RecoCandidate.h
trigger::TriggerRefsCollections::getObjects
void getObjects(Vids &ids, VRphoton &refs) const
various physics-level getters:
Definition: TriggerRefsCollections.h:590
reco::RecoChargedCandidateCollection
std::vector< RecoChargedCandidate > RecoChargedCandidateCollection
collectin of RecoChargedCandidate objects
Definition: RecoChargedCandidateFwd.h:9
HLTmumutkVtxProducer::minPt_
const double minPt_
Definition: HLTmumutkVtxProducer.h:73
edm::Ref
Definition: AssociativeIterator.h:58
HLTmumutkVtxProducer::minD0Significance_
const double minD0Significance_
Definition: HLTmumutkVtxProducer.h:76
HLTmumutkVtxProducer::idealMagneticFieldRecordToken_
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > idealMagneticFieldRecordToken_
Definition: HLTmumutkVtxProducer.h:69
CurvilinearTrajectoryError
Definition: CurvilinearTrajectoryError.h:27
BeamSpot.h
edm::ConfigurationDescriptions::add
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:57
mathSSE::sqrt
T sqrt(T t)
Definition: SSEVec.h:19
reco::BeamSpot
Definition: BeamSpot.h:21
trigger::TriggerMuon
Definition: TriggerTypeDefs.h:79
reco::Track
Definition: Track.h:27
p2
double p2[4]
Definition: TauolaWrapper.h:90
reco::TrackBase::charge
int charge() const
track electric charge
Definition: TrackBase.h:596
GlobalTrajectoryParameters
Definition: GlobalTrajectoryParameters.h:15
TrajectoryStateClosestToBeamLine::transverseImpactParameter
Measurement1D transverseImpactParameter() const
Definition: TrajectoryStateClosestToBeamLine.cc:3
reco::TrackBase::covariance
CovarianceMatrix covariance() const
return track covariance matrix
Definition: TrackBase.h:716
Point3DBase< float, GlobalTag >
HLTmumutkVtxProducer::maxEta_
const double maxEta_
Definition: HLTmumutkVtxProducer.h:72
PbPb_ZMuSkimMuonDPG_cff.deltaR
deltaR
Definition: PbPb_ZMuSkimMuonDPG_cff.py:63
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
Vertex.h
Measurement1D::significance
double significance() const
Definition: Measurement1D.h:29
bphysicsOniaDQM_cfi.vertex
vertex
Definition: bphysicsOniaDQM_cfi.py:7
HLTmumutkVtxProducer::~HLTmumutkVtxProducer
~HLTmumutkVtxProducer() override
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:233
edm::ParameterSet
Definition: ParameterSet.h:47
deltaR.h
HLTmumutkVtxProducer::transientTrackRecordToken_
const edm::ESGetToken< TransientTrackBuilder, TransientTrackRecord > transientTrackRecordToken_
Definition: HLTmumutkVtxProducer.h:59
StorageManager_cfg.e1
e1
Definition: StorageManager_cfg.py:16
HLTmumutkVtxProducer::minInvMass_
const double minInvMass_
Definition: HLTmumutkVtxProducer.h:74
iEvent
int iEvent
Definition: GenABIO.cc:224
HLTmumutkVtxProducer::checkPreviousCand
bool checkPreviousCand(const reco::TrackRef &trackref, const std::vector< reco::RecoChargedCandidateRef > &ref2) const
Definition: HLTmumutkVtxProducer.cc:232
edm::EventSetup::getHandle
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:155
p1
double p1[4]
Definition: TauolaWrapper.h:89
HLTmumutkVtxProducer::previousCandToken_
const edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > previousCandToken_
Definition: HLTmumutkVtxProducer.h:66
TransientVertex
Definition: TransientVertex.h:18
edm::EventSetup
Definition: EventSetup.h:58
submitPVResolutionJobs.err
err
Definition: submitPVResolutionJobs.py:85
reco::TrackBase::vertex
const Point & vertex() const
reference point on the track. This method is DEPRECATED, please use referencePoint() instead
Definition: TrackBase.h:676
HLTmumutkVtxProducer::beamSpotToken_
const edm::EDGetTokenT< reco::BeamSpot > beamSpotToken_
Definition: HLTmumutkVtxProducer.h:80
SiPixelPhase1Clusters_cfi.e3
e3
Definition: SiPixelPhase1Clusters_cfi.py:9
reco::JetExtendedAssociation::LorentzVector
math::PtEtaPhiELorentzVectorF LorentzVector
Definition: JetExtendedAssociation.h:25
VertexFwd.h
TransientVertex.h
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
eostools.move
def move(src, dest)
Definition: eostools.py:511
std
Definition: JetResolutionObject.h:76
FreeTrajectoryState
Definition: FreeTrajectoryState.h:27
HLTmumutkVtxProducer::thirdTrackMass_
const double thirdTrackMass_
Definition: HLTmumutkVtxProducer.h:71
RecoChargedCandidate.h
TSCBLBuilderNoMaterial
Definition: TSCBLBuilderNoMaterial.h:13
spclusmultinvestigator_cfi.vertexCollection
vertexCollection
Definition: spclusmultinvestigator_cfi.py:4
HLTmumutkVtxProducer::maxInvMass_
const double maxInvMass_
Definition: HLTmumutkVtxProducer.h:75
HLTmumutkVtxProducer::HLTmumutkVtxProducer
HLTmumutkVtxProducer(const edm::ParameterSet &)
Definition: HLTmumutkVtxProducer.cc:26
HLTmumutkVtxProducer::trkCandToken_
const edm::EDGetTokenT< reco::RecoChargedCandidateCollection > trkCandToken_
Definition: HLTmumutkVtxProducer.h:64
p3
double p3[4]
Definition: TauolaWrapper.h:91
trigger
Definition: HLTPrescaleTableCond.h:8
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
reco::TrackBase::momentum
const Vector & momentum() const
track momentum vector
Definition: TrackBase.h:664
HLTmumutkVtxProducer::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: HLTmumutkVtxProducer.cc:51
DeDxTools::esConsumes
ESGetTokenH3DDVariant esConsumes(std::string const &Reccord, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
edm::Event
Definition: Event.h:73
MagneticField
Definition: MagneticField.h:19
HLTmumutkVtxProducer::overlapDR_
const double overlapDR_
Definition: HLTmumutkVtxProducer.h:77
HLTmumutkVtxProducer::produce
void produce(edm::Event &, const edm::EventSetup &) override
Definition: HLTmumutkVtxProducer.cc:69
HLTmumutkVtxProducer::overlap
bool overlap(const reco::TrackRef &trackref1, const reco::TrackRef &trackref2)
Definition: HLTmumutkVtxProducer.cc:226
edm::InputTag
Definition: InputTag.h:15
Basic3DVector< float >
HLTmumutkVtxProducer::muCandToken_
const edm::EDGetTokenT< reco::RecoChargedCandidateCollection > muCandToken_
Definition: HLTmumutkVtxProducer.h:62
reco::Vertex
Definition: Vertex.h:35
KalmanVertexFitter
Definition: KalmanVertexFitter.h:22