94 std::vector<double> T0(
m_nTPC,
98 for (
const auto& microtpcSimHit : microtpcSimHits) {
99 const int detNb = microtpcSimHit.getdetNb();
100 const ROOT::Math::XYZVector simHitPosition = microtpcSimHit.gettkPos();
102 simHitPosition.X() / 100. -
m_TPCCenter[detNb].X(),
103 simHitPosition.Y() / 100. -
m_TPCCenter[detNb].Y(),
108 const double T = chipPosition.
Z() +
m_z_DG / 2.;
114 for (
auto& val : T0) {
124 for (
const auto& microtpcSimHit : microtpcSimHits) {
126 const int PDGid = microtpcSimHit.gettkPDG();
128 if (PDGid != 1000020040 && PDGid != 1000060120 && PDGid != 1000080160 && PDGid !=
Const::proton.getPDGCode()) {
133 const int detNb = microtpcSimHit.getdetNb();
134 const double edep = microtpcSimHit.getEnergyDep();
135 const double niel = microtpcSimHit.getEnergyNiel();
136 const int pdg = microtpcSimHit.gettkPDG();
137 const int trkID = microtpcSimHit.gettkID();
139 const ROOT::Math::XYZVector simHitPosition = microtpcSimHit.gettkPos();
141 simHitPosition.X() / 100. -
m_TPCCenter[detNb].X(),
142 simHitPosition.Y() / 100. -
m_TPCCenter[detNb].Y(),
148 ROOT::Math::XYZVector ChipPosition(0, 0, 0);
150 if (detNb == 0 || detNb == 3) {
151 ChipPosition.SetX(-chipPosition.
Y());
152 ChipPosition.SetY(-chipPosition.
X());
153 ChipPosition.SetZ(chipPosition.
Z() +
m_z_DG / 2.);
155 if (detNb == 1 || detNb == 2) {
156 ChipPosition.SetX(chipPosition.
Y());
157 ChipPosition.SetY(chipPosition.
X());
158 ChipPosition.SetZ(chipPosition.
Z() +
m_z_DG / 2.);
162 ChipPosition.SetX(chipPosition.
Y());
163 ChipPosition.SetY(chipPosition.
X());
164 ChipPosition.SetZ(chipPosition.
Z() +
m_z_DG / 2);
183 (0. < ChipPosition.Z() && ChipPosition.Z() <
m_z_DG) &&
188 const double ionEn = (edep - niel) * 1e3;
198 const double meanEl = ionEn * 1e3 /
m_Workfct;
200 const int NbEle = (int)gRandom->Gaus(meanEl, sigma);
201 const double NbEle_real = NbEle - NbEle *
m_GasAbs * chipPosition.
Z();
204 for (
int ie = 0; ie < (int)NbEle_real; ie++) {
207 double x_DG, y_DG, z_DG, t_DG;
208 Drift(ChipPosition.X(),
221 for (
int ig1 = 0; ig1 < (int)GEM_gain1; ig1++) {
224 const ROOT::Math::XYVector GEM1(
GEMGeo1(x_DG, y_DG));
226 double x_TG, y_TG, z_TG, t_TG;
231 for (
int ig2 = 0; ig2 < (int)GEM_gain2; ig2++) {
234 const ROOT::Math::XYVector GEM2(
GEMGeo2(x_TG, y_TG));
236 double x_CG, y_CG, z_CG, t_CG;
243 int quT = gRandom->Uniform(-1, 1);
244 int bci = (int)((t_DG + t_TG + t_CG - T0[detNb]) / (
double)
m_PixelTimeBin) + quT;
251 (0 <= bci && bci < MAXtSIZE)) {
352 std::vector<int> col;
353 std::vector<int> row;
354 std::vector<int> ToT;
355 std::vector<int> bci;
364 const auto& key = keyValuePair.first;
366 int i = std::get<0>(key);
368 int j = std::get<1>(key);
370 if (
m_dchip_map[std::tuple<int, int>(i, j)] == 1) {
373 const int quE = gRandom->Uniform(0, 2);
377 for (
auto& keyValuePair2 :
m_dchip) {
378 const auto& key2 = keyValuePair2.first;
379 int k = std::get<2>(key2);
380 if (
m_dchip[std::tuple<int, int, int>(i, j, k)] > thresEl) {
391 for (
auto& keyValuePair2 :
m_dchip) {
392 const auto& key2 = keyValuePair2.first;
393 int k = std::get<2>(key2);
396 NbOfEl +=
m_dchip[std::tuple<int, int, int>(i, j, k)];
400 if (NbOfEl > thresEl && NbOfEl <= 45.*
m_TOTQ1) {
404 }
else if (NbOfEl > 800.*
m_TOTQ1) {
426 if (NbOfEl > thresEl && NbOfEl <= 45.*
m_TOTQ1) {
430 }
else if (NbOfEl > 800.*
m_TOTQ1) {
452 if (bci.size() > 0) {
456 sort(t0.begin(), t0.end());
459 for (
int j = 0; j < (int)bci.size(); j++) {
virtual void Drift(double, double, double, double &, double &, double &, double &, double, double, double)
Drift ionization Make the ionization drifting from (x,y,z) to GEM1 top plane.