| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

QsumLinearityEnergyTool.cc

Go to the documentation of this file.
00001 #include "QsumLinearityEnergyTool.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 QsumLinearityEnergyTool::QsumLinearityEnergyTool(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 QsumLinearityEnergyTool::~QsumLinearityEnergyTool(){}
00030 
00031 StatusCode QsumLinearityEnergyTool::initialize()
00032 {
00033   // Get Cable Service
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 QsumLinearityEnergyTool::finalize()
00041 {
00042   return StatusCode::SUCCESS;
00043 }
00044 
00045 StatusCode QsumLinearityEnergyTool::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   // Context for this data
00065   int task = 0;
00066   ServiceMode svcMode(readout.header()->context(), task);
00067 
00068   // Loop over hits and add up charge
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     //AdPmtSensor pmtId = m_cableSvc->adPmtSensor(channel.channelId(), svcMode);
00079     if( pmtId.ring()<1 ){ continue; }  // Ignore calibration pmts
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         //the next constant value is based on the results of DYB-doc-4061
00099   //PE=133.1*Energy-10.7
00100   double indexPEtoEnergy = 133.1; // FIXME: add to calibration data service
00101   double interceptOfLinearity=10.7; // the intercept of the linearity fitting;
00102                                                                                                                                                 //FIXME: add to calibration data service
00103   double energy = (qSum +interceptOfLinearity)/ indexPEtoEnergy;
00104 
00105   
00106   recTrigger.setEnergy( energy );
00107   // Set quality to standard deviation of hits
00108   recTrigger.setEnergyQuality(sqrt((qSquareSum - qSum*qSum/nHits)/(nHits-1)));
00109   recTrigger.setEnergyStatus( ReconStatus::kGood );
00110 
00111   return StatusCode::SUCCESS;
00112 }
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:42:11 2011 for QsumLinearityEnergy by doxygen 1.4.7