CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
LSTOutputConverter.cc
Go to the documentation of this file.
19 
22 
27 
29 public:
30  explicit LSTOutputConverter(edm::ParameterSet const& iConfig);
31  ~LSTOutputConverter() override = default;
32 
33  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
34 
35 private:
36  void produce(edm::Event& iEvent, const edm::EventSetup& iSetup) override;
37 
41  const bool includeT5s_;
42  const bool includeNonpLSTSs_;
47  std::unique_ptr<SeedCreator> seedCreator_;
57 };
58 
60  : lstOutputToken_(consumes(iConfig.getParameter<edm::InputTag>("lstOutput"))),
61  lstPhase2OTHitsInputToken_{consumes(iConfig.getParameter<edm::InputTag>("phase2OTHits"))},
62  lstPixelSeedToken_{consumes(iConfig.getParameter<edm::InputTag>("lstPixelSeeds"))},
63  includeT5s_(iConfig.getParameter<bool>("includeT5s")),
64  includeNonpLSTSs_(iConfig.getParameter<bool>("includeNonpLSTSs")),
65  mfToken_(esConsumes()),
66  propagatorAlongToken_{esConsumes(iConfig.getParameter<edm::ESInputTag>("propagatorAlong"))},
67  propagatorOppositeToken_{esConsumes(iConfig.getParameter<edm::ESInputTag>("propagatorOpposite"))},
68  tGeomToken_(esConsumes()),
69  seedCreator_(SeedCreatorFactory::get()->create("SeedFromConsecutiveHitsCreator",
70  iConfig.getParameter<edm::ParameterSet>("SeedCreatorPSet"),
71  consumesCollector())),
72  // FIXME: need to make creation configurable:
73  // - A toggle to not produce TSs at all could be useful to save memory;
74  // it won't affect speed though
75  // - The minimal set for TCs is t5TCsLST, pTTCsLST and pLSTCsLST.
76  // That would complicate the handling of collections though,
77  // so it is deferred to when we have a clearer picture of what's needed.
78  trajectorySeedPutToken_(produces("")),
79  trajectorySeedpLSPutToken_(produces("pLSTSsLST")),
80  trackCandidatePutToken_(produces("")),
81  trackCandidatepTCPutToken_(produces("pTCsLST")),
82  trackCandidateT5TCPutToken_(produces("t5TCsLST")),
83  trackCandidateNopLSTCPutToken_(produces("nopLSTCsLST")),
84  trackCandidatepTTCPutToken_(produces("pTTCsLST")),
85  trackCandidatepLSTCPutToken_(produces("pLSTCsLST")),
86  seedStopInfoPutToken_(produces()) {}
87 
90 
91  desc.add<edm::InputTag>("lstOutput", edm::InputTag("lstProducer"));
92  desc.add<edm::InputTag>("phase2OTHits", edm::InputTag("lstPhase2OTHitsInputProducer"));
93  desc.add<edm::InputTag>("lstPixelSeeds", edm::InputTag("lstPixelSeedInputProducer"));
94  desc.add<bool>("includeT5s", true);
95  desc.add<bool>("includeNonpLSTSs", false);
96  desc.add("propagatorAlong", edm::ESInputTag{"", "PropagatorWithMaterial"});
97  desc.add("propagatorOpposite", edm::ESInputTag{"", "PropagatorWithMaterialOpposite"});
98 
100  psd0.add<std::string>("ComponentName", std::string("SeedFromConsecutiveHitsCreator"));
101  psd0.add<std::string>("propagator", std::string("PropagatorWithMaterial"));
102  psd0.add<double>("SeedMomentumForBOFF", 5.0);
103  psd0.add<double>("OriginTransverseErrorMultiplier", 1.0);
104  psd0.add<double>("MinOneOverPtError", 1.0);
105  psd0.add<std::string>("magneticField", std::string(""));
106  psd0.add<std::string>("TTRHBuilder", std::string("WithTrackAngle"));
107  psd0.add<bool>("forceKinematicWithRegionDirection", false);
108  desc.add<edm::ParameterSetDescription>("SeedCreatorPSet", psd0);
109 
110  descriptions.addWithDefaultLabel(desc);
111 }
112 
114  // Setup
115  auto const& lstOutput = iEvent.get(lstOutputToken_);
116  auto const& phase2OTRecHits = iEvent.get(lstPhase2OTHitsInputToken_);
117  auto const& pixelSeeds = iEvent.get(lstPixelSeedToken_);
118  auto const& mf = iSetup.getData(mfToken_);
119  auto const& propAlo = iSetup.getData(propagatorAlongToken_);
120  auto const& propOppo = iSetup.getData(propagatorOppositeToken_);
121  auto const& tracker = iSetup.getData(tGeomToken_);
122 
123  // Vector definitions
124  std::vector<std::vector<unsigned int>> const& lstTC_hitIdx = lstOutput.hitIdx();
125  std::vector<unsigned int> const& lstTC_len = lstOutput.len();
126  std::vector<int> const& lstTC_seedIdx = lstOutput.seedIdx();
127  std::vector<short> const& lstTC_trackCandidateType = lstOutput.trackCandidateType();
128 
129  TrajectorySeedCollection outputTS, outputpLSTS;
130  outputTS.reserve(lstTC_len.size());
131  outputpLSTS.reserve(lstTC_len.size());
132  TrackCandidateCollection outputTC, outputpTC, outputT5TC, outputNopLSTC, outputpTTC, outputpLSTC;
133  outputTC.reserve(lstTC_len.size());
134  outputpTC.reserve(lstTC_len.size());
135  outputT5TC.reserve(lstTC_len.size());
136  outputNopLSTC.reserve(lstTC_len.size());
137  outputpTTC.reserve(lstTC_len.size());
138  outputpLSTC.reserve(lstTC_len.size());
139 
140  auto const& OTHits = phase2OTRecHits.hits();
141 
142  LogDebug("LSTOutputConverter") << "lstTC size " << lstTC_len.size();
143  for (unsigned int i = 0; i < lstTC_len.size(); i++) {
144  LogDebug("LSTOutputConverter") << " cand " << i << " " << lstTC_len[i] << " " << lstTC_seedIdx[i];
146  if (lstTC_trackCandidateType[i] != LSTOutput::LSTTCType::T5)
147  seed = pixelSeeds[lstTC_seedIdx[i]];
148 
150  if (lstTC_trackCandidateType[i] != LSTOutput::LSTTCType::T5) {
151  for (auto const& hit : seed.recHits())
152  recHits.push_back(hit.clone());
153  }
154 
155  unsigned int const nPixelHits = lstTC_trackCandidateType[i] == LSTOutput::LSTTCType::T5 ? 0 : recHits.size();
156  for (unsigned int j = nPixelHits; j < lstTC_hitIdx[i].size(); j++)
157  recHits.push_back(OTHits[lstTC_hitIdx[i][j]]->clone());
158 
159  recHits.sort([](const auto& a, const auto& b) {
160  const auto asub = a.det()->subDetector();
161  const auto bsub = b.det()->subDetector();
163  return true;
165  return false;
166  } else if (asub != bsub) {
167  return asub < bsub;
168  } else {
169  const auto& apos = a.surface();
170  const auto& bpos = b.surface();
171  if (GeomDetEnumerators::isBarrel(asub)) {
172  return apos->rSpan().first < bpos->rSpan().first;
173  } else {
174  return std::abs(apos->zSpan().first) < std::abs(bpos->zSpan().first);
175  }
176  }
177  });
178 
180  if (lstTC_trackCandidateType[i] != LSTOutput::LSTTCType::pLS) {
181  // Construct a full-length TrajectorySeed always for T5s,
182  // only when required by a flag for other pT objects.
183  if (includeNonpLSTSs_ || lstTC_trackCandidateType[i] == LSTOutput::LSTTCType::T5) {
185  std::vector<Hit> hitsForSeed;
186  hitsForSeed.reserve(lstTC_len[i]);
187  int nHits = 0;
188  for (auto const& hit : recHits) {
189  if (lstTC_trackCandidateType[i] == LSTOutput::LSTTCType::T5) {
190  auto hType = tracker.getDetectorType(hit.geographicalId());
191  if (hType != TrackerGeometry::ModuleType::Ph2PSP && nHits < 2)
192  continue; // the first two should be P
193  }
194  hitsForSeed.emplace_back(dynamic_cast<Hit>(&hit));
195  nHits++;
196  }
197 
198  seedCreator_->init(GlobalTrackingRegion(), iSetup, nullptr);
199  seedCreator_->makeSeed(seeds, hitsForSeed);
200  if (seeds.empty()) {
201  edm::LogInfo("LSTOutputConverter")
202  << "failed to convert a LST object to a seed" << i << " " << lstTC_len[i] << " " << lstTC_seedIdx[i];
203  if (lstTC_trackCandidateType[i] == LSTOutput::LSTTCType::T5)
204  continue;
205  }
206  if (lstTC_trackCandidateType[i] == LSTOutput::LSTTCType::T5)
207  seed = seeds[0];
208 
209  auto trajectorySeed = (seeds.empty() ? seed : seeds[0]);
210  outputTS.emplace_back(trajectorySeed);
211  auto const& ss = trajectorySeed.startingState();
212  LogDebug("LSTOutputConverter") << "Created a seed with " << seed.nHits() << " " << ss.detId() << " " << ss.pt()
213  << " " << ss.parameters().vector() << " " << ss.error(0);
214  }
215  } else {
216  outputTS.emplace_back(seed);
217  outputpLSTS.emplace_back(seed);
218  }
219 
221  trajectoryStateTransform::transientState(seed.startingState(), (seed.recHits().end() - 1)->surface(), &mf);
222  tsos.rescaleError(100.);
223  auto tsosPair = propOppo.propagateWithPath(tsos, *recHits[0].surface());
224  if (!tsosPair.first.isValid()) {
225  LogDebug("LSTOutputConverter") << "Propagating to startingState opposite to momentum failed, trying along next";
226  tsosPair = propAlo.propagateWithPath(tsos, *recHits[0].surface());
227  }
228  if (tsosPair.first.isValid()) {
230  trajectoryStateTransform::persistentState(tsosPair.first, recHits[0].det()->geographicalId().rawId());
231 
232  if (lstTC_trackCandidateType[i] == LSTOutput::LSTTCType::T5) {
233  if (!includeT5s_) {
234  continue;
235  } else {
236  auto tc = TrackCandidate(recHits, seed, st);
237  outputTC.emplace_back(tc);
238  outputT5TC.emplace_back(tc);
239  outputNopLSTC.emplace_back(tc);
240  }
241  } else {
242  auto tc = TrackCandidate(recHits, seed, st);
243  outputTC.emplace_back(tc);
244  outputpTC.emplace_back(tc);
245  if (lstTC_trackCandidateType[i] != LSTOutput::LSTTCType::pLS) {
246  outputNopLSTC.emplace_back(tc);
247  outputpTTC.emplace_back(tc);
248  } else {
249  outputpLSTC.emplace_back(tc);
250  }
251  }
252  } else {
253  edm::LogInfo("LSTOutputConverter") << "Failed to make a candidate initial state. Seed state is " << tsos
254  << " TC cand " << i << " " << lstTC_len[i] << " " << lstTC_seedIdx[i]
255  << " first hit " << recHits.front().globalPosition() << " last hit "
256  << recHits.back().globalPosition();
257  }
258  }
259 
260  LogDebug("LSTOutputConverter") << "done with conversion: Track candidate output size = " << outputpTC.size()
261  << " (p* objects) + " << outputT5TC.size() << " (T5 objects)";
262  iEvent.emplace(trajectorySeedPutToken_, std::move(outputTS));
263  iEvent.emplace(trajectorySeedpLSPutToken_, std::move(outputpLSTS));
264  iEvent.emplace(trackCandidatePutToken_, std::move(outputTC));
265  iEvent.emplace(trackCandidatepTCPutToken_, std::move(outputpTC));
266  iEvent.emplace(trackCandidateT5TCPutToken_, std::move(outputT5TC));
267  iEvent.emplace(trackCandidateNopLSTCPutToken_, std::move(outputNopLSTC));
268  iEvent.emplace(trackCandidatepTTCPutToken_, std::move(outputpTTC));
269  iEvent.emplace(trackCandidatepLSTCPutToken_, std::move(outputpLSTC));
270  iEvent.emplace(seedStopInfoPutToken_, 0U); //dummy stop info
271 }
272 
const edm::EDPutTokenT< TrackCandidateCollection > trackCandidateT5TCPutToken_
bool isOuterTracker(GeomDetEnumerators::SubDetector m)
void addWithDefaultLabel(ParameterSetDescription const &psetDescription)
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
const edm::EDPutTokenT< TrackCandidateCollection > trackCandidatepTTCPutToken_
const edm::EDPutTokenT< TrackCandidateCollection > trackCandidateNopLSTCPutToken_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: performance.cc:3
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
def create(alignables, pedeDump, additionalData, outputFile, config)
~LSTOutputConverter() override=default
const edm::EDPutTokenT< TrajectorySeedCollection > trajectorySeedpLSPutToken_
bool isBarrel(GeomDetEnumerators::SubDetector m)
std::vector< TrackCandidate > TrackCandidateCollection
PTrajectoryStateOnDet persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid)
const edm::EDGetTokenT< LSTOutput > lstOutputToken_
const edm::EDGetTokenT< TrajectorySeedCollection > lstPixelSeedToken_
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
const edm::ESGetToken< Propagator, TrackingComponentsRecord > propagatorOppositeToken_
BaseTrackerRecHit const * ConstRecHitPointer
Definition: SeedingHitSet.h:14
int iEvent
Definition: GenABIO.cc:224
const edm::EDPutTokenT< TrackCandidateCollection > trackCandidatepLSTCPutToken_
std::vector< TrajectorySeed > TrajectorySeedCollection
const edm::EDPutTokenT< TrackCandidateCollection > trackCandidatePutToken_
const edm::EDPutTokenT< TrackCandidateCollection > trackCandidatepTCPutToken_
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const edm::EDPutTokenT< std::vector< SeedStopInfo > > seedStopInfoPutToken_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
const edm::ESGetToken< Propagator, TrackingComponentsRecord > propagatorAlongToken_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
Log< level::Info, false > LogInfo
TrajectoryStateOnSurface transientState(const PTrajectoryStateOnDet &ts, const Surface *surface, const MagneticField *field)
double b
Definition: hdecay.h:120
const edm::EDPutTokenT< TrajectorySeedCollection > trajectorySeedPutToken_
LSTOutputConverter(edm::ParameterSet const &iConfig)
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > mfToken_
const edm::EDGetTokenT< LSTPhase2OTHitsInput > lstPhase2OTHitsInputToken_
HLT enums.
double a
Definition: hdecay.h:121
bool isInnerTracker(GeomDetEnumerators::SubDetector m)
#define get
TupleMultiplicity< TrackerTraits > const *__restrict__ uint32_t nHits
std::unique_ptr< SeedCreator > seedCreator_
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > tGeomToken_
def move(src, dest)
Definition: eostools.py:511
#define LogDebug(id)