/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Emc/EmcWaveform/EmcWaveform-00-00-03/src/EmcWaveform.cxx

Go to the documentation of this file.
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 }

Generated on Tue Nov 29 22:58:18 2016 for BOSS_7.0.2 by  doxygen 1.4.7