00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
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
00034 {
00035 public:
00036
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
00060 PlexSEIdAltLItem CalibStripEnd(const PlexStripEndId& seid,
00061 const PlexPixelSpotId& spotid,
00062 Int_t adc, Double_t time) const;
00063
00064
00065
00066 FloatErr GetAttenCorrectedTpos(FloatErr sigcorr, FloatErr lpos, const PlexStripEndId& seid) const;
00067 FloatErr DecalAttenCorrectedTpos(FloatErr sigcorr, FloatErr lpos, const PlexStripEndId& seid) const;
00068
00069
00070
00071 Float_t GetTemperature(Int_t mode = 0) const;
00072
00073
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;
00077
00078
00079
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
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
00101 void ReInitialise(const VldContext &vldc) { Reset(vldc); };
00102
00103
00104 const Registry& GetCompleteConfiguration() const;
00105
00106
00107
00108 void SetLogLevel(Int_t lvl);
00109 void PrintConfig(std::ostream& os) const;
00110
00111
00112
00113 static Calibrator* CreateCustomCalibrator();
00114 ~Calibrator();
00115
00116 protected:
00117
00118 Calibrator();
00119
00120 void DoReset(const VldContext &context);
00121 void ConfigModified();
00122
00123
00124 void SetScheme(CalScheme* &scheme, const char* name);
00125 void ConfigScheme( const char* masterRegKey, CalScheme* scheme );
00126
00127
00128 private:
00129
00130 Calibrator(const Calibrator &);
00131 void operator=(const Calibrator &);
00132
00133
00134
00135 struct Cleaner {
00136 void UseMe() { }
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;
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
00171 mutable DoubleErr fEventTotal[CalScheme::kNumberOfSchemeTypes];
00172 mutable Double_t fEventCalls[CalScheme::kNumberOfSchemeTypes];
00173
00174
00175 mutable TH1* fFracErrorHist[CalScheme::kNumberOfSchemeTypes];
00176 mutable TH1* fErrorHist[CalScheme::kNumberOfSchemeTypes];
00177
00178 ClassDef(Calibrator,0)
00179 };
00180
00181
00182
00184 inline Calibrator& Calibrator::Instance()
00185 {
00189
00190
00191 static Cleaner cleaner;
00192
00193
00194 if (!fgInstance) {
00195 cleaner.UseMe();
00196 fgInstance = new Calibrator();
00197 if(!fgInstance){
00198 cout << "No DigitCalibrator Instance - fatal." << endl;
00199 assert(fgInstance);
00200 }
00201 CalScheme::ResetStatistics();
00202 }
00203
00204 return *fgInstance;
00205 }
00206
00207 #endif //CALIBRATOR_H