@@ -59,6 +59,7 @@ class DeDxHitInfoProducer : public edm::stream::EDProducer<> {
5959 const float trackMomentum,
6060 const LocalVector& trackDirection,
6161 reco::DeDxHitInfo& hitDeDxInfo,
62+ std::vector<float >& hitMomentum,
6263 const LocalPoint& hitLocalPos);
6364
6465 // ----------member data ---------------------------
@@ -76,6 +77,7 @@ class DeDxHitInfoProducer : public edm::stream::EDProducer<> {
7677 const bool useCalibration_;
7778 const bool doShapeTest_;
7879 const bool usePixelShape_;
80+ const bool storeMomentumAtHit_;
7981
8082 const unsigned int lowPtTracksPrescalePass_, lowPtTracksPrescaleFail_;
8183 GenericTruncatedAverageDeDxEstimator lowPtTracksEstimator_;
@@ -116,6 +118,7 @@ DeDxHitInfoProducer::DeDxHitInfoProducer(const edm::ParameterSet& iConfig)
116118 useCalibration_(iConfig.getParameter<bool >(" useCalibration" )),
117119 doShapeTest_(iConfig.getParameter<bool >(" shapeTest" )),
118120 usePixelShape_(not iConfig.getParameter<edm::InputTag>(" clusterShapeCache" ).label().empty()),
121+ storeMomentumAtHit_(iConfig.getParameter<bool >(" storeMomentumAtHit" )),
119122 lowPtTracksPrescalePass_(iConfig.getParameter<uint32_t >(" lowPtTracksPrescalePass" )),
120123 lowPtTracksPrescaleFail_(iConfig.getParameter<uint32_t >(" lowPtTracksPrescaleFail" )),
121124 lowPtTracksEstimator_(iConfig.getParameter<edm::ParameterSet>(" lowPtTracksEstimatorParameters" )),
@@ -129,6 +132,8 @@ DeDxHitInfoProducer::DeDxHitInfoProducer(const edm::ParameterSet& iConfig)
129132 produces<reco::DeDxHitInfoCollection>();
130133 produces<reco::DeDxHitInfoAss>();
131134 produces<edm::ValueMap<int >>(" prescale" );
135+ if (storeMomentumAtHit_)
136+ produces<edm::ValueMap<std::vector<float >>>(" momentumAtHit" );
132137
133138 if (!usePixel_ && !useStrip_)
134139 edm::LogError (" DeDxHitsProducer" ) << " No Pixel Hits NOR Strip Hits will be saved. Running this module is useless" ;
@@ -160,6 +165,7 @@ void DeDxHitInfoProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSe
160165
161166 std::vector<int > indices;
162167 std::vector<int > prescales;
168+ std::vector<std::vector<float >> hitMomenta;
163169 uint64_t state[2 ] = {iEvent.id ().event (), iEvent.id ().luminosityBlock ()};
164170 for (unsigned int j = 0 ; j < trackCollection.size (); j++) {
165171 const reco::Track& track = trackCollection[j];
@@ -181,15 +187,18 @@ void DeDxHitInfoProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSe
181187 }
182188
183189 reco::DeDxHitInfo hitDeDxInfo;
190+ std::vector<float > hitMomentum;
184191 auto const & trajParams = track.extra ()->trajParams ();
185192 auto hb = track.recHitsBegin ();
186193 for (unsigned int h = 0 ; h < track.recHitsSize (); h++) {
187194 auto recHit = *(hb + h);
188195 if (!trackerHitRTTI::isFromDet (*recHit))
189196 continue ;
190197
191- processHit (recHit, track.p (), trajParams[h].direction (), hitDeDxInfo, trajParams[h].position ());
198+ const auto & traj = trajParams[h];
199+ processHit (recHit, traj.momentum ().mag (), traj.direction (), hitDeDxInfo, hitMomentum, traj.position ());
192200 }
201+ assert (!storeMomentumAtHit_ || hitMomentum.size () == hitDeDxInfo.size ());
193202
194203 if (!passPt) {
195204 std::vector<DeDxHit> hits;
@@ -230,6 +239,8 @@ void DeDxHitInfoProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSe
230239 }
231240 indices.push_back (resultdedxHitColl->size ());
232241 resultdedxHitColl->push_back (hitDeDxInfo);
242+ if (storeMomentumAtHit_)
243+ hitMomenta.push_back (hitMomentum);
233244 }
234245 // /////////////////////////////////////
235246
@@ -247,6 +258,14 @@ void DeDxHitInfoProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSe
247258 pfiller.insert (dedxHitCollHandle, prescales.begin (), prescales.end ());
248259 pfiller.fill ();
249260 iEvent.put (std::move (dedxPrescale), " prescale" );
261+
262+ if (storeMomentumAtHit_) {
263+ auto dedxMomenta = std::make_unique<edm::ValueMap<std::vector<float >>>();
264+ edm::ValueMap<std::vector<float >>::Filler mfiller (*dedxMomenta);
265+ mfiller.insert (dedxHitCollHandle, hitMomenta.begin (), hitMomenta.end ());
266+ mfiller.fill ();
267+ iEvent.put (std::move (dedxMomenta), " momentumAtHit" );
268+ }
250269}
251270
252271void DeDxHitInfoProducer::processRec (reco::DeDxHitInfo& hitDeDxInfo,
@@ -279,6 +298,7 @@ void DeDxHitInfoProducer::processHit(const TrackingRecHit* recHit,
279298 const float trackMomentum,
280299 const LocalVector& trackDirection,
281300 reco::DeDxHitInfo& hitDeDxInfo,
301+ std::vector<float >& hitMomentum,
282302 const LocalPoint& hitLocalPos) {
283303 auto const & thit = static_cast <BaseTrackerRecHit const &>(*recHit);
284304 if (!thit.isValid ())
@@ -327,10 +347,14 @@ void DeDxHitInfoProducer::processHit(const TrackingRecHit* recHit,
327347 const SiStripMatchedRecHit2D* matchedHit = dynamic_cast <const SiStripMatchedRecHit2D*>(recHit);
328348 if (!matchedHit)
329349 return ;
350+ if (storeMomentumAtHit_)
351+ hitMomentum.push_back (trackMomentum);
330352
331353 processRec (hitDeDxInfo, matchedHit->monoHit (), hitLocalPos, trackDirection, cosineAbs);
332354 processRec (hitDeDxInfo, matchedHit->stereoHit (), hitLocalPos, trackDirection, cosineAbs);
333355 }
356+ if (storeMomentumAtHit_ && (clus.isPixel () || clus.isStrip ()))
357+ hitMomentum.push_back (trackMomentum);
334358}
335359
336360// define this as a plug-in
0 commit comments