00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00013
00014 #include "Calibrator.h"
00015 #include "MessageService/MsgService.h"
00016 #include "Conventions/Munits.h"
00017 #include "UgliGeometry/UgliGeomHandle.h"
00018 #include <TROOT.h>
00019 #include <TClass.h>
00020 #include <TH1F.h>
00021 #include <TCanvas.h>
00022 #include <cassert>
00023
00024 CVSID(" $Id: Calibrator.cxx,v 1.30 2007/03/29 19:56:48 tagg Exp $ ");
00025
00026 ClassImp(Calibrator)
00027
00028 Calibrator* Calibrator::fgInstance = 0;
00029
00030
00032 Calibrator* Calibrator::CreateCustomCalibrator()
00033 {
00034 MSG("Calib",Msg::kWarning) << "* Some joker has just created a custom Calibrator object." << endl;
00035 MSG("Calib",Msg::kWarning) << "* I'll do as I'm told, but doing this is usually not neccessary" << endl;
00036 MSG("Calib",Msg::kWarning) << "* except for rare testing cases." << endl;
00037 MSG("Calib",Msg::kWarning) << "* (Error/call statistics reporting will now be screwed up.)" << endl;
00038 return new Calibrator();
00039 }
00040
00041
00043
00044
00045 PlexSEIdAltLItem Calibrator::CalibStripEnd(const PlexStripEndId& seid,
00046 const PlexPixelSpotId& spotid,
00047 Int_t adc, Double_t rawtime) const
00048 {
00062
00063 MSG("Calib", Msg::kVerbose)
00064 << "Calibrator::CalibStripEnd" << endl;
00065 FloatErr seidWeight=0;
00066 FloatErr seidPE = this->GetPhotoElectrons(adc, seid);
00067 FloatErr seidSigLin = this->GetLinearized(adc, seid);
00068 FloatErr seidSigDrift = this->GetDriftCorrected(seidSigLin, seid);
00069 FloatErr seidSigCorr = this->GetStripToStripCorrected(seidSigDrift, seid);
00070 DoubleErr seidTime = this->GetCalibratedTime(rawtime, adc, seid);
00071
00072 MSG("Calib", Msg::kVerbose)
00073 << seid << " ADC: "
00074 << adc << " PE: " << seidPE << " SigLin: " << seidSigLin
00075 << " SigCor: " << seidSigCorr << endl
00076 << " Time: " << rawtime << " TimeCor: " << seidTime << std::endl;
00077
00078
00079
00080
00081
00082 PlexSEIdAltLItem item(seid, spotid, seidWeight, seidPE, seidSigDrift,
00083 seidSigCorr, seidTime);
00084 return item;
00085 }
00086
00087
00088
00090 FloatErr Calibrator::GetAttenCorrectedTpos(FloatErr sigcorr,
00091 FloatErr tpos,
00092 const PlexStripEndId& seid) const
00093 {
00109
00110 FloatErr stripX = 0.;
00111
00112
00113 if(GetContext().GetDetector()!=Detector::kNear) {
00114 if (seid.GetPlaneView()==PlaneView::kU) {
00115 stripX = -tpos;
00116 } else {
00117 stripX = tpos;
00118 }
00119 return GetAttenCorrected(sigcorr, stripX, seid);
00120 }
00121
00122 UgliGeomHandle ugli(GetContext());
00123 UgliStripHandle ustrip = ugli.GetStripHandle(seid);
00124
00125 const double rsqrt2 = 1.0/sqrt(2.0);
00126 const TVector3 kU(rsqrt2,rsqrt2,0.);
00127 const TVector3 kV(-rsqrt2,rsqrt2,0.);
00128
00129 if (seid.GetPlaneView()==PlaneView::kU) {
00130 float lambda = kV.Dot(ustrip.GlobalPos(0.));
00131 stripX = -tpos + lambda;
00132 } else {
00133 float lambda = kU.Dot(ustrip.GlobalPos(0.));
00134 stripX = tpos - lambda;
00135 }
00136 return GetAttenCorrected(sigcorr, stripX, seid);
00137 }
00138
00140 FloatErr Calibrator::DecalAttenCorrectedTpos(FloatErr sigmap,
00141 FloatErr tpos,
00142 const PlexStripEndId& seid) const
00143 {
00159
00160 FloatErr stripX = 0.;
00161
00162
00163 if(GetContext().GetDetector()!=Detector::kNear) {
00164 if (seid.GetPlaneView()==PlaneView::kU) {
00165 stripX = -tpos;
00166 } else {
00167 stripX = tpos;
00168 }
00169 return DecalAttenCorrected(sigmap, stripX, seid);
00170 }
00171
00172 UgliGeomHandle ugli(GetContext());
00173 UgliStripHandle ustrip = ugli.GetStripHandle(seid);
00174
00175 const double rsqrt2 = 1.0/sqrt(2.0);
00176 const TVector3 kU(rsqrt2,rsqrt2,0.);
00177 const TVector3 kV(-rsqrt2,rsqrt2,0.);
00178
00179 if (seid.GetPlaneView()==PlaneView::kU) {
00180 float lambda = kV.Dot(ustrip.GlobalPos(0.));
00181 stripX = -tpos + lambda;
00182 } else {
00183 float lambda = kU.Dot(ustrip.GlobalPos(0.));
00184 stripX = tpos - lambda;
00185 }
00186 return DecalAttenCorrected(sigmap, stripX, seid);
00187 }
00188
00190
00192
00193 DoubleErr Calibrator::GetCalibratedTime(DoubleErr rawtime, FloatErr charge, const PlexStripEndId& seid) const
00194 {
00205 CalScheme::IncrementCalls(CalScheme::kTimeCalibrator);
00206 if(fCalibratorIsDirty[kTimeCalibrator]) {
00207
00208 fTimeCalibrator->Reset(GetContext());
00209 fCalibratorIsDirty[kTimeCalibrator]=0;
00210 }
00211 DoubleErr result = fTimeCalibrator->GetCalibratedTime(rawtime,charge,seid);
00212 fEventTotal[CalScheme::kTimeCalibrator] += result;
00213 fEventCalls[CalScheme::kTimeCalibrator]++;
00214 fErrorHist[CalScheme::kTimeCalibrator] ->Fill(result.GetError());
00215 fFracErrorHist[CalScheme::kTimeCalibrator]->Fill(result.GetFracError());
00216 return result;
00217 }
00218
00219 DoubleErr Calibrator::DecalTime(DoubleErr caltime, FloatErr charge, const PlexStripEndId& seid) const
00220 {
00232 CalScheme::IncrementCalls(CalScheme::kTimeCalibrator);
00233 if(fCalibratorIsDirty[kTimeCalibrator]) {
00234
00235 fTimeCalibrator->Reset(GetContext());
00236 fCalibratorIsDirty[kTimeCalibrator]=0;
00237 }
00238
00239 return fTimeCalibrator->DecalTime(caltime,charge,seid);
00240 }
00241
00242
00244
00246 FloatErr Calibrator::GetPhotoElectrons(FloatErr rawcharge, const PlexStripEndId& seid) const
00247 {
00259 CalScheme::IncrementCalls(CalScheme::kPeCalibrator);
00260 if(fCalibratorIsDirty[kPeCalibrator]) {
00261
00262 fPeCalibrator->Reset(GetContext());
00263 fCalibratorIsDirty[kPeCalibrator]=0;
00264 }
00265
00266 FloatErr result = fPeCalibrator->GetPhotoElectrons(rawcharge,seid);
00267 fEventTotal[CalScheme::kPeCalibrator]+= DoubleErr(result.GetValue(),result.GetError());
00268 fEventCalls[CalScheme::kPeCalibrator]++;
00269 fErrorHist[CalScheme::kPeCalibrator] ->Fill(result.GetError());
00270 fFracErrorHist[CalScheme::kPeCalibrator]->Fill(result.GetFracError());
00271 return result;
00272 }
00273
00274 void Calibrator::DecalGainAndWidth(FloatErr& gain, FloatErr& width, const PlexStripEndId& seid) const
00275 {
00288 CalScheme::IncrementCalls(CalScheme::kPeCalibrator);
00289 if(fCalibratorIsDirty[kPeCalibrator]) {
00290
00291 fPeCalibrator->Reset(GetContext());
00292 fCalibratorIsDirty[kPeCalibrator]=0;
00293 }
00294
00295 fPeCalibrator->DecalGainAndWidth(gain,width,seid);
00296 }
00297
00298 void Calibrator::DecalGainAndWidth(FloatErr& gain, FloatErr& width,
00299 const PlexPixelSpotId& psid) const
00300 {
00313 CalScheme::IncrementCalls(CalScheme::kPeCalibrator);
00314 if(fCalibratorIsDirty[kPeCalibrator]) {
00315
00316 fPeCalibrator->Reset(GetContext());
00317 fCalibratorIsDirty[kPeCalibrator]=0;
00318 }
00319
00320 fPeCalibrator->DecalGainAndWidth(gain,width,psid);
00321 }
00323
00325 FloatErr Calibrator::GetLinearizedVA(FloatErr rawcharge, const RawChannelId& rcid ) const
00326 {
00338
00339 CalScheme::IncrementCalls(CalScheme::kVALinCalibrator);
00340 if(fCalibratorIsDirty[kVALinCalibrator]) {
00341
00342 fVALinCalibrator->Reset(GetContext());
00343 fCalibratorIsDirty[kVALinCalibrator]=0;
00344 }
00345
00346 FloatErr result = fVALinCalibrator->GetLinearizedVA(rawcharge,rcid);
00347 fEventTotal[CalScheme::kVALinCalibrator]+= DoubleErr(result.GetValue(),result.GetError());
00348 fEventCalls[CalScheme::kVALinCalibrator]++;
00349 fErrorHist[CalScheme::kVALinCalibrator] ->Fill(result.GetError());
00350 fFracErrorHist[CalScheme::kVALinCalibrator]->Fill(result.GetFracError());
00351 return result;
00352 }
00353
00354 FloatErr Calibrator::DecalVALinearity(FloatErr adc, const RawChannelId& rcid) const
00355 {
00368 CalScheme::IncrementCalls(CalScheme::kVALinCalibrator);
00369 if(fCalibratorIsDirty[kVALinCalibrator]) {
00370
00371 fVALinCalibrator->Reset(GetContext());
00372 fCalibratorIsDirty[kVALinCalibrator]=0;
00373 }
00374
00375 return fVALinCalibrator->DecalVALinearity(adc,rcid);
00376 }
00377
00378
00380
00382
00383 FloatErr Calibrator::GetDriftCorrected(FloatErr rawcharge, const PlexStripEndId& seid) const
00384 {
00396 CalScheme::IncrementCalls(CalScheme::kDriftCalibrator);
00397 if(fCalibratorIsDirty[kDriftCalibrator]) {
00398
00399 fDriftCalibrator->Reset(GetContext());
00400 fCalibratorIsDirty[kDriftCalibrator]=0;
00401 }
00402
00403 FloatErr result = fDriftCalibrator->GetDriftCorrected(rawcharge,seid);
00404 fEventTotal[CalScheme::kDriftCalibrator]+= DoubleErr(result.GetValue(),result.GetError());
00405 fEventCalls[CalScheme::kDriftCalibrator]++;
00406 fErrorHist[CalScheme::kDriftCalibrator] ->Fill(result.GetError());
00407 fFracErrorHist[CalScheme::kDriftCalibrator]->Fill(result.GetFracError());
00408 return result;
00409 }
00410
00411 FloatErr Calibrator::DecalDrift(FloatErr undrifted, const PlexStripEndId& seid) const
00412 {
00426 CalScheme::IncrementCalls(CalScheme::kDriftCalibrator);
00427 if(fCalibratorIsDirty[kDriftCalibrator]) {
00428
00429 fDriftCalibrator->Reset(GetContext());
00430 fCalibratorIsDirty[kDriftCalibrator]=0;
00431 }
00432
00433 return fDriftCalibrator->DecalDrift(undrifted,seid);
00434 }
00435
00437
00439 FloatErr Calibrator::GetLinearized(FloatErr sigdrift, const PlexStripEndId& seid) const
00440 {
00452 CalScheme::IncrementCalls(CalScheme::kLinCalibrator);
00453 if(fCalibratorIsDirty[kLinCalibrator]) {
00454
00455 fLinCalibrator->Reset(GetContext());
00456 fCalibratorIsDirty[kLinCalibrator]=0;
00457 }
00458
00459 FloatErr result = fLinCalibrator->GetLinearized(sigdrift,seid);
00460 fEventTotal[CalScheme::kLinCalibrator]+= DoubleErr(result.GetValue(),result.GetError());
00461 fEventCalls[CalScheme::kLinCalibrator]++;
00462 fErrorHist[CalScheme::kLinCalibrator] ->Fill(result.GetError());
00463 fFracErrorHist[CalScheme::kLinCalibrator]->Fill(result.GetFracError());
00464 return result;
00465 }
00466
00467 FloatErr Calibrator::DecalLinearity(FloatErr lin, const PlexStripEndId& seid) const
00468 {
00482 CalScheme::IncrementCalls(CalScheme::kLinCalibrator);
00483 if(fCalibratorIsDirty[kLinCalibrator]) {
00484
00485 fLinCalibrator->Reset(GetContext());
00486 fCalibratorIsDirty[kLinCalibrator]=0;
00487 }
00488
00489 return fLinCalibrator->DecalLinearity(lin,seid);
00490 }
00491
00493
00495 FloatErr Calibrator::GetStripToStripCorrected(FloatErr siglin, const PlexStripEndId& seid) const
00496 {
00511 CalScheme::IncrementCalls(CalScheme::kStripCalibrator);
00512 if(fCalibratorIsDirty[kStripCalibrator]) {
00513
00514 fStripCalibrator->Reset(GetContext());
00515 fCalibratorIsDirty[kStripCalibrator]=0;
00516 }
00517
00518 FloatErr result = fStripCalibrator->GetStripToStripCorrected(siglin,seid);
00519 fEventTotal[CalScheme::kStripCalibrator]+= DoubleErr(result.GetValue(),result.GetError());
00520 fEventCalls[CalScheme::kStripCalibrator]++;
00521 fErrorHist[CalScheme::kStripCalibrator] ->Fill(result.GetError());
00522 fFracErrorHist[CalScheme::kStripCalibrator]->Fill(result.GetFracError());
00523 return result;
00524 }
00525 FloatErr Calibrator::DecalStripToStrip(FloatErr sigcorr, const PlexStripEndId& seid) const
00526 {
00540 CalScheme::IncrementCalls(CalScheme::kStripCalibrator);
00541 if(fCalibratorIsDirty[kStripCalibrator]) {
00542
00543 fStripCalibrator->Reset(GetContext());
00544 fCalibratorIsDirty[kStripCalibrator]=0;
00545 }
00546
00547 return fStripCalibrator->DecalStripToStrip(sigcorr,seid);
00548 }
00549
00551
00553 FloatErr Calibrator::GetAttenCorrected(FloatErr sigcorr, FloatErr stripX, const PlexStripEndId& seid) const
00554 {
00567 CalScheme::IncrementCalls(CalScheme::kAttenCalibrator);
00568 if(fCalibratorIsDirty[kAttenCalibrator]) {
00569
00570 fAttenCalibrator->Reset(GetContext());
00571 fCalibratorIsDirty[kAttenCalibrator]=0;
00572 }
00573
00574 FloatErr result = fAttenCalibrator->GetAttenCorrected(sigcorr,stripX,seid);
00575 fEventTotal[CalScheme::kAttenCalibrator]+= DoubleErr(result.GetValue(),result.GetError());
00576 fEventCalls[CalScheme::kAttenCalibrator]++;
00577 fErrorHist[CalScheme::kAttenCalibrator] ->Fill(result.GetError());
00578 fFracErrorHist[CalScheme::kAttenCalibrator]->Fill(result.GetFracError());
00579 return result;
00580 }
00581
00582 FloatErr Calibrator::DecalAttenCorrected(FloatErr sigmap, FloatErr stripX, const PlexStripEndId& seid) const
00583 {
00598 CalScheme::IncrementCalls(CalScheme::kAttenCalibrator);
00599 if(fCalibratorIsDirty[kAttenCalibrator]) {
00600
00601 fAttenCalibrator->Reset(GetContext());
00602 fCalibratorIsDirty[kAttenCalibrator]=0;
00603 }
00604
00605 return fAttenCalibrator->DecalAttenCorrected(sigmap,stripX,seid);
00606 }
00607
00609
00611 FloatErr Calibrator::GetMIP(FloatErr sigmap, const PlexStripEndId& seid) const
00612 {
00626 CalScheme::IncrementCalls(CalScheme::kMIPCalibrator);
00627 if(fCalibratorIsDirty[kMIPCalibrator]) {
00628
00629 fMIPCalibrator->Reset(GetContext());
00630 fCalibratorIsDirty[kMIPCalibrator]=0;
00631 }
00632
00633 FloatErr result = fMIPCalibrator->GetMIP(sigmap,seid);
00634 fEventTotal[CalScheme::kMIPCalibrator]+= DoubleErr(result.GetValue(),result.GetError());
00635 fEventCalls[CalScheme::kMIPCalibrator]++;
00636 fErrorHist[CalScheme::kMIPCalibrator] ->Fill(result.GetError());
00637 fFracErrorHist[CalScheme::kMIPCalibrator]->Fill(result.GetFracError());
00638 return result;
00639 }
00640
00641 FloatErr Calibrator::DecalMIP(FloatErr sigmip, const PlexStripEndId& seid) const
00642 {
00656 CalScheme::IncrementCalls(CalScheme::kMIPCalibrator);
00657 if(fCalibratorIsDirty[kMIPCalibrator]) {
00658
00659 fMIPCalibrator->Reset(GetContext());
00660 fCalibratorIsDirty[kMIPCalibrator]=0;
00661 }
00662
00663 return fMIPCalibrator->DecalMIP(sigmip,seid);
00664 }
00665
00666
00668
00670 Float_t Calibrator::GetTemperature(Int_t mode) const
00671 {
00683 CalScheme::IncrementCalls(CalScheme::kThermometer);
00684 if(fCalibratorIsDirty[kThermometer]) {
00685
00686 fThermometer->Reset(GetContext());
00687 fCalibratorIsDirty[kThermometer]=0;
00688 }
00689
00690 return fThermometer->GetTemperature(mode);
00691 }
00692
00694
00696 Double_t Calibrator::GetTDCConvert(const RawChannelId& rcid) const
00697 {
00698
00699
00700
00701 Double_t tdc_convert = 0.1;
00702
00703
00704 switch (rcid.GetElecType()) {
00705
00706
00707 case (ElecType::kVA):
00708 tdc_convert = 1.5625;
00709 break;
00710
00711
00712 case (ElecType::kQIE):
00713 tdc_convert = 1000./53.1;
00714
00715
00716 if (rcid.GetDetector() == Detector::kCalDet)
00717 tdc_convert = 1.5625*16.0*58.0/77.0;
00718 break;
00719
00720
00721 default:
00722 break;
00723 }
00724 return tdc_convert * Munits::ns;
00725 }
00726
00727 DoubleErr Calibrator::GetTimeFromTDC(Int_t tdc, const RawChannelId& rcid) const
00728 {
00737
00738
00739
00740 DoubleErr tdc_and_err(tdc,1.0);
00741
00742
00743
00744
00745
00746 DoubleErr t = tdc_and_err * GetTDCConvert(rcid);
00747
00748 return t;
00749 }
00750
00751 Int_t Calibrator::GetTDCFromTime(Double_t time, const RawChannelId& rcid) const
00752 {
00761
00762
00763
00764
00765 Double_t tdc = time / GetTDCConvert(rcid);
00766
00767
00768 return TMath::Nint(tdc);
00769 }
00770
00771
00772
00773
00774
00775
00777
00779 void Calibrator::DoReset(const VldContext& )
00780 {
00785 for(int i=0;i<kNumberOfSchemeTypes; i++) {
00786 fCalibratorIsDirty[i]=1;
00787 }
00788 }
00789
00790
00792
00794
00795 void Calibrator::SetLogLevel(Int_t lvl)
00796 {
00797 MsgService::Instance()->GetStream("Calib")->SetLogLevel((Msg::LogLevel_t)lvl);
00798 }
00799
00800 const Registry& Calibrator::GetCompleteConfiguration() const
00801 {
00809
00810 static Registry r;
00811 r = GetConfig();
00812 r.Set("TimeCalibratorConfig", fTimeCalibrator ->GetConfig());
00813 r.Set("PeCalibratorConfig", fPeCalibrator ->GetConfig());
00814 r.Set("VALinCalibratorConfig", fVALinCalibrator->GetConfig());
00815 r.Set("DriftCalibratorConfig", fDriftCalibrator->GetConfig());
00816 r.Set("LinCalibratorConfig", fLinCalibrator ->GetConfig());
00817 r.Set("StripCalibratorConfig", fStripCalibrator->GetConfig());
00818 r.Set("AttenCalibratorConfig", fAttenCalibrator->GetConfig());
00819 r.Set("MIPCalibratorConfig", fMIPCalibrator ->GetConfig());
00820 r.Set("ThermometerConfig", fThermometer ->GetConfig());
00821 return r;
00822 }
00823
00824 void Calibrator::PrintConfig(std::ostream& os) const
00825 {
00826
00827 os << endl;
00828 os << "-----------------------------------------------------" << endl;
00829 os << "TimeCalibrator: " << GetConfig().GetCharString("TimeCalibrator") << endl;
00830 fTimeCalibrator->PrintConfig(os);
00831
00832 os << endl;
00833 os << "-----------------------------------------------------" << endl;
00834 os << "PeCalibrator: " << GetConfig().GetCharString("PeCalibrator") << endl;
00835 fPeCalibrator->PrintConfig(os);
00836
00837 os << endl;
00838 os << "-----------------------------------------------------" << endl;
00839 os << "VALinCalibrator: " << GetConfig().GetCharString("VALinCalibrator") << endl;
00840 fVALinCalibrator->PrintConfig(os);
00841
00842 os << endl;
00843 os << "-----------------------------------------------------" << endl;
00844 os << "DriftCalibrator: " << GetConfig().GetCharString("DriftCalibrator") << endl;
00845 fDriftCalibrator->PrintConfig(os);
00846
00847 os << endl;
00848 os << "-----------------------------------------------------" << endl;
00849 os << "LinCalibrator: " << GetConfig().GetCharString("LinCalibrator") << endl;
00850 fLinCalibrator->PrintConfig(os);
00851
00852 os << endl;
00853 os << "-----------------------------------------------------" << endl;
00854 os << "StripCalibrator: " << GetConfig().GetCharString("StripCalibrator") << endl;
00855 fStripCalibrator->PrintConfig(os);
00856
00857 os << endl;
00858 os << "-----------------------------------------------------" << endl;
00859 os << "AttenCalibrator: " << GetConfig().GetCharString("AttenCalibrator") << endl;
00860 fAttenCalibrator->PrintConfig(os);
00861
00862 os << endl;
00863 os << "-----------------------------------------------------" << endl;
00864 os << "MIPCalibrator: " << GetConfig().GetCharString("MIPCalibrator") << endl;
00865 fMIPCalibrator->PrintConfig(os);
00866
00867 os << endl;
00868 os << "-----------------------------------------------------" << endl;
00869 os << "Thermometer: " << GetConfig().GetCharString("Thermometer") << endl;
00870 fThermometer->PrintConfig(os);
00871 }
00872
00873
00874 void Calibrator::ConfigModified()
00875 {
00884
00885 const Registry& r = this->GetConfig();
00886
00887
00888 SetScheme(fTimeCalibrator, r.GetCharString("TimeCalibrator"));
00889 SetScheme(fPeCalibrator, r.GetCharString("PeCalibrator"));
00890 SetScheme(fVALinCalibrator, r.GetCharString("VALinCalibrator"));
00891 SetScheme(fDriftCalibrator, r.GetCharString("DriftCalibrator"));
00892 SetScheme(fLinCalibrator, r.GetCharString("LinCalibrator"));
00893 SetScheme(fStripCalibrator, r.GetCharString("StripCalibrator"));
00894 SetScheme(fAttenCalibrator, r.GetCharString("AttenCalibrator"));
00895 SetScheme(fMIPCalibrator, r.GetCharString("MIPCalibrator"));
00896 SetScheme(fThermometer, r.GetCharString("Thermometer"));
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906 ConfigScheme("TimeCalibratorConfig", fTimeCalibrator);
00907 ConfigScheme("PeCalibratorConfig", fPeCalibrator);
00908 ConfigScheme("VALinCalibratorConfig",fVALinCalibrator);
00909 ConfigScheme("DriftCalibratorConfig",fDriftCalibrator);
00910 ConfigScheme("LinCalibratorConfig", fLinCalibrator);
00911 ConfigScheme("StripCalibratorConfig",fStripCalibrator);
00912 ConfigScheme("AttenCalibratorConfig",fAttenCalibrator);
00913 ConfigScheme("MIPCalibratorConfig", fMIPCalibrator);
00914 ConfigScheme("ThermometerConfig", fThermometer);
00915
00916
00917 DoReset(GetContext());
00918 }
00919
00920
00921 void Calibrator::SetScheme(CalScheme* &scheme, const char* name)
00922 {
00923 if(scheme) {
00924
00925 if(strcmp(scheme->GetName(),name)==0) {
00926
00927 return;
00928 }
00929 }
00930
00931
00932 CalScheme* newscheme = 0;
00933 assert(gROOT);
00934
00935 TClass* theclass = gROOT->GetClass(name);
00936 if(!theclass) {
00937 MSG("Calib",Msg::kError) << "Calibrator: Unable to find requested Scheme: " << name << endl;
00938 } else {
00939 void* p = theclass->New();
00940 TObject* obj = (TObject*) p;
00941 newscheme = dynamic_cast<CalScheme*>(obj);
00942 if(!newscheme) {
00943 MSG("Calib",Msg::kError) << "Calibrator: " << name << " is not a CalScheme!" << endl;
00944 }
00945 }
00946
00947 if(!newscheme) {
00948 if(!scheme) {
00949 MSG("Calib",Msg::kError) << " Cannot generate calibration scheme " << name
00950 << " so I have to die! Sorry! ";
00951 assert(0);
00952 } else {
00953 MSG("Calib",Msg::kError) << " Cannot generate calibration scheme " << name
00954 << " so I'll keep the old one: " << scheme->GetName() << endl;
00955 return;
00956 }
00957 }
00958
00959
00960 if(scheme) delete scheme;
00961 scheme = newscheme;
00962 }
00963
00964
00965 void Calibrator::ConfigScheme( const char* masterRegKey, CalScheme* scheme )
00966 {
00972
00973 Registry rs = GetConfig().GetRegistry(masterRegKey);
00974
00975 if(rs.Size()<=0) return;
00976 scheme->Set(rs);
00977
00978 Registry blank;
00979 Set(masterRegKey,blank);
00980 }
00981
00982
00983
00984
00986
00987
00988 Calibrator::Calibrator() :
00989 fTimeCalibrator(0),
00990 fPeCalibrator(0),
00991 fVALinCalibrator(0),
00992 fDriftCalibrator(0),
00993 fLinCalibrator(0),
00994 fStripCalibrator(0),
00995 fAttenCalibrator(0),
00996 fMIPCalibrator(0),
00997 fThermometer(0)
00998 {
00999
01000
01001 Registry r;
01002 r.SetName("Calibrator");
01003 r.Set("TimeCalibrator", "PulserTimeCalScheme");
01004 r.Set("PeCalibrator", "PEGainAggCalScheme");
01005 r.Set("VALinCalibrator","VaLinearityCalScheme");
01006 r.Set("DriftCalibrator","MuonDriftCalScheme");
01007 r.Set("LinCalibrator", "PulserLinearityCalScheme");
01008 r.Set("StripCalibrator","StripToStripCalScheme");
01009 r.Set("AttenCalibrator","StripAttenCalScheme");
01010 r.Set("MIPCalibrator", "MIPCalScheme");
01011 r.Set("Thermometer", "TemperatureCalScheme");
01012
01013 r.Set("TimeCalibratorConfig",Registry());
01014 r.Set("PeCalibratorConfig",Registry());
01015 r.Set("VALinCalibratorConfig",Registry());
01016 r.Set("DriftCalibratorConfig",Registry());
01017 r.Set("LinCalibratorConfig",Registry());
01018 r.Set("StripCalibratorConfig",Registry());
01019 r.Set("AttenCalibratorConfig",Registry());
01020 r.Set("MIPCalibratorConfig",Registry());
01021 r.Set("ThermometerConfig",Registry());
01022 InitializeConfig(r);
01023
01024 for(int i=0;i<kNumberOfSchemeTypes; i++) {
01025 fCalibratorIsDirty[i]=1;
01026 fFracErrorHist[i] = 0;
01027 fErrorHist[i] = 0;
01028 }
01029
01030 ResetEventStats();
01031 ResetHistograms();
01032 }
01033
01035
01036
01037 Calibrator::~Calibrator()
01038 {
01039 cout << endl << "Calibrator shutting down." << endl;
01040 PrintErrorStats();
01041 if(fTimeCalibrator) delete fTimeCalibrator; fTimeCalibrator = 0;
01042 if(fPeCalibrator) delete fPeCalibrator; fPeCalibrator = 0;
01043 if(fVALinCalibrator) delete fVALinCalibrator; fVALinCalibrator = 0;
01044 if(fDriftCalibrator) delete fDriftCalibrator; fDriftCalibrator= 0;
01045 if(fLinCalibrator) delete fLinCalibrator; fLinCalibrator = 0;
01046 if(fStripCalibrator) delete fStripCalibrator; fStripCalibrator = 0;
01047 if(fAttenCalibrator) delete fAttenCalibrator; fAttenCalibrator = 0;
01048 if(fMIPCalibrator) delete fMIPCalibrator; fMIPCalibrator = 0;
01049 if(fThermometer) delete fThermometer; fThermometer = 0;
01050
01051 for(int i=0; i<CalScheme::kNumberOfSchemeTypes; i++) {
01052 if(fErrorHist[i]) delete fErrorHist[i];
01053 if(fFracErrorHist[i]) delete fFracErrorHist[i];
01054 }
01055 }
01056
01057
01058 void Calibrator::ResetEventStats()
01059 {
01060 for(int i=0; i<CalScheme::kNumberOfSchemeTypes; i++) {
01061 fEventTotal[i].Set(0,0);
01062 fEventCalls[i] = 0;
01063 }
01064 }
01065
01066 void Calibrator::ResetHistograms()
01067 {
01071 for(int i=0; i<CalScheme::kNumberOfSchemeTypes; i++) {
01072
01073 if(fErrorHist[i]) {
01074 fErrorHist[i]->Reset();
01075 } else {
01076 if(i==CalScheme::kTimeCalibrator)
01077 fErrorHist[i] = new TH1F(Form("hError_%s",SchemeTypeName(i)),
01078 Form("Error, %s",SchemeTypeName(i)),
01079 500,0,100.*Munits::ns);
01080 else
01081 fErrorHist[i] = new TH1F(Form("hError_%s",SchemeTypeName(i)),
01082 Form("Error, %s",SchemeTypeName(i)),
01083 500,0,1e4);
01084
01085 fErrorHist[i] -> SetXTitle(Form("Error per calibration (%s)",CalScheme::UnitName(i)));
01086 fErrorHist[i] -> SetYTitle("Number of calibrations");
01087 }
01088 fErrorHist[i] -> SetDirectory(0);
01089
01090 if(fFracErrorHist[i]) {
01091 delete fFracErrorHist[i];
01092 } else {
01093 fFracErrorHist[i] = new TH1F(Form("hFracError_%s",SchemeTypeName(i)),
01094 Form("Fractional Error, %s",SchemeTypeName(i)),
01095 20,0,1.0);
01096 fFracErrorHist[i] -> SetXTitle("Fractional error");
01097 fFracErrorHist[i] -> SetYTitle("Number of calibrations");
01098 }
01099 fFracErrorHist[i] -> SetDirectory(0);
01100
01101 }
01102 }
01103
01104 void Calibrator::PrintEventStats() const
01105 {
01106 MSG("Calib",Msg::kInfo) << "Event statistics: ----------------------" << endl;
01107
01108 for(int i=0; i<CalScheme::kNumberOfSchemeTypes; i++) {
01109 if(i==CalScheme::kUnknown) continue;
01110 else {
01111 MSG("Calib",Msg::kInfo) << Form("%16s | Total %8s: %10.1f +- %8.1f Mean %8s: %6.1f +- %6.1f",
01112 CalScheme::SchemeTypeName(i),
01113 CalScheme::UnitName(i),
01114 fEventTotal[i].GetValue(),
01115 fEventTotal[i].GetError(),
01116 CalScheme::UnitName(i),
01117 (fEventCalls[i]>0) ?
01118 (fEventTotal[i]/fEventCalls[i]).GetValue() : -1
01119 ,
01120 (fEventCalls[i]>0) ?
01121 (fEventTotal[i]/fEventCalls[i]).GetError() : -1
01122 )
01123 << endl;
01124 }
01125 }
01126 }
01127
01128 void Calibrator::DrawHistograms()
01129 {
01130 static TCanvas* sCanvas1 = 0;
01131 if(!sCanvas1) sCanvas1 = new TCanvas("calCanvas1","Calibrator Summary 1");
01132 sCanvas1->cd();
01133 sCanvas1->Divide(2,4,0,0,kWhite);
01134
01135 static TCanvas* sCanvas2 = 0;
01136 if(!sCanvas2) sCanvas2 = new TCanvas("calCanvas2","Calibrator Summary 2");
01137 sCanvas2->cd();
01138 sCanvas2->Divide(2,4,0,0,kWhite);
01139
01140 int ipad = 0;
01141 int types[] = { CalScheme::kTimeCalibrator,
01142 CalScheme::kVALinCalibrator,
01143 CalScheme::kPeCalibrator,
01144 CalScheme::kLinCalibrator,
01145 CalScheme::kDriftCalibrator,
01146 CalScheme::kStripCalibrator,
01147 CalScheme::kAttenCalibrator,
01148 CalScheme::kMIPCalibrator };
01149
01150 for(int itype=0; itype<8; itype++) {
01151 int type = types[itype];
01152
01153 ipad++;
01154 sCanvas1->cd(ipad);
01155 fErrorHist[type]->Draw();
01156 sCanvas2->cd(ipad);
01157 fFracErrorHist[type]->Draw();
01158 }
01159 }