39 std::vector<InDet::PixelClusterParts> Parts;
41 const std::vector<Identifier> & Rdos = OrigCluster.
rdoList();
42 const unsigned int NumPixels =
static_cast<unsigned int>(Rdos.size());
47 if (NumPixels < m_minPixels || NumPixels >
m_maxPixels)
return Parts;
49 std::vector<InDetDD::SiCellId> CellIds(NumPixels);
52 std::transform(Rdos.begin(),Rdos.end(), CellIds.begin(), getCellId);
66 const auto [pMinPhi,pMaxPhi] = std::minmax_element(CellIds.begin(), CellIds.end(), comparePhi);
67 const auto [pMinEta,pMaxEta] = std::minmax_element(CellIds.begin(), CellIds.end(), compareEta);
68 const auto & MinPhiIdx = pMinPhi->phiIndex();
69 const auto & MaxPhiIdx = pMaxPhi->phiIndex();
70 const auto & MinEtaIdx = pMinEta->etaIndex();
71 const auto & MaxEtaIdx = pMaxEta->etaIndex();
72 const int PhiWidth = MaxPhiIdx - MinPhiIdx + 1;
73 const int EtaWidth = MaxEtaIdx - MinEtaIdx + 1;
76 const std::vector<float> & Charges = OrigCluster.
chargeList();
78 std::vector<float> PhiChargeHist(PhiWidth, 0.);
79 unsigned int NumPhiMinima = 0;
80 std::vector<unsigned int> PhiMinimaLoc(PhiWidth/2);
81 std::vector<float> PhiMinimaQuality(PhiWidth/2);
85 for (
unsigned int i = 0;
i < NumPixels;
i++)
86 PhiChargeHist[CellIds[
i].
phiIndex() - MinPhiIdx] += Charges[
i];
89 for (
int i = 1;
i < PhiWidth - 1;
i++)
91 if (PhiChargeHist[
i-1] <= PhiChargeHist[
i] || PhiChargeHist[
i] >= PhiChargeHist[
i+1])
continue;
93 PhiMinimaLoc[NumPhiMinima] =
static_cast<unsigned int>(
i);
94 PhiMinimaQuality[NumPhiMinima++] = (PhiChargeHist[
i+1] + PhiChargeHist[
i-1] - 2.*PhiChargeHist[
i]) /
95 (PhiChargeHist[
i+1] + PhiChargeHist[
i-1]);
99 std::vector<float> EtaChargeHist(EtaWidth, 0.);
100 unsigned int NumEtaMinima = 0;
101 std::vector<unsigned int> EtaMinimaLoc(EtaWidth/2);
102 std::vector<float> EtaMinimaQuality(EtaWidth/2);
103 const float LongPixScale = 2./3.;
108 for (
unsigned int i = 0;
i < NumPixels;
i++)
111 if ( (PixType % 2) == 1 )
112 Scale = LongPixScale;
115 EtaChargeHist[CellIds[
i].etaIndex() - MinEtaIdx] +=
Scale*Charges[
i];
119 for (
int i = 1;
i < EtaWidth - 1;
i++)
121 if (EtaChargeHist[
i-1] <= EtaChargeHist[
i] || EtaChargeHist[
i] >= EtaChargeHist[
i+1])
continue;
123 EtaMinimaLoc[NumEtaMinima] =
static_cast<unsigned int>(
i);
124 EtaMinimaQuality[NumEtaMinima++] = (EtaChargeHist[
i+1] + EtaChargeHist[
i-1] - 2.*EtaChargeHist[
i]) /
125 (EtaChargeHist[
i+1] + EtaChargeHist[
i-1]);
130 unsigned int bestMin = 0;
131 float bestQual = -1.;
133 for (
unsigned int i = 0;
i < NumPhiMinima;
i++)
135 if (PhiMinimaQuality[
i] <= bestQual)
continue;
137 bestMin = PhiMinimaLoc[
i];
138 bestQual = PhiMinimaQuality[
i];
140 for (
unsigned int i = 0;
i < NumEtaMinima;
i++)
142 if (EtaMinimaQuality[
i] <= bestQual)
continue;
144 bestMin = EtaMinimaLoc[
i];
145 bestQual = EtaMinimaQuality[
i];
147 const int SplitIndex =
static_cast<int>(bestMin);
157 ATH_MSG_ERROR(
"<InDet::TotPixelClusterSplitter::splitCluster> : Unrecognized SplitType!");
164 const int LowIdx = (
Type ==
PhiSplit) ? MinPhiIdx : MinEtaIdx;
167 std::vector<Identifier> SplitRdos[2];
168 std::vector<int> Totgroups[2];
169 std::vector<int> Lvl1groups[2];
171 const std::vector<int>& OrigTots = OrigCluster.
totList();
172 const int Lvl1a = OrigCluster.
LVL1A();
186 const PixelID& pixelID = *pixelIDp;
189 for (
unsigned int i = 0;
i < NumPixels;
i++)
191 Idx = (CellIds[
i].*IndexFunc)() - LowIdx;
192 if (Idx < SplitIndex)
194 SplitRdos[0].push_back(Rdos[
i]);
195 Totgroups[0].push_back(OrigTots[
i]);
196 Lvl1groups[0].push_back(Lvl1a);
198 else if (Idx > SplitIndex)
200 SplitRdos[1].push_back(Rdos[
i]);
201 Totgroups[1].push_back(OrigTots[
i]);
202 Lvl1groups[1].push_back(Lvl1a);
206 for (
int j = 0; j < 2; j++)
211 std::array<InDetDD::PixelDiodeTree::CellIndexType,2> diode_idx
222 SplitRdos[j].push_back(Rdos[
i]);
223 Totgroups[j].push_back(calibData->
getToT(diode_type, moduleHash, feValue, Charges[
i] / 2.0));
224 Lvl1groups[j].push_back(Lvl1a);
229 Parts.emplace_back(SplitRdos[0], Totgroups[0], Lvl1groups[0]);
230 Parts.emplace_back(SplitRdos[1], Totgroups[1], Lvl1groups[1]);