11 const std::vector<TICLSeedingRegion> &
regions,
14 const std::vector<reco::CaloCluster> &layerClusters,
15 const std::vector<float> &mask,
16 const edm::ValueMap<std::pair<float, float>> &layerClustersTime,
21 float etaLimitIncreaseWindow,
23 int maxNumberOfLayers,
32 int startEtaBin, endEtaBin, startPhiBin, endPhiBin;
40 auto firstLayerOnZSide = maxNumberOfLayers * zSide;
41 const auto &firstLayerHisto =
histo[firstLayerOnZSide];
43 int entryEtaBin = firstLayerHisto.etaBin(
r.origin.eta());
44 int entryPhiBin = firstLayerHisto.phiBin(
r.origin.phi());
49 auto etaWindow = deltaIEta;
51 if (
std::abs(
r.origin.eta()) > etaLimitIncreaseWindow) {
54 LogDebug(
"HGCGraph") <<
"Limit of Eta for increase: " << etaLimitIncreaseWindow
55 <<
" reached! Increasing inner search window" << std::endl;
57 startEtaBin =
std::max(entryEtaBin - etaWindow, 0);
62 LogDebug(
"HGCGraph") <<
" Entrance eta, phi: " <<
r.origin.eta() <<
", " <<
r.origin.phi()
63 <<
" entryEtaBin: " << entryEtaBin <<
" entryPhiBin: " << entryPhiBin
64 <<
" globalBin: " << firstLayerHisto.globalBin(
r.origin.eta(),
r.origin.phi())
65 <<
" on layer: " << firstLayerOnZSide <<
" startEtaBin: " << startEtaBin
66 <<
" endEtaBin: " << endEtaBin <<
" startPhiBin: " << startPhiBin
67 <<
" endPhiBin: " << endPhiBin <<
" phiBin(0): " << firstLayerHisto.phiBin(0.)
68 <<
" phiBin(" <<
M_PI / 2. <<
"): " << firstLayerHisto.phiBin(
M_PI / 2.) <<
" phiBin("
69 <<
M_PI <<
"): " << firstLayerHisto.phiBin(
M_PI) <<
" phiBin(" << -
M_PI / 2.
70 <<
"): " << firstLayerHisto.phiBin(-
M_PI / 2.) <<
" phiBin(" << -
M_PI
71 <<
"): " << firstLayerHisto.phiBin(-
M_PI) <<
" phiBin(" << 2. *
M_PI
72 <<
"): " << firstLayerHisto.phiBin(2. *
M_PI) << std::endl;
76 for (
int il = 0; il < maxNumberOfLayers - 1; ++il) {
77 for (
int outer_layer = 0; outer_layer <
std::min(1 +
missing_layers, maxNumberOfLayers - 1 - il); ++outer_layer) {
78 int currentInnerLayerId = il + maxNumberOfLayers * zSide;
79 int currentOuterLayerId = currentInnerLayerId + 1 + outer_layer;
80 auto const &outerLayerHisto =
histo[currentOuterLayerId];
81 auto const &innerLayerHisto =
histo[currentInnerLayerId];
82 const int etaLimitIncreaseWindowBin = innerLayerHisto.etaBin(etaLimitIncreaseWindow);
84 LogDebug(
"HGCGraph") <<
"Limit of Eta for increase: " << etaLimitIncreaseWindow
85 <<
" at etaBin: " << etaLimitIncreaseWindowBin << std::endl;
90 for (
int iphi_it = startPhiBin; iphi_it < endPhiBin; ++iphi_it) {
94 <<
" on layers I/O: " << currentInnerLayerId <<
"/" << currentOuterLayerId
95 <<
" with clusters: " << innerLayerHisto[
offset +
iphi].
size() << std::endl;
97 for (
auto innerClusterId : innerLayerHisto[
offset +
iphi]) {
99 if (mask[innerClusterId] == 0.) {
101 LogDebug(
"HGCGraph") <<
"Skipping inner masked cluster " << innerClusterId << std::endl;
110 auto etaWindow = deltaIEta;
116 LogDebug(
"HGCGraph") <<
"Eta and Phi window increased by one" << std::endl;
122 for (
int oeta = etaRangeMin; oeta < etaRangeMax; ++oeta) {
124 for (
int phiRange = 0; phiRange < 2 *
phiWindow + 1; ++phiRange) {
133 <<
" on layers I/O: " << currentInnerLayerId <<
"/" << currentOuterLayerId
134 <<
" with clusters: " << innerLayerHisto[oeta *
nPhiBins + ophi].
size()
137 for (
auto outerClusterId : outerLayerHisto[oeta *
nPhiBins + ophi]) {
139 if (mask[outerClusterId] == 0.) {
141 LogDebug(
"HGCGraph") <<
"Skipping outer masked cluster " << outerClusterId << std::endl;
145 if (maxDeltaTime != -1 &&
146 !
areTimeCompatible(innerClusterId, outerClusterId, layerClustersTime, maxDeltaTime)) {
148 LogDebug(
"HGCGraph") <<
"Rejecting doublets due to timing!" << std::endl;
151 allDoublets_.emplace_back(innerClusterId, outerClusterId, doubletId, &layerClusters,
r.index);
154 <<
"Creating doubletsId: " << doubletId <<
" layerLink in-out: [" << currentInnerLayerId
155 <<
", " << currentOuterLayerId <<
"] clusterLink in-out: [" << innerClusterId <<
", "
156 << outerClusterId <<
"]" << std::endl;
163 <<
"Checking compatibility of doubletId: " << doubletId
164 <<
" with all possible inners doublets link by the innerClusterId: " << innerClusterId
167 bool isRootDoublet = thisDoublet.checkCompatibilityAndTag(
allDoublets_,
186 LogDebug(
"HGCGraph") <<
"number of Root doublets " <<
theRootDoublets_.size() <<
" over a total number of doublets "
194 const edm::ValueMap<std::pair<float, float>> &layerClustersTime,
195 float maxDeltaTime) {
196 float timeIn = layerClustersTime.get(innerIdx).first;
197 float timeInE = layerClustersTime.get(innerIdx).second;
198 float timeOut = layerClustersTime.get(outerIdx).first;
199 float timeOutE = layerClustersTime.get(outerIdx).second;
201 return (timeIn == -99. || timeOut == -99. ||
202 std::abs(timeIn - timeOut) < maxDeltaTime *
sqrt(timeInE * timeInE + timeOutE * timeOutE));
207 std::vector<int> &seedIndices,
208 const unsigned int minClustersPerNtuplet,
210 unsigned int maxOutInHops) {
212 tmpNtuplet.reserve(minClustersPerNtuplet);
213 std::vector<std::pair<unsigned int, unsigned int>> outInToVisit;
216 outInToVisit.clear();
220 allDoublets_, tmpNtuplet, seedIndex, outInDFS, outInHops, maxOutInHops, outInToVisit);
221 while (!outInToVisit.empty()) {
223 allDoublets_, tmpNtuplet, seedIndex, outInDFS, outInToVisit.back().second, maxOutInHops, outInToVisit);
224 outInToVisit.pop_back();
227 if (tmpNtuplet.size() > minClustersPerNtuplet) {
228 foundNtuplets.push_back(tmpNtuplet);
229 seedIndices.push_back(seedIndex);