| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

PmtCalibLeadingEdge.cc

Go to the documentation of this file.
00001 #include "PmtCalibLeadingEdge.h"
00002 
00003 #include "Event/ReadoutHeader.h"
00004 #include "StatisticsSvc/IStatisticsSvc.h"
00005 #include "DataSvc/ICableSvc.h"
00006 #include "DataSvc/ICalibDataSvc.h"
00007 #include "Context/ServiceMode.h"
00008 #include "TH1F.h"
00009 #include "TF1.h"
00010 #include "TH2.h"
00011 #include "TParameter.h"
00012 #include <math.h>
00013 #include <numeric>
00014 
00015 PmtCalibLeadingEdge::PmtCalibLeadingEdge(const std::string& type,
00016                                          const std::string& name, 
00017                                          const IInterface* parent)
00018   : GaudiTool(type,name,parent)
00019   , m_cableSvc(0)
00020   , m_statsSvc(0)
00021 {
00022   
00023   declareInterface< IPmtCalibParamTool >(this) ;   
00024   declareProperty("CableSvcName",m_cableSvcName="StaticCableSvc",
00025                   "Name of service to map between detector, hardware, and electronic IDs");
00026   declareProperty("CalibSvcName",m_calibSvcName="StaticCalibDataSvc",
00027                   "Name of service to access FEE channel baselines");
00028   declareProperty("FloatingFeePedestalSvcName",m_floatFeePedesSvcName="FloatingFeePedestalSvc",
00029                   "Name of service to access floating FEE channel baselines");
00030   declareProperty("UseFloatFeePedes",m_useFloatFeePedes=false,
00031                   "Use FloatFeePedes or not? In case of false, it will use CalibSvc.");
00032   declareProperty("FilePath",m_filepath="/file0/pmtCalibLeadingEdge",
00033                   "File path of registered histograms.");
00034 
00035   declareProperty("TextFile", m_textFileName="Sum.txt", "Summary of fitting result in text file");
00036 
00037 }
00038 
00039 PmtCalibLeadingEdge::~PmtCalibLeadingEdge(){}
00040 
00041 StatusCode PmtCalibLeadingEdge::initialize()
00042 {
00043   info() << "initialize()" << endreq;
00044   StatusCode sc = this->GaudiTool::initialize();
00045   if( sc != StatusCode::SUCCESS ) return sc;
00046 
00047   // Get Cable Service
00048   m_cableSvc = svc<ICableSvc>(m_cableSvcName,true);
00049   if(!m_cableSvc){
00050     error() << "Failed to access cable svc: " << m_cableSvcName << endreq;
00051     return StatusCode::FAILURE;
00052   }
00053 
00054   // Get Calibration Service
00055   m_calibSvc = svc<ICalibDataSvc>(m_calibSvcName,true);
00056   if(!m_calibSvc){
00057     error() << "Failed to access calibration svc: " << m_calibSvcName << endreq;
00058     return StatusCode::FAILURE;
00059   }
00060 
00061   if(m_useFloatFeePedes){
00062     // Get floating fee pedestal service
00063     m_floatFeePedesSvc = svc<IFloatingFeePedestalSvc>(m_floatFeePedesSvcName,true);
00064     if(!m_floatFeePedesSvc){
00065       error() << "Failed to access FloatingFeePedestalSvc: " << m_floatFeePedesSvcName << endreq;
00066       return StatusCode::FAILURE;
00067     }
00068   }
00069 
00070   // Get the histogram service
00071   m_statsSvc = svc<IStatisticsSvc>("StatisticsSvc",true);
00072   if(!m_statsSvc) {
00073     error() << " No StatisticsSvc available." << endreq;
00074     return StatusCode::FAILURE;
00075   }
00076 
00077   // Initialize data from input file.
00078   // Processed detectors are identified by directory name.
00079   std::vector<std::string> detDirs = m_statsSvc->getSubFolders(m_filepath);
00080   std::vector<std::string>::iterator dirIter, dirEnd = detDirs.end();
00081   for(dirIter=detDirs.begin(); dirIter != dirEnd; dirIter++){
00082     info() << "Processing input directory: " << m_filepath << "/" 
00083            << *dirIter << endreq;
00084     DayaBay::Detector detector( 
00085                  DayaBay::Detector::siteDetPackedFromString(*dirIter) );
00086     if( detector.site() == Site::kUnknown 
00087         || detector.detectorId() == DetectorId::kUnknown ){
00088       warning() << "Input directory: " << m_filepath << "/" 
00089                 << *dirIter << " not processed." << endreq;
00090     }
00091     m_processedDetectors.push_back(detector);
00092   }
00093 
00094   m_textFile.open( m_textFileName.c_str(), ios_base::out );
00095 
00096   m_textFile
00097     <<"run/I:board/I:channel/I:preAdc/D:preAdcSigma/D:rawAdc/D:rawAdcSigma/D:expAdc/D:expAdcSigma/D:quasiAdc/D:quasiAdcSigma/D"<<endl;
00098 
00099   return StatusCode::SUCCESS;
00100 }
00101 
00102 StatusCode PmtCalibLeadingEdge::finalize()
00103 {
00104   StatusCode sc = this->GaudiTool::finalize();
00105   if( sc != StatusCode::SUCCESS ) return sc;
00106 
00107   m_textFile.close();
00108 
00109   return StatusCode::SUCCESS;
00110 }
00111 
00113 
00114 StatusCode PmtCalibLeadingEdge::process(const DayaBay::ReadoutHeader& readoutHeader){
00115 
00116   const DayaBay::DaqCrate* daqCrate = readoutHeader.daqCrate();
00117   if(!daqCrate){
00118     error() << "Failed to get DAQ crate from header" << endreq;
00119     return StatusCode::FAILURE;
00120   }
00121 
00122   const DayaBay::Detector& detector = daqCrate->detector();
00123 
00124   // Convert to PMT crate readout
00125   const DayaBay::DaqPmtCrate* pmtCrate
00126       = daqCrate->asPmtCrate();
00127   if(!pmtCrate){
00128     // Not an AD, continue
00129     debug() << "process(): Do not process detector: " << detector.detName() 
00130             << endreq;
00131     return StatusCode::SUCCESS;
00132   }
00133 
00134   Context context = readoutHeader.context();
00135   if( !hasStats(detector) ){
00136     // New detector; initialize all the detector statistics
00137     StatusCode sc = prepareStats(context);
00138     if( sc != StatusCode::SUCCESS ) return sc;
00139   }
00140   ServiceMode svcMode(context, 0);
00141 
00142   // Retrieve the parameters and histograms
00143   TObject* nReadoutsObj = 
00144     m_statsSvc->get(this->getPath(detector) + "/nReadouts");
00145   TParameter<int>* nReadoutsPar= dynamic_cast<TParameter<int>*>(nReadoutsObj);
00146   if(!nReadoutsPar) return StatusCode::FAILURE;
00147   TH1F* adcSumH = m_statsSvc->getTH1F( this->getPath(detector) + "/adcSum");
00148   if(!adcSumH) return StatusCode::FAILURE;
00149   TH1F* tdcMeanH = m_statsSvc->getTH1F( this->getPath(detector)+"/tdcMean");
00150   if(!tdcMeanH) return StatusCode::FAILURE;
00151   TH1F* NChannelH = m_statsSvc->getTH1F( this->getPath(detector) + "/NChannel");
00152   if(!NChannelH) return StatusCode::FAILURE;
00153   TH2F* occupancyH = m_statsSvc->getTH2F(this->getPath(detector) + "/occupancy");
00154   if(!occupancyH) return StatusCode::FAILURE;
00155 
00156   // Add the current readout to the calibration statistics
00157   std::vector<int> readoutTdc;
00158   double adcSum = 0;
00159   // Loop over channels
00160   int NChannel = 0;
00161 
00162   const DayaBay::DaqPmtCrate::PmtChannelPtrList& channels
00163     = pmtCrate->channelReadouts();
00164     
00165   DayaBay::DaqPmtCrate::PmtChannelPtrList::const_iterator channelIter, 
00166     channelEnd = channels.end();
00167   for(channelIter = channels.begin(); channelIter!=channelEnd; channelIter++) { 
00168     const DayaBay::DaqPmtChannel& channel = *(*channelIter);
00169     const DayaBay::FeeChannelId& chanId = channel.channelId();
00170     
00171     //const DayaBay::FeeCalibData* feeCalib = m_calibSvc->feeCalibData(chanId,svcMode);
00172 
00173     // Get Parameters and Histograms
00174     TObject* nHitsObj = m_statsSvc->get(this->getPath(chanId) + "/nHits");
00175     TParameter<int>* nHitsPar = dynamic_cast<TParameter<int>*>(nHitsObj);
00176     if(!nHitsPar) return StatusCode::FAILURE;
00177     TH1F* tdcRawH = m_statsSvc->getTH1F( this->getPath(chanId) + "/tdcRaw");
00178     if(!tdcRawH) return StatusCode::FAILURE;
00179     TH1F* adcRawH = m_statsSvc->getTH1F( this->getPath(chanId) + "/adcRaw");
00180     if(!adcRawH) return StatusCode::FAILURE;
00181     TH1F* preAdcH = m_statsSvc->getTH1F( this->getPath(chanId) + "/preAdc");
00182     if(!preAdcH) return StatusCode::FAILURE;
00183     TH1F* adcH = m_statsSvc->getTH1F( this->getPath(chanId) + "/adc");    
00184     if(!adcH) return StatusCode::FAILURE;
00185     TH1F* quasiAdcH = m_statsSvc->getTH1F( this->getPath(chanId) + "/quasiAdc");
00186     if(!quasiAdcH) return StatusCode::FAILURE;
00187     TH1F* adcByClockH = m_statsSvc->getTH1F( this->getPath(chanId) 
00188                                              + "/adcByClock");
00189     if(!adcByClockH) return StatusCode::FAILURE;
00190     
00191     // Loop over each hit
00192     bool FindFirstHit = false;
00193     for(unsigned int i=0; i<channel.hitCount(); i++) {
00194       int adcClock = channel.peakCycle(i);
00195       int adc = channel.adc(i);
00196       float preAdc = channel.preAdcAvg(i);
00197       int tdc = channel.tdc(i);
00198 
00199       // Only hit with good timing can join the fit and only the first one.
00200       if( FindFirstHit ) break;
00201       if( !GoodTdc(tdc) ) continue;
00202       FindFirstHit = true;
00203 
00204       // Loop over tdc values
00205       readoutTdc.push_back(tdc);
00206       tdcRawH->Fill(tdc);
00207     
00208       // Loop over adc values
00209       double adcBaseline;
00210       if( m_useFloatFeePedes ) {
00211         if(channel.isHighGainAdc(i)){
00212           adcBaseline = m_floatFeePedesSvc->pedestal( chanId, DayaBay::FeeGain::kHigh);
00213         }else{
00214           adcBaseline = m_floatFeePedesSvc->pedestal( chanId, DayaBay::FeeGain::kLow);
00215         }
00216         // In case floatFeePedesSvc didn't get enough statistics yet, use preAdc instead.
00217         if( adcBaseline<0 ) adcBaseline = channel.preAdcAvg(i);
00218       } else {
00219         // adcBaseline = feeCalib->m_adcBaselineLow;  // The pedestal run result is not good enough
00220         adcBaseline = channel.preAdcAvg(i);  // Use preAdc is much better
00221       }
00222 
00224       if( adc>0 && channel.isHighGainAdc(i) ) {
00225         adcRawH->Fill(adc);
00226         adcH->Fill(adc-adcBaseline);
00227         quasiAdcH->Fill(adc-preAdc);
00228         adcByClockH->Fill(adcClock,adc-adcBaseline);
00229         preAdcH->Fill(preAdc);
00230       }
00231       adcSum += adc-adcBaseline;
00232     }
00233     // Increment number of hits on this channel
00234     if( FindFirstHit ) {
00235       nHitsPar->SetVal( nHitsPar->GetVal() + 1 );
00236      }
00237   }
00238   NChannel = readoutTdc.size();
00239   if( NChannel<=0 ) {
00240     info()<<" Too few hits for this event. Skipped. "<<endreq;
00241     return StatusCode::SUCCESS;
00242   }
00243 
00244   if(readoutTdc.size() > 0){
00245     // Find the mean TDC
00246     double meanTdc = accumulate(readoutTdc.begin(), readoutTdc.end(),0);
00247     meanTdc = meanTdc/NChannel;
00248 
00249     for(channelIter = channels.begin(); channelIter!=channelEnd; channelIter++) { 
00250       const DayaBay::DaqPmtChannel& pmtChan = *(*channelIter);
00251       const DayaBay::FeeChannelId& chanId = pmtChan.channelId();
00252       TH1F* tdcByMeanH = 
00253         m_statsSvc->getTH1F( this->getPath(chanId) + "/tdcByMean");
00254       if(!tdcByMeanH) return StatusCode::FAILURE;
00255       // Loop over tdc values
00256       bool FirstHit = false;
00257       for(unsigned int i=0; i<pmtChan.hitCount(); i++) {
00258         int tdc = pmtChan.tdc(i);
00259         // Only hit with good timing can join the fit and only the first one.
00260         if( FirstHit ) break;
00261         if( !GoodTdc(tdc) ) continue;
00262         FirstHit = true;
00263         tdcByMeanH->Fill(tdc-meanTdc);
00264       }
00265     }
00266     tdcMeanH->Fill(meanTdc);
00267   }
00268 
00269   NChannelH->Fill(NChannel);
00270   adcSumH->Fill(adcSum);
00271   // Increment number of readouts from this detector
00272   nReadoutsPar->SetVal( nReadoutsPar->GetVal() + 1 );
00273   return StatusCode::SUCCESS;  
00274 }
00275 
00276 StatusCode PmtCalibLeadingEdge::calibrate(){
00277   // Loop over detectors in summary data, and calculate parameters
00278 
00279   std::vector<DayaBay::Detector>::iterator detIter, 
00280     detEnd = m_processedDetectors.end();
00281 
00282   for(detIter = m_processedDetectors.begin(); detIter != detEnd; detIter++){
00283     DayaBay::Detector detector = *detIter;
00284 
00285     if(!detector.isAD()) continue;//for now this code can only tolerate ADs (jpochoa)    
00286 
00287     // Retrieve the data description and histograms
00288     TObject* nReadoutsObj = 
00289       m_statsSvc->get(this->getPath(detector) + "/nReadouts");
00290     TParameter<int>* nReadoutsPar= dynamic_cast<TParameter<int>*>(nReadoutsObj);
00291     if(!nReadoutsPar) return StatusCode::FAILURE;
00292 
00293     TH1F* meanOccupancyH = m_statsSvc->getTH1F( this->getPath(detector)
00294                                                 +"/meanOccupancy");
00295     if(!meanOccupancyH) return StatusCode::FAILURE;
00296 
00297     TH1F* meanTdcOffsetH = m_statsSvc->getTH1F( this->getPath(detector)
00298                                                 +"/meanTdcOffset");
00299     if(!meanTdcOffsetH) return StatusCode::FAILURE;
00300 
00302     TH1F* adcRawMeanH = m_statsSvc->getTH1F( this->getPath(detector)
00303                                                 +"/adcRawMean");
00304     if(!adcRawMeanH) return StatusCode::FAILURE;
00305     TH1F* adcRawSigmaH = m_statsSvc->getTH1F( this->getPath(detector)
00306                                                 +"/adcRawSigma");
00307     if(!adcRawSigmaH) return StatusCode::FAILURE;
00308     //
00309     TH1F* quasiAdcMeanH = m_statsSvc->getTH1F( this->getPath(detector)
00310                                                 +"/quasiAdcMean");
00311     if(!quasiAdcMeanH) return StatusCode::FAILURE;
00312     TH1F* quasiAdcSigmaH = m_statsSvc->getTH1F( this->getPath(detector)
00313                                                  +"/quasiAdcSigma");
00314     if(!quasiAdcSigmaH) return StatusCode::FAILURE;
00315     //
00316     TH1F* expAdcMeanH = m_statsSvc->getTH1F( this->getPath(detector)
00317                                                   +"/expAdcMean");
00318     if(!expAdcMeanH) return StatusCode::FAILURE;
00319     TH1F* expAdcSigmaH = m_statsSvc->getTH1F( this->getPath(detector)
00320                                                    +"/expAdcSigma");
00321     if(!expAdcSigmaH) return StatusCode::FAILURE;
00322     //
00323     TH1F* preAdcMeanH = m_statsSvc->getTH1F( this->getPath(detector)
00324                                              +"/preAdcMean");
00325     if(!preAdcMeanH) return StatusCode::FAILURE;
00326     TH1F* preAdcSigmaH = m_statsSvc->getTH1F( this->getPath(detector)
00327                                               +"/preAdcSigma");
00328     if(!preAdcSigmaH) return StatusCode::FAILURE;
00329     TH2F* occupancyH2D = m_statsSvc->getTH2F( this->getPath(detector) 
00330                                               + "/occupancy");
00331     if(!occupancyH2D) return StatusCode::FAILURE;
00332     TH2F* gainH2D = m_statsSvc->getTH2F( this->getPath(detector) 
00333                                               + "/gain2D");
00334     if(!gainH2D) return StatusCode::FAILURE;
00335     TH1F* gainH1D = m_statsSvc->getTH1F( this->getPath(detector) 
00336                                               + "/gain1D");
00337     if(!gainH1D) return StatusCode::FAILURE;
00338 
00340     
00341     TObject* simFlagObj = m_statsSvc->get(this->getPath(detector) +"/simFlag");
00342     TParameter<int>* simFlagPar = dynamic_cast<TParameter<int>*>(simFlagObj);
00343     if(!simFlagPar) return StatusCode::FAILURE;
00344 
00345     TObject* timeSecObj = m_statsSvc->get(this->getPath(detector) +"/timeSec");
00346     TParameter<int>* timeSecPar = dynamic_cast<TParameter<int>*>(timeSecObj);
00347     if(!timeSecPar) return StatusCode::FAILURE;
00348 
00349     TObject* timeNanoSecObj = 
00350       m_statsSvc->get(this->getPath(detector) +"/timeNanoSec");
00351     TParameter<int>* timeNanoSecPar = 
00352       dynamic_cast<TParameter<int>*>(timeNanoSecObj);
00353     if(!timeNanoSecPar) return StatusCode::FAILURE;
00354 
00355     Site::Site_t site = detector.site();
00356     DetectorId::DetectorId_t detId = detector.detectorId();
00357     SimFlag::SimFlag_t simFlag = (SimFlag::SimFlag_t)(simFlagPar->GetVal());
00358     time_t timeSec = (time_t)(timeSecPar->GetVal());
00359     int timeNanoSec = timeNanoSecPar->GetVal();
00360     int nReadouts = nReadoutsPar->GetVal();
00361 
00362     // Context, ServiceMode
00363     Context context(site,simFlag,TimeStamp(timeSec,timeNanoSec),detId);
00364     ServiceMode svcMode(context, 0);
00365 
00366     // Prepare data for ring-to-ring comparison
00367     int nRings = 8;
00368     std::map<int,double> meanOccRing;
00369     std::map<int,double> meanOccWeight;
00370     std::map<int,double> meanTdcRing;
00371     std::map<int,double> meanTdcWeight;
00372     for(int ring = 1; ring <= nRings; ring++){
00373       meanOccRing[ring] = 0.0;
00374       meanOccWeight[ring] = 0.0;
00375       meanTdcRing[ring] = 0.0;
00376       meanTdcWeight[ring] = 0.0;
00377     }
00378     double minValidOcc = 0.01;  // Cut on PMTs with bad/low occupancy
00379     std::vector<DayaBay::FeeChannelId> badChannels;
00380 
00381     // Get list of all FEE channels (not from data, but just from cableSvc)
00382     const std::vector<DayaBay::FeeChannelId>& channelList 
00383       = m_cableSvc->feeChannelIds( svcMode );
00384     std::vector<DayaBay::FeeChannelId>::const_iterator chanIter, 
00385       chanEnd = channelList.end();
00386     // Initialize statistics for each channel
00387     for(chanIter = channelList.begin(); chanIter != chanEnd; chanIter++){
00388       DayaBay::FeeChannelId chanId = *chanIter;
00389 
00390       // Analyze the channel data
00391       // Determine ring and column
00392       DayaBay::AdPmtSensor pmtId = 
00393         m_cableSvc->adPmtSensor(chanId, svcMode);
00394       int ring = pmtId.ring();
00395       int column = pmtId.column();
00396 
00397       m_textFile<<-1<<" "<<chanId.board()<<" "<<chanId.connector()<<" ";
00398 
00399       // Channel status
00400       bool occupancyOk = true;
00401       bool gainOk = true;
00402 
00403       // Get Parameters and Histograms
00404       TObject* nHitsObj = m_statsSvc->get(this->getPath(chanId) + "/nHits");
00405       TParameter<int>* nHitsPar = dynamic_cast<TParameter<int>*>(nHitsObj);
00406       if(!nHitsPar) return StatusCode::FAILURE;
00407       TH1F* tdcByMeanH= m_statsSvc->getTH1F( this->getPath(chanId)
00408                                                +"/tdcByMean");
00409       if(!tdcByMeanH) return StatusCode::FAILURE;
00411       TH1F* adcH = m_statsSvc->getTH1F( this->getPath(chanId) + "/adc");
00412       if(!adcH) return StatusCode::FAILURE;
00413       TH1F* adcRawH = m_statsSvc->getTH1F( this->getPath(chanId) + "/adcRaw");
00414       if(!adcRawH) return StatusCode::FAILURE;
00415       TH1F* preAdcH = m_statsSvc->getTH1F( this->getPath(chanId) + "/preAdc");
00416       if(!preAdcH) return StatusCode::FAILURE;
00417       TH1F* quasiAdcH = m_statsSvc->getTH1F( this->getPath(chanId) + "/quasiAdc");
00418       if(!quasiAdcH) return StatusCode::FAILURE;
00419       
00421       TH1F* occupancyH = m_statsSvc->getTH1F( this->getPath(detector,ring)
00422                                               +"/occupancy");
00423       if(!occupancyH) return StatusCode::FAILURE;
00424 
00425       TH1F* tdcOffsetH = m_statsSvc->getTH1F( this->getPath(detector,ring)
00426                                               +"/tdcOffset");
00427       if(!tdcOffsetH) return StatusCode::FAILURE;
00428       TH1F* adcMeanH = m_statsSvc->getTH1F( this->getPath(detector,ring)
00429                                               +"/adcMean");
00430       if(!adcMeanH) return StatusCode::FAILURE;
00431       TH1F* adcSigmaH = m_statsSvc->getTH1F( this->getPath(detector,ring)
00432                                              +"/adcSigma");
00433       if(!adcSigmaH) return StatusCode::FAILURE;
00434 
00435       // Channel Occupancy
00436       double occupancy = 0;
00437       double occupancyUncert = 0;
00438       {
00439         int nHits = nHitsPar->GetVal();
00440         if(nReadouts > 0){
00441           occupancy = nHits / ((double) nReadouts);
00442           occupancyUncert = 
00443             sqrt( occupancy*(1-occupancy)/((double) nReadouts) );
00444         }
00445         occupancyH->SetBinContent(occupancyH->FindBin(column),occupancy);
00446         occupancyH->SetBinError(occupancyH->FindBin(column),occupancyUncert);
00447         occupancyH2D->SetBinContent(occupancyH2D->GetXaxis()->FindBin(column),
00448                                     occupancyH2D->GetYaxis()->FindBin(ring),
00449                                     occupancy);
00450         occupancyH2D->SetBinError(occupancyH2D->GetXaxis()->FindBin(column),
00451                                     occupancyH2D->GetYaxis()->FindBin(ring),
00452                                     occupancyUncert);
00453         
00454         if(occupancy < minValidOcc) occupancyOk = false;
00455       }
00456       // TDC offset
00457       double tdcOffset = 0;
00458       double tdcOffsetUncert = 0;
00459       {
00460         // Use a fit to the leading edge to determine the time offset
00461         int maxbin = tdcByMeanH->GetMaximumBin();
00462         double fitMin = tdcByMeanH->GetBinCenter(maxbin) - 3; //tdcByMeanH->GetRMS(1);
00463         double fitMax = tdcByMeanH->GetBinCenter(maxbin) + 3; //tdcByMeanH->GetRMS(1);
00464         tdcByMeanH->Fit("gaus","","",fitMin, fitMax);
00465         TF1* fitFunc = tdcByMeanH->GetFunction("gaus");
00466         if( fitFunc ){
00467           tdcOffset = fitFunc->GetParameter(1);
00468           tdcOffsetUncert = fitFunc->GetParError(1);
00469           
00470           if( fitFunc->GetNDF() < 3 ) 
00471             // Catch bad fits
00472             tdcOffsetUncert = 0;
00473           else
00474             // Scale uncertainty by the quality of the fit
00475             tdcOffsetUncert *= sqrt(fitFunc->GetChisquare() / fitFunc->GetNDF());
00476           
00477           tdcOffsetH->SetBinContent(tdcOffsetH->FindBin(column),tdcOffset);
00478           tdcOffsetH->SetBinError(tdcOffsetH->FindBin(column),tdcOffsetUncert);
00479         }else{
00480           warning() << "PMT  " << pmtId << " has no TDC data for fitting." 
00481                     << endreq;
00482         }
00483       }
00484 
00485       // PreAdc
00486       double preAdcArea;
00487       double preAdcMean;
00488       double preAdcSigm;
00489       {
00490         preAdcArea = preAdcH->GetEntries();
00491         preAdcMean = preAdcH->GetMean(1);
00492         preAdcSigm = preAdcH->GetRMS(1);
00493         TF1 preAdcFit("preAdcFit","gaus");
00494         preAdcFit.SetParameter( 0, preAdcArea );
00495         preAdcFit.SetParameter( 1, preAdcMean );
00496         preAdcFit.SetParameter( 2, preAdcSigm );
00497         preAdcH->Fit( &preAdcFit, "", "", 
00498                       preAdcMean-2*preAdcSigm, preAdcMean+2*preAdcSigm );
00499         preAdcMean = preAdcFit.GetParameter(1);
00500         preAdcSigm = preAdcFit.GetParameter(2);
00501         //
00502         if(chanId.board()<=16) {
00503           preAdcMeanH->SetBinContent(
00504                                      chanId.board()*16+chanId.connector(),preAdcMean);
00505           preAdcSigmaH->SetBinContent(
00506                                       chanId.board()*16+chanId.connector(),preAdcSigm);
00507         }
00508         
00509         m_textFile<<preAdcMean<<" "<<preAdcSigm<<" ";
00510       }
00511 
00512       // Raw Adc
00513       double adcRawArea;
00514       double adcRawMean;
00515       double adcRawSigm;
00516       {
00517         adcRawArea = adcRawH->GetEntries();
00518         adcRawMean = adcRawH->GetMean(1);
00519         adcRawSigm = adcRawH->GetRMS(1);
00520         TF1 adcRawFit("adcRawFit","gaus");
00521         adcRawFit.SetParameter( 0, adcRawArea );
00522         adcRawFit.SetParameter( 1, adcRawMean );
00523         adcRawFit.SetParameter( 2, adcRawSigm );
00524         adcRawH->Fit( &adcRawFit, "", "",
00525                       adcRawMean-1.0*adcRawSigm, adcRawMean+1.0*adcRawSigm );
00526         adcRawMean = adcRawFit.GetParameter(1);
00527         adcRawSigm = adcRawFit.GetParameter(2);
00528         
00529         if(chanId.board()<=16) {
00530           adcRawMeanH->SetBinContent(
00531                                      chanId.board()*16+chanId.connector(),adcRawMean);
00532           adcRawSigmaH->SetBinContent(
00533                                       chanId.board()*16+chanId.connector(),adcRawSigm);
00534         }
00535 
00536         m_textFile<<adcRawMean<<" "<<adcRawSigm<<" ";
00537       }
00538 
00539       // ADC (Adc -Ave Ped)
00540       double adcArea = 0;
00541       double adcMean = 0;
00542       double adcMeanUncert = 0;
00543       double adcSigma = 0;
00544       double adcSigmaUncert = 0;
00545       {
00546         // Find ADC SPE peak, width with simple gaussian
00547         adcArea = adcH->GetEntries();
00548         adcMean = adcH->GetMean(1);
00549         adcSigma= adcH->GetRMS(1);
00550         TF1 adcFit("adcFit","gaus");
00551         adcFit.SetParameter( 0, adcArea );
00552         adcFit.SetParameter( 1, adcMean );
00553         adcFit.SetParameter( 2, adcSigma);
00554         adcH->Fit( &adcFit,"","",
00555                    adcMean-1.0*adcSigma, adcMean+1.0*adcSigma); 
00556 
00557         adcMean = adcFit.GetParameter(1);
00558         adcMeanUncert = adcFit.GetParError(1);
00559         adcSigma = adcFit.GetParameter(2);
00560         adcSigmaUncert = adcFit.GetParError(2);
00561         gainOk=true;
00562 
00563         adcMeanH->SetBinContent(adcMeanH->FindBin(column),adcMean);
00564         adcMeanH->SetBinError(adcMeanH->FindBin(column),adcMeanUncert);
00565         adcSigmaH->SetBinContent(adcSigmaH->FindBin(column),adcSigma);
00566         adcSigmaH->SetBinError(adcSigmaH->FindBin(column),adcSigmaUncert);
00567         gainH2D->SetBinContent(gainH2D->GetXaxis()->FindBin(column),
00568                                gainH2D->GetYaxis()->FindBin(ring),
00569                                adcMean);
00570         gainH2D->SetBinError(gainH2D->GetXaxis()->FindBin(column),
00571                                gainH2D->GetYaxis()->FindBin(ring),
00572                                adcMeanUncert);
00573         gainH1D->Fill(adcMean);
00574 
00575         if(chanId.board()<=16) {
00576           expAdcMeanH->SetBinContent(
00577                                      chanId.board()*16+chanId.connector(),adcMean);
00578           expAdcSigmaH->SetBinContent(
00579                                       chanId.board()*16+chanId.connector(),adcSigma);
00580         }
00581 
00582         m_textFile<<adcMean<<" "<<adcSigma<<" ";
00583       }
00584 
00585       // Quasi Adc
00586       double quasiAdcArea;
00587       double quasiAdcMean;
00588       double quasiAdcSigm;
00589       {
00590         quasiAdcArea = quasiAdcH->GetEntries();
00591         quasiAdcMean = quasiAdcH->GetMean(1);
00592         quasiAdcSigm = quasiAdcH->GetRMS(1);
00593         TF1 quasiAdcFit("quasiAdcFit","gaus");
00594         quasiAdcFit.SetParameter( 0, quasiAdcArea );
00595         quasiAdcFit.SetParameter( 1, quasiAdcMean );
00596         quasiAdcFit.SetParameter( 2, quasiAdcSigm );
00597         quasiAdcH->Fit( &quasiAdcFit, "", "",
00598                         quasiAdcMean-1.0*quasiAdcSigm, quasiAdcMean+1.0*quasiAdcSigm );
00599         quasiAdcMean = quasiAdcFit.GetParameter(1);
00600         quasiAdcSigm = quasiAdcFit.GetParameter(2);
00601 
00602         if(chanId.board()<=16) {
00603           quasiAdcMeanH->SetBinContent(
00604                                        chanId.board()*16+chanId.connector(),quasiAdcMean);
00605           quasiAdcSigmaH->SetBinContent(
00606                                         chanId.board()*16+chanId.connector(),quasiAdcSigm);
00607         }
00608 
00609         m_textFile<<quasiAdcMean<<" "<<quasiAdcSigm<<endl;
00610       }
00611 
00612 
00613       // Record ring averages, ignoring bad channels
00614       if( occupancyOk && gainOk ){
00615         if( occupancyUncert > 0 ){
00616           meanOccRing[ring] += occupancy / (occupancyUncert*occupancyUncert); 
00617           meanOccWeight[ring] += 1.0 / (occupancyUncert*occupancyUncert); 
00618         }
00619         if( tdcOffsetUncert > 0 ){
00620           meanTdcRing[ring] += tdcOffset / (tdcOffsetUncert*tdcOffsetUncert); 
00621           meanTdcWeight[ring] += 1.0 / (tdcOffsetUncert*tdcOffsetUncert); 
00622         }
00623       }
00624 
00625     }
00626 
00627     // Record mean time offset and mean occupancy by ring
00628     for(int ring = 1; ring <= nRings; ring++){
00629       if( meanOccWeight[ring] > 0 ){
00630         meanOccupancyH->SetBinContent(ring,
00631                                       meanOccRing[ring] / meanOccWeight[ring]);
00632         meanOccupancyH->SetBinError(ring, 
00633                                     sqrt( 1.0 / meanOccWeight[ring] ));
00634       }
00635       if( meanTdcWeight[ring] > 0 ){
00636         meanTdcOffsetH->SetBinContent(ring,
00637                                       meanTdcRing[ring] / meanTdcWeight[ring]);
00638         meanTdcOffsetH->SetBinError(ring, 
00639                                     sqrt( 1.0 / meanTdcWeight[ring] ));
00640       }
00641     } // Loop over rings
00642  
00643   } // Loop over detectors
00644   return StatusCode::SUCCESS;
00645 }
00646 
00648 bool PmtCalibLeadingEdge::hasStats(const DayaBay::Detector& detector){
00649   // Check if statistics have been initialized for this detector
00650   return (std::find(m_processedDetectors.begin(), 
00651                     m_processedDetectors.end(), 
00652                     detector) 
00653           != m_processedDetectors.end());
00654 }
00655 
00656 std::string PmtCalibLeadingEdge::getPath( const DayaBay::Detector& detector ){
00657   return m_filepath + "/" + detector.detName();
00658 }
00659 
00660 std::string PmtCalibLeadingEdge::getPath(const DayaBay::Detector& detector,
00661                                          int ring){
00662   std::ostringstream path;
00663   path << m_filepath << "/" << detector.detName() << "/ring_" << ring; 
00664   return path.str();
00665 }
00666 
00667 std::string PmtCalibLeadingEdge::getPath(const DayaBay::FeeChannelId& chanId){
00668   std::ostringstream path;
00669   path << m_filepath << "/" << chanId.detName() 
00670        << "/chan_" << chanId.board() << "_" << chanId.connector(); 
00671   return path.str();
00672 }
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:29:39 2011 for CalibParam by doxygen 1.4.7