72 void assignTimeToCandidates(std::vector<TICLCandidate> &resultCandidates,
109 const float tkEnergyCut_ = 2.0f;
114 static constexpr float c_light_ = CLHEP::c_light * CLHEP::ns / CLHEP::cm;
125 useMTDTiming_(ps.getParameter<
bool>(
"useMTDTiming")),
126 useTimingAverage_(ps.getParameter<
bool>(
"useTimingAverage")),
127 timingQualityThreshold_(ps.getParameter<double>(
"timingQualityThreshold")),
130 detector_(ps.getParameter<
std::
string>(
"detector")),
131 propName_(ps.getParameter<
std::
string>(
"propagator")),
135 cutTk_(ps.getParameter<
std::
string>(
"cutTk")) {
137 for (
auto const &
tag : ps.
getParameter<std::vector<edm::InputTag>>(
"egamma_tracksters_collections")) {
142 for (
auto const &
tag : ps.
getParameter<std::vector<edm::InputTag>>(
"egamma_tracksterlinks_collections")) {
151 for (
auto const &
tag : ps.
getParameter<std::vector<edm::InputTag>>(
"general_tracksters_collections")) {
155 for (
auto const &
tag : ps.
getParameter<std::vector<edm::InputTag>>(
"general_tracksterlinks_collections")) {
163 for (
auto const &
tag : ps.
getParameter<std::vector<edm::InputTag>>(
"original_masks")) {
167 std::string detectorName_ = (
detector_ ==
"HFNose") ?
"HGCalHFNoseSensitive" :
"HGCalEESensitive";
169 esConsumes<HGCalDDDConstants, IdealGeometryRecord, edm::Transition::BeginRun>(
edm::ESInputTag(
"", detectorName_));
174 produces<std::vector<TICLCandidate>>();
177 produces<std::vector<Trackster>>();
198 const edm::Handle<std::vector<reco::Muon>> &muons_h,
200 const float tkEnergyCut_,
201 std::vector<bool> &maskTracks) {
202 auto const &
tracks = *tkH;
203 for (
unsigned i = 0;
i <
tracks.size(); ++
i) {
211 if (!cutTk_((tk))
or (muId != -1 and
PFMuonAlgo::isMuon(muonref) and not(*muons_h)[muId].isTrackerMuon())) {
212 maskTracks[
i] =
false;
218 maskTracks[
i] =
false;
223 maskTracks[
i] =
true;
228 auto resultTracksters = std::make_unique<std::vector<Trackster>>();
229 auto resultTrackstersMerged = std::make_unique<std::vector<Trackster>>();
230 auto linkedResultTracksters = std::make_unique<std::vector<std::vector<unsigned int>>>();
239 const auto &
tracks = *tracks_h;
255 std::vector<float> original_global_mask(
layerClusters.size(), 1.f);
258 for (
unsigned int j = 0;
j < tmp_mask.size(); ++
j) {
259 original_global_mask[
j] *= tmp_mask[
j];
263 auto resultMask = std::make_unique<std::vector<float>>(original_global_mask);
270 generalTrackstersManager.addVector(*general_tracksters_h[
i]);
273 std::vector<edm::Handle<std::vector<std::vector<unsigned>>>> general_tracksterlinks_h(
275 std::vector<std::vector<unsigned>> generalTracksterLinksGlobalId;
278 for (
unsigned int j = 0;
j < general_tracksterlinks_h[
i]->size(); ++
j) {
279 generalTracksterLinksGlobalId.emplace_back();
280 auto &links_vector = generalTracksterLinksGlobalId.back();
281 links_vector.resize((*general_tracksterlinks_h[
i])[
j].
size());
282 for (
unsigned int k = 0;
k < links_vector.size(); ++
k) {
283 links_vector[
k] = generalTrackstersManager.getGlobalIndex(
i, (*general_tracksterlinks_h[
i])[
j][
k]);
288 std::vector<bool> maskTracks;
289 maskTracks.resize(
tracks.size());
296 generalTrackstersManager,
297 generalTracksterLinksGlobalId,
301 auto resultCandidates = std::make_unique<std::vector<TICLCandidate>>();
302 std::vector<int> trackstersInTrackIndices(
tracks.size(), -1);
313 std::vector<bool> maskTracksters(resultTracksters->size(),
true);
316 for (
size_t iTrack = 0; iTrack <
tracks.size(); iTrack++) {
317 if (maskTracks[iTrack]) {
318 auto const tracksterId = trackstersInTrackIndices[iTrack];
320 if (tracksterId != -1 and !maskTracksters.empty()) {
323 resultCandidates->push_back(chargedCandidate);
324 maskTracksters[tracksterId] =
false;
332 if (muonRef.
isNonnull() and muonRef->isGlobalMuon()) {
334 chargedCandidate.
setPdgId(13 * trackPtr.get()->charge());
336 resultCandidates->push_back(chargedCandidate);
342 for (
size_t iTrackster = 0; iTrackster < maskTracksters.size(); iTrackster++) {
343 if (maskTracksters[iTrackster]) {
347 resultCandidates->push_back(neutralCandidate);
356 if (!stateForProjectionToBeamLineOnSurface.
isValid()) {
358 <<
"the state on the closest measurement is not valid. skipping track.";
364 tscbl = tscblBuilder(stateForProjectionToBeamLine,
bs);
366 if (tscbl.isValid()) {
367 auto const &tscblPCA = tscbl.trackStateAtPCA();
368 auto const &innSurface = traj.direction() ==
alongMomentum ? traj.firstMeasurement().updatedState().surface()
369 : traj.lastMeasurement().updatedState().surface();
370 auto const &extSurface = traj.direction() ==
alongMomentum ? traj.lastMeasurement().updatedState().surface()
371 : traj.firstMeasurement().updatedState().surface();
372 float pathlength =
propagator->propagateWithPath(tscblPCA, innSurface).second;
376 const auto &t_inn_out =
propagator->propagateWithPath(fts_inn, extSurface);
378 if (t_inn_out.first.isValid()) {
379 pathlength += t_inn_out.second;
381 std::pair<float, float> rMinMax =
hgcons_->
rangeR(zVal,
true);
384 float zSide = (iSide == 0) ? (-1. * zVal) : zVal;
385 const auto &disk = std::make_unique<GeomDet>(
391 const auto &tsos =
propagator->propagateWithPath(fts_out, disk->surface());
393 if (tsos.first.isValid()) {
394 pathlength += tsos.second;
408 template <
typename F>
414 for (
auto &
cand : resultCandidates) {
417 float invTimeErr = 0.f;
418 float timeErr = -1.f;
420 for (
const auto &tr :
cand.tracksters()) {
421 if (tr->timeError() > 0) {
422 const auto invTimeESq =
pow(tr->timeError(), -2);
423 const auto x = tr->barycenter().X();
424 const auto y = tr->barycenter().Y();
425 const auto z = tr->barycenter().Z();
427 if (
cand.trackPtr().get() !=
nullptr) {
430 auto const &inputTimingView = (*inputTiming_h).const_view();
431 if (inputTimingView.timeErr()[trackIndex] > 0) {
432 const auto xMtd = inputTimingView.posInMTD_x()[trackIndex];
433 const auto yMtd = inputTimingView.posInMTD_y()[trackIndex];
434 const auto zMtd = inputTimingView.posInMTD_z()[trackIndex];
436 beta = inputTimingView.beta()[trackIndex];
437 path =
std::sqrt((
x - xMtd) * (
x - xMtd) + (
y - yMtd) * (
y - yMtd) + (
z - zMtd) * (
z - zMtd)) +
438 inputTimingView.pathLength()[trackIndex];
442 for (
const auto &trj : trjtrks) {
443 if (trj.val !=
edm::Ref<std::vector<reco::Track>>(track_h, trackIndex))
448 float pathLength =
func(*(
cand.trackPtr().get()),
z, traj, tscbl);
457 invTimeErr += invTimeESq;
460 if (invTimeErr > 0) {
463 timeErr =
sqrt(1.
f / invTimeErr) > 0.02 ?
sqrt(1.
f / invTimeErr) : 0.02;
469 auto const &inputTimingView = (*inputTiming_h).const_view();
473 const auto timeHGC =
cand.time();
474 const auto timeEHGC =
cand.timeError();
475 const auto timeMTD = inputTimingView.time0()[trackIndex];
476 const auto timeEMTD = inputTimingView.time0Err()[trackIndex];
480 const auto invTimeESqHGC =
pow(timeEHGC, -2);
481 const auto invTimeESqMTD =
pow(timeEMTD, -2);
482 timeErr = 1.f / (invTimeESqHGC + invTimeESqMTD);
483 time = (timeHGC * invTimeESqHGC + timeMTD * invTimeESqMTD) * timeErr;
484 timeErr =
sqrt(timeErr);
485 }
else if (timeEMTD > 0) {
491 cand.setMTDTime(inputTimingView.time()[trackIndex], inputTimingView.timeErr()[trackIndex]);
501 desc.add<std::vector<edm::InputTag>>(
"egamma_tracksters_collections", {
edm::InputTag(
"ticlTracksterLinks")});
502 desc.add<std::vector<edm::InputTag>>(
"egamma_tracksterlinks_collections", {
edm::InputTag(
"ticlTracksterLinks")});
503 desc.add<std::vector<edm::InputTag>>(
"general_tracksters_collections", {
edm::InputTag(
"ticlTracksterLinks")});
504 desc.add<std::vector<edm::InputTag>>(
"general_tracksterlinks_collections", {
edm::InputTag(
"ticlTracksterLinks")});
505 desc.add<std::vector<edm::InputTag>>(
"original_masks",
506 {
edm::InputTag(
"hgcalMergeLayerClusters",
"InitialLayerClustersMask")});
516 desc.add<
bool>(
"useMTDTiming",
true);
517 desc.add<
bool>(
"useTimingAverage",
true);
518 desc.add<
double>(
"timingQualityThreshold", 0.5);
520 "1.48 < abs(eta) < 3.0 && pt > 1. && quality(\"highPurity\") && " 521 "hitPattern().numberOfLostHits(\"MISSING_OUTER_HITS\") < 5");
522 descriptions.
add(
"ticlCandidateProducer",
desc);
static DiskPointer build(Args &&... args)
static int muAssocToTrack(const reco::TrackRef &trackref, const reco::MuonCollection &muons)
TICLCandidateProducer(const edm::ParameterSet &ps)
T getParameter(std::string const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
bool get(ProductID const &oid, Handle< PROD > &result) const
void beginRun(edm::Run const &iEvent, edm::EventSetup const &es) override
const StringCutObjectSelector< reco::Track > cutTk_
static bool isMuon(const reco::PFBlockElement &elt)
std::once_flag initializeGeometry_
const edm::EDGetTokenT< edm::ValueMap< std::pair< float, float > > > clustersTime_token_
Global3DPoint GlobalPoint
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
bool isNonnull() const
Checks for non-null.
bool getByToken(EDGetToken token, Handle< PROD > &result) const
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > bfield_token_
const edm::EDGetTokenT< reco::BeamSpot > bsToken_
Log< level::Error, false > LogError
const edm::EDGetTokenT< std::vector< reco::Track > > tracks_token_
static std::string const input
const float timingQualityThreshold_
edm::ESHandle< Propagator > propagator_
~TICLCandidateProducer() override
const edm::ESGetToken< Propagator, TrackingComponentsRecord > propagator_token_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
const bool useTimingAverage_
T const * product() const
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
edm::Ref< MuonCollection > MuonRef
presistent reference to a Muon
#define DEFINE_FWK_MODULE(type)
edm::ESGetToken< HGCalDDDConstants, IdealGeometryRecord > hdc_token_
void produce(edm::Event &, const edm::EventSetup &) override
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
std::vector< edm::EDGetTokenT< std::vector< Trackster > > > general_tracksters_tokens_
std::pair< double, double > rangeR(double z, bool reco) const
hgcal::RecHitTools rhtools_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::vector< edm::EDGetTokenT< std::vector< Trackster > > > egamma_tracksters_tokens_
edm::Ref< TrackCollection > TrackRef
persistent reference to a Track
void add(std::string const &label, ParameterSetDescription const &psetDescription)
const std::string detector_
const edm::EDGetTokenT< std::vector< reco::CaloCluster > > clusters_token_
const HGCalDDDConstants * hgcons_
const std::string propName_
static constexpr float c_light_
std::vector< edm::EDGetTokenT< std::vector< std::vector< unsigned > > > > general_tracksterlinks_tokens_
FreeTrajectoryState const * freeState(bool withErrors=true) const
const edm::ESGetToken< CaloGeometry, CaloGeometryRecord > geometry_token_
void assignPCAtoTracksters(std::vector< Trackster > &, const std::vector< reco::CaloCluster > &, const edm::ValueMap< std::pair< float, float >> &, double, bool computeLocalTime=false, bool energyWeight=true)
edm::EDGetTokenT< MtdHostCollection > inputTimingToken_
std::vector< edm::EDGetTokenT< std::vector< float > > > original_masks_tokens_
std::unique_ptr< TICLInterpretationAlgoBase< reco::Track > > generalInterpretationAlgo_
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)
void assignTimeToCandidates(std::vector< TICLCandidate > &resultCandidates, edm::Handle< std::vector< reco::Track >> track_h, edm::Handle< MtdHostCollection > inputTiming_h, TrajTrackAssociationCollection trjtrks, F func) const
edm::ESHandle< MagneticField > bfield_
void setPdgId(int pdgId) final
std::vector< edm::EDGetTokenT< std::vector< std::vector< unsigned > > > > egamma_tracksterlinks_tokens_
void filterTracks(edm::Handle< std::vector< reco::Track >> tkH, const edm::Handle< std::vector< reco::Muon >> &muons_h, const StringCutObjectSelector< reco::Track > cutTk_, const float tkEnergyCut_, std::vector< bool > &maskTracks)
Power< A, B >::type pow(const A &a, const B &b)
const edm::EDGetTokenT< std::vector< reco::Muon > > muons_token_
const edm::EDGetTokenT< TrajTrackAssociationCollection > trajTrackAssToken_