Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

Calibrator.h

Go to the documentation of this file.
00001 
00002 // Calibrator
00003 //
00004 // Top-level calibrator class. Slices, dices, Julienne-fries.
00005 //
00006 // n.tagg1@physics.ox.ac.uk  N Tagg 2004, 
00007 //
00008 // Lots of code based upon older calibrator classes by Ryan Nichol, 2001
00009 //
00010 //
00011 // $Id: Calibrator.h,v 1.14 2006/05/18 04:08:41 tagg Exp $
00013 
00014 #ifndef CALIBRATOR_H
00015 #define CALIBRATOR_H
00016 
00017 #include <TObject.h>
00018 #include "CalScheme.h"
00019 #include "Validity/VldContext.h"
00020 #include "Configurable/CfgConfigurable.h"
00021 #include "Conventions/CalDigitType.h"
00022 #include "RawData/RawChannelId.h"
00023 #include "Plex/PlexStripEndId.h"
00024 #include "Plex/PlexCalib.h"
00025 #include "Plex/PlexPixelSpotId.h"
00026 #include "Plex/PlexSEIdAltLItem.h"
00027 #include <iostream>
00028 #include <cassert>
00029 
00030 class TH1;
00031 
00032 class Calibrator : public PlexCalib,
00033                    public CalScheme // The daddy of all CalSchemes.
00034 {
00035 public:
00036   // How to get a handle: 
00037   static Calibrator& Instance(); 
00038 
00039   static CalScheme& TimeCalibrator()  { return Instance().GetTimeCalibrator(); };
00040   static CalScheme& PeCalibrator()    { return Instance().GetPeCalibrator(); };
00041   static CalScheme& VALinCalibrator() { return Instance().GetVALinCalibrator(); };
00042   static CalScheme& DriftCalibrator() { return Instance().GetDriftCalibrator(); };
00043   static CalScheme& LinCalibrator()   { return Instance().GetLinCalibrator(); };
00044   static CalScheme& StripCalibrator() { return Instance().GetStripCalibrator(); };
00045   static CalScheme& AttenCalibrator() { return Instance().GetAttenCalibrator(); };
00046   static CalScheme& MIPCalibrator()   { return Instance().GetMIPCalibrator(); };
00047   static CalScheme& Thermometer()     { return Instance().GetThermometer(); };
00048 
00049   CalScheme& GetTimeCalibrator()  { return *fTimeCalibrator; };
00050   CalScheme& GetPeCalibrator()    { return *fPeCalibrator; };
00051   CalScheme& GetVALinCalibrator() { return *fVALinCalibrator; };
00052   CalScheme& GetDriftCalibrator() { return *fDriftCalibrator; };
00053   CalScheme& GetLinCalibrator()   { return *fLinCalibrator; };
00054   CalScheme& GetStripCalibrator() { return *fStripCalibrator; };
00055   CalScheme& GetAttenCalibrator() { return *fAttenCalibrator; };
00056   CalScheme& GetMIPCalibrator()   { return *fMIPCalibrator; };
00057   CalScheme& GetThermometer()     { return *fThermometer; };
00058 
00059   // Called by the DigitListModule by way of the Plex. Calibrates a strip end.
00060   PlexSEIdAltLItem CalibStripEnd(const PlexStripEndId& seid,
00061                                  const PlexPixelSpotId& spotid,
00062                                  Int_t adc, Double_t time) const;
00063   
00064    
00065   // A more useful version of GetAttenCorrected that does some complicated geometry stuff for you.
00066   FloatErr  GetAttenCorrectedTpos(FloatErr sigcorr, FloatErr lpos, const PlexStripEndId& seid) const;
00067   FloatErr  DecalAttenCorrectedTpos(FloatErr sigcorr, FloatErr lpos, const PlexStripEndId& seid) const;
00068 
00069   // These aren't really calibrations, but are useful calls
00070   // that are probably best put here.
00071   Float_t  GetTemperature(Int_t mode = 0) const;
00072 
00073   // These don't use sub-calibrators, but are coded into the Calibrator.
00074   DoubleErr GetTimeFromTDC(Int_t    tdc,  const RawChannelId& rcid) const;  
00075   Int_t     GetTDCFromTime(Double_t time, const RawChannelId& rcid) const;
00076   Double_t  GetTDCConvert(const RawChannelId&) const; // returns seconds per TDC tick
00077 
00078   
00079   // Used by the above, or used on their own:
00080   DoubleErr GetCalibratedTime(DoubleErr rawtime,  FloatErr charge,    const PlexStripEndId& seid) const;
00081   FloatErr  GetPhotoElectrons(FloatErr rawcharge,                const PlexStripEndId& seid) const;
00082   FloatErr  GetLinearizedVA(FloatErr rawcharge,                  const RawChannelId& rcid) const;
00083   FloatErr  GetDriftCorrected(FloatErr rawcharge,                const PlexStripEndId& seid) const;
00084   FloatErr  GetLinearized(FloatErr sigdrift,                     const PlexStripEndId& seid) const;
00085   FloatErr  GetStripToStripCorrected(FloatErr siglin,            const PlexStripEndId& seid) const;
00086   FloatErr  GetAttenCorrected(FloatErr sigcorr, FloatErr stripX, const PlexStripEndId& seid) const;
00087   FloatErr  GetMIP(FloatErr sigmap,                              const PlexStripEndId& seid = PlexStripEndId()) const;
00088   
00089   // Used by MC routines:
00090   DoubleErr DecalTime(DoubleErr caltime,  FloatErr charge,       const PlexStripEndId& seid) const;
00091   void      DecalGainAndWidth(FloatErr& gain, FloatErr& width,   const PlexStripEndId& seid) const;
00092   void      DecalGainAndWidth(FloatErr& gain, FloatErr& width,   const PlexPixelSpotId& psid) const;
00093   FloatErr  DecalVALinearity(FloatErr adc,                       const RawChannelId& rcid) const;
00094   FloatErr  DecalDrift(FloatErr undrifted,                       const PlexStripEndId& seid) const;
00095   FloatErr  DecalLinearity(FloatErr lin,                         const PlexStripEndId& seid) const;
00096   FloatErr  DecalStripToStrip(FloatErr sigcorr,                  const PlexStripEndId& seid) const;
00097   FloatErr  DecalAttenCorrected(FloatErr sigmap, FloatErr stripX, const PlexStripEndId& seid) const;
00098   FloatErr  DecalMIP(FloatErr sigmip,                             const PlexStripEndId& seid = PlexStripEndId()) const;
00099   
00100   // Call to set up new context (i.e. new event)
00101   void ReInitialise(const VldContext &vldc) { Reset(vldc); }; // alternate name, backwards compatability.
00102   
00103   // Configuration.
00104   const Registry& GetCompleteConfiguration() const; // Suitable for saving.
00105 
00106 
00107   // I/O. Reporting.
00108   void     SetLogLevel(Int_t lvl);  
00109   void     PrintConfig(std::ostream& os) const; // Printout of current configuration.
00110 
00111   // If you really REALLY want to, you can have your own instance.
00112   // However, this is not recommended and should be used only in special cases.
00113   static Calibrator* CreateCustomCalibrator();
00114   ~Calibrator();
00115 
00116  protected:  
00117   // Calibrator is a singleton, so ctor/dtor protected
00118   Calibrator();
00119 
00120   void DoReset(const VldContext &context);
00121   void ConfigModified();              // Perform changes the current configuration.
00122 
00123   // Factory utilities:
00124   void SetScheme(CalScheme* &scheme, const char* name);
00125   void ConfigScheme( const char* masterRegKey, CalScheme* scheme );
00126 
00127 
00128  private:
00129   // These methods are private and not implemented to prevent copying.
00130   Calibrator(const Calibrator &);
00131   void operator=(const Calibrator &);
00132   
00133   // This section sets up the singleton machinery.
00134   // Cleaner struct used to clean up singleton at end of job
00135   struct Cleaner {
00136     void UseMe() { }                  // Dummy method to quiet compiler
00137     ~Cleaner() {
00138       if (Calibrator::fgInstance != 0) {
00139         delete Calibrator::fgInstance;
00140         Calibrator::fgInstance = 0;
00141       } } 
00142   };
00143   friend struct Cleaner; 
00144   static Calibrator *fgInstance;  // Unique Calibrator object
00145   
00146   CalScheme* fTimeCalibrator;
00147   CalScheme* fPeCalibrator;
00148   CalScheme* fVALinCalibrator;
00149   CalScheme* fDriftCalibrator;
00150   CalScheme* fLinCalibrator;
00151   CalScheme* fStripCalibrator;
00152   CalScheme* fAttenCalibrator;
00153   CalScheme* fMIPCalibrator;   
00154   CalScheme* fThermometer;
00155   mutable Int_t fCalibratorIsDirty[CalScheme::kNumberOfSchemeTypes];
00156   
00157  public:
00158   void     ResetEventStats();
00159   void     ResetHistograms();
00160 
00161   void      PrintEventStats() const;
00162   DoubleErr GetEventTotal(CalScheme::SchemeType_t type) const { return fEventTotal[(int)type]; };
00163   DoubleErr GetEventCalls(CalScheme::SchemeType_t type) const { return fEventCalls[(int)type]; };
00164   void      DrawHistograms();
00165 
00166   TH1*     GetFracErrorHist(CalScheme::SchemeType_t type) { return fFracErrorHist[(int)type]; };
00167   TH1*     GetErrorHist(CalScheme::SchemeType_t type)     { return fErrorHist[(int)type]; };
00168 
00169   
00170   // Event statistics
00171   mutable DoubleErr  fEventTotal[CalScheme::kNumberOfSchemeTypes];
00172   mutable Double_t   fEventCalls[CalScheme::kNumberOfSchemeTypes];
00173   
00174   // Overall statistics
00175   mutable TH1*      fFracErrorHist[CalScheme::kNumberOfSchemeTypes];
00176   mutable TH1*      fErrorHist[CalScheme::kNumberOfSchemeTypes];
00177 
00178   ClassDef(Calibrator,0)              // Calibrator version 0
00179 };
00180 
00181 
00182 
00184 inline Calibrator& Calibrator::Instance()
00185 {
00189   
00190   // Cleaner destructor calls DigitCalibrator dtor
00191   static Cleaner cleaner;
00192   
00193   // Calibrator mode "1" the default.  This is hardwired for now.
00194   if (!fgInstance) {
00195     cleaner.UseMe();           // dummy call to quiet compiler warnings
00196     fgInstance = new Calibrator();
00197     if(!fgInstance){
00198       cout << "No DigitCalibrator Instance - fatal." << endl;
00199       assert(fgInstance);               // Kill job is there is no instance
00200     }
00201     CalScheme::ResetStatistics();
00202   }
00203   
00204   return *fgInstance;
00205 }
00206 
00207 #endif //CALIBRATOR_H

Generated on Mon Feb 15 11:06:27 2010 for loon by  doxygen 1.3.9.1