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
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
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
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
00071 m_statsSvc = svc<IStatisticsSvc>("StatisticsSvc",true);
00072 if(!m_statsSvc) {
00073 error() << " No StatisticsSvc available." << endreq;
00074 return StatusCode::FAILURE;
00075 }
00076
00077
00078
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
00125 const DayaBay::DaqPmtCrate* pmtCrate
00126 = daqCrate->asPmtCrate();
00127 if(!pmtCrate){
00128
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
00137 StatusCode sc = prepareStats(context);
00138 if( sc != StatusCode::SUCCESS ) return sc;
00139 }
00140 ServiceMode svcMode(context, 0);
00141
00142
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
00157 std::vector<int> readoutTdc;
00158 double adcSum = 0;
00159
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
00172
00173
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
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
00200 if( FindFirstHit ) break;
00201 if( !GoodTdc(tdc) ) continue;
00202 FindFirstHit = true;
00203
00204
00205 readoutTdc.push_back(tdc);
00206 tdcRawH->Fill(tdc);
00207
00208
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
00217 if( adcBaseline<0 ) adcBaseline = channel.preAdcAvg(i);
00218 } else {
00219
00220 adcBaseline = channel.preAdcAvg(i);
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
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
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
00256 bool FirstHit = false;
00257 for(unsigned int i=0; i<pmtChan.hitCount(); i++) {
00258 int tdc = pmtChan.tdc(i);
00259
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
00272 nReadoutsPar->SetVal( nReadoutsPar->GetVal() + 1 );
00273 return StatusCode::SUCCESS;
00274 }
00275
00276 StatusCode PmtCalibLeadingEdge::calibrate(){
00277
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;
00286
00287
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
00363 Context context(site,simFlag,TimeStamp(timeSec,timeNanoSec),detId);
00364 ServiceMode svcMode(context, 0);
00365
00366
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;
00379 std::vector<DayaBay::FeeChannelId> badChannels;
00380
00381
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
00387 for(chanIter = channelList.begin(); chanIter != chanEnd; chanIter++){
00388 DayaBay::FeeChannelId chanId = *chanIter;
00389
00390
00391
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
00400 bool occupancyOk = true;
00401 bool gainOk = true;
00402
00403
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
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
00457 double tdcOffset = 0;
00458 double tdcOffsetUncert = 0;
00459 {
00460
00461 int maxbin = tdcByMeanH->GetMaximumBin();
00462 double fitMin = tdcByMeanH->GetBinCenter(maxbin) - 3;
00463 double fitMax = tdcByMeanH->GetBinCenter(maxbin) + 3;
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
00472 tdcOffsetUncert = 0;
00473 else
00474
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
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
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
00540 double adcArea = 0;
00541 double adcMean = 0;
00542 double adcMeanUncert = 0;
00543 double adcSigma = 0;
00544 double adcSigmaUncert = 0;
00545 {
00546
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
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
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
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 }
00642
00643 }
00644 return StatusCode::SUCCESS;
00645 }
00646
00648 bool PmtCalibLeadingEdge::hasStats(const DayaBay::Detector& detector){
00649
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 }