LDMX Software
trigscint::TrigScintQIEDigiProducer Class Reference

Class that simulates QIE chip of the trigger scintillator. More...

#include <TrigScintQIEDigiProducer.h>

Public Member Functions

 TrigScintQIEDigiProducer (const std::string &name, framework::Process &process)
 
void configure (framework::config::Parameters &parameters) override
 Callback for the processor to configure itself from the given set of parameters.
 
void produce (framework::Event &event) override
 Method to produce a collection of QIE digis.
 
- Public Member Functions inherited from framework::Producer
 Producer (const std::string &name, Process &process)
 Class constructor.
 
virtual void process (Event &event) final
 Processing an event for a Producer is calling produce.
 
- Public Member Functions inherited from framework::EventProcessor
 DECLARE_FACTORY (EventProcessor, EventProcessor *, const std::string &, Process &)
 declare that we have a factory for this class
 
 EventProcessor (const std::string &name, Process &process)
 Class constructor.
 
virtual ~EventProcessor ()=default
 Class destructor.
 
virtual void beforeNewRun (ldmx::RunHeader &run_header)
 Callback for Producers to add parameters to the run header before conditions are initialized.
 
virtual void onNewRun (const ldmx::RunHeader &run_header)
 Callback for the EventProcessor to take any necessary action when the run being processed changes.
 
virtual void onFileOpen (EventFile &event_file)
 Callback for the EventProcessor to take any necessary action when a new event input ROOT file is opened.
 
virtual void onFileClose (EventFile &event_file)
 Callback for the EventProcessor to take any necessary action when a event input ROOT file is closed.
 
virtual void onProcessStart ()
 Callback for the EventProcessor to take any necessary action when the processing of events starts, such as creating histograms.
 
virtual void onProcessEnd ()
 Callback for the EventProcessor to take any necessary action when the processing of events finishes, such as calculating job-summary quantities.
 
template<class T >
const T & getCondition (const std::string &condition_name)
 Access a conditions object for the current event.
 
TDirectory * getHistoDirectory ()
 Access/create a directory in the histogram file for this event processor to create histograms and analysis tuples.
 
void setStorageHint (framework::StorageControl::Hint hint)
 Mark the current event as having the given storage control hint from this module_.
 
void setStorageHint (framework::StorageControl::Hint hint, const std::string &purposeString)
 Mark the current event as having the given storage control hint from this module and the given purpose string.
 
int getLogFrequency () const
 Get the current logging frequency from the process.
 
int getRunNumber () const
 Get the run number from the process.
 
std::string getName () const
 Get the processor name.
 
void createHistograms (const std::vector< framework::config::Parameters > &histos)
 Internal function which is used to create histograms passed from the python configuration @parma histos vector of Parameters that configure histograms to create.
 

Private Attributes

std::unique_ptr< TRandom3 > random_ {nullptr}
 Random number generator.
 
std::string input_collection_
 Name of the input collection containing the sim hits.
 
std::string input_pass_name_
 Name of the pass that the input collection is on (empty string means take any pass)
 
std::string output_collection_
 Name of the output collection that will be used to stored the digitized trigger scintillator hits.
 
std::string sim_particles_coll_name_
 Name of the sim particle collection.
 
std::string sim_particles_passname_
 Pass name for the sim particle collection.
 
int strips_per_array_ {50}
 Number of strips per array.
 
double mean_noise_ {0}
 Mean readout noise.
 
double mev_per_mip_ {1.40}
 Total MeV per MIP.
 
double pe_per_mip_ {13.5}
 Total number of photoelectrons per MIP.
 
std::string input_pulse_shape_
 QIE Input pulse shape.
 
std::vector< float > pulse_params_
 QIE Input pulse parameters.
 
float toff_overall_
 Overall input pulse time offset.
 
int maxts_
 no. of time samples analysed by QIE
 
float tdc_thr_
 QIE TDC Current threshold.
 
float pedestal_
 QIE pedestal.
 
float elec_noise_
 QIE electronic noise.
 
float sipm_gain_
 SiPM Gain.
 
float s_freq_
 QIE sampling frequency [in MHz].
 
float zero_supp_cut_ {1.}
 Zero-suppression: discard any integrated pulses with PE < this number.
 
SimQIEsmq_ {nullptr}
 SimQIE pointer.
 

Additional Inherited Members

- Protected Member Functions inherited from framework::EventProcessor
void abortEvent ()
 Abort the event immediately.
 
- Protected Attributes inherited from framework::EventProcessor
HistogramPool histograms_
 helper object for making and filling histograms
 
NtupleManagerntuple_ {NtupleManager::getInstance()}
 Manager for any ntuples.
 
logging::logger the_log_
 The logger for this EventProcessor.
 

Detailed Description

Class that simulates QIE chip of the trigger scintillator.

Definition at line 47 of file TrigScintQIEDigiProducer.h.

Constructor & Destructor Documentation

◆ TrigScintQIEDigiProducer()

trigscint::TrigScintQIEDigiProducer::TrigScintQIEDigiProducer ( const std::string & name,
framework::Process & process )

Definition at line 13 of file TrigScintQIEDigiProducer.cxx.

15 : Producer(name, process) {}
Producer(const std::string &name, Process &process)
Class constructor.
virtual void process(Event &event) final
Processing an event for a Producer is calling produce.

Member Function Documentation

◆ configure()

void trigscint::TrigScintQIEDigiProducer::configure ( framework::config::Parameters & parameters)
overridevirtual

Callback for the processor to configure itself from the given set of parameters.

Parameters
parametersParameterSet for configuration.

Reimplemented from framework::EventProcessor.

Definition at line 17 of file TrigScintQIEDigiProducer.cxx.

18 {
19 // Configure this instance of the producer
20 strips_per_array_ = parameters.get<int>("number_of_strips");
21 // number_of_arrays_ = parameters.get<int>("number_of_arrays");
22 mean_noise_ = parameters.get<double>("mean_noise");
23 mev_per_mip_ = parameters.get<double>("mev_per_mip");
24 pe_per_mip_ = parameters.get<double>("pe_per_mip");
25 input_collection_ = parameters.get<std::string>("input_collection");
26 input_pass_name_ = parameters.get<std::string>("input_pass_name");
27 output_collection_ = parameters.get<std::string>("output_collection");
29 parameters.get<std::string>("sim_particles_coll_name");
31 parameters.get<std::string>("sim_particles_passname");
32
33 // QIE specific parameters initialization
34 maxts_ = parameters.get<int>("maxts");
35 toff_overall_ = parameters.get<double>("toff_overall");
36 input_pulse_shape_ = parameters.get<std::string>("input_pulse_shape");
37 tdc_thr_ = parameters.get<double>("tdc_thr");
38 pedestal_ = parameters.get<double>("pedestal");
39 elec_noise_ = parameters.get<double>("elec_noise");
40 sipm_gain_ = parameters.get<double>("sipm_gain");
41 s_freq_ = parameters.get<double>("qie_sf");
42 zero_supp_cut_ = parameters.get<double>("zero_supp_in_pe");
43
44 if (input_pulse_shape_ == "Expo") {
45 pulse_params_.clear();
46 pulse_params_.push_back(parameters.get<double>("expo_k"));
47 pulse_params_.push_back(parameters.get<double>("expo_tmax"));
48
49 ldmx_log(debug) << "expo_k =" << pulse_params_[0];
50 ldmx_log(debug) << "expo_tmax =" << pulse_params_[1];
51 }
52
53 // Debug mode: print parameter values.
54 ldmx_log(debug) << "maxts_ =" << maxts_;
55 ldmx_log(debug) << "toff_overall_ =" << toff_overall_;
56 ldmx_log(debug) << "input_pulse_shape_ =" << input_pulse_shape_;
57 ldmx_log(debug) << "tdc_thr =" << tdc_thr_;
58 ldmx_log(debug) << "pedestal =" << pedestal_;
59 ldmx_log(debug) << "elec_noise =" << elec_noise_;
60 ldmx_log(debug) << "sipm_gain =" << sipm_gain_;
61 ldmx_log(debug) << "qie_sf =" << s_freq_;
62 ldmx_log(debug) << "zero_supp_in_pe =" << zero_supp_cut_;
63 ldmx_log(debug) << "pe_per_mip =" << pe_per_mip_;
64 ldmx_log(debug) << "mev_per_mip =" << mev_per_mip_;
65}
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
Definition Parameters.h:78
std::string input_collection_
Name of the input collection containing the sim hits.
float zero_supp_cut_
Zero-suppression: discard any integrated pulses with PE < this number.
std::vector< float > pulse_params_
QIE Input pulse parameters.
float toff_overall_
Overall input pulse time offset.
std::string sim_particles_passname_
Pass name for the sim particle collection.
std::string input_pass_name_
Name of the pass that the input collection is on (empty string means take any pass)
float tdc_thr_
QIE TDC Current threshold.
float s_freq_
QIE sampling frequency [in MHz].
double pe_per_mip_
Total number of photoelectrons per MIP.
int strips_per_array_
Number of strips per array.
int maxts_
no. of time samples analysed by QIE
std::string sim_particles_coll_name_
Name of the sim particle collection.
std::string output_collection_
Name of the output collection that will be used to stored the digitized trigger scintillator hits.
std::string input_pulse_shape_
QIE Input pulse shape.

References framework::config::Parameters::get().

◆ produce()

void trigscint::TrigScintQIEDigiProducer::produce ( framework::Event & event)
overridevirtual

Method to produce a collection of QIE digis.

For each event, the SimHit information is converted to an output format analogous to real QIE output.

Implements framework::Producer.

Definition at line 67 of file TrigScintQIEDigiProducer.cxx.

67 {
68 // no sim hits, e.g. real data
70 ldmx_log(warn) << "No input collection " << input_collection_ << "_"
71 << input_pass_name_ << " found; skipping";
72 return;
73 }
74
75 // Need to handle seeding on the first event
76 if (random_.get() == nullptr) {
81
82 random_ = std::make_unique<TRandom3>(rseed.getSeed(output_collection_));
83
84 // Initialize SimQIE instance with
85 // pedestal, electronic noise and the random seed
86 smq_ = new SimQIE(pedestal_, elec_noise_,
87 rseed2.getSeed(output_collection_ + "SimQIE"));
88
93 }
94
95 // To simulate multiple pulses coming at different times, SiPMS
96 // Initialize with strips_per_array_ zeros
97 std::vector<float> true_edep(strips_per_array_, 0.);
98
99 // The part of true_edep deposited by beam electrons
100 std::vector<float> beam_edep(strips_per_array_, 0.);
101
102 // Initialize with strips_per_array_ nullptrs
103 std::vector<Expo*> ex(strips_per_array_, nullptr);
104 for (int i = 0; i < strips_per_array_; i++) {
105 // Set the pulse shape with fixed parameters given by config. file
106 ex[i] = new Expo(pulse_params_[0], pulse_params_[1]);
107 true_edep[i] = 0;
108 }
109
110 // loop over sim hits and aggregate energy depositions for each detID
111 const auto sim_hits{event.getCollection<ldmx::SimCalorimeterHit>(
113 const bool has_sim_particles{
115 if (!has_sim_particles) {
116 ldmx_log(debug) << "No " << sim_particles_coll_name_
117 << " found; beamEfrac set to -1";
118 }
119 const auto particle_map{
120 has_sim_particles ? event.getMap<int, ldmx::SimParticle>(
122 : std::map<int, ldmx::SimParticle>{}};
123
124 for (const auto& sim_hit : sim_hits) {
125 ldmx::TrigScintID id(sim_hit.getID());
126
127 ldmx_log(debug) << "Processing sim hit with bar ID: " << id.bar();
128
129 // tag the edep coming from beam electrons
130 for (int i = 0; i < sim_hit.getNumberOfContribs(); i++) {
131 const auto contrib{sim_hit.getContrib(i)};
132 const auto particle{particle_map.find(contrib.track_id_)};
133 if (particle == particle_map.end()) continue;
134
135 ldmx_log(trace) << "contrib " << i << " trackID: " << contrib.track_id_
136 << " pdgID: " << contrib.pdg_code_
137 << " edep: " << contrib.edep_;
138 ldmx_log(trace) << "\t particle id: " << particle->second.getPdgID()
139 << " particle status: "
140 << particle->second.getGenStatus();
141
142 if (particle->second.getPdgID() == 11 &&
143 particle->second.getGenStatus() == 1) {
144 beam_edep[id.bar()] += contrib.edep_;
145 }
146 }
147
148 // Simulating the noise corresponding to uncertainity in
149 // detecting scintillating photons.
150 // Poissonian distribution with mean = mean PEs generated
151 double pulse_amp =
152 random_->Poisson(sim_hit.getEdep() / mev_per_mip_ * pe_per_mip_);
153
154 // Adding a pulse for every sim hit recorded.
155 // time offset = global offset+simhit time
156 ex[id.bar()]->addPulse(toff_overall_ + sim_hit.getTime(), pulse_amp);
157
158 // incrementing true energy deposited in appropriate bar.
159 true_edep[id.bar()] += sim_hit.getEdep();
160 }
161
162 // A container to hold the digitized trigger scintillator hits.
163 std::vector<trigscint::TrigScintQIEDigis> q_digis;
164
165 double total_noise = mean_noise_ * maxts_;
166
167 // time period[ns] = 1000/sampling freq.[MHz]
168 double sampling_time = 1000 / s_freq_;
169
170 // Loop over all the bars available.
171 for (int bar_id = 0; bar_id < strips_per_array_; bar_id++) {
172 // Dark current simulation
173 // e-hole pairs may be generated at random times in SiPM
174 // due to thermal fluctuations.
175 // Every e- thus generated, mimicks a Photo Electron.
176 // Hence we will creat 1PE pulses for each electron generated.
177 int n_noise_pulses = random_->Poisson(total_noise);
178 for (int i = 0; i < n_noise_pulses; i++) {
179 ex[bar_id]->addPulse(random_->Uniform(0, maxts_ * sampling_time), 1);
180 }
181
182 // Storing the "good" digis
183 if (smq_->pulseCut(ex[bar_id], zero_supp_cut_)) {
185
186 qie_info.setChanID(bar_id);
187 qie_info.setADC(smq_->outAdc(ex[bar_id]));
188 qie_info.setTDC(smq_->outTdc(ex[bar_id]));
189 qie_info.setCID(smq_->capId(ex[bar_id]));
190
191 // sim truth; dark-current-only bars get 0, no SimParticles get -1
192 if (has_sim_particles) {
193 qie_info.setBeamEfrac(
194 true_edep[bar_id] > 0 ? beam_edep[bar_id] / true_edep[bar_id] : 0.);
195 }
196
197 q_digis.push_back(qie_info);
198 }
199 }
200 event.add(output_collection_, q_digis);
201}
const T & getCondition(const std::string &condition_name)
Access a conditions object for the current event.
bool exists(const std::string &name, const std::string &passName, bool unique=true) const
Check for the existence of an object or collection with the given name and pass name in the event.
Definition Event.cxx:105
static const std::string CONDITIONS_OBJECT_NAME
Conditions object name.
Stores simulated calorimeter hit information.
Class representing a simulated particle.
Definition SimParticle.h:24
Class that defines the detector ID of the trigger scintillator.
Definition TrigScintID.h:14
void setGain(const float gg=1e+6)
Set gain of SiPM.
Definition SimQIE.h:46
void setNTimeSamples(const int maxts=5)
Set the number of time samples to analyze.
Definition SimQIE.h:60
void setFreq(const float sf=40)
Set sampling frequency of QIE.
Definition SimQIE.h:53
void setTDCThreshold(const float thr)
Set current threshold for TDC latch.
Definition SimQIE.h:38
std::unique_ptr< TRandom3 > random_
Random number generator.
class for storing QIE output
void setCID(const std::vector< int > cid)
Store cids of all time samples.
void setTDC(const std::vector< int > tdc)
Store tdcs of all time samples.
void setChanID(const int chanid)
Store the channel ID.
void setBeamEfrac(const float beamEfrac)
Store the beam energy fraction.
void setADC(const std::vector< int > adc)
Store adcs of all time samples.

References framework::RandomNumberSeedService::CONDITIONS_OBJECT_NAME, framework::Event::exists(), trigscint::TrigScintQIEDigis::setADC(), trigscint::TrigScintQIEDigis::setBeamEfrac(), trigscint::TrigScintQIEDigis::setChanID(), trigscint::TrigScintQIEDigis::setCID(), and trigscint::TrigScintQIEDigis::setTDC().

Member Data Documentation

◆ elec_noise_

float trigscint::TrigScintQIEDigiProducer::elec_noise_
private

QIE electronic noise.

Definition at line 123 of file TrigScintQIEDigiProducer.h.

◆ input_collection_

std::string trigscint::TrigScintQIEDigiProducer::input_collection_
private

Name of the input collection containing the sim hits.

Definition at line 73 of file TrigScintQIEDigiProducer.h.

◆ input_pass_name_

std::string trigscint::TrigScintQIEDigiProducer::input_pass_name_
private

Name of the pass that the input collection is on (empty string means take any pass)

Definition at line 77 of file TrigScintQIEDigiProducer.h.

◆ input_pulse_shape_

std::string trigscint::TrigScintQIEDigiProducer::input_pulse_shape_
private

QIE Input pulse shape.

Definition at line 105 of file TrigScintQIEDigiProducer.h.

◆ maxts_

int trigscint::TrigScintQIEDigiProducer::maxts_
private

no. of time samples analysed by QIE

Definition at line 114 of file TrigScintQIEDigiProducer.h.

◆ mean_noise_

double trigscint::TrigScintQIEDigiProducer::mean_noise_ {0}
private

Mean readout noise.

Definition at line 96 of file TrigScintQIEDigiProducer.h.

96{0};

◆ mev_per_mip_

double trigscint::TrigScintQIEDigiProducer::mev_per_mip_ {1.40}
private

Total MeV per MIP.

Definition at line 99 of file TrigScintQIEDigiProducer.h.

99{1.40};

◆ output_collection_

std::string trigscint::TrigScintQIEDigiProducer::output_collection_
private

Name of the output collection that will be used to stored the digitized trigger scintillator hits.

Definition at line 81 of file TrigScintQIEDigiProducer.h.

◆ pe_per_mip_

double trigscint::TrigScintQIEDigiProducer::pe_per_mip_ {13.5}
private

Total number of photoelectrons per MIP.

Definition at line 102 of file TrigScintQIEDigiProducer.h.

102{13.5};

◆ pedestal_

float trigscint::TrigScintQIEDigiProducer::pedestal_
private

QIE pedestal.

Definition at line 120 of file TrigScintQIEDigiProducer.h.

◆ pulse_params_

std::vector<float> trigscint::TrigScintQIEDigiProducer::pulse_params_
private

QIE Input pulse parameters.

Definition at line 108 of file TrigScintQIEDigiProducer.h.

◆ random_

std::unique_ptr<TRandom3> trigscint::TrigScintQIEDigiProducer::random_ {nullptr}
private

Random number generator.

Definition at line 70 of file TrigScintQIEDigiProducer.h.

70{nullptr};

◆ s_freq_

float trigscint::TrigScintQIEDigiProducer::s_freq_
private

QIE sampling frequency [in MHz].

Definition at line 129 of file TrigScintQIEDigiProducer.h.

◆ sim_particles_coll_name_

std::string trigscint::TrigScintQIEDigiProducer::sim_particles_coll_name_
private

Name of the sim particle collection.

Definition at line 84 of file TrigScintQIEDigiProducer.h.

◆ sim_particles_passname_

std::string trigscint::TrigScintQIEDigiProducer::sim_particles_passname_
private

Pass name for the sim particle collection.

Definition at line 87 of file TrigScintQIEDigiProducer.h.

◆ sipm_gain_

float trigscint::TrigScintQIEDigiProducer::sipm_gain_
private

SiPM Gain.

Definition at line 126 of file TrigScintQIEDigiProducer.h.

◆ smq_

SimQIE* trigscint::TrigScintQIEDigiProducer::smq_ {nullptr}
private

SimQIE pointer.

Definition at line 135 of file TrigScintQIEDigiProducer.h.

135{nullptr};

◆ strips_per_array_

int trigscint::TrigScintQIEDigiProducer::strips_per_array_ {50}
private

Number of strips per array.

Definition at line 90 of file TrigScintQIEDigiProducer.h.

90{50};

◆ tdc_thr_

float trigscint::TrigScintQIEDigiProducer::tdc_thr_
private

QIE TDC Current threshold.

Definition at line 117 of file TrigScintQIEDigiProducer.h.

◆ toff_overall_

float trigscint::TrigScintQIEDigiProducer::toff_overall_
private

Overall input pulse time offset.

Definition at line 111 of file TrigScintQIEDigiProducer.h.

◆ zero_supp_cut_

float trigscint::TrigScintQIEDigiProducer::zero_supp_cut_ {1.}
private

Zero-suppression: discard any integrated pulses with PE < this number.

Definition at line 132 of file TrigScintQIEDigiProducer.h.

132{1.};

The documentation for this class was generated from the following files: