58 {
59 const InDetDD::PixelModuleDesign* p_design =
60 static_cast<const InDetDD::PixelModuleDesign*
>(&(chargedDiodes.
element())->design());
61
63 return;
64 }
65
66 const PixelID* pixelId =
static_cast<const PixelID*
>(chargedDiodes.
element()->
getIdHelper());
69
72
74 return;
75 }
76
77 const EventContext& ctx{Gaudi::Hive::currentContext()};
78 SG::ReadCondHandle<PixelModuleData> moduleDataHandle(
m_moduleDataKey, ctx);
79 const PixelModuleData *moduleData = *moduleDataHandle;
80 SG::ReadCondHandle<PixelChargeCalibCondData> calibDataHandle(
m_chargeDataKey, ctx);
81 const PixelChargeCalibCondData *calibData = *calibDataHandle;
82
83 int maxFEI4SmallHit = 2;
85
86 std::vector<std::unique_ptr<Pixel1RawData>> p_rdo_small_fei4;
87 int nSmallHitsFEI4 = 0;
88 std::vector<int>
row, col;
91 std::vector<std::vector<int> > FEI4Map(maxRow + 16, std::vector<int>(maxCol + 16));
92
93
95
97
99
100
102 }
103
104
106
108 i_chargedDiode != chargedDiodes.
orderedEnd(); ++i_chargedDiode) {
109 SiChargedDiode& diode = **i_chargedDiode;
110
111 Identifier diodeID = chargedDiodes.
getId(diode.
diode());
113
114
115
116 double corrQ = 1.11 *
117 (1.0 - (-7.09 * 1000.0) / (23.72 * 1000.0 +
charge) + (-0.22 * 1000.0) /
118 (-0.42 * 1000.0 +
charge));
119 if (corrQ < 1.0) {
120 corrQ = 1.0;
121 }
123
124
125
129
130
131 const auto & thresholds = calibData->
getThresholds(type, moduleHash, FE);
133
134
135
137 int bunchSim;
139 bunchSim =
142 } else {
144 }
145
148 } else {
150 }
151 } else {
153 }
154
155
157 double totsig = calibData->
getTotRes(moduleHash, FE, tot);
158 int nToT = static_cast<int>(CLHEP::RandGaussZiggurat::shoot(rndmEngine, tot, totsig));
159
160
161 if (totsig==0.0) {
162 double totIBLsig = getSigma(nToT);
163 if (totIBLsig) {
164 if (CLHEP::RandFlat::shoot(rndmEngine,0.0,1.0)<std::exp(-0.5/totIBLsig/totIBLsig)) {
165 if (CLHEP::RandFlat::shoot(rndmEngine,0.0,1.0)<0.5) { nToT--; }
166 else { nToT++; }
167 }
168 }
169 }
170
171
172
173
174 if (nToT == 2 && maxFEI4SmallHit == 2) {
175 nToT = 1;
176 }
177
178 nToT=std::clamp(nToT, 1, overflowToT);
179
180 if (nToT <= moduleData->getToTThreshold(barrel_ec, layerIndex)) {
182 }
183
184
186 continue;
187 }
189 continue;
190 }
191
194 continue;
195 }
196
198 int bunch = (
flag >> 8) & 0xff;
199
202
205 if (iicol >= maxCol) {
206 iicol = iicol - maxCol;
207 }
208
209
211 auto p_rdo = std::make_unique<Pixel1RawData>(id_readout, nToT, bunch, 0, bunch);
212 if (nToT > maxFEI4SmallHit) {
213 rdoCollection.
push_back(p_rdo.release());
214 FEI4Map[iirow][iicol] = 2;
215 } else {
216 p_rdo_small_fei4.push_back(std::move(p_rdo));
217 row.push_back(iirow);
218 col.push_back(iicol);
219 FEI4Map[iirow][iicol] = 1;
220 nSmallHitsFEI4++;
221 }
222 }
223 }
224
225
226 if (nSmallHitsFEI4 > 0) {
228
229
230 for (int ismall = 0; ismall < nSmallHitsFEI4; ismall++) {
231 int rowPDR =
row[ismall] / 2;
232 int colPDR = col[ismall] / 2;
233 for (int rowBigHit = 2 * rowPDR; rowBigHit != 2 * rowPDR + 2 && rowBigHit < maxRow; ++rowBigHit) {
234 for (int colBigHit = 2 * colPDR; colBigHit != 2 * colPDR + 2 && colBigHit < maxCol; ++colBigHit) {
236 "rowBig = " << rowBigHit << " colBig = " << colBigHit << " Map Content = " <<
237 FEI4Map[rowBigHit][colBigHit]);
238 if (FEI4Map[rowBigHit][colBigHit] == 2 && !recorded) {
241 }
242 }
243 }
244
245
246 if (!recorded && row[ismall] < maxRow - 1) {
247 if (FEI4Map[row[ismall] + 1][col[ismall]] == 2) {
250 }
251 }
252 if (!recorded && row[ismall] != 0) {
253 if (FEI4Map[row[ismall] - 1][col[ismall]] == 2) {
256 }
257 }
258 }
259 }
260 }
double charge(const T &p)
SiChargedDiodeOrderedSet::iterator SiChargedDiodeOrderedIterator
value_type push_back(value_type pElem)
PixelReadoutTechnology getReadoutTechnology() const
int rowsPerCircuit() const
Number of cell rows per circuit:
int columnsPerCircuit() const
Number of cell columns per circuit:
int phiIndex() const
Get phi index. Equivalent to strip().
int etaIndex() const
Get eta index.
virtual Identifier identify() const override final
identifier of this detector element (inline)
virtual Identifier identifierFromCellId(const SiCellId &cellId) const =0
Identifier <-> SiCellId (ie strip number or pixel eta_index,phi_index) Identifier from SiCellId (ie s...
constexpr int getFEI4OverflowToT() const
PixelChargeCalib::Thresholds getThresholds(InDetDD::PixelDiodeType type, unsigned int moduleHash, unsigned int FE) const
float getToT(InDetDD::PixelDiodeType type, unsigned int moduleHash, unsigned int FE, float Q) const
float getTotRes(unsigned int moduleHash, unsigned int FE, float Q) const
int layer_disk(const Identifier &id) const
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module) const
For a single crystal.
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
IdentifierHash wafer_hash(Identifier wafer_id) const
wafer hash from id
double getCrossTalk(int barrel_ec, int layer) const
virtual Identifier identify() const override final
SiChargedDiodeOrderedIterator orderedEnd()
SiChargedDiodeOrderedIterator orderedBegin()
Identifier getId(const InDetDD::SiCellId &id) const
const InDetDD::SolidStateDetectorElementBase * element() const
const InDetDD::SiCellId & diode() const
const SiTotalCharge & totalCharge() const
const InDetDD::SiReadoutCellId & getReadoutCell() const
static bool isMaskOut(SiChargedDiode &chDiode)
static void SetBunch(SiChargedDiode &chDiode, int bunch, MsgStream *log=nullptr)
static void disabled(SiChargedDiode &chDiode, bool flag, bool mask=false)
static void belowThreshold(SiChargedDiode &chDiode, bool flag, bool mask=false)
static bool isDisabled(SiChargedDiode &chDiode)
static std::string release
list recorded
if USE_PDG_VALUES = True, load PDG value of sin2thetaW and particle masses/widths from parameter dict...
constexpr uint32_t invalidFrontEnd
const T * getIdHelper(StoreGateSvc *pDetStore, const std::string &helperName)
void randomDisable(SiChargedDiodeCollection &chargedDiodes, const PixelModuleData *moduleData, CLHEP::HepRandomEngine *rndmEngine)
void crossTalk(double crossTalk, SiChargedDiodeCollection &chargedDiodes)
void thermalNoise(double thermalNoise, SiChargedDiodeCollection &chargedDiodes, CLHEP::HepRandomEngine *rndmEngine)
double randomThreshold(const PixelChargeCalib::Thresholds &t, CLHEP::HepRandomEngine *pEngine)
void randomNoise(SiChargedDiodeCollection &chargedDiodes, const PixelModuleData *moduleData, int nBcid, const PixelChargeCalibCondData *chargeCalibData, CLHEP::HepRandomEngine *rndmEngine, InDetDD::IPixelReadoutManager *pixelReadout)
double getG4Time(const SiTotalCharge &totalCharge)
row
Appending html table to final .html summary file.