CMS 3D CMS Logo

HLTDisplacedtktktkVtxProducer.cc
Go to the documentation of this file.
1 #include <iostream>
2 
21 
22 using namespace edm;
23 using namespace reco;
24 using namespace std;
25 using namespace trigger;
26 //
27 // constructors and destructor
28 //
30  : transientTrackRecordToken_(esConsumes(edm::ESInputTag("", "TransientTrackBuilder"))),
31  srcTag_(iConfig.getParameter<edm::InputTag>("Src")),
32  srcToken_(consumes<reco::RecoChargedCandidateCollection>(srcTag_)),
33  previousCandTag_(iConfig.getParameter<edm::InputTag>("PreviousCandTag")),
34  previousCandToken_(consumes<trigger::TriggerFilterObjectWithRefs>(previousCandTag_)),
35  maxEta_(iConfig.getParameter<double>("MaxEtaTk")),
36  minPtTk1_(iConfig.getParameter<double>("MinPtResTk1")),
37  minPtTk2_(iConfig.getParameter<double>("MinPtResTk2")),
38  minPtTk3_(iConfig.getParameter<double>("MinPtThirdTk")),
39  minPtRes_(iConfig.getParameter<double>("MinPtRes")),
40  minPtTri_(iConfig.getParameter<double>("MinPtTri")),
41  minInvMassRes_(iConfig.getParameter<double>("MinInvMassRes")),
42  maxInvMassRes_(iConfig.getParameter<double>("MaxInvMassRes")),
43  minInvMass_(iConfig.getParameter<double>("MinInvMass")),
44  maxInvMass_(iConfig.getParameter<double>("MaxInvMass")),
45  massParticle1_(iConfig.getParameter<double>("massParticleRes1")),
46  massParticle2_(iConfig.getParameter<double>("massParticleRes2")),
47  massParticle3_(iConfig.getParameter<double>("massParticle3")),
48  chargeOpt_(iConfig.getParameter<int>("ChargeOpt")),
49  resOpt_(iConfig.getParameter<int>("ResOpt")),
50  triggerTypeDaughters_(iConfig.getParameter<int>("triggerTypeDaughters")) {
51  produces<VertexCollection>();
52 
59  if (resOpt_ <= 0 && massParticle1_ != massParticle2_) {
63  }
67  }
68  }
72 }
73 
75 
78  desc.add<edm::InputTag>("Src", edm::InputTag("hltL3MuonCandidates"));
79  desc.add<edm::InputTag>("PreviousCandTag", edm::InputTag(""));
80  desc.add<double>("MaxEtaTk", 2.5);
81  desc.add<double>("MinPtResTk1", 0.0);
82  desc.add<double>("MinPtResTk2", 0.0);
83  desc.add<double>("MinPtThirdTk", 0.0);
84  desc.add<double>("MinPtRes", 0.0);
85  desc.add<double>("MinPtTri", 0.0);
86  desc.add<double>("MinInvMassRes", 1.0);
87  desc.add<double>("MaxInvMassRes", 20.0);
88  desc.add<double>("MinInvMass", 1.0);
89  desc.add<double>("MaxInvMass", 20.0);
90  desc.add<double>("massParticleRes1", 0.4937);
91  desc.add<double>("massParticleRes2", 0.4937);
92  desc.add<double>("massParticle3", 0.1396);
93  desc.add<int>("ChargeOpt", -1);
94  desc.add<int>("ResOpt", 1);
95  desc.add<int>("triggerTypeDaughters", 0);
96 
97  descriptions.add("hltDisplacedtktktkVtxProducer", desc);
98 }
99 
100 // ------------ method called on each new Event ------------
102  // get hold of track trks
104  iEvent.getByToken(srcToken_, trackcands);
105  if (trackcands->size() < 3)
106  return;
107 
108  // get the transient track builder
109  auto const& theB = iSetup.getHandle(transientTrackRecordToken_);
110 
111  std::unique_ptr<VertexCollection> vertexCollection(new VertexCollection());
112 
113  // look at all trackcands, check cuts and make vertices
114  double e1, e2, e3;
116 
117  RecoChargedCandidateCollection::const_iterator cand1;
118  RecoChargedCandidateCollection::const_iterator cand2;
119  RecoChargedCandidateCollection::const_iterator cand3;
120 
121  // get the objects passing the previous filter
123  iEvent.getByToken(previousCandToken_, previousCands);
124 
125  vector<RecoChargedCandidateRef> vPrevCands;
126  previousCands->getObjects(triggerTypeDaughters_, vPrevCands);
127 
128  std::vector<bool> candComp;
129  for (cand1 = trackcands->begin(); cand1 != trackcands->end(); cand1++)
130  candComp.push_back(checkPreviousCand(cand1->get<TrackRef>(), vPrevCands));
131 
132  for (cand1 = trackcands->begin(); cand1 != trackcands->end(); cand1++) {
133  TrackRef tk1 = cand1->get<TrackRef>();
134  LogDebug("HLTDisplacedtktktkVtxProducer") << " 1st track in loop: q*pt= " << cand1->charge() * cand1->pt()
135  << ", eta= " << cand1->eta() << ", hits= " << tk1->numberOfValidHits();
136 
137  //first check if this track passed the previous filter
138  if (!candComp[cand1 - trackcands->begin()])
139  continue;
140  // if( ! checkPreviousCand( tk1, vPrevCands) ) continue;
141 
142  // cuts
143  if (std::abs(cand1->eta()) > maxEta_)
144  continue;
145  if (cand1->pt() < firstTrackPt)
146  continue;
147 
148  cand2 = trackcands->begin();
150  cand2 = cand1 + 1;
151  }
152 
153  for (; cand2 != trackcands->end(); cand2++) {
154  TrackRef tk2 = cand2->get<TrackRef>();
155  if (tk1 == tk2)
156  continue;
157  LogDebug("HLTDisplacedtktktkVtxProducer")
158  << " 2nd track in loop: q*pt= " << cand2->charge() * cand2->pt() << ", eta= " << cand2->eta()
159  << ", hits= " << tk2->numberOfValidHits() << ", d0= " << tk2->d0();
160 
161  //first check if this track passed the previous filter
162  if (!candComp[cand2 - trackcands->begin()])
163  continue;
164  // if( ! checkPreviousCand( tk2, vPrevCands) ) continue;
165 
166  // cuts
167  if (std::abs(cand2->eta()) > maxEta_)
168  continue;
169  if (cand2->pt() < secondTrackPt)
170  continue;
171 
172  // opposite sign or same sign for resonance
173  if (resOpt_ > 0) {
174  if (chargeOpt_ < 0) {
175  if (cand1->charge() * cand2->charge() > 0)
176  continue;
177  } else if (chargeOpt_ > 0) {
178  if (cand1->charge() * cand2->charge() < 0)
179  continue;
180  }
181  }
182 
183  //
184  // Combined ditrack system
185  e1 = sqrt(cand1->momentum().Mag2() + firstTrackMass2);
186  e2 = sqrt(cand2->momentum().Mag2() + secondTrackMass2);
187  pres = Particle::LorentzVector(cand1->px(), cand1->py(), cand1->pz(), e1) +
188  Particle::LorentzVector(cand2->px(), cand2->py(), cand2->pz(), e2);
189 
190  if (resOpt_ > 0) {
191  if (pres.pt() < minPtRes_)
192  continue;
193  double invmassRes = std::abs(pres.mass());
194  LogDebug("HLTDisplacedtktktkVtxProducer") << " ... 1-2 invmass= " << invmassRes;
195  if (invmassRes < minInvMassRes_)
196  continue;
197  if (invmassRes > maxInvMassRes_)
198  continue;
199  }
200 
201  cand3 = trackcands->begin();
203  cand3 = cand2 + 1;
204  }
205 
206  for (; cand3 != trackcands->end(); cand3++) {
207  TrackRef tk3 = cand3->get<TrackRef>();
208  if (tk1 == tk3 || tk2 == tk3)
209  continue;
210  LogDebug("HLTDisplacedtktktkVtxProducer")
211  << " 3rd track in loop: q*pt= " << cand3->charge() * cand3->pt() << ", eta= " << cand3->eta()
212  << ", hits= " << tk3->numberOfValidHits();
213 
214  //first check if this track passed the previous filter
215  if (!candComp[cand3 - trackcands->begin()])
216  continue;
217  // if( ! checkPreviousCand( tk3, vPrevCands) ) continue;
218 
219  // cuts
220  if (std::abs(cand3->eta()) > maxEta_)
221  continue;
222  if (cand3->pt() < thirdTrackPt)
223  continue;
224 
225  e3 = sqrt(cand3->momentum().Mag2() + thirdTrackMass2);
226  p = Particle::LorentzVector(cand1->px(), cand1->py(), cand1->pz(), e1) +
227  Particle::LorentzVector(cand2->px(), cand2->py(), cand2->pz(), e2) +
228  Particle::LorentzVector(cand3->px(), cand3->py(), cand3->pz(), e3);
229 
230  if (p.pt() < minPtTri_)
231  continue;
232  double invmass = std::abs(p.mass());
233  LogDebug("HLTDisplacedtktktkVtxProducer") << " ... 1-2-3 invmass= " << invmass;
234  if (invmass < minInvMass_)
235  continue;
236  if (invmass > maxInvMass_)
237  continue;
238 
239  // do the vertex fit
240  vector<TransientTrack> t_tks;
241  TransientTrack ttkp1 = (*theB).build(&tk1);
242  TransientTrack ttkp2 = (*theB).build(&tk2);
243  TransientTrack ttkp3 = (*theB).build(&tk3);
244 
245  t_tks.push_back(ttkp1);
246  t_tks.push_back(ttkp2);
247  t_tks.push_back(ttkp3);
248 
249  if (t_tks.size() != 3)
250  continue;
251 
252  KalmanVertexFitter kvf;
253  TransientVertex tv = kvf.vertex(t_tks);
254 
255  if (!tv.isValid())
256  continue;
257 
258  Vertex vertex = tv;
259 
260  // put vertex in the event
261  vertexCollection->push_back(vertex);
262  }
263  }
264  }
266 }
267 
269  const vector<RecoChargedCandidateRef>& refVect) const {
270  bool ok = false;
271  for (auto& i : refVect) {
272  if (i->get<TrackRef>() == trackref) {
273  ok = true;
274  break;
275  }
276  }
277  return ok;
278 }
ConfigurationDescriptions.h
HLTDisplacedtktktkVtxProducer::minPtTk2_
const double minPtTk2_
Definition: HLTDisplacedtktktkVtxProducer.h:52
HLTDisplacedtktktkVtxProducer::thirdTrackMass2
double thirdTrackMass2
Definition: HLTDisplacedtktktkVtxProducer.h:75
trigger::TriggerFilterObjectWithRefs
Definition: TriggerFilterObjectWithRefs.h:35
KalmanVertexFitter::vertex
CachingVertex< 5 > vertex(const std::vector< reco::TransientTrack > &tracks) const override
Definition: KalmanVertexFitter.h:49
mps_fire.i
i
Definition: mps_fire.py:428
edm::ESInputTag
Definition: ESInputTag.h:87
MessageLogger.h
KalmanVertexFitter.h
ESHandle.h
TransientVertex::isValid
bool isValid() const
Definition: TransientVertex.h:195
HLTDisplacedtktktkVtxProducer::minInvMass_
const double minInvMass_
Definition: HLTDisplacedtktktkVtxProducer.h:58
edm
HLT enums.
Definition: AlignableModifier.h:19
HLTDisplacedtktktkVtxProducer::srcToken_
const edm::EDGetTokenT< reco::RecoChargedCandidateCollection > srcToken_
Definition: HLTDisplacedtktktkVtxProducer.h:47
HLT_FULL_cff.InputTag
InputTag
Definition: HLT_FULL_cff.py:89301
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
edm::Ref::get
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:232
HLTDisplacedtktktkVtxProducer::thirdTrackMass
double thirdTrackMass
Definition: HLTDisplacedtktktkVtxProducer.h:69
TriggerFilterObjectWithRefs.h
reco
fixed size matrix
Definition: AlignmentAlgorithmBase.h:46
HLTDisplacedtktktkVtxProducer.h
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
HLTDisplacedtktktkVtxProducer::triggerTypeDaughters_
const int triggerTypeDaughters_
Definition: HLTDisplacedtktktkVtxProducer.h:65
HLTDisplacedtktktkVtxProducer::chargeOpt_
const int chargeOpt_
Definition: HLTDisplacedtktktkVtxProducer.h:63
edm::Ref< TrackCollection >
HLTDisplacedtktktkVtxProducer::previousCandToken_
const edm::EDGetTokenT< trigger::TriggerFilterObjectWithRefs > previousCandToken_
Definition: HLTDisplacedtktktkVtxProducer.h:49
CandidateFwd.h
HLTDisplacedtktktkVtxProducer::checkPreviousCand
bool checkPreviousCand(const reco::TrackRef &trackref, const std::vector< reco::RecoChargedCandidateRef > &ref2) const
Definition: HLTDisplacedtktktkVtxProducer.cc:268
HLTDisplacedtktktkVtxProducer::resOpt_
const int resOpt_
Definition: HLTDisplacedtktktkVtxProducer.h:64
HLTDisplacedtktktkVtxProducer::minPtTk3_
const double minPtTk3_
Definition: HLTDisplacedtktktkVtxProducer.h:53
HLTDisplacedtktktkVtxProducer::massParticle1_
const double massParticle1_
Definition: HLTDisplacedtktktkVtxProducer.h:60
HLTDisplacedtktktkVtxProducer::firstTrackMass2
double firstTrackMass2
Definition: HLTDisplacedtktktkVtxProducer.h:73
Track.h
TrackFwd.h
edm::ConfigurationDescriptions::add
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:57
HLTDisplacedtktktkVtxProducer::minPtTk1_
const double minPtTk1_
Definition: HLTDisplacedtktktkVtxProducer.h:51
std::swap
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
Definition: DataFrameContainer.h:209
HLTDisplacedtktktkVtxProducer::secondTrackPt
double secondTrackPt
Definition: HLTDisplacedtktktkVtxProducer.h:71
HLTDisplacedtktktkVtxProducer::HLTDisplacedtktktkVtxProducer
HLTDisplacedtktktkVtxProducer(const edm::ParameterSet &)
Definition: HLTDisplacedtktktkVtxProducer.cc:29
mathSSE::sqrt
T sqrt(T t)
Definition: SSEVec.h:19
HLTDisplacedtktktkVtxProducer::secondTrackMass2
double secondTrackMass2
Definition: HLTDisplacedtktktkVtxProducer.h:74
HLTDisplacedtktktkVtxProducer::firstTrackMass
double firstTrackMass
Definition: HLTDisplacedtktktkVtxProducer.h:67
HLTDisplacedtktktkVtxProducer::transientTrackRecordToken_
const edm::ESGetToken< TransientTrackBuilder, TransientTrackRecord > transientTrackRecordToken_
Definition: HLTDisplacedtktktkVtxProducer.h:45
RefToBase.h
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
HLTDisplacedtktktkVtxProducer::thirdTrackPt
double thirdTrackPt
Definition: HLTDisplacedtktktkVtxProducer.h:72
bphysicsOniaDQM_cfi.vertex
vertex
Definition: bphysicsOniaDQM_cfi.py:7
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:233
edm::ParameterSet
Definition: ParameterSet.h:47
HLTDisplacedtktktkVtxProducer::maxInvMassRes_
const double maxInvMassRes_
Definition: HLTDisplacedtktktkVtxProducer.h:57
AlCaHLTBitMon_ParallelJobs.p
def p
Definition: AlCaHLTBitMon_ParallelJobs.py:153
StorageManager_cfg.e1
e1
Definition: StorageManager_cfg.py:16
createfilelist.int
int
Definition: createfilelist.py:10
iEvent
int iEvent
Definition: GenABIO.cc:224
edm::EventSetup::getHandle
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:155
HLTDisplacedtktktkVtxProducer::~HLTDisplacedtktktkVtxProducer
~HLTDisplacedtktktkVtxProducer() override
HLTDisplacedtktktkVtxProducer::maxEta_
const double maxEta_
Definition: HLTDisplacedtktktkVtxProducer.h:50
HLTDisplacedtktktkVtxProducer::firstTrackPt
double firstTrackPt
Definition: HLTDisplacedtktktkVtxProducer.h:70
HLTDisplacedtktktkVtxProducer::massParticle2_
const double massParticle2_
Definition: HLTDisplacedtktktkVtxProducer.h:61
TransientVertex
Definition: TransientVertex.h:18
edm::EventSetup
Definition: EventSetup.h:58
HLTDisplacedtktktkVtxProducer::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: HLTDisplacedtktktkVtxProducer.cc:76
SiPixelPhase1Clusters_cfi.e3
e3
Definition: SiPixelPhase1Clusters_cfi.py:9
reco::JetExtendedAssociation::LorentzVector
math::PtEtaPhiELorentzVectorF LorentzVector
Definition: JetExtendedAssociation.h:25
VertexFwd.h
TransientVertex.h
HLTDisplacedtktktkVtxProducer::massParticle3_
const double massParticle3_
Definition: HLTDisplacedtktktkVtxProducer.h:62
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
eostools.move
def move(src, dest)
Definition: eostools.py:511
std
Definition: JetResolutionObject.h:76
reco::TransientTrack
Definition: TransientTrack.h:19
RecoChargedCandidate.h
Vertex.h
HLTDisplacedtktktkVtxProducer::minPtRes_
const double minPtRes_
Definition: HLTDisplacedtktktkVtxProducer.h:54
spclusmultinvestigator_cfi.vertexCollection
vertexCollection
Definition: spclusmultinvestigator_cfi.py:4
HLTDisplacedtktktkVtxProducer::minInvMassRes_
const double minInvMassRes_
Definition: HLTDisplacedtktktkVtxProducer.h:56
l1t::VertexCollection
std::vector< Vertex > VertexCollection
Definition: Vertex.h:12
HLTDisplacedtktktkVtxProducer::produce
void produce(edm::Event &, const edm::EventSetup &) override
Definition: HLTDisplacedtktktkVtxProducer.cc:101
TriggerRefsCollections.h
trigger
Definition: HLTPrescaleTableCond.h:8
Candidate.h
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
HLTDisplacedtktktkVtxProducer::minPtTri_
const double minPtTri_
Definition: HLTDisplacedtktktkVtxProducer.h:55
HLTDisplacedtktktkVtxProducer::maxInvMass_
const double maxInvMass_
Definition: HLTDisplacedtktktkVtxProducer.h:59
DeDxTools::esConsumes
ESGetTokenH3DDVariant esConsumes(std::string const &Reccord, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
edm::Event
Definition: Event.h:73
RecoChargedCandidateFwd.h
edm::InputTag
Definition: InputTag.h:15
HLTDisplacedtktktkVtxProducer::secondTrackMass
double secondTrackMass
Definition: HLTDisplacedtktktkVtxProducer.h:68
reco::Vertex
Definition: Vertex.h:35
KalmanVertexFitter
Definition: KalmanVertexFitter.h:22