00001
00016 #ifndef ESPMTEFFECTPULSETOOL_H
00017 #define ESPMTEFFECTPULSETOOL_H 1
00018
00019 #include "ElecSim/IEsPulseTool.h"
00020 #include "Event/ElecPmtPulse.h"
00021 #include "GaudiAlg/GaudiTool.h"
00022 #include "GaudiKernel/IRndmGenSvc.h"
00023 #include "GaudiKernel/RndmGenerators.h"
00024 #include "DataSvc/ICableSvc.h"
00025 #include "DataSvc/ISimDataSvc.h"
00026 #include "Context/TimeStamp.h"
00027
00028 namespace DayaBay{
00029 class SimHitCollection;
00030 class ElecPulseCollection;
00031 }
00032
00033 class EsPmtEffectPulseTool : public GaudiTool , virtual public IEsPulseTool
00034 {
00035 public:
00036
00037 EsPmtEffectPulseTool(const std::string& type,
00038 const std::string& name,
00039 const IInterface* parent);
00040
00041 virtual ~EsPmtEffectPulseTool();
00042
00043 virtual StatusCode generatePulses(DayaBay::SimHitCollection*,
00044 DayaBay::ElecPulseCollection*);
00045 virtual StatusCode initialize();
00046 virtual StatusCode finalize();
00047
00048 private:
00049
00050
00051 std::string m_cableSvcName;
00052
00053
00054
00055 std::string m_simDataSvcName;
00056
00057
00058
00059
00060 std::vector<double> m_prePulsePdf;
00061 std::vector<double> m_prePulseEdges;
00062 std::vector<double> m_afterPulsePdf;
00063 std::vector<double> m_afterPulseEdges;
00064 std::vector<double> m_afterPulseTime;
00065
00066 bool m_enablePrePulse;
00067 bool m_enableAfterPulse;
00068
00069
00070
00071
00072 std::string m_afterPulseAmpMode;
00073 std::string m_darkPulseAmpMode;
00074
00075
00076 std::vector<double> m_afterPulseAmpPdf;
00077 std::vector<double> m_afterPulseAmpEdges;
00078
00079
00080
00081 bool m_enableNonlinearAfterpulse;
00082
00083
00084 double m_linearAfterpulseThreshold;
00085
00086
00087
00088 bool m_enableVeryLongTimeSuppression;
00089
00090
00091 double m_veryLongTime;
00092
00093
00094 double m_expWeight;
00095
00096 double m_speExpDecay;
00097 double m_speCutoff;
00098
00099
00100 ICableSvc *m_cableSvc;
00101
00102 ISimDataSvc *m_simDataSvc;
00103
00104
00105 Rndm::Numbers m_uni,m_gauss,m_exp;
00106 Rndm::Numbers m_randPrePulseTime,m_randAfterPulseTime;
00107
00108
00109 TimeStamp m_simTimeEarliest;
00110 TimeStamp m_simTimeLatest;
00111
00112
00113 double m_timeInterval;
00114
00115 DayaBay::ElecPulse* makePrePulse (DayaBay::ElecPulse* simpulse,
00116 const DayaBay::PmtSimData& pmtData);
00117 DayaBay::ElecPulse* makeAfterPulse(DayaBay::ElecPulse* simpulse,
00118 const DayaBay::PmtSimData& pmtData);
00119 DayaBay::ElecPulse* makeDarkPulse (const DayaBay::ElecChannelId& channelId,
00120 const DayaBay::PmtSimData& pmtData);
00121 float PulseAmp(float weight, float gain, float gainFwhm);
00122 double ConvertPdfRand(double rand, std::vector<double> pdf, std::vector<double> edges);
00123 double ConvertPdfRand01(double rand, std::vector<double> pdf, std::vector<double> edges);
00124 int PoissonRand(double mean);
00125
00126 double NumAfterPulse(const int numPmtHit);
00127
00128 void getAfterPulseAmpPdf(std::vector<double>& pdf);
00129 void getAfterPulseAmpEdges(std::vector<double>& edges);
00130 };
00131
00132 #endif // ESPMTEFFECTPULSETOOL_H
00133
00134