All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
RealisticCaloDigiScinPpd.cc
Go to the documentation of this file.
1 // Calorimeter digitiser for the IDC ECAL and HCAL
2 // For other detectors/models SimpleCaloDigi should be used
3 
5 
6 #include <marlin/Global.h>
7 
8 #include <iostream>
9 #include <string>
10 #include <algorithm>
11 #include <assert.h>
12 
13 #include "CLHEP/Random/RandGauss.h"
14 #include "CLHEP/Random/RandBinomial.h"
15 
16 using namespace std;
17 //using namespace lcio ;
18 using namespace marlin ;
19 
21 
22 RealisticCaloDigiScinPpd::RealisticCaloDigiScinPpd() : RealisticCaloDigi::Processor("RealisticCaloDigiScinPpd") {
23 
24  _description = "Performs digitization of sim calo hits..." ;
25 
26 
27  registerProcessorParameter("ppd_mipPe" ,
28  "# Photo-electrons per MIP (scintillator): used to poisson smear #PEs if >0" ,
30  (float)10.);
31 
32  registerProcessorParameter("ppd_npix" ,
33  "total number of MPPC/SiPM pixels for implementation of saturation effect" ,
35  (int)10000);
36 
37  registerProcessorParameter("ppd_npix_uncert" ,
38  "fractional uncertainty of effective total number of MPPC/SiPM pixels" ,
40  float (0.05) );
41 
42  registerProcessorParameter("ppd_pix_spread",
43  "variation of PPD pixel signal (as a fraction: 0.01=1%)",
44  _pixSpread,
45  float (0.05));
46 
47 }
48 
49 
50 float RealisticCaloDigiScinPpd::convertEnergy( float energy, int inUnit ) const { // convert energy from input to output scale (NPE)
51  if ( inUnit==NPE ) return energy;
52  else if ( inUnit==MIP ) return _PPD_pe_per_mip*energy;
53  else if ( inUnit==GEVDEP ) return _PPD_pe_per_mip*energy/_calib_mip;
54  else streamlog_out (ERROR) << "unknown unit " << inUnit << std::endl;
55  assert (0);
56 }
57 
59  // input energy in deposited GeV
60  // output in npe
61  float npe = energy*_PPD_pe_per_mip/_calib_mip; // convert to pe scale
62 
63  if (_PPD_n_pixels>0){
64  // apply average sipm saturation behaviour
65  npe = _PPD_n_pixels*(1.0 - exp( -npe/_PPD_n_pixels ) );
66  //apply binomial smearing
67  float p = npe/_PPD_n_pixels; // fraction of hit pixels on SiPM
68  npe = CLHEP::RandBinomial::shoot(_PPD_n_pixels, p); //npe now quantised to integer pixels
69 
70  if (_pixSpread>0) {
71  // variations in pixel capacitance
72  npe *= CLHEP::RandGauss::shoot(1, _pixSpread/sqrt(npe) );
73  }
74  }
75 
76  return npe;
77 }
78 
RealisticCaloDigiScinPpd aRealisticCaloDigiScinPpd
float digitiseDetectorEnergy(float energy) const
float convertEnergy(float energy, int inputUnit) const