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

In This Package:

FloatingFeePedestalSvc Namespace Reference


Namespaces

namespace  __init__

Functions

 FloatingFeePedestalSvc (const std::string &name, ISvcLocator *svc)
 ~FloatingFeePedestalSvc ()
StatusCode initialize ()
StatusCode finalize ()
StatusCode queryInterface (const InterfaceID &riid, void **ppvInterface)
StatusCode cumulate (const DayaBay::ReadoutHeader *rh)
double pedestal (const DayaBay::FeeChannelId &channelId, int gain) const
double updatePedestal (list< unsigned int > &PreAdcs, unsigned int newPreAdc)

Function Documentation

FloatingFeePedestalSvc::FloatingFeePedestalSvc ( const std::string &  name,
ISvcLocator svc 
)

Definition at line 17 of file FloatingFeePedestalSvc.cc.

00018   : Service(name,svc)
00019 {
00020   declareProperty("Limit",m_limit=500,
00021                   "Number of preAdcs to document");
00022 
00023   declareProperty("TimeCutInSec",m_timeCutInSec=0.0001,  // 100 us
00024                   "Time cut in second to remove afterpulses");
00025 }

FloatingFeePedestalSvc::~FloatingFeePedestalSvc (  ) 

Definition at line 27 of file FloatingFeePedestalSvc.cc.

00028 {
00029 }

StatusCode FloatingFeePedestalSvc::initialize (  ) 

Definition at line 31 of file FloatingFeePedestalSvc.cc.

00032 {
00033   StatusCode sc;
00034   sc = this->Service::initialize();
00035 
00036   m_finePreAdc.clear();
00037   m_crsePreAdc.clear();
00038 
00039   m_finePedes.clear();
00040   m_crsePedes.clear();
00041 
00042   m_lastTrig = TimeStamp::GetBOT();
00043 
00044   return sc;
00045 }

StatusCode FloatingFeePedestalSvc::finalize (  ) 

Definition at line 47 of file FloatingFeePedestalSvc.cc.

00048 {
00049   StatusCode sc;
00050   sc = this->Service::finalize();
00051 
00052   return sc;
00053 }

StatusCode FloatingFeePedestalSvc::queryInterface ( const InterfaceID riid,
void **  ppvInterface 
)

Definition at line 55 of file FloatingFeePedestalSvc.cc.

00057 {
00058   StatusCode sc = StatusCode::FAILURE;
00059   if (ppvInterface) {
00060     *ppvInterface = 0;
00061     
00062     if (IFloatingFeePedestalSvc::interfaceID().versionMatch(riid)) {
00063       *ppvInterface = static_cast<IFloatingFeePedestalSvc*>(this);
00064       sc = StatusCode::SUCCESS;
00065       addRef();
00066     }
00067     else sc = Service::queryInterface( riid, ppvInterface );
00068   }
00069   return sc;
00070 }

StatusCode FloatingFeePedestalSvc::cumulate ( const DayaBay::ReadoutHeader rh  ) 

Definition at line 73 of file FloatingFeePedestalSvc.cc.

00074 {
00075   MsgStream log(msgSvc(), "FloatingFeePedestalSvc");
00076 
00078   const Readout* readout = rh->readout();
00079   if(!readout) {
00080     log << MSG::ERROR <<"Failed to get readout from header"<<endreq;
00081     return StatusCode::FAILURE;
00082   }
00083 
00085   if( readout->detector().detectorId() != DetectorId::kAD1 &&
00086       readout->detector().detectorId() != DetectorId::kAD2 &&
00087       readout->detector().detectorId() != DetectorId::kAD3 &&
00088       readout->detector().detectorId() != DetectorId::kAD4 &&
00089       readout->detector().detectorId() != DetectorId::kIWS &&
00090       readout->detector().detectorId() != DetectorId::kOWS ) {
00091     return StatusCode::SUCCESS;
00092   }
00093 
00095   TimeStamp trigTime = readout->triggerTime();
00096   
00098   if( (m_lastTrig == TimeStamp::GetBOT()) ||
00099       ((trigTime-m_lastTrig).GetSeconds() > m_timeCutInSec) ) {
00100     
00102     const ReadoutPmtCrate* pPmtCrate=0;
00103     pPmtCrate = dynamic_cast< const DayaBay::ReadoutPmtCrate* > ( readout );
00104     if(!pPmtCrate) {
00105       log << MSG::ERROR <<"Failed to get ReadoutPmtCrate"<<endreq;
00106       return StatusCode::FAILURE;
00107     }
00108     
00110     ReadoutPmtCrate::PmtChannelReadouts channels = pPmtCrate->channelReadout();
00111     ReadoutPmtCrate::PmtChannelReadouts::iterator ci, ci_end = channels.end();
00112 
00113     for(ci = channels.begin(); ci!=ci_end; ci++) {
00114 
00116       ReadoutPmtChannel channel = ci->second;
00117       FeeChannelId channelId = channel.channelId();
00118       
00119       int preAdc = channel.pedestal()[0];
00120       int range  = channel.adcRange()[0];
00121 
00123       if( range == FeeGain::kHigh ) {
00124         list<unsigned int>& preAdcs = m_finePreAdc[ channelId ];
00125         m_finePedes[ channelId ] = updatePedestal( preAdcs, preAdc );
00126       }
00127       if( range == FeeGain::kLow ) {
00128         list<unsigned int>& preAdcs = m_crsePreAdc[ channelId ];
00129         m_crsePedes[ channelId ] = updatePedestal( preAdcs, preAdc );
00130       }
00131     }
00132     
00133     m_lastTrig = trigTime;
00134   }
00135 
00136   return StatusCode::SUCCESS;
00137 }

double FloatingFeePedestalSvc::pedestal ( const DayaBay::FeeChannelId channelId,
int  gain 
) const

Definition at line 140 of file FloatingFeePedestalSvc.cc.

00142 {
00143   MsgStream log(msgSvc(), "FloatingFeePedestalSvc");
00144 
00145   if( gain==FeeGain::kHigh ) {
00146     PedestalArray::const_iterator ci;
00147     ci = m_finePedes.find( channelId );
00148     if( ci != m_finePedes.end() ) {
00149       return ci->second;
00150     } else {
00151       log << MSG::WARNING <<"Incomplete fine range pedestal map. Try preADC."<<endreq;
00152       return -1000;
00153     }
00154   }
00155 
00156   if( gain==FeeGain::kLow ) {
00157     PedestalArray::const_iterator ci;
00158     ci = m_crsePedes.find( channelId );
00159     if( ci != m_crsePedes.end() ) {
00160       return ci->second;
00161     } else {
00162       log << MSG::WARNING <<"Incomplete coarse range pedestal map. Try preADC."<<endreq;
00163       return -1000;
00164     }
00165   }
00166 
00167   log << MSG::ERROR <<"Query with wrong gain parameter"<<endreq;
00168   return -1000;
00169 }

double FloatingFeePedestalSvc::updatePedestal ( list< unsigned int > &  PreAdcs,
unsigned int  newPreAdc 
)

Definition at line 171 of file FloatingFeePedestalSvc.cc.

00172 {
00174   PreAdcs.push_front( newPreAdc );
00175   if( PreAdcs.size()>m_limit ) PreAdcs.pop_back();
00176 
00177   double sum=0;
00178   int count = PreAdcs.size();
00179   list<unsigned int>::iterator li,liend=PreAdcs.end();
00180   for( li=PreAdcs.begin(); li!=liend; li++ ) {
00181     sum+= (*li);
00182   }
00183   
00184   sum = sum/count;
00185   
00186   return sum;
00187 }

| 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