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.
 
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 11 of file TrigScintQIEDigiProducer.cxx.

13 : 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 15 of file TrigScintQIEDigiProducer.cxx.

16 {
17 // Configure this instance of the producer
18 strips_per_array_ = parameters.get<int>("number_of_strips");
19 // number_of_arrays_ = parameters.get<int>("number_of_arrays");
20 mean_noise_ = parameters.get<double>("mean_noise");
21 mev_per_mip_ = parameters.get<double>("mev_per_mip");
22 pe_per_mip_ = parameters.get<double>("pe_per_mip");
23 input_collection_ = parameters.get<std::string>("input_collection");
24 input_pass_name_ = parameters.get<std::string>("input_pass_name");
25 output_collection_ = parameters.get<std::string>("output_collection");
26
27 // QIE specific parameters initialization
28 maxts_ = parameters.get<int>("maxts");
29 toff_overall_ = parameters.get<double>("toff_overall");
30 input_pulse_shape_ = parameters.get<std::string>("input_pulse_shape");
31 tdc_thr_ = parameters.get<double>("tdc_thr");
32 pedestal_ = parameters.get<double>("pedestal");
33 elec_noise_ = parameters.get<double>("elec_noise");
34 sipm_gain_ = parameters.get<double>("sipm_gain");
35 s_freq_ = parameters.get<double>("qie_sf");
36 zero_supp_cut_ = parameters.get<double>("zeroSupp_in_pe");
37
38 if (input_pulse_shape_ == "Expo") {
39 pulse_params_.clear();
40 pulse_params_.push_back(parameters.get<double>("expo_k"));
41 pulse_params_.push_back(parameters.get<double>("expo_tmax"));
42
43 ldmx_log(debug) << "expo_k =" << pulse_params_[0];
44 ldmx_log(debug) << "expo_tmax =" << pulse_params_[1];
45 }
46
47 // Debug mode: print parameter values.
48 ldmx_log(debug) << "maxts_ =" << maxts_;
49 ldmx_log(debug) << "toff_overall_ =" << toff_overall_;
50 ldmx_log(debug) << "input_pulse_shape_ =" << input_pulse_shape_;
51 ldmx_log(debug) << "tdc_thr =" << tdc_thr_;
52 ldmx_log(debug) << "pedestal =" << pedestal_;
53 ldmx_log(debug) << "elec_noise =" << elec_noise_;
54 ldmx_log(debug) << "sipm_gain =" << sipm_gain_;
55 ldmx_log(debug) << "qie_sf =" << s_freq_;
56 ldmx_log(debug) << "zeroSupp_in_pe =" << zero_supp_cut_;
57 ldmx_log(debug) << "pe_per_mip =" << pe_per_mip_;
58 ldmx_log(debug) << "mev_per_mip =" << mev_per_mip_;
59}
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 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 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 61 of file TrigScintQIEDigiProducer.cxx.

61 {
62 // Need to handle seeding on the first event
63 if (random_.get() == nullptr) {
68
69 random_ = std::make_unique<TRandom3>(rseed.getSeed(output_collection_));
70
71 // Initialize SimQIE instance with
72 // pedestal, electronic noise and the random seed
73 smq_ = new SimQIE(pedestal_, elec_noise_,
74 rseed2.getSeed(output_collection_ + "SimQIE"));
75
80 }
81
82 // To simulate multiple pulses coming at different times, SiPMS
83 // Initialize with strips_per_array_ zeros
84 std::vector<float> true_edep(strips_per_array_, 0.);
85
86 // Initialize with strips_per_array_ nullptrs
87 std::vector<Expo*> ex(strips_per_array_, nullptr);
88 for (int i = 0; i < strips_per_array_; i++) {
89 // Set the pulse shape with fixed parameters given by config. file
90 ex[i] = new Expo(pulse_params_[0], pulse_params_[1]);
91 true_edep[i] = 0;
92 }
93
94 // loop over sim hits and aggregate energy depositions for each detID
95 const auto sim_hits{event.getCollection<ldmx::SimCalorimeterHit>(
97
98 for (const auto& sim_hit : sim_hits) {
99 ldmx::TrigScintID id(sim_hit.getID());
100
101 ldmx_log(debug) << "Processing sim hit with bar ID: " << id.bar();
102
103 // Simulating the noise corresponding to uncertainity in
104 // detecting scintillating photons.
105 // Poissonian distribution with mean = mean PEs generated
106 double pulse_amp =
107 random_->Poisson(sim_hit.getEdep() / mev_per_mip_ * pe_per_mip_);
108
109 // Adding a pulse for every sim hit recorded.
110 // time offset = global offset+simhit time
111 ex[id.bar()]->addPulse(toff_overall_ + sim_hit.getTime(), pulse_amp);
112
113 // incrementing true energy deposited in appropriate bar.
114 true_edep[id.bar()] += sim_hit.getEdep();
115 }
116
117 // A container to hold the digitized trigger scintillator hits.
118 std::vector<trigscint::TrigScintQIEDigis> q_digis;
119
120 double total_noise = mean_noise_ * maxts_;
121
122 // time period[ns] = 1000/sampling freq.[MHz]
123 double sampling_time = 1000 / s_freq_;
124
125 // Loop over all the bars available.
126 for (int bar_id = 0; bar_id < strips_per_array_; bar_id++) {
127 // Dark current simulation
128 // e-hole pairs may be generated at random times in SiPM
129 // due to thermal fluctuations.
130 // Every e- thus generated, mimicks a Photo Electron.
131 // Hence we will creat 1PE pulses for each electron generated.
132 int n_noise_pulses = random_->Poisson(total_noise);
133 for (int i = 0; i < n_noise_pulses; i++) {
134 ex[bar_id]->addPulse(random_->Uniform(0, maxts_ * sampling_time), 1);
135 }
136
137 // Storing the "good" digis
138 if (smq_->pulseCut(ex[bar_id], zero_supp_cut_)) {
140
141 qie_info.setChanID(bar_id);
142 qie_info.setADC(smq_->outAdc(ex[bar_id]));
143 qie_info.setTDC(smq_->outTdc(ex[bar_id]));
144 qie_info.setCID(smq_->capId(ex[bar_id]));
145
146 q_digis.push_back(qie_info);
147 }
148 }
149 event.add(output_collection_, q_digis);
150}
const T & getCondition(const std::string &condition_name)
Access a conditions object for the current event.
static const std::string CONDITIONS_OBJECT_NAME
Conditions object name.
Stores simulated calorimeter hit information.
Class that defines the detector ID of the trigger scintillator.
Definition TrigScintID.h:14
bool pulseCut(QIEInputPulse *pulse, float cut)
Method to check if the pulse is good to be stored.
Definition SimQIE.cxx:134
std::vector< int > outAdc(QIEInputPulse *pp)
Complete set of ADCs for the pulse.
Definition SimQIE.cxx:88
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
std::vector< int > outTdc(QIEInputPulse *pp)
Complete set of TDCs for the pulse.
Definition SimQIE.cxx:113
void setFreq(const float sf=40)
Set sampling frequency of QIE.
Definition SimQIE.h:53
std::vector< int > capId(QIEInputPulse *pp)
Complete set of Capacitor IDs for the pulse.
Definition SimQIE.cxx:124
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 setADC(const std::vector< int > adc)
Store adcs of all time samples.

References framework::RandomNumberSeedService::CONDITIONS_OBJECT_NAME, trigscint::TrigScintQIEDigis::setADC(), 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 117 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 99 of file TrigScintQIEDigiProducer.h.

◆ maxts_

int trigscint::TrigScintQIEDigiProducer::maxts_
private

no. of time samples analysed by QIE

Definition at line 108 of file TrigScintQIEDigiProducer.h.

◆ mean_noise_

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

Mean readout noise.

Definition at line 90 of file TrigScintQIEDigiProducer.h.

90{0};

◆ mev_per_mip_

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

Total MeV per MIP.

Definition at line 93 of file TrigScintQIEDigiProducer.h.

93{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 96 of file TrigScintQIEDigiProducer.h.

96{13.5};

◆ pedestal_

float trigscint::TrigScintQIEDigiProducer::pedestal_
private

QIE pedestal.

Definition at line 114 of file TrigScintQIEDigiProducer.h.

◆ pulse_params_

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

QIE Input pulse parameters.

Definition at line 102 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 123 of file TrigScintQIEDigiProducer.h.

◆ sipm_gain_

float trigscint::TrigScintQIEDigiProducer::sipm_gain_
private

SiPM Gain.

Definition at line 120 of file TrigScintQIEDigiProducer.h.

◆ smq_

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

SimQIE pointer.

Definition at line 129 of file TrigScintQIEDigiProducer.h.

129{nullptr};

◆ strips_per_array_

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

Number of strips per array.

Definition at line 84 of file TrigScintQIEDigiProducer.h.

84{50};

◆ tdc_thr_

float trigscint::TrigScintQIEDigiProducer::tdc_thr_
private

QIE TDC Current threshold.

Definition at line 111 of file TrigScintQIEDigiProducer.h.

◆ toff_overall_

float trigscint::TrigScintQIEDigiProducer::toff_overall_
private

Overall input pulse time offset.

Definition at line 105 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 126 of file TrigScintQIEDigiProducer.h.

126{1.};

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