BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
BesEmcWaveform.cc
Go to the documentation of this file.
1//---------------------------------------------------------------------------//
2// BOOST --- BESIII Object_Oriented Simulation Tool //
3//---------------------------------------------------------------------------//
4// Description:
5// Author: Hemiao
6// Created: Oct 25, 2004
7// Modified:
8// Comment:
9//---------------------------------------------------------------------------//
10// $Id: BesEmcWaveform.cc
11
12#include "EmcSim/BesEmcWaveform.hh"
13#include "CLHEP/Random/RandGauss.h"
14#include "CLHEP/Random/RanecuEngine.h"
15#include "EmcSim/BesEmcDigi.hh"
16#include "EmcSim/BesEmcParameter.hh"
17#include "Randomize.hh"
18using namespace CLHEP;
19// Constructors
20
23 // BesEmcParameter emcPara;
24 // emcPara.ReadData();
25 array_size = emcPara.GetArraySize();
26 m_tau = emcPara.GetTau();
27 m_highRange = emcPara.GetHighRange();
28 m_midRange = emcPara.GetMidRange();
29 m_lowRange = emcPara.GetLowRange();
30 m_sampleTime = emcPara.GetSampleTime();
31 m_peakTime = emcPara.GetPeakTime();
32 m_timeOffset = emcPara.GetTimeOffset();
33 m_bitNb = emcPara.GetADCbit();
34 m_photonsPerMeV = emcPara.GetPhotonsPerMeV();
35 m_nonuniformity = emcPara.GetNonuniformity();
36 m_flag = -1;
37 m_highPrecision = m_highRange / ( (G4double)( 1 << m_bitNb ) );
38 m_midPrecision = m_midRange / ( (G4double)( 1 << m_bitNb ) );
39 m_lowPrecision = m_lowRange / ( (G4double)( 1 << m_bitNb ) );
40 emcWave = new G4double[array_size];
41
42 for ( G4long i = 0; i < array_size; i++ ) emcWave[i] = 0;
43}
44
45BesEmcWaveform::BesEmcWaveform( G4long size, G4double tau, G4double sampleTime )
46 : m_tau( tau ), m_sampleTime( sampleTime ) {
47 if ( size > 0 )
48 {
49 array_size = size;
50 emcWave = new G4double[array_size];
51 G4double* init = emcWave + array_size;
52 while ( init != emcWave ) *--init = 0.0;
53 }
54 else
55 {
56 G4cout << "BesEmcWaveform:: Invalid size" << G4endl;
57 exit( -1 );
58 }
59}
60
61// Destructors
63 delete[] emcWave;
64 emcWave = 0;
65}
66
67// Operators
68BesEmcWaveform& BesEmcWaveform::operator*=( const G4double& scale ) {
69 for ( G4long i = 0; i < array_size; i++ ) emcWave[i] *= scale;
70 return *this;
71}
72
73BesEmcWaveform& BesEmcWaveform::operator/=( const G4double& scale ) {
74 for ( G4long i = 0; i < array_size; i++ ) emcWave[i] /= scale;
75 return *this;
76}
77
79 for ( G4long i = 0; i < array_size; i++ ) emcWave[i] += assign[i];
80 return *this;
81}
82
84 if ( this != &assign )
85 {
86 if ( emcWave != 0 ) delete[] emcWave;
87 emcWave = new G4double[assign.array_size];
88 array_size = assign.array_size;
89 for ( G4long i = 0; i < array_size; i++ ) emcWave[i] = assign[i];
90 }
91 return *this;
92}
93
94G4double BesEmcWaveform::max( G4long& binOfMax ) const {
95 G4double maxi = emcWave[0];
96 binOfMax = 0;
97 for ( G4long i = 1; i < array_size; i++ )
98 {
99 if ( emcWave[i] > maxi )
100 {
101 maxi = emcWave[i];
102 binOfMax = i;
103 }
104 }
105 return maxi;
106}
107
109 G4double energy = hit->GetEdepCrystal();
110 G4double time = hit->GetTimeCrystal();
111
113}
114
116 G4double energy = digi->GetEnergy();
117 G4double time = digi->GetTime() * m_sampleTime + m_timeOffset - m_peakTime;
118
120}
121
122void BesEmcWaveform::makeWaveform( G4double energy, G4double time ) {
123 G4double amplitude;
124 if ( m_photonsPerMeV == 0 ) { amplitude = energy; }
125 else
126 {
127 G4double photons = energy * m_photonsPerMeV;
128 if ( photons > 0 )
129 {
130 G4double photonStatFactor = RandGauss::shoot( photons, sqrt( photons ) ) / photons;
131 amplitude = energy * photonStatFactor;
132 }
133 else { amplitude = 0; }
134 }
135
136 G4double tempTime;
137 tempTime = 0;
138
139 G4double peak =
140 m_peakTime * m_peakTime * m_peakTime * m_peakTime * exp( -m_peakTime / m_tau ) / 24;
141
142 for ( G4long i = 0; i < array_size; i++ )
143 {
144 tempTime = i * m_sampleTime + m_timeOffset - time;
145 if ( tempTime > 0 )
146 emcWave[i] += amplitude * tempTime * tempTime * tempTime * tempTime *
147 exp( -tempTime / m_tau ) / ( 24 * peak );
148 }
149}
150
152 G4double oneBitResolution;
153 oneBitResolution = m_midRange * 2 / ( (G4double)( 1 << m_bitNb ) ); // not used now
154 G4double energy;
155
156 for ( G4long i = 0; i < array_size; i++ )
157 {
158 energy = emcWave[i];
159 if ( energy > m_highRange )
160 G4cout << "---In BesEmcWaveform: Over measurement!--- energy=" << energy << G4endl;
161 else if ( energy > m_midRange )
162 {
163 m_flag = 2;
164 emcWave[i] = (G4double)( (G4long)( emcWave[i] / m_highPrecision ) ) * m_highPrecision;
165 }
166 else if ( energy > m_lowRange )
167 {
168 m_flag = 1;
169 emcWave[i] = (G4double)( (G4long)( emcWave[i] / m_midPrecision ) ) * m_midPrecision;
170 }
171 else
172 {
173 m_flag = 0;
174 emcWave[i] = (G4double)( (G4long)( emcWave[i] / m_lowPrecision ) ) * m_lowPrecision;
175 }
176 }
177}
178
180 G4cout << "New Wave!" << G4endl;
181 for ( G4long i = 0; i < array_size; i++ ) G4cout << emcWave[i] << "\t";
182 G4cout << G4endl;
183}
184
185void BesEmcWaveform::addElecNoise( G4double width, G4double coherentNoise ) {
186 for ( G4int i = 0; i < array_size; i++ )
187 {
188 emcWave[i] += RandGauss::shoot() * width;
189 emcWave[i] += coherentNoise;
190 emcWave[i] = emcWave[i] > 0 ? emcWave[i] : 0;
191 }
192}
Double_t time
EvtComplex exp(const EvtComplex &c)
************Class m_ypar INTEGER m_KeyWgt INTEGER m_KeyIHVP INTEGER m_KeyGPS INTEGER m_IsBeamPolarized INTEGER m_EvtGenInterface DOUBLE PRECISION m_Emin DOUBLE PRECISION m_sphot DOUBLE PRECISION m_Xenph DOUBLE PRECISION m_q2 DOUBLE PRECISION m_PolBeam2 DOUBLE PRECISION m_xErrPb *COMMON c_KK2f $ !CMS energy average $ !Spin Polarization vector first beam $ !Spin Polarization vector second beam $ !Beam energy spread[GeV] $ !minimum hadronization energy[GeV] $ !input READ never touch them !$ !debug facility $ !maximum weight $ !inverse alfaQED $ !minimum real photon energy
Definition KK2f.h:50
static BesEmcParameter & GetInstance()
virtual BesEmcWaveform & operator/=(const G4double &)
virtual ~BesEmcWaveform()
void updateWaveform(BesEmcHit *)
virtual BesEmcWaveform & operator+=(const BesEmcWaveform &)
void makeWaveform(G4double energy, G4double time)
void addElecNoise(G4double, G4double)
virtual BesEmcWaveform & operator=(const BesEmcWaveform &)
virtual BesEmcWaveform & operator*=(const G4double &)
G4double max(G4long &binOfMax) const