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

In This Package:

FloatingDaqFeePedestalSvc.cc

Go to the documentation of this file.
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,  // 100 us
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 // Record the preAdc value from past events,                                                                              
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       // check for rpc's sneaking in
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 // Return the FEE Calibration data
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 }
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:29:21 2011 for FloatingFeePedestalSvc by doxygen 1.4.7