////////////////////////////////////////////////////////////////////////
// $Id: PulserTimeCalScheme.h,v 1.10 2006/04/18 13:21:03 cpw1 Exp $
//
// Calibrator scheme for doing both LI hardware correction
// and muon correction.
//
// Inherits from the plain-old TimeCalScheme.
//
// n.tagg1@physics.ox.ac.uk rjn@hep.ucl.ac.uk
////////////////////////////////////////////////////////////////////////
#ifndef PULSERTIMECALSCHEME_H
#define PULSERTIMECALSCHEME_H

#include "TimeCalScheme.h"
#include "DatabaseInterface/DbiResultPtr.h"
#include "Calibrator/CalTimeCalibration.h"
#include "PulserCalibration/PulserTimeDrift.h"
#include "PulserCalibration/PulserTimingCardSetting.h"
#include "CalTimeJump.h"

const int kMaxLeds = 3;

class PulserTimeCalScheme : public CalScheme
{
public:
   PulserTimeCalScheme(); // Class constructor

   virtual void DoReset( const VldContext& context );
   virtual void ConfigModified();
   virtual void PrintConfig( std::ostream& os ) const;
 
   virtual  DoubleErr GetCalibratedTime(DoubleErr rawtime, FloatErr rawcharge,     const PlexStripEndId& seid) const;      
   virtual  DoubleErr DecalTime(DoubleErr caltime, FloatErr rawcharge,  const PlexStripEndId& seid) const;      
  
   
 private:
   // Config:
   Int_t    fUseMuonCalibration;
   Int_t    fMuonTask;
   Int_t    fUseShieldCalibration;
   Int_t    fUseJumps;
   Int_t    fJumpTask;
   Int_t    fUsePulserCalibration;
   Int_t    fDoWalkCorrection;
   Int_t    fPulserLed[kMaxLeds];
   Double_t fDefaultTimingCardSetting;
   Double_t fOverallOffset;
   VldTimeStamp fReferenceTime;

   // Muon calibration data:
   DbiResultPtr<CalTimeCalibration>      fMuonResPtr;
   DbiResultPtr<CalTimeCalibration>      fShieldResPtr;

   // By-hand timing jumps:
   DbiResultPtr<CalTimeJump>             fJumpResPtr;

   // Data for timing drift by LI
   DbiResultPtr<PulserTimeDrift>         fDriftPtr[kMaxLeds];
   DbiResultPtr<PulserTimeDrift>         fDriftRefPtr[kMaxLeds];

   // Data for timing card settings at time of LI drift data
   DbiResultPtr<PulserTimingCardSetting> fTimingCardResPtr;
   DbiResultPtr<PulserTimingCardSetting> fTimingCardReferencePtr;


   // Methods:
   DoubleErr CalibrateByJumps (DoubleErr caltime, const RawChannelId& rcid,Bool_t calibrate) const;
   DoubleErr CalibrateByPulser(DoubleErr rawtime, const RawChannelId& rcid,Bool_t calibrate) const;
   DoubleErr CalibrateByMuon  (DoubleErr caltime, const PlexStripEndId& seid,Bool_t calibrate) const;
   DoubleErr WalkCorrection   (FloatErr rawcharge, const PlexStripEndId& seid ) const;
   DoubleErr CalibrateShield  (DoubleErr rawtime, FloatErr rawcharge, const PlexStripEndId& sied, Bool_t calibrate) const;

   // Pulser calibration utility:
   Bool_t   GetPulserCalibration(Int_t iled, UInt_t index,
				 const PulserTimeDrift* &drift, 
				 const PulserTimeDrift* &ref) const;
   
   ClassDef(PulserTimeCalScheme,0);
};

#endif                                      // TIMECALSCHEME_H



































