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

Calibrator.cxx

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.cxx,v 1.30 2007/03/29 19:56:48 tagg Exp $
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;                       //Will be set by the Plex
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   // Used in debugging phase.
00079   //if((adc/seidPE)<10 ) MSG("Calib",Msg::kError) << "Abnormally high gain ( " << (adc/seidPE) << " adc/pe) returned for SEID " << seid.AsString() << endl;
00080   //if((adc/seidPE)>500) MSG("Calib",Msg::kError) << "Abnormally low  gain ( " << (adc/seidPE) << " adc/pe) returned for SEID " << seid.AsString() << endl;
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   // Caldet and Far are both symettric.
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   // Caldet and Far are both symettric.
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 // Time Calibration calls
00192 
00193 DoubleErr Calibrator::GetCalibratedTime(DoubleErr rawtime, FloatErr charge, const PlexStripEndId& seid) const
00194 {
00205   CalScheme::IncrementCalls(CalScheme::kTimeCalibrator);
00206   if(fCalibratorIsDirty[kTimeCalibrator]) {
00207     // Lazy context update.
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     // Lazy context update.
00235     fTimeCalibrator->Reset(GetContext()); 
00236     fCalibratorIsDirty[kTimeCalibrator]=0;
00237   }
00238    
00239   return fTimeCalibrator->DecalTime(caltime,charge,seid);
00240 }     
00241 
00242 
00244 // PE Calibration calls
00246 FloatErr  Calibrator::GetPhotoElectrons(FloatErr rawcharge, const PlexStripEndId& seid) const
00247 {
00259   CalScheme::IncrementCalls(CalScheme::kPeCalibrator);
00260   if(fCalibratorIsDirty[kPeCalibrator]) {
00261     // Lazy context update.
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     // Lazy context update.
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     // Lazy context update.
00316     fPeCalibrator->Reset(GetContext()); 
00317     fCalibratorIsDirty[kPeCalibrator]=0;
00318   }
00319    
00320   fPeCalibrator->DecalGainAndWidth(gain,width,psid);
00321 }
00323 // VA Linearity Calibration calls
00325 FloatErr  Calibrator::GetLinearizedVA(FloatErr rawcharge, const RawChannelId& rcid ) const
00326 {
00338  
00339   CalScheme::IncrementCalls(CalScheme::kVALinCalibrator);
00340   if(fCalibratorIsDirty[kVALinCalibrator]) {
00341     // Lazy context update.
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     // Lazy context update.
00371     fVALinCalibrator->Reset(GetContext()); 
00372     fCalibratorIsDirty[kVALinCalibrator]=0;
00373   }
00374    
00375   return fVALinCalibrator->DecalVALinearity(adc,rcid);
00376 }
00377 
00378 
00380 // Drift Calibration calls
00382 
00383 FloatErr  Calibrator::GetDriftCorrected(FloatErr rawcharge, const PlexStripEndId& seid) const
00384 {
00396   CalScheme::IncrementCalls(CalScheme::kDriftCalibrator);
00397   if(fCalibratorIsDirty[kDriftCalibrator]) {
00398     // Lazy context update.
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     // Lazy context update.
00429     fDriftCalibrator->Reset(GetContext()); 
00430     fCalibratorIsDirty[kDriftCalibrator]=0;
00431   }
00432    
00433   return fDriftCalibrator->DecalDrift(undrifted,seid);
00434 }
00435 
00437 // Linearization Calibration calls
00439 FloatErr  Calibrator::GetLinearized(FloatErr sigdrift, const PlexStripEndId& seid) const
00440 {
00452   CalScheme::IncrementCalls(CalScheme::kLinCalibrator);
00453   if(fCalibratorIsDirty[kLinCalibrator]) {
00454     // Lazy context update.
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     // Lazy context update.
00485     fLinCalibrator->Reset(GetContext()); 
00486     fCalibratorIsDirty[kLinCalibrator]=0;
00487   }
00488    
00489   return fLinCalibrator->DecalLinearity(lin,seid);  
00490 }
00491 
00493 // Strip-to-Strip Calibration calls
00495 FloatErr  Calibrator::GetStripToStripCorrected(FloatErr siglin,  const PlexStripEndId& seid) const
00496 {
00511   CalScheme::IncrementCalls(CalScheme::kStripCalibrator);
00512   if(fCalibratorIsDirty[kStripCalibrator]) {
00513     // Lazy context update.
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     // Lazy context update.
00543     fStripCalibrator->Reset(GetContext()); 
00544     fCalibratorIsDirty[kStripCalibrator]=0;
00545   }
00546    
00547   return fStripCalibrator->DecalStripToStrip(sigcorr,seid);    
00548 }
00549 
00551 // Strip Attenuation Correction Calibration calls
00553 FloatErr  Calibrator::GetAttenCorrected(FloatErr sigcorr, FloatErr stripX, const PlexStripEndId& seid) const
00554 {
00567   CalScheme::IncrementCalls(CalScheme::kAttenCalibrator);
00568   if(fCalibratorIsDirty[kAttenCalibrator]) {
00569     // Lazy context update.
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     // Lazy context update.
00601     fAttenCalibrator->Reset(GetContext()); 
00602     fCalibratorIsDirty[kAttenCalibrator]=0;
00603   }
00604    
00605   return fAttenCalibrator->DecalAttenCorrected(sigmap,stripX,seid);      
00606 }
00607 
00609 // MIP Calibration calls
00611 FloatErr  Calibrator::GetMIP(FloatErr sigmap,                        const PlexStripEndId& seid) const
00612 {
00626   CalScheme::IncrementCalls(CalScheme::kMIPCalibrator);
00627   if(fCalibratorIsDirty[kMIPCalibrator]) {
00628     // Lazy context update.
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     // Lazy context update.
00659     fMIPCalibrator->Reset(GetContext()); 
00660     fCalibratorIsDirty[kMIPCalibrator]=0;
00661   }
00662    
00663   return fMIPCalibrator->DecalMIP(sigmip,seid);     
00664 }
00665 
00666 
00668 // Other non-calibration calibrations
00670 Float_t Calibrator::GetTemperature(Int_t mode) const
00671 {
00683   CalScheme::IncrementCalls(CalScheme::kThermometer);
00684   if(fCalibratorIsDirty[kThermometer]) {
00685     // Lazy context update.
00686     fThermometer->Reset(GetContext()); 
00687     fCalibratorIsDirty[kThermometer]=0;
00688   }
00689    
00690   return fThermometer->GetTemperature(mode);
00691 }
00692 
00694 // Useful Global conversion calls
00696 Double_t Calibrator::GetTDCConvert(const RawChannelId& rcid)  const
00697 {
00698    // This code shamelessly lifted from AlgDigit.
00699   
00700   // Convert from 0.1*Munits:ns to standard Munits base time units (sec).
00701   Double_t tdc_convert = 0.1;   // REROOT, non-VA, non-QIE scale factor
00702   
00703   // Switch on type of readout electronics
00704   switch (rcid.GetElecType()) {
00705     
00706     // VA electronics, tick = 1.5625 ns (640MHz)
00707   case (ElecType::kVA):
00708     tdc_convert = 1.5625;
00709     break;
00710 
00711     // QIE electronics, tick = 18.832 ns (RF clock)
00712   case (ElecType::kQIE):
00713     tdc_convert =  1000./53.1;  // clock is 53.1MHz
00714     
00715     // CalDet has yet a different clock frequency
00716     if (rcid.GetDetector() == Detector::kCalDet)
00717       tdc_convert = 1.5625*16.0*58.0/77.0;
00718     break;
00719     
00720     // Use whatever value we started with
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   // Convert TDC counts to Double_t.  
00739 
00740   DoubleErr tdc_and_err(tdc,1.0);
00741 
00742   // Flag error on FD:
00743   //if(rcid.GetElecType==ElecType::kVA)
00744   //  if( (tdc & 0x1F) == 0x08 )  tdc_and_err.SetError(8.);
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   // This code shamelessly lifted from AlgDigit.
00763   
00764   // Convert TDC counts to Double_t.  
00765   Double_t tdc = time / GetTDCConvert(rcid);
00766   
00767   //return (int)round(tdc);  // round() not available on IRIX
00768   return TMath::Nint(tdc);
00769 }
00770 
00771 
00772 
00773 
00774 
00775 
00777 // Context methods
00779 void Calibrator::DoReset(const VldContext& /*context*/)
00780 {
00785   for(int i=0;i<kNumberOfSchemeTypes; i++) {
00786     fCalibratorIsDirty[i]=1;
00787   }
00788 }
00789 
00790 
00792 // I/O, reporting, configuration.
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   // Printout of current configuration.
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   // First, create the Schema.
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   // If we wanted to be good, we would now check that each scheme
00899   // implimented the routines we want. But that's a lot of work.
00900   
00901   // Now, merge in any configuration that we have.
00902   // The SubCalibrators hold the definative version of the configuration.
00903   // The main Calibrator object holds only _modifications_ to them.
00904 
00905   // Because of this, we now _delete_ any calibration we have after sending it on.
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   // Make sure that all the calibrators have their contexts set:
00917   DoReset(GetContext());
00918 }
00919 
00920 
00921 void Calibrator::SetScheme(CalScheme* &scheme, const char* name)
00922 {
00923   if(scheme) {
00924     // object exists. Is it the right kind?
00925     if(strcmp(scheme->GetName(),name)==0) {
00926       // It is. Do nothing.
00927       return;
00928     }
00929   }
00930   
00931   // Make a new one.
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   // All is well. Make the sucker.
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 // Constructor.
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   // Use this to define global default. 
01000   //Load this from a file, like the AlgConfigs?
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 // Destructor.
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); // Make sure it's only memory-resident.
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); // Make sure it's only memory-resident.
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 }

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