7 #include <FairLogger.h>
9 #include <TClonesArray.h>
11 #include <TMathBase.h>
32 LOG(info) <<
" Ionization energy of gas: " <<
fEIonize <<
" MeV";
33 LOG(info) <<
" Fano factor of gas: " <<
fFano;
34 LOG(info) <<
" Drift velocity: " <<
fVelDrift;
35 LOG(info) <<
" Longitudal coefficient of diffusion: " <<
fCoefL;
36 LOG(info) <<
" Transverse coefficient of diffusion: " <<
fCoefT;
37 LOG(info) <<
" Position of the pad plane (Z): " <<
fDetPadPlane;
42 for (
auto &point : vec) {
43 auto size = array.GetEntriesFast();
50 std::vector<SimPointPtr> ret;
51 for (
int i = 0; i < fMCPointArray.GetEntries(); ++i) {
52 auto mcPoint =
dynamic_cast<AtMCPoint *
>(fMCPointArray.At(i));
55 ret.push_back(std::move(point));
63 LOG(info) <<
"Skipping point " << pointID <<
". Not in drift volume.";
67 auto trackID = mcPoint.GetTrackID();
72 if (mcPoint.GetEnergyLoss() == 0 ||
fTrackID != trackID) {
80 if (genElectrons > 0) {
81 step = (currentPoint -
fPrevPoint) / genElectrons;
87 std::vector<SimPointPtr> ret;
90 for (
int i = 0; i < genElectrons; ++i) {
91 auto loc = applyDiffusion(currentPoint + i * step, sigTrans, sigLong);
92 XYZVector locVec(loc.X(), loc.Y(), loc.Z());
93 ret.push_back(std::make_unique<AtSimulatedPoint>(pointID, i, locVec));
94 LOG(debug2) << loc <<
" from " << currentPoint + i * step;
103 auto sigInCm = TMath::Sqrt(
fCoefL * 2 * driftTime);
111 return 10. * TMath::Sqrt(
fCoefT * 2 * driftTime);
116 auto energyLoss = mcPoint.GetEnergyLoss() * 1000.;
117 auto meanElec = energyLoss /
fEIonize;
118 auto sigElec = TMath::Sqrt(
fFano * meanElec);
119 return gRandom->Gaus(meanElec, sigElec);
125 auto driftTime = TMath::Abs(zInCm) /
fVelDrift;
127 return {mcPoint.GetX() * 10., mcPoint.GetY() * 10., driftTime};
133 auto r = gRandom->Gaus(0, sigTrans);
134 auto phi = gRandom->Uniform(0, TMath::TwoPi());
135 auto dz = gRandom->Gaus(0, sigLong);
137 return loc +
XYZVector(r * TMath::Cos(phi), r * TMath::Sin(phi), dz);