CMS 3D CMS Logo

TrackstersFromSimClustersProducer.cc
Go to the documentation of this file.
1 // Author: Felice Pantaleo - felice.pantaleo@cern.ch
2 // Date: 02/2021
3 
4 // user include files
5 
14 
17 
19 
23 
27 
28 #include "TrackstersPCA.h"
29 #include <vector>
30 #include <iterator>
31 #include <algorithm>
32 using namespace ticl;
33 
34 namespace {
35  Trackster::ParticleType tracksterParticleTypeFromPdgId(int pdgId, int charge) {
36  if (pdgId == 111) {
38  } else {
39  pdgId = std::abs(pdgId);
40  if (pdgId == 22) {
42  } else if (pdgId == 11) {
44  } else if (pdgId == 13) {
46  } else {
47  bool isHadron = (pdgId > 100 and pdgId < 900) or (pdgId > 1000 and pdgId < 9000);
48  if (isHadron) {
49  if (charge != 0) {
51  } else {
53  }
54  } else {
56  }
57  }
58  }
59  }
60 } // namespace
61 
63 public:
66  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
67 
68  void produce(edm::Event&, const edm::EventSetup&) override;
69 
70 private:
72  const bool doNose_ = false;
76 
79 
86  const double fractionCut_;
87 };
89 
91  : detector_(ps.getParameter<std::string>("detector")),
92  doNose_(detector_ == "HFNose"),
93  clusters_token_(consumes<std::vector<reco::CaloCluster>>(ps.getParameter<edm::InputTag>("layer_clusters"))),
94  clustersTime_token_(
95  consumes<edm::ValueMap<std::pair<float, float>>>(ps.getParameter<edm::InputTag>("time_layerclusters"))),
96  filtered_layerclusters_mask_token_(consumes<std::vector<float>>(ps.getParameter<edm::InputTag>("filtered_mask"))),
97  simclusters_token_(consumes<std::vector<SimCluster>>(ps.getParameter<edm::InputTag>("simclusters"))),
98  caloparticles_token_(consumes<std::vector<CaloParticle>>(ps.getParameter<edm::InputTag>("caloparticles"))),
99  associatorLayerClusterSimCluster_(ps.getUntrackedParameter<edm::InputTag>("layerClusterSimClusterAssociator")),
100  associatorMapSimClusterToReco_token_(
101  consumes<hgcal::SimToRecoCollectionWithSimClusters>(associatorLayerClusterSimCluster_)),
102  associatorLayerClusterCaloParticle_(
103  ps.getUntrackedParameter<edm::InputTag>("layerClusterCaloParticleAssociator")),
104  associatorMapCaloParticleToReco_token_(consumes<hgcal::SimToRecoCollection>(associatorLayerClusterCaloParticle_)),
105  geom_token_(esConsumes()),
106  fractionCut_(ps.getParameter<double>("fractionCut")) {
107  produces<std::vector<Trackster>>();
108  produces<std::vector<float>>();
109 }
110 
112  // hgcalMultiClusters
114  desc.add<std::string>("detector", "HGCAL");
115  desc.add<edm::InputTag>("layer_clusters", edm::InputTag("hgcalLayerClusters"));
116  desc.add<edm::InputTag>("time_layerclusters", edm::InputTag("hgcalLayerClusters", "timeLayerCluster"));
117  desc.add<edm::InputTag>("filtered_mask", edm::InputTag("filteredLayerClustersSimTracksters", "ticlSimTracksters"));
118  desc.add<edm::InputTag>("simclusters", edm::InputTag("mix", "MergedCaloTruth"));
119  desc.add<edm::InputTag>("caloparticles", edm::InputTag("mix", "MergedCaloTruth"));
120  desc.addUntracked<edm::InputTag>("layerClusterSimClusterAssociator",
121  edm::InputTag("layerClusterSimClusterAssociationProducer"));
122  desc.addUntracked<edm::InputTag>("layerClusterCaloParticleAssociator",
123  edm::InputTag("layerClusterCaloParticleAssociationProducer"));
124  desc.add<double>("fractionCut", 0.);
125 
126  descriptions.add("trackstersFromSimClustersProducer", desc);
127 }
128 
130  auto result = std::make_unique<std::vector<Trackster>>();
131  auto output_mask = std::make_unique<std::vector<float>>();
132  const auto& layerClusters = evt.get(clusters_token_);
133  const auto& layerClustersTimes = evt.get(clustersTime_token_);
134  const auto& inputClusterMask = evt.get(filtered_layerclusters_mask_token_);
135  output_mask->resize(layerClusters.size(), 1.f);
136 
137  const auto& simclusters = evt.get(simclusters_token_);
138  const auto& caloparticles = evt.get(caloparticles_token_);
139 
140  const auto& simClustersToRecoColl = evt.get(associatorMapSimClusterToReco_token_);
141  const auto& caloParticlesToRecoColl = evt.get(associatorMapCaloParticleToReco_token_);
142 
143  const auto& geom = es.getData(geom_token_);
145  auto num_simclusters = simclusters.size();
146  result->reserve(num_simclusters);
147 
148  for (const auto& [key, values] : caloParticlesToRecoColl) {
149  auto const& cp = *(key);
150  auto cpIndex = &cp - &caloparticles[0];
151  if (cp.g4Tracks()[0].crossedBoundary()) {
152  if (values.empty())
153  continue;
154  Trackster tmpTrackster;
155  tmpTrackster.zeroProbabilities();
156  tmpTrackster.vertices().reserve(values.size());
157  tmpTrackster.vertex_multiplicity().reserve(values.size());
158  for (auto const& [lc, energyScorePair] : values) {
159  if (inputClusterMask[lc.index()] > 0) {
160  double fraction = energyScorePair.first / lc->energy();
161  if (fraction < fractionCut_)
162  continue;
163  tmpTrackster.vertices().push_back(lc.index());
164  (*output_mask)[lc.index()] -= fraction;
165  tmpTrackster.vertex_multiplicity().push_back(1. / fraction);
166  }
167  }
168  tmpTrackster.setIdProbability(tracksterParticleTypeFromPdgId(cp.pdgId(), cp.charge()), 1.f);
169  float energyAtBoundary = cp.g4Tracks()[0].getMomentumAtBoundary().energy();
170  tmpTrackster.setRegressedEnergy(energyAtBoundary);
171  tmpTrackster.setSeed(key.id(), cpIndex);
172  result->emplace_back(tmpTrackster);
173  } else {
174  for (const auto& scRef : cp.simClusters()) {
175  const auto& it = simClustersToRecoColl.find(scRef);
176  if (it == simClustersToRecoColl.end())
177  continue;
178  const auto& lcVec = it->val;
179  if (lcVec.empty())
180  continue;
181  auto const& sc = *(scRef);
182  auto simClusterIndex = &sc - &simclusters[0];
183  Trackster tmpTrackster;
184 
185  tmpTrackster.zeroProbabilities();
186  tmpTrackster.vertices().reserve(lcVec.size());
187  tmpTrackster.vertex_multiplicity().reserve(lcVec.size());
188 
189  for (auto const& [lc, energyScorePair] : lcVec) {
190  if (inputClusterMask[lc.index()] > 0) {
191  double fraction = energyScorePair.first / lc->energy();
192  if (fraction < fractionCut_)
193  continue;
194  tmpTrackster.vertices().push_back(lc.index());
195  (*output_mask)[lc.index()] -= fraction;
196  tmpTrackster.vertex_multiplicity().push_back(1. / fraction);
197  }
198  }
199  tmpTrackster.setIdProbability(tracksterParticleTypeFromPdgId(sc.pdgId(), sc.charge()), 1.f);
200  float energyAtBoundary = sc.g4Tracks()[0].getMomentumAtBoundary().energy();
201  tmpTrackster.setRegressedEnergy(energyAtBoundary);
202  tmpTrackster.setSeed(scRef.id(), simClusterIndex);
203  result->emplace_back(tmpTrackster);
204  }
205  }
206  }
207 
210  result->shrink_to_fit();
211 
212  evt.put(std::move(result));
213  evt.put(std::move(output_mask));
214 }
ConfigurationDescriptions.h
ticl::Trackster::ParticleType::neutral_hadron
TrackstersPCA.h
hgcal::RecHitTools
Definition: RecHitTools.h:23
TrackstersFromSimClustersProducer::filtered_layerclusters_mask_token_
const edm::EDGetTokenT< std::vector< float > > filtered_layerclusters_mask_token_
Definition: TrackstersFromSimClustersProducer.cc:75
TrackstersFromSimClustersProducer::associatorMapSimClusterToReco_token_
edm::EDGetTokenT< hgcal::SimToRecoCollectionWithSimClusters > associatorMapSimClusterToReco_token_
Definition: TrackstersFromSimClustersProducer.cc:81
MessageLogger.h
dqmMemoryStats.float
float
Definition: dqmMemoryStats.py:127
Trackster.h
ESHandle.h
f
double f[11][100]
Definition: MuScleFitUtils.cc:78
edm::EDGetTokenT
Definition: EDGetToken.h:33
edm
HLT enums.
Definition: AlignableModifier.h:19
ticl::Trackster::ParticleType::charged_hadron
TrackstersFromSimClustersProducer::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: TrackstersFromSimClustersProducer.cc:111
HLT_FULL_cff.InputTag
InputTag
Definition: HLT_FULL_cff.py:89301
ticl::Trackster::setSeed
void setSeed(edm::ProductID pid, int index)
Definition: Trackster.h:59
RecHitTools.h
TrackstersFromSimClustersProducer::produce
void produce(edm::Event &, const edm::EventSetup &) override
Definition: TrackstersFromSimClustersProducer.cc:129
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
TrackstersFromSimClustersProducer::fractionCut_
const double fractionCut_
Definition: TrackstersFromSimClustersProducer.cc:86
TrackstersFromSimClustersProducer::simclusters_token_
edm::EDGetTokenT< std::vector< SimCluster > > simclusters_token_
Definition: TrackstersFromSimClustersProducer.cc:77
EDProducer.h
hgcal_conditions::parameters
Definition: HGCConditions.h:86
SimCluster
Monte Carlo truth information used for tracking validation.
Definition: SimCluster.h:29
reco
fixed size matrix
Definition: AlignmentAlgorithmBase.h:46
TrackstersFromSimClustersProducer::associatorLayerClusterCaloParticle_
edm::InputTag associatorLayerClusterCaloParticle_
Definition: TrackstersFromSimClustersProducer.cc:82
ticl
Definition: Common.h:8
TrackstersFromSimClustersProducer::TrackstersFromSimClustersProducer
TrackstersFromSimClustersProducer(const edm::ParameterSet &)
Definition: TrackstersFromSimClustersProducer.cc:90
TrackstersFromSimClustersProducer::~TrackstersFromSimClustersProducer
~TrackstersFromSimClustersProducer() override
Definition: TrackstersFromSimClustersProducer.cc:65
hgcal
Definition: EgammaPCAHelper.h:31
ticl::assignPCAtoTracksters
void assignPCAtoTracksters(std::vector< Trackster > &, const std::vector< reco::CaloCluster > &, const edm::ValueMap< std::pair< float, float >> &, double, bool energyWeight=true)
Definition: TrackstersPCA.cc:12
MakerMacros.h
SimCluster.h
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::ConfigurationDescriptions::add
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:57
HLT_FULL_cff.fraction
fraction
Definition: HLT_FULL_cff.py:52823
ticl::Trackster::zeroProbabilities
void zeroProbabilities()
Definition: Trackster.h:107
TrackstersFromSimClustersProducer::caloparticles_token_
edm::EDGetTokenT< std::vector< CaloParticle > > caloparticles_token_
Definition: TrackstersFromSimClustersProducer.cc:78
contentValuesCheck.values
values
Definition: contentValuesCheck.py:38
TrackstersFromSimClustersProducer
Definition: TrackstersFromSimClustersProducer.cc:62
fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
DDAxes::z
TrackstersFromSimClustersProducer::associatorLayerClusterSimCluster_
edm::InputTag associatorLayerClusterSimCluster_
Definition: TrackstersFromSimClustersProducer.cc:80
PFCluster.h
relativeConstraints.geom
geom
Definition: relativeConstraints.py:72
SimTracksters_cff.simclusters
simclusters
Definition: SimTracksters_cff.py:22
ParameterSetDescription.h
HLTEgPhaseIITestSequence_cff.layerClusters
layerClusters
Definition: HLTEgPhaseIITestSequence_cff.py:2506
ticl::Trackster::ParticleType::photon
SimTracksters_cff.caloparticles
caloparticles
Definition: SimTracksters_cff.py:23
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
ticl::Trackster::ParticleType::muon
TrackstersFromSimClustersProducer::clustersTime_token_
const edm::EDGetTokenT< edm::ValueMap< std::pair< float, float > > > clustersTime_token_
Definition: TrackstersFromSimClustersProducer.cc:74
ALCARECOTkAlJpsiMuMu_cff.charge
charge
Definition: ALCARECOTkAlJpsiMuMu_cff.py:47
edm::ParameterSet
Definition: ParameterSet.h:47
CaloParticle
Definition: CaloParticle.h:16
Event.h
CaloParticle.h
hgcal::SimToRecoCollectionWithSimClusters
edm::AssociationMap< edm::OneToManyWithQualityGeneric< SimClusterCollection, reco::CaloClusterCollection, std::pair< float, float > > > SimToRecoCollectionWithSimClusters
Definition: LayerClusterToSimClusterAssociatorBaseImpl.h:23
hgcal::RecHitTools::lastLayerEE
unsigned int lastLayerEE(bool nose=false) const
Definition: RecHitTools.h:67
TrackstersFromSimClustersProducer::geom_token_
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > geom_token_
Definition: TrackstersFromSimClustersProducer.cc:84
TrackstersFromSimClustersProducer::associatorMapCaloParticleToReco_token_
edm::EDGetTokenT< hgcal::SimToRecoCollection > associatorMapCaloParticleToReco_token_
Definition: TrackstersFromSimClustersProducer.cc:83
edm::Event::put
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:133
trackerHitRTTI::vector
Definition: trackerHitRTTI.h:21
edm::stream::EDProducer
Definition: EDProducer.h:36
EgammaValidation_cff.pdgId
pdgId
Definition: EgammaValidation_cff.py:117
ticl::Trackster::vertex_multiplicity
std::vector< float > & vertex_multiplicity()
Definition: Trackster.h:57
edm::EventSetup
Definition: EventSetup.h:58
hgcal::RecHitTools::getPositionLayer
GlobalPoint getPositionLayer(int layer, bool nose=false) const
Definition: RecHitTools.cc:138
edm::ESGetToken< CaloGeometry, CaloGeometryRecord >
AlCaHLTBitMon_QueryRunRegistry.string
string string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
edm::EventSetup::getData
bool getData(T &iHolder) const
Definition: EventSetup.h:127
TrackstersFromSimClustersProducer::clusters_token_
const edm::EDGetTokenT< std::vector< reco::CaloCluster > > clusters_token_
Definition: TrackstersFromSimClustersProducer.cc:73
ValueMap.h
TrackstersFromSimClustersProducer::doNose_
const bool doNose_
Definition: TrackstersFromSimClustersProducer.cc:72
LayerClusterToSimClusterAssociator.h
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
eostools.move
def move(src, dest)
Definition: eostools.py:511
std
Definition: JetResolutionObject.h:76
Frameworkfwd.h
hgcal::RecHitTools::setGeometry
void setGeometry(CaloGeometry const &)
Definition: RecHitTools.cc:68
ticl::Trackster::vertices
std::vector< unsigned int > & vertices()
Definition: Trackster.h:56
ticl::Trackster::ParticleType::neutral_pion
hgcal::SimToRecoCollection
edm::AssociationMap< edm::OneToManyWithQualityGeneric< CaloParticleCollection, reco::CaloClusterCollection, std::pair< float, float > > > SimToRecoCollection
Definition: LayerClusterToCaloParticleAssociatorBaseImpl.h:23
or
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
Definition: Activities.doc:12
TrackstersFromSimClustersProducer::rhtools_
hgcal::RecHitTools rhtools_
Definition: TrackstersFromSimClustersProducer.cc:85
mps_fire.result
result
Definition: mps_fire.py:311
ticl::Trackster::ParticleType
ParticleType
Definition: Trackster.h:26
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
LayerClusterToCaloParticleAssociator.h
DeDxTools::esConsumes
ESGetTokenH3DDVariant esConsumes(std::string const &Reccord, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
edm::Event
Definition: Event.h:73
crabWrapper.key
key
Definition: crabWrapper.py:19
ticl::Trackster::setRegressedEnergy
void setRegressedEnergy(float value)
Definition: Trackster.h:67
edm::Event::get
bool get(ProductID const &oid, Handle< PROD > &result) const
Definition: Event.h:346
edm::InputTag
Definition: InputTag.h:15
TrackstersFromSimClustersProducer::detector_
std::string detector_
Definition: TrackstersFromSimClustersProducer.cc:71
ticl::Trackster
Definition: Trackster.h:19
ticl::Trackster::setIdProbability
void setIdProbability(ParticleType type, float value)
Definition: Trackster.h:117
CaloCluster.h
ticl::Trackster::ParticleType::unknown
ticl::Trackster::ParticleType::electron