00001 #include "QsumEnergyTool.h"
00002
00003 #include "Event/CalibReadout.h"
00004 #include "Event/CalibReadoutPmtCrate.h"
00005 #include "Event/CalibReadoutPmtChannel.h"
00006 #include "Event/RecTrigger.h"
00007 #include "Conventions/Reconstruction.h"
00008 #include "Conventions/Detectors.h"
00009
00010 #include "DataSvc/ICableSvc.h"
00011 #include "DataSvc/ICalibDataSvc.h"
00012
00013 using namespace DayaBay;
00014
00015 QsumEnergyTool::QsumEnergyTool(const std::string& type,
00016 const std::string& name,
00017 const IInterface* parent)
00018 : GaudiTool(type,name,parent)
00019 , m_cableSvc(0)
00020 , m_calibDataSvc(0)
00021 {
00022 declareInterface< IReconTool >(this) ;
00023 declareProperty("CableSvcName",m_cableSvcName="StaticCableSvc",
00024 "Name of service to map between detector, hardware, and electronic IDs");
00025 declareProperty("CalibDataSvcName", m_calibDataSvcName="StaticCalibDataSvc",
00026 "Name of calibration data service");
00027 }
00028
00029 QsumEnergyTool::~QsumEnergyTool(){}
00030
00031 StatusCode QsumEnergyTool::initialize()
00032 {
00033
00034 m_cableSvc = svc<ICableSvc>(m_cableSvcName,true);
00035 m_calibDataSvc = svc<ICalibDataSvc>(m_calibDataSvcName,true);
00036
00037 return StatusCode::SUCCESS;
00038 }
00039
00040 StatusCode QsumEnergyTool::finalize()
00041 {
00042 return StatusCode::SUCCESS;
00043 }
00044
00045 StatusCode QsumEnergyTool::reconstruct(const CalibReadout& readout,
00046 RecTrigger& recTrigger)
00047 {
00048 if( !readout.detector().isAD() ){
00049 debug() << "Not an AD readout; ignoring detector "
00050 << readout.detector().detName() << endreq;
00051 recTrigger.setEnergyStatus( ReconStatus::kNotProcessed );
00052 return StatusCode::SUCCESS;
00053 }
00054
00055 const CalibReadoutPmtCrate* pmtReadout
00056 = dynamic_cast<const CalibReadoutPmtCrate*>(&readout);
00057 if(!pmtReadout){
00058 error() << "Incorrect type of readout crate for detector "
00059 << readout.detector().detName() << endreq;
00060 recTrigger.setEnergyStatus( ReconStatus::kBadReadout );
00061 return StatusCode::FAILURE;
00062 }
00063
00064
00065 int task = 0;
00066 ServiceMode svcMode(readout.header()->context(), task);
00067
00068
00069 double qSum = 0;
00070 double qSquareSum = 0;
00071 int nHits = 0;
00072 CalibReadoutPmtCrate::PmtChannelReadouts::const_iterator chanIter,
00073 chanEnd = pmtReadout->channelReadout().end();
00074 for(chanIter=pmtReadout->channelReadout().begin(); chanIter != chanEnd;
00075 chanIter++){
00076 const CalibReadoutPmtChannel& channel = *chanIter;
00077 AdPmtSensor pmtId(channel.pmtSensorId().fullPackedData());
00078
00079 if( pmtId.ring()<1 ){ continue; }
00080 const PmtCalibData* pmtCalib = m_calibDataSvc->pmtCalibData(pmtId, svcMode);
00081 if( !pmtCalib ){
00082 error() << "No calibration data for pmt ID: " << pmtId << endreq;
00083 recTrigger.setEnergyStatus( ReconStatus::kBadReadout );
00084 return StatusCode::FAILURE;
00085 }
00086 if( pmtCalib->m_status != PmtCalibData::kGood ) { continue; }
00087 double peakAdc = channel.maxCharge();
00088 qSum += peakAdc;
00089 qSquareSum += peakAdc*peakAdc;
00090 nHits++;
00091 }
00092
00093 if(nHits<1){
00094 recTrigger.setEnergyStatus( ReconStatus::kNoHits );
00095 return StatusCode::SUCCESS;
00096 }
00097
00098 double pePerMeV = 116.0;
00099 double energy = qSum / pePerMeV;
00100 recTrigger.setEnergy( energy );
00101
00102 recTrigger.setEnergyQuality(sqrt((qSquareSum - qSum*qSum/nHits)/(nHits-1)));
00103 recTrigger.setEnergyStatus( ReconStatus::kGood );
00104
00105 return StatusCode::SUCCESS;
00106 }