18 template <
typename TILES>
23 oneTracksterPerTrackSeed_(conf.getParameter<
bool>(
"oneTracksterPerTrackSeed")),
24 promoteEmptyRegionToTrackster_(conf.getParameter<
bool>(
"promoteEmptyRegionToTrackster")),
25 out_in_dfs_(conf.getParameter<
bool>(
"out_in_dfs")),
26 max_out_in_hops_(conf.getParameter<
int>(
"max_out_in_hops")),
27 min_cos_theta_(conf.getParameter<double>(
"min_cos_theta")),
28 min_cos_pointing_(conf.getParameter<double>(
"min_cos_pointing")),
29 root_doublet_max_distance_from_seed_squared_(
30 conf.getParameter<double>(
"root_doublet_max_distance_from_seed_squared")),
31 etaLimitIncreaseWindow_(conf.getParameter<double>(
"etaLimitIncreaseWindow")),
32 skip_layers_(conf.getParameter<
int>(
"skip_layers")),
33 max_missing_layers_in_trackster_(conf.getParameter<
int>(
"max_missing_layers_in_trackster")),
34 check_missing_layers_(max_missing_layers_in_trackster_ < 100),
35 shower_start_max_layer_(conf.getParameter<
int>(
"shower_start_max_layer")),
36 min_layers_per_trackster_(conf.getParameter<
int>(
"min_layers_per_trackster")),
37 filter_on_categories_(conf.getParameter<
std::
vector<
int>>(
"filter_on_categories")),
38 pid_threshold_(conf.getParameter<double>(
"pid_threshold")),
39 energy_em_over_total_threshold_(conf.getParameter<double>(
"energy_em_over_total_threshold")),
40 max_longitudinal_sigmaPCA_(conf.getParameter<double>(
"max_longitudinal_sigmaPCA")),
41 min_clusters_per_ntuplet_(min_layers_per_trackster_),
42 max_delta_time_(conf.getParameter<double>(
"max_delta_time")),
43 computeLocalTime_(conf.getParameter<
bool>(
"computeLocalTime")),
44 siblings_maxRSquared_(conf.getParameter<
std::
vector<double>>(
"siblings_maxRSquared")){};
46 template <
typename TILES>
49 template <
typename TILES>
52 std::vector<Trackster> &
result,
53 std::unordered_map<
int, std::vector<int>> &seedToTracksterAssociation) {
55 if (
input.regions.empty())
60 rhtools_.setGeometry(
geom);
65 LogDebug(
"HGCPatternRecoByCA") <<
"Making Tracksters with CA" << std::endl;
73 std::vector<int> seedIndices;
74 std::vector<uint8_t> layer_cluster_usage(
input.layerClusters.size(), 0);
75 theGraph_->makeAndConnectDoublets(
input.tiles,
81 input.layerClustersTime,
86 root_doublet_max_distance_from_seed_squared_,
87 etaLimitIncreaseWindow_,
89 rhtools_.lastLayer(isHFnose),
91 rhtools_.lastLayerEE(isHFnose),
92 rhtools_.lastLayerFH(),
93 siblings_maxRSquared_);
95 theGraph_->findNtuplets(
foundNtuplets, seedIndices, min_clusters_per_ntuplet_, out_in_dfs_, max_out_in_hops_);
97 const auto &
doublets = theGraph_->getAllDoublets();
106 std::set<unsigned int> effective_cluster_idx;
108 for (
auto const &doublet :
ntuplet) {
109 auto innerCluster =
doublets[doublet].innerClusterId();
110 auto outerCluster =
doublets[doublet].outerClusterId();
112 effective_cluster_idx.insert(innerCluster);
113 effective_cluster_idx.insert(outerCluster);
116 LogDebug(
"HGCPatternRecoByCA") <<
" New doublet " << doublet <<
" for trackster: " <<
result.size()
117 <<
" InnerCl " << innerCluster <<
" " <<
input.layerClusters[innerCluster].x()
118 <<
" " <<
input.layerClusters[innerCluster].y() <<
" " 119 <<
input.layerClusters[innerCluster].z() <<
" OuterCl " << outerCluster <<
" " 120 <<
input.layerClusters[outerCluster].x() <<
" " 121 <<
input.layerClusters[outerCluster].y() <<
" " 122 <<
input.layerClusters[outerCluster].z() <<
" " << tracksterId << std::endl;
125 unsigned showerMinLayerId = 99999;
126 std::vector<unsigned int> uniqueLayerIds;
127 uniqueLayerIds.reserve(effective_cluster_idx.size());
128 std::vector<std::pair<unsigned int, unsigned int>> lcIdAndLayer;
129 lcIdAndLayer.reserve(effective_cluster_idx.size());
130 for (
auto const i : effective_cluster_idx) {
131 auto const &haf =
input.layerClusters[
i].hitsAndFractions();
132 auto layerId = rhtools_.getLayerWithOffset(haf[0].
first);
133 showerMinLayerId =
std::min(layerId, showerMinLayerId);
134 uniqueLayerIds.push_back(layerId);
135 lcIdAndLayer.emplace_back(
i, layerId);
137 std::sort(uniqueLayerIds.begin(), uniqueLayerIds.end());
138 uniqueLayerIds.erase(
std::unique(uniqueLayerIds.begin(), uniqueLayerIds.end()), uniqueLayerIds.end());
139 unsigned int numberOfLayersInTrackster = uniqueLayerIds.size();
140 if (check_missing_layers_) {
141 int numberOfMissingLayers = 0;
142 unsigned int j = showerMinLayerId;
143 unsigned int indexInVec = 0;
144 for (
const auto &layer : uniqueLayerIds) {
146 numberOfMissingLayers++;
148 if (numberOfMissingLayers > max_missing_layers_in_trackster_) {
149 numberOfLayersInTrackster = indexInVec;
150 for (
auto &llpair : lcIdAndLayer) {
151 if (llpair.second >= layer) {
152 effective_cluster_idx.erase(llpair.first);
162 if ((numberOfLayersInTrackster >= min_layers_per_trackster_) and (showerMinLayerId <= shower_start_max_layer_)) {
165 tmp.vertices().reserve(effective_cluster_idx.size());
166 tmp.vertex_multiplicity().resize(effective_cluster_idx.size(), 1);
169 tmp.setSeed(
input.regions[0].collectionID, seedIndices[tracksterId]);
171 std::copy(std::begin(effective_cluster_idx), std::end(effective_cluster_idx), std::back_inserter(
tmp.vertices()));
177 input.layerClustersTime,
178 rhtools_.getPositionLayer(rhtools_.lastLayerEE(isHFnose), isHFnose).z(),
185 template <
typename TILES>
187 const std::vector<Trackster> &inTracksters,
189 std::unordered_map<
int, std::vector<int>> &seedToTracksterAssociation) {
191 auto cumulative_prob = 0.;
192 for (
auto index : filter_on_categories_) {
193 cumulative_prob +=
t.id_probabilities(
index);
195 return (cumulative_prob <= pid_threshold_) &&
196 (
t.raw_em_energy() < energy_em_over_total_threshold_ *
t.raw_energy());
199 std::vector<unsigned int> selectedTrackstersIds;
200 for (
unsigned i = 0;
i < inTracksters.size(); ++
i) {
201 auto &
t = inTracksters[
i];
202 if (!filter_on_pids(
t) and
t.sigmasPCA()[0] < max_longitudinal_sigmaPCA_) {
203 selectedTrackstersIds.push_back(
i);
206 output.reserve(selectedTrackstersIds.size());
207 bool isRegionalIter = !
input.regions.empty() && (
input.regions[0].index != -1);
208 for (
unsigned i = 0;
i < selectedTrackstersIds.size(); ++
i) {
209 const auto &
t = inTracksters[selectedTrackstersIds[
i]];
210 if (isRegionalIter) {
211 seedToTracksterAssociation[
t.seedIndex()].push_back(
i);
217 if (oneTracksterPerTrackSeed_) {
218 std::vector<Trackster>
tmp;
219 mergeTrackstersTRK(
output,
input.layerClusters,
tmp, seedToTracksterAssociation);
225 if (promoteEmptyRegionToTrackster_) {
226 emptyTrackstersFromSeedsTRK(
output, seedToTracksterAssociation,
input.regions[0].collectionID);
230 for (
auto &trackster :
output) {
231 LogDebug(
"HGCPatternRecoByCA") <<
"Trackster characteristics: " << std::endl;
232 LogDebug(
"HGCPatternRecoByCA") <<
"Size: " << trackster.vertices().size() << std::endl;
234 for (
auto const &
p : trackster.id_probabilities()) {
240 template <
typename TILES>
242 const std::vector<Trackster> &
input,
244 std::vector<Trackster> &
output,
245 std::unordered_map<
int, std::vector<int>> &seedToTracksterAssociation)
const {
247 for (
auto &thisSeed : seedToTracksterAssociation) {
250 auto numberOfTrackstersInSeed =
tracksters.size();
252 auto &outTrackster =
output.back();
254 auto updated_size = outTrackster.vertices().size();
255 for (
unsigned int j = 1;
j < numberOfTrackstersInSeed; ++
j) {
257 updated_size += thisTrackster.vertices().size();
259 LogDebug(
"HGCPatternRecoByCA") <<
"Updated size: " << updated_size << std::endl;
261 outTrackster.vertices().reserve(updated_size);
262 outTrackster.vertex_multiplicity().reserve(updated_size);
263 std::copy(std::begin(thisTrackster.vertices()),
264 std::end(thisTrackster.vertices()),
265 std::back_inserter(outTrackster.vertices()));
266 std::copy(std::begin(thisTrackster.vertex_multiplicity()),
267 std::end(thisTrackster.vertex_multiplicity()),
268 std::back_inserter(outTrackster.vertex_multiplicity()));
273 auto &orig_vtx = outTrackster.vertices();
274 auto vtx_sorted{orig_vtx};
275 std::sort(std::begin(vtx_sorted), std::end(vtx_sorted));
276 for (
unsigned int iLC = 1; iLC < vtx_sorted.size(); ++iLC) {
277 if (vtx_sorted[iLC] == vtx_sorted[iLC - 1]) {
279 const auto lcIdx = vtx_sorted[iLC];
280 const auto firstEl =
std::find(orig_vtx.begin(), orig_vtx.end(), lcIdx);
281 const auto firstPos =
std::distance(std::begin(orig_vtx), firstEl);
283 while (iDup != orig_vtx.end()) {
284 orig_vtx.erase(iDup);
285 outTrackster.vertex_multiplicity().erase(outTrackster.vertex_multiplicity().begin() +
287 outTrackster.vertex_multiplicity()[firstPos] -= 1;
297 template <
typename TILES>
300 std::unordered_map<
int, std::vector<int>> &seedToTracksterAssociation,
302 for (
auto &thisSeed : seedToTracksterAssociation) {
303 if (thisSeed.second.empty()) {
305 t.setRegressedEnergy(0.
f);
306 t.zeroProbabilities();
308 t.setSeed(collectionID, thisSeed.first);
310 thisSeed.second.emplace_back(
tracksters.size() - 1);
315 template <
typename TILES>
317 iDesc.
add<
int>(
"algo_verbosity", 0);
318 iDesc.
add<
bool>(
"oneTracksterPerTrackSeed",
false);
319 iDesc.
add<
bool>(
"promoteEmptyRegionToTrackster",
false);
320 iDesc.
add<
bool>(
"out_in_dfs",
true);
321 iDesc.
add<
int>(
"max_out_in_hops", 10);
322 iDesc.
add<
double>(
"min_cos_theta", 0.915);
323 iDesc.
add<
double>(
"min_cos_pointing", -1.);
324 iDesc.
add<
double>(
"root_doublet_max_distance_from_seed_squared", 9999);
325 iDesc.
add<
double>(
"etaLimitIncreaseWindow", 2.1);
326 iDesc.
add<
int>(
"skip_layers", 0);
327 iDesc.
add<
int>(
"max_missing_layers_in_trackster", 9999);
328 iDesc.
add<
int>(
"shower_start_max_layer", 9999)->setComment(
"make default such that no filtering is applied");
329 iDesc.
add<
int>(
"min_layers_per_trackster", 10);
330 iDesc.
add<std::vector<int>>(
"filter_on_categories", {0});
331 iDesc.
add<
double>(
"pid_threshold", 0.)->
setComment(
"make default such that no filtering is applied");
332 iDesc.
add<
double>(
"energy_em_over_total_threshold", -1.)
333 ->
setComment(
"make default such that no filtering is applied");
334 iDesc.
add<
double>(
"max_longitudinal_sigmaPCA", 9999);
335 iDesc.
add<
double>(
"max_delta_time", 3.)->
setComment(
"nsigma");
336 iDesc.
add<
bool>(
"computeLocalTime",
false);
337 iDesc.
add<std::vector<double>>(
"siblings_maxRSquared", {6
e-4, 6
e-4, 6
e-4});
void setComment(std::string const &value)
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
void filter(std::vector< Trackster > &output, const std::vector< Trackster > &inTracksters, const typename PatternRecognitionAlgoBaseT< TILES >::Inputs &input, std::unordered_map< int, std::vector< int >> &seedToTracksterAssociation) override
void mergeTrackstersTRK(const std::vector< Trackster > &, const std::vector< reco::CaloCluster > &, std::vector< Trackster > &, std::unordered_map< int, std::vector< int >> &seedToTracksterAssociation) const
void emptyTrackstersFromSeedsTRK(std::vector< Trackster > &tracksters, std::unordered_map< int, std::vector< int >> &seedToTracksterAssociation, const edm::ProductID &collectionID) const
void assignPCAtoTracksters(std::vector< Trackster > &tracksters, const std::vector< reco::CaloCluster > &layerClusters, const edm::ValueMap< std::pair< float, float >> &layerClustersTime, double z_limit_em, hgcal::RecHitTools const &rhTools, bool computeLocalTime=false, bool energyWeight=true, bool clean=false, int minLayer=10, int maxLayer=10)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
~PatternRecognitionbyCA() override
void makeTracksters(const typename PatternRecognitionAlgoBaseT< TILES >::Inputs &input, std::vector< Trackster > &result, std::unordered_map< int, std::vector< int >> &seedToTracksterAssociation) override
static std::string const input
def unique(seq, keepstr=True)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
PatternRecognitionbyCA(const edm::ParameterSet &conf, edm::ConsumesCollector iC)
auto const & foundNtuplets
static void fillPSetDescription(edm::ParameterSetDescription &iDesc)
static constexpr int nPhiBins