All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
pmtsimulation_icarus.fcl
Go to the documentation of this file.
1 #
2 # File: pmtsimulation_icarus.fcl
3 # Purpose: Presets for configuration of ICARUS PMT channel digitization.
4 #
5 # Configurations offered:
6 #
7 # * `PMTsimulationAlg` algorithm:
8 # * `icarus_pmtsimulationalg_standard`: main configuration, expected to be
9 # used in production and by the general user
10 # * `icarus_pmtsimulationalg_202202`: a general use configuration,
11 # including dark and electronics noise; `noise` and `nonoise` variants
12 # (the latter with dark and electronics noise disabled)
13 # * `icarus_pmtsimulationalg_2018`: legacy configuration (until June 2022),
14 # including dark and electronics noise; `noise` and `nonoise` variants
15 # (the latter with dark and electronics noise disabled)
16 #
17 # Usage:
18 #
19 # * `PMTsimulationAlg` algorithm configuration needs to be included verbatim
20 # into the configuration of `SimPMTIcarus` module
21 #
22 #
23 # Changes:
24 # 20181024 (petrillo@slac.stanford.edu)
25 # detached from `opdetsim_pmt_icarus.fcl`
26 # 20200212 (petrillo@slac.stanford.edu)
27 # reconnected quantum efficiency to the value in `opticalproperties_icarus.fcl`
28 # 20210206 (petrillo@slac.stanford.edu)
29 # added explicit noise configuration, and made standard an alias of it
30 # 20210212 (petrillo@slac.stanford.edu)
31 # updated baseline to reflect the one in data
32 # 20210615 (petrillo@slac.stanford.edu)
33 # updated PMT readout enable window to 2 ms
34 # 20220706 (petrillo@slac.stanford.edu)
35 # introduced configuration for SPR 202202
36 #
37 
39 
40 BEGIN_PROLOG
41 
42 ################################################################################
43 ### Configurations for `PMTsimulationAlg`
44 ################################################################################
45 
46 ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
47 ### Detector and readout parameters
48 ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
49 
51 
52  nominalPMTgain: 7.0e6 # PMT multiplication gain factor
53 
55 
56 
57 
58 ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
59 ### Single photoelectron response configurations
60 ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
61 #
62 # Single photoelectron response with a Gaussian rise and a fall shape.
63 #
64 # Parameters are as used since forever to at least v08_46_00.
65 #
66 icarus_photoelectronresponse_gaussian: {
67 
68  # run `lar --print-description AsymGaussPulseFunctionTool` for configuration
69  tool_type: AsymGaussPulseFunctionTool
70 
71  TransitTime: "55.1 ns"
72  RaiseTime: "3.8 ns"
73  FallTime: "13.7 ns"
74  MeanAmplitude: "0.9 pC"
75  ADC: -11.1927 #charge to adc factor
76 
77 } # icarus_photoelectronresponse_gaussian
78 
79 
80 #
81 # Single photoelectron response with exponential rise and a fall shapes.
82 #
83 # Parameters are reworked from an ICARUS trigger note (not yet released as
84 # of April 2020), which come from data analysis from the BNL group.
85 #
86 # In particular, raise and fall times are reported to be 1.4 and 3.2 ns for
87 # the PMT, and 1.8 and 4.2 ns including the cable distortion at CERN (10 m),
88 # which is not the setup of the actual ICARUS detector (37 m).
89 # The average gain is considered to be 7 x 10^6 (somehow lower than the nominal
90 # 10^7 which we had targetted).
91 # Attenuation from the cable is considered negligible.
92 #
93 # The peak charge is computed starting from the charge of a photoelectron
94 # (-1.6 x 10^-7 pC), multiplied by the gain (7 x 10^6). At signal peak time,
95 # the current from that charge is -0.14 mA, i.e. a voltage drop on 50 ohm
96 # of -7.07 mV. In this parametrisation, we inject the gain and let the code
97 # compute the amplitude.
98 # The digitizer converts a range up to 2 volt with 14 bit, which translates into
99 # about 8.192 ADC/mV and 409.6 ADC/mA.
100 # In short, the peak signal is expected to be -7.07 mV, -0.14 mA, -57.93 ADC.
101 #
102 # The integral of the shape is 191.407 ADC (time 0 to infinity, 2 ns sampling).
103 #
104 icarus_photoelectronresponse_exponentials: {
105 
106  # run `lar --print-description AsymGaussPulseFunctionTool` for configuration
107  tool_type: AsymExpPulseFunctionTool
108 
109  TransitTime: "55.1 ns"
110  RaiseTimeConstant: "1.8 ns"
111  FallTimeConstant: "4.2 ns"
112  Gain: @local::icarus_settings_opdet.nominalPMTgain # Gain = 7.0e6 => PeakCurrent: -0.14144 mA
113  ADC: 409.6 # ADC / mA
114 
115 } # icarus_photoelectronresponse_exponentials
116 
117 
118 #
119 # Single photoelectron response from data.
120 #
121 icarus_photoelectronresponse_202202: {
122 
123  tool_type: SampledWaveformFunctionTool
124 
125  WaveformData: "Responses/SPR202202.txt"
126  TransitTime: "55.1 ns"
127  Gain: @local::icarus_settings_opdet.nominalPMTgain
128 
129 } # icarus_photoelectronresponse_202202
130 
131 
132 #
133 # Custom photoelectron response.
134 #
135 # This is just an example for an arbitrary function shape; the example tries to
136 # reproduce an `AsymGaussPulseFunction`.
137 # The names of the parameters are arbitrary and their value must be numerical.
138 #
139 icarus_photoelectronresponse_customexample: {
140 
141  # run `lar --print-description CustomPulseFunctionTool` for configuration
142  tool_type: CustomPulseFunctionTool
143 
144  ShapeFormula:
145  "[ADC] * [MeanAmplitude] * exp(-0.5*((x - [TransitTime])/((x < [TransitTime])? [RaiseTime]: [FallTime]))**2)"
146  PeakTime: "[TransitTime]"
147  Parameters: {
148  TransitTime: 55.1
149  RaiseTime: 3.8
150  FallTime: 13.7
151  MeanAmplitude: 0.9
152  ADC: -11.1927
153  } # parameters
154 
155 } # icarus_photoelectronresponse_customexample
156 
157 
158 #
159 # pick one
160 #
161 icarus_photoelectronresponse_standard: @local::icarus_photoelectronresponse_exponentials
162 
163 
164 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
165 ###
166 ### Configuration preset components
167 ###
168 icarus_pmtsimulation.disable_noise: {
169  AmpNoise: 0.0 # RMS in ADC counts
170  DarkNoiseRate: "0 kHz"
171 } # icarus_pmtsimulation.disable_noise
172 
173 
174 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
175 ###
176 ### The standard configuration (`icarus_pmtsimulationalg_standard`) is chosen
177 ### below.
178 ###
179 ###
180 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
181 ### Configuration "2022":
182 ### * based on SPR202202
183 ### * gain: 9.7 x 10^6
184 ### * electronics noise included
185 ### * readout is fundamentally different from the real one: the hardwware readout
186 ### collects channels in groups of 180 (full cryostat in Run1, may change in future)
187 ### based on a trigger logic (channels above a O(10) p.e. threshold); the simulation
188 ### instead does not assume a readout trigger logic and tries to read out every
189 ### photoelectron (each channel independently, against a << 1 p.e. threshold);
190 ### the part that is not included in the simulation but would be included in data
191 ### is comprised only of noise (and exceptionally low response fluctuations of single
192 ### photoelectrons), so post-processing can trim and extend the this simulation to
193 ### reflect the real readout by removing the channels in the regions (cryostats)
194 ### that would not be triggered, and generating the missing waveforms with noise.
195 ### The single photoelectron response 202202 used in the simulation is 800 samples
196 ### (1.6 us) long; since every single photoelectron "triggers" the simulation, each
197 ### waveform will end with pure noise. With the current setting of a 4 us buffer
198 ### we have about 1 us of noise in the pre-trigger buffer, 1.6 us of signal and then
199 ### 1.4 us of noise (additional photoelectrons in these 4 us would just effectively
200 ### extend the "signal" part). All this considered, we keep the PMT readout buffer
201 ### in the simulation 1+3 us, sizeably smaller than the 3+7 us used in the hardware
202 ### for Run1, to save space (using 3+7, we would still have 1.6 us of signal,
203 ### and the 3 us before and 5.4 us after it would still be pure noise).
204 ### Likewise, we don't attempt to cover the full beam gate time like in hardware
205 ### (7+21 us in Run1 settings), since all the signal will be included anyway.
206 ### But we do force all 360 channels to take data at beam gate time ("only" for
207 ### 1+21 us around the beam gate opening though).
208 ###
209 
210 icarus_pmtsimulationalg_202202_noise: {
211 
212  Baseline: 14999.5 # in ADC; try to distribute rounding errors
213 
214  SinglePhotonResponse: @local::icarus_photoelectronresponse_standard
215 
216  AmpNoise: 3.0 # in ADC; temporary value, see SBN DocDB 19187
217  DarkNoiseRate: "1.6 kHz" # per channel, from CERN test stand measurement
218 
219  ## This is the readout window size for each "trigger" on the electronics
220  ReadoutWindowSize: 2000 # ticks (2 ns each --> 4 us)
221 
222  ##fraction of readout window size that should come before the "trigger" on the electronics
223  PreTrigFraction: 0.25 # fraction (1+3 us)
224 
225  ##Threshold in ADC counts for a PMT self-trigger.
226  # 15 ADC = 5x 3 ADC (RMS, see AmpNoise above),~45% of standard SPR (4 mV, 33 ADC);
227  # number of noise samples above 15 ADC: ~206 samples for 2 ms x 360 channels (300 Hz)
228  # number of noise samples above 18 ADC: ~0.36 samples for 2 ms x 360 channels (0.5 Hz)
229  ##NOTE this is assumed to be positive-going and ABOVE BASELINE! Pulse polarity is corrected before determining trigger.
230  ThresholdADC: 18 # ADC counts
231 
232  PulsePolarity: -1 #Pulse polarity (1 = positive, -1 = negative)
233  TriggerOffsetPMT: "-1.0 ms" # PMT enable gate start: time relative to trigger when readout begins
234  ReadoutEnablePeriod: "2.0 ms" # PMT enable gate duration: time for which PMT readout is enabled
235  CreateBeamGateTriggers: true #Option to create unbiased readout around beam spill
236  BeamGateTriggerRepPeriod: "2.0 us" # Repetition period and number of repetitions for BeamGateTriggers:
237  BeamGateTriggerNReps: 10 # should cover -7/+21 us, instead just goes -1 to 21 us)
238  QE: @local::icarus_opticalproperties.ScintPreScale # from opticalproperties_icarus.fcl
239  FluctuateGain: true # apply per-photoelectron gain fluctuations
240 
241  PMTspecs: {
242  DynodeK: 0.75 # gain on a PMT multiplication stage
243  # is proportional to dV^k
244  # relative multiplication stage resistors in Hamamatsu 5912,
245  # from their datasheet; if the resistor on first stage is 17.4 R, the one on
246  # the second stage is 3.4 R, etc. The value of R is not necessary.
247  # Only multiplication stages are included.
248  VoltageDistribution: [ 17.4, 3.4, 5.0, 3.33, 1.67, 1.0, 1.2, 1.5, 2.2, 3.0 ]
249  Gain: @local::icarus_settings_opdet.nominalPMTgain # total typical PMT gain
250  } # PMTspecs
251 
252 } # icarus_pmtsimulationalg_202202_noise
253 
254 
255 icarus_pmtsimulationalg_202202_nonoise: {
256  @table::icarus_pmtsimulationalg_202202_noise
257  @table::icarus_pmtsimulation.disable_noise
258 }
259 
260 icarus_pmtsimulationalg_202202: @local::icarus_pmtsimulationalg_202202_noise
261 
262 
263 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
264 ###
265 ### Legacy configuration, pre-2022
266 ###
267 icarus_pmtsimulationalg_2018: {
268 
269  Baseline: 14999.5 #in ADC
270 
271  SinglePhotonResponse: @local::icarus_photoelectronresponse_standard
272 
273  AmpNoise: 3.0 # in ADC; temporary value, see SBN DocDB 19187
274  DarkNoiseRate: "1.6 kHz" # from CERN test stand measurement
275 
276  ##This is the readout window size for each "trigger" on the electronics
277  ReadoutWindowSize: 2000 #ticks (if 2ns each --> 4us)
278 
279  ##fraction of readout window size that should come before the "trigger" on the electronics
280  PreTrigFraction: 0.25 # fraction
281 
282  ##Threshold in ADC counts for a PMT self-trigger.
283  # 18 ADC = 6x 3 ADC (RMS, see AmpNoise above),~35% of standard SPR (55 ADC);
284  # number of noise samples above 18 ADC: ~0.35 samples for 2 ms x 360 channels
285  ##NOTE this is assumed to be positive-going and ABOVE BASELINE! Pulse polarity is corrected before determining trigger.
286  ThresholdADC: 18 # ADC counts
287 
288  PulsePolarity: -1 #Pulse polarity (1 = positive, -1 = negative)
289  TriggerOffsetPMT: "-1.0 ms" #Time relative to trigger when readout begins
290  ReadoutEnablePeriod: "2.0 ms" #Time for which pmt readout is enabled
291  CreateBeamGateTriggers: true #Option to create unbiased readout around beam spill
292  BeamGateTriggerRepPeriod: "2.0 us" #Repetition Period for BeamGateTriggers
293  BeamGateTriggerNReps: 10 #Number of beamgate trigger reps to produce
294  Saturation: 300 #in number of p.e. to see saturation effects in the signal
295  QE: @local::icarus_opticalproperties.ScintPreScale # from opticalproperties_icarus.fcl
296  FluctuateGain: true # apply per-photoelectron gain fluctuations
297 
298  PMTspecs: {
299  DynodeK: 0.75 # gain on a PMT multiplication stage
300  # is proportional to dV^k
301  # relative multiplication stage resistors in Hamamatsu 5912, from
302  # JINST 13 (2018) 10, P10030 (https://doi.org/10.1088/1748-0221/13/10/P10030);
303  # if the resistor on first stage is 17.4 R, the one on the second stage is 3.4 R,
304  # etc. The value of R is not necessary.
305  # Only multiplication stages are included.
306  VoltageDistribution: [ 17.4, 3.4, 5.0, 3.33, 1.67, 1.0, 1.2, 1.5, 2.2, 3.0 ]
307  Gain: @local::icarus_settings_opdet.nominalPMTgain # total typical PMT gain
308  } # PMTspecs
309 
310 } # icarus_pmtsimulationalg_2018
311 
312 
313 icarus_pmtsimulationalg_2018_noise: @local::icarus_pmtsimulationalg_2018
314 
315 
316 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
317 ###
318 ### Legacy no-noise configuration: `icarus_pmtsimulationalg_2018_nonoise`
319 ###
320 ###
321 icarus_pmtsimulationalg_2018_nonoise: {
322  @table::icarus_pmtsimulationalg_2018
323  @table::icarus_pmtsimulation.disable_noise
324 } # icarus_pmtsimulationalg_2018_nonoise
325 
326 
327 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
328 ###
329 ### Configuration used for standard simulation
330 ###
331 #
332 # Includes noise.
333 #
334 icarus_pmtsimulationalg_standard: @local::icarus_pmtsimulationalg_2018_nonoise
335 
336 
337 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
338 END_PROLOG
temporary see SBN DocDB from CERN test stand measurement ReadoutWindowSize
stream1 stream1 can override from command line with o or output services LArPropertiesService ScintPreScale
#define PMT
Definition: NestAlg.cxx:19
esac done echo Signal files are
Definition: TrainMVA.sh:25
pdgs p
Definition: selectors.fcl:22
#define the
tick ticks
Alias for common language habits.
Definition: electronics.h:78
BEGIN_PROLOG icarus_opticalproperties
process_name gaushit a
BEGIN_PROLOG icarus_settings_opdet
counts_as<> counts
Number of ADC counts, represented by signed short int.
Definition: electronics.h:116
process_name drop raw::OpDetWaveforms_DataApr2016RecoStage1_saturation_ saturation
return match has_match and(match.match_pdg==11 or match.match_pdg==-11)
then echo Cowardly refusing to create a new FHiCL file with the same name as the original one('${SourceName}')." >&2 exit 1 fi echo "'$
fhicl::Table< sbnd::crt::CRTDetSimParams > Parameters
try to distribute rounding errors SinglePhotonResponse
if &&[-z"$BASH_VERSION"] then echo Attempting to switch to bash bash shellSwitch exit fi &&["$1"= 'shellSwitch'] shift declare a IncludeDirectives for Dir in
temporary see SBN DocDB DarkNoiseRate
temporary value
BEGIN_PROLOG hitmakerfive clustermakerfour pfparticlemakerthree showermakertwo END_PROLOG hitmakerfive clustermakerfour pfparticlemakerthree sequence::inline_paths sequence::inline_paths sequence::inline_paths showermakers test
pdgs k
Definition: selectors.fcl:22
process_name showerreco Particles Coinciding wih the Vertex services ScanOptions nu_mu services ScanOptions Number