00001 //---------------------------------------------------------------------------// 00002 // BOOST --- BESIII Object_Oriented Simulation Tool // 00003 //---------------------------------------------------------------------------// 00004 //Description: 00005 //Author: Hemiao 00006 //Created: Oct 25, 2004 00007 //Modified: 00008 //Comment: 00009 //---------------------------------------------------------------------------// 00010 // $Id: EmcWaveform.cxx 00011 00012 #include "EmcWaveform/EmcWaveform.h" 00013 #include <math.h> 00014 00015 // Constructors 00016 00017 EmcWaveform::EmcWaveform() 00018 { 00019 array_size = 60; 00020 m_tau = 1000.; 00021 m_sampleTime = 50.; 00022 m_peakTime = 4000.; 00023 m_timeOffset = 2500.; 00024 emcWave=new double[array_size]; 00025 00026 for (int i=0; i<array_size;i++) 00027 emcWave[i]=0; 00028 } 00029 00030 EmcWaveform::EmcWaveform(int size, double tau, double sampleTime) 00031 :m_tau(tau),m_sampleTime(sampleTime) 00032 { 00033 if(size>0){ 00034 array_size=size; 00035 emcWave=new double[array_size]; 00036 double *init=emcWave+array_size; 00037 while(init!=emcWave) *--init=0.0; 00038 } 00039 } 00040 00041 // Destructors 00042 EmcWaveform::~EmcWaveform(){ 00043 delete [] emcWave; 00044 emcWave=0; 00045 } 00046 00047 // Operators 00048 EmcWaveform &EmcWaveform::operator*=(const double scale) 00049 { 00050 for (int i=0; i<array_size;i++) emcWave[i]*=scale; 00051 return *this; 00052 } 00053 00054 EmcWaveform &EmcWaveform::operator/=(const double scale) 00055 { 00056 for (int i=0; i<array_size;i++) emcWave[i]/=scale; 00057 return *this; 00058 } 00059 00060 EmcWaveform &EmcWaveform::operator+=(const EmcWaveform &assign) 00061 { 00062 for (int i=0; i<array_size;i++) emcWave[i]+=assign[i]; 00063 return *this; 00064 } 00065 00066 EmcWaveform &EmcWaveform::operator=(const EmcWaveform &assign) 00067 { 00068 if (this != &assign) { 00069 if (emcWave!=0) delete [] emcWave; 00070 emcWave=new double[assign.array_size]; 00071 array_size=assign.array_size; 00072 for (int i=0;i<array_size;i++) emcWave[i]=assign[i]; 00073 } 00074 return *this; 00075 } 00076 00077 double EmcWaveform::max(int &binOfMax) const 00078 { 00079 double maxi=emcWave[0]; 00080 binOfMax = 0; 00081 for (int i=1;i<array_size;i++) 00082 { 00083 if (emcWave[i]>maxi) 00084 { 00085 maxi=emcWave[i]; 00086 binOfMax = i; 00087 } 00088 } 00089 return maxi; 00090 } 00091 00092 double EmcWaveform::getADCTrg(int time) 00093 { 00094 double adc = emcWave[0]; 00095 for(int i = 0; i < array_size; i++) { 00096 if(time >= i*m_sampleTime && time < (i+1)*m_sampleTime) adc = emcWave[i]; 00097 } 00098 return adc; 00099 } 00100 00101 int EmcWaveform::frontEdgeTrg(double thres) 00102 { 00103 int binOfMax = -1; 00104 for (int i=0;i<array_size;i++) 00105 { 00106 if (emcWave[i]>thres) 00107 { 00108 binOfMax = i; 00109 break; 00110 } 00111 } 00112 return binOfMax; 00113 } 00114 00115 void EmcWaveform::makeWaveformTrg(double energy, double time) 00116 { 00117 double time0 = time*m_sampleTime+m_timeOffset-m_peakTime; //start time 00118 double tempTime = 0; //time for each bin 00119 00120 double peak = m_peakTime*m_peakTime*m_peakTime*m_peakTime*exp(-m_peakTime/m_tau)/24; 00121 00122 for (int i=0;i<array_size;i++) 00123 { 00124 tempTime = i*m_sampleTime + m_timeOffset - time0; 00125 if(tempTime>0) 00126 emcWave[i] += 00127 energy*tempTime*tempTime*tempTime*tempTime*exp(-tempTime/m_tau)/(24*peak); 00128 } 00129 } 00130 00131 void EmcWaveform::makeWaveform(double energy, double time) 00132 { 00133 double time0 = time*m_sampleTime+m_timeOffset-m_peakTime; //start time 00134 double tempTime = 0; //time for each bin 00135 00136 double peak = m_peakTime*m_peakTime*m_peakTime*m_peakTime*exp(-m_peakTime/m_tau)/24; 00137 00138 for (int i=0;i<array_size;i++) 00139 { 00140 tempTime = i*m_sampleTime + m_timeOffset - time0; 00141 if(tempTime>0) 00142 emcWave[i] += 00143 energy*tempTime*tempTime*tempTime*tempTime*exp(-tempTime/m_tau)/(24*peak); 00144 } 00145 } 00146 00147 void EmcWaveform::print() 00148 { 00149 cout<<"New Wave!"<<endl; 00150 for(int i=0;i<array_size;i++) 00151 cout<<emcWave[i]<<"\t"; 00152 cout<<endl; 00153 }