30 ,
fRnd(new TRandom3())
43 fPMTHits.emplace_back(newHit.
time, newHit.
light);
46 std::sort(fPMTHits.begin(), fPMTHits.end());
47 cachedFirstHitOverThresh.invalidate();
52 if (!cachedFirstHitOverThresh.valid())
54 cachedFirstHitOverThresh.set(FindThresholdExceedingHit());
55 cachedQDC.invalidate();
56 cachedTDC.invalidate();
57 cachedEnergy.invalidate();
60 return cachedFirstHitOverThresh.get() != fPMTHits.end();
65 if (!cachedQDC.valid())
67 cachedQDC.set(BuildQDC());
74 if (!cachedTDC.valid())
76 cachedTDC.set(BuildTDC());
83 if (!cachedEnergy.valid())
85 cachedEnergy.set(BuildEnergy());
90 Double_t Channel::BuildQDC()
98 for (
auto hit_it = cachedFirstHitOverThresh.
get(); hit_it != fPMTHits.end(); hit_it++)
100 const auto hit = *hit_it;
112 Double_t Channel::BuildTDC()
116 return (*cachedFirstHitOverThresh.
get()).time + par.
fRnd->Gaus(0., par.
fTimeRes);
122 Double_t Channel::BuildEnergy()
124 Double_t energy =
GetQDC();
128 energy = energy / (1. + par.fSaturationCoefficient * energy);
130 energy = par.fRnd->Gaus(energy, par.fEResRel * energy);
132 if (par.fExperimentalDataIsCorrectedForSaturation)
134 energy = energy / (1. - par.fSaturationCoefficient * energy);
139 std::vector<Channel::Hit>::const_iterator Channel::FindThresholdExceedingHit()
const
143 Double_t currentHeightOfLightPulse = 0.;
144 Double_t previousTime = 0.;
147 for (
auto hit_it = fPMTHits.begin(); hit_it != fPMTHits.end(); hit_it++)
153 previousTime = hit.time;
156 currentHeightOfLightPulse += hit.light;
167 return fPMTHits.end();