00001
00006 #include "FloatingDaqFeePedestalSvc.h"
00007 #include "Event/ReadoutPmtCrate.h"
00008 #include "Event/ReadoutPmtChannel.h"
00009 #include "Event/Readout.h"
00010 #include "Event/ReadoutHeader.h"
00011
00012 #include "Conventions/Electronics.h"
00013 #include "Context/TimeStamp.h"
00014
00015 using namespace std;
00016 using namespace DayaBay;
00017
00018 FloatingDaqFeePedestalSvc::FloatingDaqFeePedestalSvc(const std::string& name, ISvcLocator *svc)
00019 : Service(name,svc)
00020 {
00021 declareProperty("Limit",m_limit=500,
00022 "Number of preAdcs to document");
00023
00024 declareProperty("TimeCutInSec",m_timeCutInSec=0.0001,
00025 "Time cut in second to remove afterpulses");
00026 }
00027
00028 FloatingDaqFeePedestalSvc::~FloatingDaqFeePedestalSvc()
00029 {
00030 }
00031
00032 StatusCode FloatingDaqFeePedestalSvc::initialize()
00033 {
00034 StatusCode sc;
00035 sc = this->Service::initialize();
00036
00037 m_finePreAdc.clear();
00038 m_crsePreAdc.clear();
00039
00040 m_finePedes.clear();
00041 m_crsePedes.clear();
00042
00043 m_lastTrig = TimeStamp::GetBOT();
00044
00045 return sc;
00046 }
00047
00048 StatusCode FloatingDaqFeePedestalSvc::finalize()
00049 {
00050 StatusCode sc;
00051 sc = this->Service::finalize();
00052
00053 return sc;
00054 }
00055
00056 StatusCode FloatingDaqFeePedestalSvc::queryInterface(const InterfaceID& riid,
00057 void** ppvInterface)
00058 {
00059 StatusCode sc = StatusCode::FAILURE;
00060 if (ppvInterface) {
00061 *ppvInterface = 0;
00062
00063 if (IFloatingFeePedestalSvc::interfaceID().versionMatch(riid)) {
00064 *ppvInterface = static_cast<IFloatingFeePedestalSvc*>(this);
00065 sc = StatusCode::SUCCESS;
00066 addRef();
00067 }
00068 else sc = Service::queryInterface( riid, ppvInterface );
00069 }
00070 return sc;
00071 }
00072
00073
00074 StatusCode FloatingDaqFeePedestalSvc::cumulate( const DayaBay::ReadoutHeader* rh )
00075 {
00076 MsgStream log(msgSvc(), "FloatingFeePedestalSvc");
00077
00078 const DaqCrate* daqCrate = rh->daqCrate();
00079 if(!daqCrate) {
00080 log << MSG::ERROR <<"Failed to get daqCrate from header"<<endreq;
00081 return StatusCode::FAILURE;
00082 }
00083
00085
00086 if( ! (daqCrate->detector().isAD() || daqCrate->detector().isWaterShield() ) ) {
00087 return StatusCode::SUCCESS;
00088 }
00089
00091 TimeStamp trigTime = daqCrate->triggerTime();
00092
00094 if( (m_lastTrig == TimeStamp::GetBOT()) ||
00095 ((trigTime-m_lastTrig).GetSeconds() > m_timeCutInSec) ) {
00096
00098 const DaqPmtCrate* pPmtCrate=daqCrate->asPmtCrate();
00099 if(!pPmtCrate) {
00100 log << MSG::ERROR <<"Failed to get ReadoutPmtCrate"<<endreq;
00101 return StatusCode::FAILURE;
00102 }
00103
00105 DaqPmtCrate::PmtChannelPtrList channels = pPmtCrate->pmtChannelReadouts();
00106 DaqPmtCrate::PmtChannelPtrList::iterator ci, ci_end = channels.end();
00107
00108 for(ci = channels.begin(); ci!=ci_end; ci++) {
00109
00111 DaqPmtChannel *channel = *ci;
00112 FeeChannelId channelId = channel->channelId();
00113
00114 float preAdc = channel->preAdcAvg(0);
00115 int range = channel->isHighGainAdc(0) ? FeeGain::kHigh
00116 : FeeGain::kLow ;
00117
00119 if( range == FeeGain::kHigh ) {
00120 list<float>& preAdcs = m_finePreAdc[ channelId ];
00121 m_finePedes[ channelId ] = updatePedestal( preAdcs, preAdc );
00122 }
00123 if( range == FeeGain::kLow ) {
00124 list<float>& preAdcs = m_crsePreAdc[ channelId ];
00125 m_crsePedes[ channelId ] = updatePedestal( preAdcs, preAdc );
00126 }
00127 }
00128
00129 m_lastTrig = trigTime;
00130 }
00131
00132 return StatusCode::SUCCESS;
00133 }
00134
00135
00136 double FloatingDaqFeePedestalSvc::pedestal( const DayaBay::FeeChannelId& channelId,
00137 int gain ) const
00138 {
00139 MsgStream log(msgSvc(), "FloatingDaqFeePedestalSvc");
00140
00141 if( gain==FeeGain::kHigh ) {
00142 PedestalArray::const_iterator ci;
00143 ci = m_finePedes.find( channelId );
00144 if( ci != m_finePedes.end() ) {
00145 return ci->second;
00146 } else {
00147 log << MSG::WARNING <<"Incomplete fine range pedestal map. Try preADC."<<endreq;
00148 return -1000;
00149 }
00150 }
00151
00152 if( gain==FeeGain::kLow ) {
00153 PedestalArray::const_iterator ci;
00154 ci = m_crsePedes.find( channelId );
00155 if( ci != m_crsePedes.end() ) {
00156 return ci->second;
00157 } else {
00158 log << MSG::WARNING <<"Incomplete coarse range pedestal map. Try preADC."<<endreq;
00159 return -1000;
00160 }
00161 }
00162
00163 log << MSG::ERROR <<"Query with wrong gain parameter"<<endreq;
00164 return -1000;
00165 }
00166
00167 double FloatingDaqFeePedestalSvc::updatePedestal( list<float>& PreAdcs, float newPreAdc )
00168 {
00170 PreAdcs.push_front( newPreAdc );
00171 if( PreAdcs.size()>m_limit ) PreAdcs.pop_back();
00172
00173 double sum=0;
00174 int count = PreAdcs.size();
00175 list<float>::iterator li,liend=PreAdcs.end();
00176 for( li=PreAdcs.begin(); li!=liend; li++ ) {
00177 sum+= (*li);
00178 }
00179
00180 sum = sum/count;
00181
00182 return sum;
00183 }