64 const double tdiff = rnd.Uniform(-1000., 1000.);
66 const double invveff = 1. / veff;
69 const double invattlen = 1. / attlen;
73 for (
auto event = 0;
event <
nEvents; ++event)
78 const std::array<double, 2> time = { distance[0] * 0.5 * fabs(invveff) + tdiff * 0.5,
79 distance[1] * 0.5 * fabs(invveff) - tdiff * 0.5 };
81 const auto eloss = rnd.Uniform(1., 20.);
82 const std::array<double, 2> eatpmt = { eloss * std::exp(-invattlen * distance[0]),
83 eloss * std::exp(-invattlen * distance[1]) };
85 const auto pos = rnd.Gaus(position, 1.);
86 const std::array<double, 2> tdc = { rnd.Gaus(time[0], 0.05), rnd.Gaus(time[1], 0.05) };
87 const std::array<double, 2> qdc = { gain[0] * eatpmt[0] / (1. + Neuland::AvgSaturationConstant * eatpmt[0]),
88 gain[1] * eatpmt[1] / (1. + Neuland::AvgSaturationConstant * eatpmt[1]) };
89 const auto energy = rnd.Gaus(eloss, eloss * 0.05);
94 for (
auto side = 0; side < 2; ++side)
95 bar->Set(side, tdc[side], qdc[side]);
97 bar->Add(0., pos, pos, energy);
102 const auto pars = bar->GetParameters();
103 std::cout << endl << pars.GetTimeOffset(2) - pars.GetTimeOffset(1) <<
" " << tdiff << std::endl;
104 std::cout << pars.GetEffectiveSpeed() <<
" " << veff << std::endl;
105 std::cout << pars.GetEnergyGain(1) <<
" " << gain[0] << std::endl;
106 std::cout << pars.GetEnergyGain(2) <<
" " << gain[1] << std::endl;
107 std::cout << pars.GetLightAttenuationLength() <<
" " << attlen << std::endl;
109 if (fabs(pars.GetTimeOffset(2) - pars.GetTimeOffset(1) - tdiff) < 0.01 &&
110 fabs(pars.GetEffectiveSpeed() - veff) < 0.1 && fabs(pars.GetEnergyGain(1) - gain[0]) < 0.1 &&
111 fabs(pars.GetEnergyGain(2) - gain[1]) < 0.01 && fabs(pars.GetLightAttenuationLength() - attlen) < 25)
113 std::cout <<
"SUCCESS" << std::endl;
117 std::cout <<
"FAILED" << std::endl;