275 const EventContext& ctx = Gaudi::Hive::currentContext();
280 CLHEP::HepRandomEngine* rndmEngine = rngWrapper->
getEngine(ctx);
283 auto digitsContainer = std::make_unique<TileMutableDigitsContainer>(
true,
291 auto rawChannelContainer = std::make_unique<TileMutableRawChannelContainer>(
true,
m_rChType,
m_rChUnit);
292 ATH_CHECK( rawChannelContainer->status() );
294 DataPool < TileDigits > tileDigitsPool(
m_tileHWID->adc_hash_max());
296 double tFit = 0, ped = 100;
298 TF1 *pdf =
new TF1();
299 TF1 *pdf_PhaseI =
new TF1();
300 TF1 *pdf_lo =
new TF1();
301 TF1 *pdf_hi =
new TF1();
306 Double_t sigma_lo = 1;
307 pdf_lo =
new TF1(
"pdf_lo",
"(1/(sqrt(2*pi)*[0])) * (exp(-0.5*(x/[0])**2)/(sqrt(2*pi)*[0]))", -100, 100);
308 pdf_lo->SetParameter(0,sigma_lo);
310 Double_t sigma_hi = 2.5;
311 pdf_hi =
new TF1(
"pdf_hi",
"(1/(sqrt(2*pi)*[0])) * (exp(-0.5*(x/[0])**2)/(sqrt(2*pi)*[0]))", -100, 100);
312 pdf_hi->SetParameter(0,sigma_hi);
318 pdf_PhaseI =
new TF1(
"pdf_PhaseI",
"[0] * (exp(-0.5*(x/[1])**2)/(sqrt(2*pi)*[1]) + [2] *exp(-0.5*(x/[3])**2)/(sqrt(2*pi)*[3]))", -100., 100.);
330 double n_inTimeAmp = 0.0;
333 for (
int ros = 1; ros < 5; ++ros) {
334 for (
int drawer = 0; drawer < 64; ++drawer) {
336 for (
int channel = 0; channel < 48; ++channel) {
348 bool isHGSaturated =
false;
350 for (
int igain = 1; igain >= 0; igain--) {
368 m_ps[gain]->scalePulse(deformatedTime, deformatedTime);
375 addPileUp(n_inTimeAmp, gain, ros, drawer, channel);
379 m_ps[gain]->scalePulse(deformatedTime, deformatedTime);
381 double scaleFactor = (
m_PhaseII ? 40.0 : 64.0);
382 n_inTimeAmp /= scaleFactor;
383 for (
auto &Value :
m_PUAmp[ros-1][drawer][channel]) {
384 ampValue /= scaleFactor;
389 pdf = (gain==1) ? pdf_hi : pdf_lo;
400 m_buf->getValueVector(samples);
406 RandGaussQ::shootArray(rndmEngine, samples.size(), Rndm, 0.0, 1.0);
407 RandFlat::shootArray(rndmEngine, 1, Rndm_dG, 0.0, 1.0);
408 for (
unsigned int js = 0; js < samples.size(); ++js) {
410 if (Rndm_dG[0] <
Norm)
411 samples[js] += (float) Hfn1 * Rndm[js];
413 samples[js] += (float) Hfn2 * Rndm[js];
417 for (
unsigned int i = 0; i < samples.size(); ++i) {
419 isHGSaturated =
true;
429 ATH_MSG_VERBOSE(
"New ADC " << ros <<
"/" << drawer <<
"/" << channel <<
"/ saving gain " << gain);
435 ATH_CHECK( digitsContainer->push_back(digit) );
437 auto rawChannel = std::make_unique<TileRawChannel>(digit->adc_HWID(),
443 ATH_CHECK( rawChannelContainer->push_back(std::move(rawChannel)) );
448 ATH_MSG_VERBOSE(
"New ADC " << ros <<
"/" << drawer <<
"/" << channel <<
"/ saving gain " << gain);
454 ATH_CHECK( digitsContainer->push_back(digit) );
456 auto rawChannel = std::make_unique<TileRawChannel>(digit->adc_HWID(),
462 ATH_CHECK( rawChannelContainer->push_back(std::move(rawChannel)) );
478 float my_PUAmp[7] = {0};
480 for (
int i = 0; i < 7; i++)
490 m_tsg->fill7SamplesQIE((
float) n_inTimeAmp, my_PUAmp);
494 m_buf->getValueVector(samples);
496 ATH_MSG_VERBOSE(
"New ADC " << ros <<
"/" << drawer <<
"/" << channel <<
"/ saving gain " << gain);
502 ATH_CHECK( digitsContainer->push_back(digit) );
504 auto rawChannel = std::make_unique<TileRawChannel>(digit->adc_HWID(),
510 ATH_CHECK( rawChannelContainer->push_back(std::move(rawChannel)) );
515 bool isHGSaturated =
false;
517 for (
int igain = 1; igain >= 0; --igain) {
532 pdf = (gain == 1) ? pdf_hi : pdf_lo;
546 m_ps[gain]->scalePulse(deformatedTime, deformatedTime);
549 m_PUAmp[ros-1][drawer][channel].pop_back();
550 m_PUAmp[ros-1][drawer][channel].insert(
m_PUAmp[ros-1][drawer][channel].begin(), 0);
557 m_PUAmp[ros-1][drawer][channel].front() += n_inTimeAmp;
559 sample =
m_tsg->fillSample(tFit, ped,
560 m_PUAmp[ros-1][drawer][channel],
571 sample =
m_tsg->fillSample(tFit, ped,
572 m_PUAmp[ros-1][drawer][channel],
589 isHGSaturated =
true;
594 samples.push_back(sample);
596 ATH_MSG_VERBOSE(
"New chain ADC " << ros <<
"/" << drawer <<
"/" << channel <<
" - saving gain " << gain);
601 ATH_CHECK(digitsContainer->push_back(digit));
604 auto rawChannel = std::make_unique<TileRawChannel>(
610 ATH_CHECK(rawChannelContainer->push_back(std::move(rawChannel)));
637 return StatusCode::SUCCESS;
725 for (
int imu = 0; imu<mu; imu++){
741 ATH_MSG_VERBOSE(
"Random amplitudes for PU: " << amp_1 <<
" " << amp_2);
791 double scaleFactor =
m_PhaseII ? 40 : 64;
792 n_inTimeAmp /= scaleFactor;