SdBaselineSimulatorOG/SdBaselineSimulator.cc
Go to the documentation of this file.
1 #include "SdBaselineSimulator.h"
2 
3 #include <evt/Event.h>
4 
5 #include <det/Detector.h>
6 
7 #include <sdet/SDetector.h>
8 #include <sdet/PMTConstants.h>
9 
10 #include <sevt/SEvent.h>
11 #include <sevt/Station.h>
12 #include <sevt/StationSimData.h>
13 #include <sevt/PMT.h>
14 #include <sevt/PMTSimData.h>
15 
16 #include <fwk/CentralConfig.h>
17 #include <fwk/RandomEngineRegistry.h>
18 
19 #include <utl/RandomEngine.h>
20 #include <utl/ErrorLogger.h>
21 #include <utl/Reader.h>
22 #include <utl/Accumulator.h>
23 
24 #include <CLHEP/Random/Randomize.h>
25 
26 #include <sstream>
27 
28 using namespace utl;
29 using namespace fwk;
30 using namespace sevt;
31 using namespace std;
32 
33 
34 namespace SdBaselineSimulatorOG {
35 
38  {
39  fRandomEngine = &RandomEngineRegistry::GetInstance().Get(RandomEngineRegistry::eDetector);
40  return eSuccess;
41  }
42 
43 
45  SdBaselineSimulator::Run(evt::Event& event)
46  {
47  const auto rnd = &fRandomEngine->GetEngine();
48 
49  auto& sEvent = event.GetSEvent();
50 
51  for (auto& station : sEvent.StationsRange()) {
52 
53  // skip station if no particles
54  if (!station.HasSimData())
55  continue;
56 
57  const auto& dStation = det::Detector::GetInstance().GetSDetector().GetStation(station);
58  const auto traceLength = dStation.GetFADCTraceLength();
59 
60  // make sure all traces in a station start and end exactly at the same times
61  Accumulator::Safe<Accumulator::Min<int>> minTime;
62  Accumulator::Safe<Accumulator::Max<int>> maxTime;
63  for (auto& pmt : station.PMTsRange(sdet::PMTConstants::eAnyType)) {
64  if (!pmt.HasSimData())
65  continue;
66  const auto& pmtSim = pmt.GetSimData();
67  if (!pmtSim.HasFADCTrace())
68  continue;
69  const auto& trace = pmtSim.GetFADCTraceD(sdet::PMTConstants::eHighGain, StationConstants::eTotal);
70  minTime(trace.GetStart());
71  maxTime(trace.GetStop());
72  }
73 
74  const auto saturationValue = dStation.GetSaturationValue();
75 
76  // add padding before and after
77  const int startTime = minTime.GetMin() - traceLength/3; // this should be ok also for UUB
78  const int stopTime = maxTime.GetMax() + traceLength;
79 
80  for (auto& pmt : station.PMTsRange(sdet::PMTConstants::eAnyType)) {
81 
82  if (!pmt.HasSimData())
83  continue;
84  auto& pmtSim = pmt.GetSimData();
85 
86  if (!pmtSim.HasFADCTrace())
87  continue;
88 
89  if (!pmtSim.HasFADCTrace(StationConstants::eTotalNoSaturation))
90  pmtSim.MakeFADCTrace(StationConstants::eTotalNoSaturation);
91 
92  if (!pmt.HasCalibData())
93  pmt.MakeCalibData();
94  auto& pmtCalib = pmt.GetCalibData();
95 
96  const auto& dPMT = dStation.GetPMT(pmt);
97 
99  const double nominalBaseline = dPMT.GetBaseline(gain);
100  // choose uniform random phase between the adc counts
101  const double baseline = CLHEP::RandFlat::shoot(rnd, nominalBaseline-0.5, nominalBaseline+0.5);
102  const double noise = dPMT.GetBaselineRMS(gain);
103  pmtCalib.SetBaseline(baseline, noise, gain);
104 
105  auto& traceD = pmtSim.GetFADCTraceD(gain, StationConstants::eTotal);
106  auto& noSat = pmtSim.GetFADCTrace(gain, StationConstants::eTotalNoSaturation);
107  auto& trace = pmtSim.GetFADCTrace(gain, StationConstants::eTotal);
108  for (int i = startTime; i <= stopTime; ++i) {
109  const double noisyBaseline = CLHEP::RandGauss::shoot(rnd, baseline, noise);
110  const double signal = traceD.At(i) + noisyBaseline;
111  const double saturatedSignal = min(max(signal, 0.), double(saturationValue));
112  traceD.SetTime(i, saturatedSignal);
113  const int signalI = round(signal);
114  const int positiveSignalI = max(signalI, 0);
115  noSat.SetTime(i, positiveSignalI);
116  const int saturatedSignalI = min(positiveSignalI, int(saturationValue));
117  trace.SetTime(i, saturatedSignalI);
118  }
119  }
120 
121  }
122 
123  }
124 
125  return eSuccess;
126  }
127 
128 }
void Init()
Initialise the registry.
int gain
Definition: dump1090.h:241
#define max(a, b)
total FADC trace, with no saturation applied by FADC/baseline simulator
ResultFlag
Flag returned by module methods to the RunController.
Definition: VModule.h:60
total (shower and background)

, generated on Tue Sep 26 2023.