CMS 3D CMS Logo

TTStubAssociator.cc
Go to the documentation of this file.
1 
11 
13 template <>
16  if (iEvent.isRealData())
17  return;
18 
20  if (TTClusterTruthInputTags.size() != TTStubsInputTags.size()) {
21  edm::LogError("TTStubAsso ") << "E R R O R! the InputTag vectors have different size!";
22  return;
23  }
24 
25  int ncont1 = 0;
26 
27  const TrackerGeometry* const theTrackerGeom = theTrackerGeometry.product();
28  const TrackerTopology* const tTopo = theTrackerTopology.product();
29 
31 
32  for (auto iTag = TTStubsTokens.begin(); iTag != TTStubsTokens.end(); iTag++) {
34  auto associationMapForOutput = std::make_unique<TTStubAssociationMap<Ref_Phase2TrackerDigi_>>();
35 
38  iEvent.getByToken(*iTag, TTStubHandle);
39 
42  iEvent.getByToken(TTClusterTruthTokens.at(ncont1), TTClusterAssociationMapHandle);
43 
45  std::map<edm::Ref<edmNew::DetSetVector<TTStub<Ref_Phase2TrackerDigi_>>, TTStub<Ref_Phase2TrackerDigi_>>,
47  stubToTrackingParticleMap;
48  std::map<edm::Ptr<TrackingParticle>,
49  std::vector<edm::Ref<edmNew::DetSetVector<TTStub<Ref_Phase2TrackerDigi_>>, TTStub<Ref_Phase2TrackerDigi_>>>>
50  trackingParticleToStubVectorMap;
51  stubToTrackingParticleMap.clear();
52  trackingParticleToStubVectorMap.clear();
53 
55 
56  if (!TTStubHandle->empty()) {
57  for (auto gd = theTrackerGeom->dets().begin(); gd != theTrackerGeom->dets().end(); gd++) {
58  DetId detid = (*gd)->geographicalId();
59  if (detid.subdetId() != StripSubdetector::TOB && detid.subdetId() != StripSubdetector::TID)
60  continue; // only run on OT
61 
62  if (!tTopo->isLower(detid))
63  continue; // loop on the stacks: choose the lower arbitrarily
64 
65  DetId stackDetid = tTopo->stack(detid); // Stub module detid
66 
67  if (TTStubHandle->find(stackDetid) == TTStubHandle->end())
68  continue;
69 
71  edmNew::DetSet<TTStub<Ref_Phase2TrackerDigi_>> stubs = (*TTStubHandle)[stackDetid];
72 
73  for (auto contentIter = stubs.begin(); contentIter != stubs.end(); ++contentIter) {
76  edmNew::makeRefTo(TTStubHandle, contentIter);
77 
79  // std::vector< edm::Ref< edmNew::DetSetVector< TTCluster< Ref_Phase2TrackerDigi_ > >, TTCluster< Ref_Phase2TrackerDigi_ > > > theseClusters = tempStubRef->getClusterRefs();
80 
82  for (unsigned int ic = 0; ic < 2; ic++) {
83  std::vector<edm::Ptr<TrackingParticle>> tempTPs =
84  TTClusterAssociationMapHandle->findTrackingParticlePtrs(tempStubRef->clusterRef(ic));
85 
86  for (unsigned int itp = 0; itp < tempTPs.size(); itp++) {
87  edm::Ptr<TrackingParticle> testTP = tempTPs.at(itp);
88 
89  if (testTP.isNull())
90  continue;
91 
93  if (trackingParticleToStubVectorMap.find(testTP) == trackingParticleToStubVectorMap.end()) {
94  std::vector<
96  stubVector;
97  stubVector.clear();
98  trackingParticleToStubVectorMap.insert(std::make_pair(testTP, stubVector));
99  }
100  trackingParticleToStubVectorMap.find(testTP)->second.push_back(tempStubRef);
101  }
102  }
103 
107  if (TTClusterAssociationMapHandle->isUnknown(tempStubRef->clusterRef(0)) ||
108  TTClusterAssociationMapHandle->isUnknown(tempStubRef->clusterRef(1))) {
112  continue;
113  } else {
117  if (TTClusterAssociationMapHandle->isGenuine(tempStubRef->clusterRef(0)) &&
118  TTClusterAssociationMapHandle->isGenuine(tempStubRef->clusterRef(1))) {
122  if (TTClusterAssociationMapHandle->findTrackingParticlePtr(tempStubRef->clusterRef(0)).get() ==
123  TTClusterAssociationMapHandle->findTrackingParticlePtr(tempStubRef->clusterRef(1)).get()) {
126  TTClusterAssociationMapHandle->findTrackingParticlePtr(tempStubRef->clusterRef(0));
127 
130  stubToTrackingParticleMap.insert(std::make_pair(tempStubRef, testTP));
131 
133  continue;
134  } else {
136  continue;
137  }
138  }
139  else {
141  TrackingParticle* prevTPAddress = nullptr;
142  unsigned int whichTP = 0;
143 
144  std::vector<edm::Ptr<TrackingParticle>> trackingParticles0 =
145  TTClusterAssociationMapHandle->findTrackingParticlePtrs(tempStubRef->clusterRef(0));
146  std::vector<edm::Ptr<TrackingParticle>> trackingParticles1 =
147  TTClusterAssociationMapHandle->findTrackingParticlePtrs(tempStubRef->clusterRef(1));
148 
149  bool escape = false;
150 
151  for (unsigned int i = 0; i < trackingParticles0.size() && !escape; i++) {
153  if (trackingParticles0.at(i).isNull())
154  continue;
155 
156  for (unsigned int k = 0; k < trackingParticles1.size() && !escape; k++) {
158  if (trackingParticles1.at(k).isNull())
159  continue;
160 
161  if (trackingParticles0.at(i).get() == trackingParticles1.at(k).get()) {
163  if (prevTPAddress == nullptr) {
164  prevTPAddress = const_cast<TrackingParticle*>(trackingParticles1.at(k).get());
165  whichTP = k;
166  }
167 
170  if (prevTPAddress != const_cast<TrackingParticle*>(trackingParticles1.at(k).get())) {
171  escape = true;
172  continue;
173  }
174  }
175  }
176  }
177 
180  if (escape)
181  continue;
182 
183  if (prevTPAddress == nullptr) {
185  continue;
186  } else {
191  edm::Ptr<TrackingParticle> testTP = trackingParticles1.at(whichTP);
192 
195  stubToTrackingParticleMap.insert(std::make_pair(tempStubRef, testTP));
196 
198  continue;
199  }
200  }
201  }
202  }
203  }
204  }
205 
208  typename std::map<edm::Ptr<TrackingParticle>,
209  std::vector<edm::Ref<edmNew::DetSetVector<TTStub<Ref_Phase2TrackerDigi_>>,
210  TTStub<Ref_Phase2TrackerDigi_>>>>::iterator iterMapToClean;
211  for (iterMapToClean = trackingParticleToStubVectorMap.begin();
212  iterMapToClean != trackingParticleToStubVectorMap.end();
213  ++iterMapToClean) {
215  std::vector<edm::Ref<edmNew::DetSetVector<TTStub<Ref_Phase2TrackerDigi_>>, TTStub<Ref_Phase2TrackerDigi_>>>
216  tempVector = iterMapToClean->second;
217 
219  std::sort(tempVector.begin(), tempVector.end());
220  tempVector.erase(std::unique(tempVector.begin(), tempVector.end()), tempVector.end());
221 
223  iterMapToClean->second = tempVector;
224  }
225 
227  edm::RefProd<TTClusterAssociationMap<Ref_Phase2TrackerDigi_>> theCluAssoMap(TTClusterAssociationMapHandle);
228 
230  associationMapForOutput->setTTStubToTrackingParticleMap(stubToTrackingParticleMap);
231  associationMapForOutput->setTrackingParticleToTTStubsMap(trackingParticleToStubVectorMap);
232  associationMapForOutput->setTTClusterAssociationMap(theCluAssoMap);
233 
235  iEvent.put(std::move(associationMapForOutput), TTStubsInputTags.at(ncont1).instance());
236 
237  ++ncont1;
238  }
239 }
edm::RefProd
Definition: EDProductfwd.h:25
mps_fire.i
i
Definition: mps_fire.py:355
TTStubAssociator.h
TrackerTopology::isLower
bool isLower(const DetId &id) const
Definition: TrackerTopology.cc:195
TrackerTopology
Definition: TrackerTopology.h:16
edmNew::makeRefTo
edm::Ref< typename HandleT::element_type, typename HandleT::element_type::value_type::value_type > makeRefTo(const HandleT &iHandle, typename HandleT::element_type::value_type::const_iterator itIter)
Definition: DetSetVectorNew.h:735
TrackerTopology::stack
uint32_t stack(const DetId &id) const
Definition: TrackerTopology.cc:104
edm::Handle
Definition: AssociativeIterator.h:50
edm::Ref
Definition: AssociativeIterator.h:58
DetId
Definition: DetId.h:17
edmNew::DetSet::end
iterator end()
Definition: DetSetNew.h:56
TrackingParticle
Monte Carlo truth information used for tracking validation.
Definition: TrackingParticle.h:29
TTStub
Class to store the L1 Track Trigger stubs.
Definition: TTStub.h:22
edmNew::DetSet
Definition: DetSetNew.h:22
dqmdumpme.k
k
Definition: dqmdumpme.py:60
DetId::subdetId
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum)
Definition: DetId.h:48
edm::LogError
Definition: MessageLogger.h:183
iEvent
int iEvent
Definition: GenABIO.cc:224
edmNew::DetSet::begin
iterator begin()
Definition: DetSetNew.h:54
edm::EventSetup
Definition: EventSetup.h:57
TrackerGeometry::dets
const DetContainer & dets() const override
Returm a vector of all GeomDet (including all GeomDetUnits)
Definition: TrackerGeometry.h:62
get
#define get
edm::Ptr< TrackingParticle >
eostools.move
def move(src, dest)
Definition: eostools.py:511
tier0.unique
def unique(seq, keepstr=True)
Definition: tier0.py:24
StripSubdetector::TOB
static constexpr auto TOB
Definition: StripSubdetector.h:18
edm::Event
Definition: Event.h:73
edm::Ptr::isNull
bool isNull() const
Checks for null.
Definition: Ptr.h:142
StripSubdetector::TID
static constexpr auto TID
Definition: StripSubdetector.h:17
TTStubAssociator::produce
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
TrackerGeometry
Definition: TrackerGeometry.h:14