00001 /* 00002 * PmtCalibFullModel.h 00003 * 00004 * Generate calibration fit parameters from PMT data 00005 * 00006 * This method uses the leading edge of the signals on each channel 00007 * to determine timing offsets. 00008 * and use the PMT full response model to get the PMT gain, from NIM A339 (1994) 468-476 00009 * and to determine the relative efficiency of each channel 00010 * 00011 * wangzhm@ihep.ac.cn 2009/11/29 00012 */ 00013 00014 #ifndef PMTCALIBFULLMODEL_H 00015 #define PMTCALIBFULLMODEL_H 00016 00017 #include "CalibParam/IPmtCalibParamTool.h" 00018 #include "GaudiAlg/GaudiTool.h" 00019 #include "Conventions/Electronics.h" 00020 #include "Conventions/Detectors.h" 00021 #include "Context/Context.h" 00022 #include <string> 00023 #include <vector> 00024 #include "FloatingFeePedestalSvc/IFloatingFeePedestalSvc.h" 00025 00026 namespace DayaBay{ 00027 class ReadoutHeader; 00028 } 00029 00030 class IStatisticsSvc; 00031 class ICableSvc; 00032 class ICalibDataSvc; 00033 00034 /* 00035 // Statistics container class for one PMT channel 00036 class PmtStatsOneChannelLE { 00037 public: 00038 PmtStatsOneChannelLE(const DayaBay::FeeChannelId& channelId) 00039 { m_channelId = channelId; m_nHits = 0; m_tdcRaw=0; m_tdcByMedian=0; 00040 m_adcRaw=0; m_adc=0; m_adcByClock=0;} 00041 ~PmtStatsOneChannelLE(){;} 00042 public: 00043 DayaBay::FeeChannelId m_channelId; 00044 DayaBay::AdPmtSensor m_pmtId; 00045 int m_nHits; 00046 TH1F* m_tdcRaw; 00047 TH1F* m_tdcByMedian; 00048 TH1F* m_adcRaw; 00049 TH1F* m_adc; 00050 TH1F* m_adcByClock; 00051 }; 00052 00053 // Statistics container class for one detector 00054 class PmtStatsLE { 00055 public: 00056 PmtStatsLE(const DayaBay::Detector& detector){m_detector=detector; 00057 m_nReadouts=0;} 00058 ~PmtStatsLE(){;} 00059 public: 00060 DayaBay::Detector m_detector; 00061 std::map<DayaBay::FeeChannelId,PmtStatsOneChannelLE*> m_channel; 00062 int m_nReadouts; 00063 TH1F* m_adcSum; 00064 TH1F* m_tdcMedian; 00065 std::map<int, TH1F*> m_occupancy; 00066 std::map<int, TH1F*> m_tdcOffset; 00067 std::map<int, TH1F*> m_adcMedian; 00068 std::map<int, TH1F*> m_adcSigma; 00069 }; 00070 */ 00071 00072 class PmtCalibFullModel : public GaudiTool, virtual public IPmtCalibParamTool 00073 { 00074 public: 00075 PmtCalibFullModel(const std::string& type, 00076 const std::string& name, 00077 const IInterface* parent); 00078 00079 virtual ~PmtCalibFullModel(); 00080 00081 virtual StatusCode initialize(); 00082 virtual StatusCode finalize(); 00083 00085 00088 virtual StatusCode process(const DayaBay::ReadoutHeader& readout); 00089 00093 virtual StatusCode calibrate(); 00094 00095 private: 00097 bool hasStats(const DayaBay::Detector& detector); 00099 StatusCode prepareStats(const Context& context); 00100 00101 // Format path to detector statistics 00102 std::string getPath(const DayaBay::Detector& detector); 00103 // Format path to detector, ring statistics 00104 std::string getPath(const DayaBay::Detector& detector, int ring); 00105 // Format path to channel statistics 00106 std::string getPath(const DayaBay::FeeChannelId& channelId); 00107 00108 private: 00109 00110 // Property CableSvcName - Name of the cable service 00111 std::string m_cableSvcName; 00112 00113 // Property CalibSvcName - Name of the calibration service 00114 std::string m_calibSvcName; 00115 00116 // Property FloatingFeePedesSvcName - Name of floating fee pedestal service 00117 std::string m_floatFeePedesSvcName; 00118 00119 // Property FilePath - File path of registered histograms 00120 std::string m_filepath; 00121 00122 // CableSvc 00123 ICableSvc *m_cableSvc; 00124 00125 // CalibSvc 00126 ICalibDataSvc *m_calibSvc; 00127 00128 // IStatisticsSvc 00129 IStatisticsSvc *m_statsSvc; 00130 00131 // IFloatingFeePedestalSvc; 00132 IFloatingFeePedestalSvc *m_floatFeePedesSvc; 00133 00134 // Use FloatFeePedes or not? In case of flase, it will use CalibSvc. 00135 bool m_useFloatFeePedes; 00136 00137 // Cached list of processed detectors 00138 std::vector<DayaBay::Detector> m_processedDetectors; 00139 }; 00140 00141 #endif // PMTCALIBFULLMODEL_H