Public Member Functions | |
AdExamplePlots (DayaBay::Detector det, MsgStream &msg) | |
StatusCode | book (ITHistSvc *hsvc, string filepath) |
StatusCode | fill (ICableSvc *, const ServiceMode &, ICoordSysSvc *coord, const ReadoutHeader *roh) |
Public Attributes | |
TH2F * | genVertexZRho |
TH1F * | nPhotoElectrons |
TH1F * | hitPmts |
TH1F * | dtReadout |
TH1F * | dtReadoutShort |
TH1F * | adcSpectrum |
TH1F * | tdcSpectrum |
TH1F * | chargeSum |
TH2F * | hitPmtVsChargeSum |
bool | findCoincidence |
TH1F * | dtNeutronCapture |
TH1F * | promptEnergy |
TH1F * | delayedEnergy |
TH2F * | delayedVsPromptEnergy |
Private Attributes | |
DayaBay::Detector | detector |
MsgStream & | log |
bool | firstReadout |
TimeStamp | lastTriggerTime |
vector< AdSummary > | adHistory |
Definition at line 36 of file AdPlotterAlg.cc.
AdExamplePlots::AdExamplePlots | ( | DayaBay::Detector | det, | |
MsgStream & | msg | |||
) | [inline] |
Definition at line 65 of file AdPlotterAlg.cc.
00066 : detector(det), 00067 log(msg), 00068 firstReadout(true), 00069 findCoincidence(false) 00070 { }
StatusCode AdExamplePlots::book | ( | ITHistSvc * | hsvc, | |
string | filepath | |||
) | [inline] |
Definition at line 72 of file AdPlotterAlg.cc.
00072 { 00073 // Initialize and register all the histograms 00074 gStyle->SetHistLineWidth(2); 00075 gStyle->SetHistLineColor(4); 00076 { 00077 string name = detector.detName() + "_HitPmts"; 00078 string title = "Number of Hit Pmts for " + detector.detName(); 00079 hitPmts = new TH1F(name.c_str(),title.c_str(),200,0,200); 00080 hitPmts->GetXaxis()->SetTitle("Number of Hit PMTs"); 00081 hitPmts->GetYaxis()->SetTitle("Readouts"); 00082 name = filepath+"/"+detector.detName()+"/hitPmts"; 00083 if (hsvc->regHist(name,hitPmts).isFailure()) { 00084 log << MSG::ERROR << "Could not register " << name << endreq; 00085 delete hitPmts; hitPmts = 0; 00086 return StatusCode::FAILURE; 00087 } 00088 } 00089 { 00090 string name = detector.detName() + "_DtReadout"; 00091 string title = "Time between readouts for " + detector.detName(); 00092 dtReadout = new TH1F(name.c_str(),title.c_str(),200,0,0.02); 00093 dtReadout->GetXaxis()->SetTitle("#Deltat [s]"); 00094 dtReadout->GetYaxis()->SetTitle("Readouts / bin"); 00095 name = filepath+"/"+detector.detName()+"/dtReadout"; 00096 if (hsvc->regHist(name,dtReadout).isFailure()) { 00097 log << MSG::ERROR << "Could not register " << name << endreq; 00098 delete dtReadout; dtReadout = 0; 00099 return StatusCode::FAILURE; 00100 } 00101 } 00102 { 00103 string name = detector.detName() + "_DtReadoutShort"; 00104 string title = "Short time between readouts for " + detector.detName(); 00105 dtReadoutShort = new TH1F(name.c_str(),title.c_str(),200,0,100.e-6); 00106 dtReadoutShort->GetXaxis()->SetTitle("#Deltat [s]"); 00107 dtReadoutShort->GetYaxis()->SetTitle("Readouts / bin"); 00108 name = filepath+"/"+detector.detName()+"/dtReadoutShort"; 00109 if (hsvc->regHist(name,dtReadoutShort).isFailure()) { 00110 log << MSG::ERROR << "Could not register " << name << endreq; 00111 delete dtReadoutShort; dtReadoutShort = 0; 00112 return StatusCode::FAILURE; 00113 } 00114 } 00115 { 00116 string name = detector.detName() + "_AdcSpectrum"; 00117 string title = "ADC spectrum for all channels in " + detector.detName(); 00118 adcSpectrum = new TH1F(name.c_str(),title.c_str(),4096,0,4096); 00119 adcSpectrum->GetXaxis()->SetTitle("ADC value"); 00120 adcSpectrum->GetYaxis()->SetTitle("Entries"); 00121 name = filepath+"/"+detector.detName()+"/adcSpectrum"; 00122 if (hsvc->regHist(name,adcSpectrum).isFailure()) { 00123 log << MSG::ERROR << "Could not register " << name << endreq; 00124 delete adcSpectrum; adcSpectrum = 0; 00125 return StatusCode::FAILURE; 00126 } 00127 } 00128 { 00129 string name = detector.detName() + "_TdcSpectrum"; 00130 string title = "TDC spectrum for all channels in " + detector.detName(); 00131 tdcSpectrum = new TH1F(name.c_str(),title.c_str(),300,0,300); 00132 tdcSpectrum->GetXaxis()->SetTitle("TDC value"); 00133 tdcSpectrum->GetYaxis()->SetTitle("Entries"); 00134 name = filepath+"/"+detector.detName()+"/tdcSpectrum"; 00135 if (hsvc->regHist(name,tdcSpectrum).isFailure()) { 00136 log << MSG::ERROR << "Could not register " << name << endreq; 00137 delete tdcSpectrum; tdcSpectrum = 0; 00138 return StatusCode::FAILURE; 00139 } 00140 } 00141 { 00142 string name = detector.detName() + "_ChargeSum"; 00143 string title = "ADC Charge sum for " + detector.detName(); 00144 chargeSum = new TH1F(name.c_str(),title.c_str(),500,0,20000); 00145 chargeSum->GetXaxis()->SetTitle("Sum(ADC - Baseline)"); 00146 chargeSum->GetYaxis()->SetTitle("Readouts"); 00147 name = filepath+"/"+detector.detName()+"/chargeSum"; 00148 if (hsvc->regHist(name,chargeSum).isFailure()) { 00149 log << MSG::ERROR << "Could not register " << name << endreq; 00150 delete chargeSum; chargeSum = 0; 00151 return StatusCode::FAILURE; 00152 } 00153 } 00154 { 00155 string name = detector.detName() + "_HitPmtVsChargeSum"; 00156 string title = "Number of Hit PMTs versus the Charge Sum for" 00157 + detector.detName(); 00158 hitPmtVsChargeSum = new TH2F(name.c_str(),title.c_str(), 00159 200,0,20000, 00160 200,0,200); 00161 hitPmtVsChargeSum->GetXaxis()->SetTitle("Sum(ADC - Baseline)"); 00162 hitPmtVsChargeSum->GetYaxis()->SetTitle("Number of Hit PMTs"); 00163 name = filepath+"/"+detector.detName()+"/hitPmtVsChargeSum"; 00164 if (hsvc->regHist(name,hitPmtVsChargeSum).isFailure()) { 00165 log << MSG::ERROR << "Could not register " << name << endreq; 00166 delete hitPmtVsChargeSum; hitPmtVsChargeSum = 0; 00167 return StatusCode::FAILURE; 00168 } 00169 } 00170 // Simulated Hits 00171 { 00172 string name = detector.detName() + "_NPhotoElectrons"; 00173 string title = "Number of simulated photoelectrons for " 00174 + detector.detName(); 00175 nPhotoElectrons = new TH1F(name.c_str(),title.c_str(),1000,0,1000); 00176 nPhotoElectrons->GetXaxis()->SetTitle("Number of Photoelectrons"); 00177 nPhotoElectrons->GetYaxis()->SetTitle("Readouts"); 00178 name = filepath+"/"+detector.detName()+"/nPhotoElectrons"; 00179 if (hsvc->regHist(name,nPhotoElectrons).isFailure()) { 00180 log << MSG::ERROR << "Could not register " << name << endreq; 00181 delete nPhotoElectrons; nPhotoElectrons = 0; 00182 return StatusCode::FAILURE; 00183 } 00184 } 00185 // Generated Vertices 00186 { 00187 string name = detector.detName() + "_GenVertexZRho"; 00188 string title = "Position of generated vertices for " + detector.detName(); 00189 genVertexZRho = new TH2F(name.c_str(),title.c_str(), 00190 200,0,3, 00191 200,-5,5); 00192 genVertexZRho->GetXaxis()->SetTitle("Particle (#rho / 3 m)^{2}"); 00193 genVertexZRho->GetYaxis()->SetTitle("Particle z [m]"); 00194 name = filepath+"/"+detector.detName()+"/genVertexZRho"; 00195 if (hsvc->regHist(name,genVertexZRho).isFailure()) { 00196 log << MSG::ERROR << "Could not register " << name << endreq; 00197 delete genVertexZRho; genVertexZRho = 0; 00198 return StatusCode::FAILURE; 00199 } 00200 } 00201 if(findCoincidence){ 00202 // add coincidence histograms 00203 { 00204 // IBD Neutron Capture Time 00205 string name = detector.detName() + "_DtNeutronCapture"; 00206 string title = "IBD Neutron capture spectrum for " + detector.detName(); 00207 dtNeutronCapture = new TH1F(name.c_str(),title.c_str(),200,0,100.e-6); 00208 dtNeutronCapture->GetXaxis()->SetTitle("#Deltat [s]"); 00209 dtNeutronCapture->GetYaxis()->SetTitle("Readouts"); 00210 name = filepath+"/"+detector.detName()+"/dtNeutronCapture"; 00211 if (hsvc->regHist(name,dtNeutronCapture).isFailure()) { 00212 log << MSG::ERROR << "Could not register " << name << endreq; 00213 delete dtNeutronCapture; dtNeutronCapture = 0; 00214 return StatusCode::FAILURE; 00215 } 00216 } 00217 { 00218 // IBD Prompt Energy 00219 string name = detector.detName() + "_PromptEnergy"; 00220 string title = "IBD Prompt Energy for " + detector.detName(); 00221 promptEnergy = new TH1F(name.c_str(),title.c_str(),200,0,12); 00222 promptEnergy->GetXaxis()->SetTitle("Prompt Energy [MeV]"); 00223 promptEnergy->GetYaxis()->SetTitle("Readouts"); 00224 name = filepath+"/"+detector.detName()+"/promptEnergy"; 00225 if (hsvc->regHist(name,promptEnergy).isFailure()) { 00226 log << MSG::ERROR << "Could not register " << name << endreq; 00227 delete promptEnergy; promptEnergy = 0; 00228 return StatusCode::FAILURE; 00229 } 00230 } 00231 { 00232 // IBD Delayed Energy 00233 string name = detector.detName() + "_DelayedEnergy"; 00234 string title = "IBD Delayed Energy for " + detector.detName(); 00235 delayedEnergy = new TH1F(name.c_str(),title.c_str(),200,0,12); 00236 delayedEnergy->GetXaxis()->SetTitle("Delayed Energy [MeV]"); 00237 delayedEnergy->GetYaxis()->SetTitle("Readouts"); 00238 name = filepath+"/"+detector.detName()+"/delayedEnergy"; 00239 if (hsvc->regHist(name,delayedEnergy).isFailure()) { 00240 log << MSG::ERROR << "Could not register " << name << endreq; 00241 delete delayedEnergy; delayedEnergy = 0; 00242 return StatusCode::FAILURE; 00243 } 00244 } 00245 { 00246 // IBD Delayed vs. Prompt Energy 00247 string name = detector.detName() + "_DelayedVsPromptEnergy"; 00248 string title = "IBD Delayed vs. Prompt Energy for " + detector.detName(); 00249 delayedVsPromptEnergy = new TH2F(name.c_str(),title.c_str(), 00250 200,0,12, 00251 200,0,12); 00252 delayedVsPromptEnergy->GetXaxis()->SetTitle("Prompt Energy [MeV]"); 00253 delayedVsPromptEnergy->GetYaxis()->SetTitle("Delayed Energy [MeV]"); 00254 name = filepath+"/"+detector.detName()+"/delayedVsPromptEnergy"; 00255 if (hsvc->regHist(name,delayedVsPromptEnergy).isFailure()) { 00256 log << MSG::ERROR << "Could not register " << name << endreq; 00257 delete delayedVsPromptEnergy; delayedVsPromptEnergy = 0; 00258 return StatusCode::FAILURE; 00259 } 00260 } 00261 } 00262 return StatusCode::SUCCESS; 00263 }
StatusCode AdExamplePlots::fill | ( | ICableSvc * | , | |
const ServiceMode & | , | |||
ICoordSysSvc * | coord, | |||
const ReadoutHeader * | roh | |||
) | [inline] |
Definition at line 265 of file AdPlotterAlg.cc.
00267 { 00268 00269 const DayaBay::ReadoutPmtCrate* ro = 00270 dynamic_cast<const DayaBay::ReadoutPmtCrate*>(roh->readout()); 00271 if (!ro) { 00272 log << MSG::DEBUG << "Got a non-PmtCrate readout, skipping..." << endreq; 00273 return StatusCode::SUCCESS; 00274 } 00275 00276 double adcChargeSum = 0; 00277 int nHitPmts = 0; 00278 const ReadoutPmtCrate::PmtChannelReadouts& 00279 channelMap = ro->channelReadout(); 00280 ReadoutPmtCrate::PmtChannelReadouts::const_iterator 00281 it, done = channelMap.end(); 00282 for (it=channelMap.begin(); it != done; ++it) { 00283 // Ignore calibration PMTs 00284 if(it->first.board() > 12) continue; 00285 nHitPmts++; 00286 00287 // ADC data 00288 double baseline = 500.; 00289 float charge = 0; 00290 const vector<int> &adc = it->second.adc(); 00291 vector<int>::const_iterator cit, cdone=adc.end(); 00292 for (cit=adc.begin(); cit != cdone; ++cit) { 00293 adcSpectrum->Fill(*cit); 00294 charge += *cit - baseline; 00295 } 00296 adcChargeSum += charge; 00297 00298 // TDC data 00299 const vector<int> &tdc = it->second.tdc(); 00300 vector<int>::const_iterator tdcIter, tdcDone = tdc.end(); 00301 for (tdcIter=tdc.begin(); tdcIter != tdcDone; ++tdcIter) { 00302 tdcSpectrum->Fill(*tdcIter); 00303 } 00304 00305 } 00306 hitPmts->Fill(nHitPmts); 00307 chargeSum->Fill(adcChargeSum); 00308 hitPmtVsChargeSum->Fill(adcChargeSum, nHitPmts); 00309 00310 // Time between readouts 00311 if( !firstReadout ){ 00312 TimeStamp dt = ro->triggerTime() - lastTriggerTime; 00313 dtReadout->Fill( dt.GetSeconds() ); 00314 dtReadoutShort->Fill( dt.GetSeconds() ); 00315 }else{ 00316 firstReadout = false; 00317 } 00318 lastTriggerTime = ro->triggerTime(); 00319 00320 // If Simulation headers are available, fill additional figures 00321 const SimReadoutHeader* simReadoutHeader = 0; 00322 const ElecHeader* elecHeader = 0; 00323 vector<const SimHeader*> simHeaders; 00324 vector<const GenHeader*> genHeaders; 00325 vector<const IHeader*> inputHeaders = roh->inputHeaders(); 00326 vector<const IHeader*>::const_iterator headerIter, 00327 headerDone = inputHeaders.end(); 00328 log << MSG::INFO << "Processing Input Headers: " << inputHeaders.size() 00329 << endreq; 00330 for (headerIter=inputHeaders.begin(); headerIter != headerDone; 00331 ++headerIter) { 00332 simReadoutHeader = dynamic_cast<const SimReadoutHeader*>(*headerIter); 00333 if(simReadoutHeader){ 00334 log << MSG::INFO << " Found SimReadoutHeader" << endreq; 00335 break; 00336 } 00337 } 00338 if(simReadoutHeader){ 00339 inputHeaders = simReadoutHeader->inputHeaders(); 00340 headerDone = inputHeaders.end(); 00341 for (headerIter=inputHeaders.begin(); headerIter != headerDone; 00342 ++headerIter) { 00343 elecHeader = dynamic_cast<const ElecHeader*>(*headerIter); 00344 if(elecHeader){ 00345 log << MSG::INFO << " Found ElecHeader" << endreq; 00346 break; 00347 } 00348 } 00349 } 00350 if(elecHeader){ 00351 inputHeaders = elecHeader->inputHeaders(); 00352 headerDone = inputHeaders.end(); 00353 for (headerIter=inputHeaders.begin(); headerIter != headerDone; 00354 ++headerIter) { 00355 const SimHeader* simHeader 00356 = dynamic_cast<const SimHeader*>(*headerIter); 00357 if(simHeader){ 00358 log << MSG::INFO << " Found SimHeader" << endreq; 00359 simHeaders.push_back(simHeader); 00360 } 00361 } 00362 } 00363 if(simHeaders.size() > 0){ 00364 for(unsigned int simHeaderIdx=0; simHeaderIdx<simHeaders.size(); 00365 simHeaderIdx++){ 00366 inputHeaders = (simHeaders[simHeaderIdx])->inputHeaders(); 00367 headerDone = inputHeaders.end(); 00368 for (headerIter=inputHeaders.begin(); headerIter != headerDone; 00369 ++headerIter) { 00370 const GenHeader* genHeader 00371 = dynamic_cast<const GenHeader*>(*headerIter); 00372 if(genHeader){ 00373 log << MSG::INFO << " Found GenHeader" << endreq; 00374 genHeaders.push_back(genHeader); 00375 } 00376 } 00377 } 00378 } 00379 00380 // Fill additional histograms 00381 // Loop over simulated hits 00382 for(unsigned int simHeaderIdx=0; simHeaderIdx<simHeaders.size(); 00383 simHeaderIdx++){ 00384 log << MSG::INFO << " simHeaderIdx = " << simHeaderIdx << endreq; 00385 const SimHeader* simHeader = simHeaders[simHeaderIdx]; 00386 const SimHitHeader* shh = simHeader->hits(); 00387 if(!shh){ 00388 log << MSG::INFO << "Can't find hit header." << endreq; 00389 continue; 00390 } 00391 short int detId = detector.siteDetPackedData(); 00392 SimHitHeader::hc_map::const_iterator hcmapIter 00393 = shh->hitCollection().find(detId); 00394 if(hcmapIter == shh->hitCollection().end()){ 00395 log << MSG::INFO << "Can't find hit collection for detector " 00396 << detId << endreq; 00397 log << MSG::INFO << "Have hit collections for " 00398 << shh->hitCollection().size() << " detectors: "; 00399 SimHitHeader::hc_map::const_iterator hcmapDone 00400 = shh->hitCollection().end(); 00401 for(hcmapIter = shh->hitCollection().begin(); hcmapIter != hcmapDone; 00402 hcmapIter++){ 00403 log << MSG::INFO << hcmapIter->first << "\t"; 00404 } 00405 continue; 00406 } 00407 const SimHitCollection* hc = hcmapIter->second; 00408 if(!hc) continue; 00409 int nPeHits = 0; 00410 const SimHitCollection::hit_container& hits = hc->collection(); 00411 SimHitCollection::hit_container::const_iterator hitIter, 00412 hitEnd = hits.end(); 00413 for(hitIter = hits.begin(); hitIter != hitEnd; hitIter++){ 00414 const SimHit* hit = *hitIter; 00415 if(!hit) continue; 00416 // Ignore calibration pmts 00417 if(AdPmtSensor(hit->sensDetId()).ring()<1) continue; 00418 nPeHits++; 00419 } 00420 log << MSG::INFO << " Npe = " << nPeHits << endreq; 00421 nPhotoElectrons->Fill(nPeHits); 00422 } 00423 00424 for(unsigned int genHeaderIdx=0; genHeaderIdx<genHeaders.size(); 00425 genHeaderIdx++){ 00426 const GenHeader* genHeader = genHeaders[genHeaderIdx]; 00427 const HepMC::GenEvent* event = genHeader->event(); 00428 if(!event) continue; 00429 HepMC::GenEvent::vertex_const_iterator vtxIter, 00430 vtxDone = event->vertices_end(); 00431 for(vtxIter = event->vertices_begin(); vtxIter != vtxDone; vtxIter++){ 00432 const HepMC::GenVertex* vtx = *vtxIter; 00433 if(!vtx) continue; 00434 double x = vtx->position().x(); 00435 double y = vtx->position().y(); 00436 double z = vtx->position().z(); 00437 log << MSG::INFO << "\n" << vtx->position().t() << endreq; 00438 log << MSG::INFO << " Vertex time: " << vtx->position().t() << endreq; 00439 log << MSG::INFO << "\n" << vtx->position().t() << endreq; 00440 Gaudi::XYZPoint globalPoint(x,y,z); 00441 IDetectorElement* coordDE = coord->coordSysDE(globalPoint); 00442 if(!coordDE){ 00443 log << MSG::ERROR << "Failed to find detector element for point: " 00444 << x << "\t" << y << "\t" << z 00445 << endreq; 00446 continue; 00447 } 00448 Gaudi::XYZPoint localPoint = coordDE->geometry()->toLocal(globalPoint); 00449 double rho_3meters = localPoint.Rho()/(3.*Gaudi::Units::meter); 00450 double rhoSq = rho_3meters * rho_3meters; 00451 double z_meters = localPoint.Z()/Gaudi::Units::meter; 00452 genVertexZRho->Fill(rhoSq, z_meters); 00453 if( rhoSq < 0 || rhoSq > 3. || z_meters>5. || z_meters<-5. ){ 00454 log << MSG::VERBOSE << "vtx position: " << localPoint.x() << "\t" 00455 << localPoint.y() << "\t" << localPoint.z() 00456 << endreq; 00457 } 00458 // Example loop over particles in vertex 00459 /* 00460 HepMC::GenVertex::particles_out_const_iterator pIter, 00461 pDone = vtx->particles_out_const_end(); 00462 for(pIter = vtx->particles_out_const_begin(); pIter != pDone; pIter++){ 00463 const HepMC::GenParticle* particle = *pIter; 00464 if(!particle) continue; 00465 log << MSG::VERBOSE << "particle energy: " 00466 << particle->momentum().e() << endreq; 00467 } 00468 */ 00469 // End example 00470 } 00471 } 00472 00473 if(findCoincidence){ 00474 double dtCut_s = 100.0e-6; 00475 double epCutLow = 0.7; 00476 double epCutHigh = 8.0; 00477 double edCutLow = 6.0; 00478 double edCutHigh = 10.0; 00479 double chargeScale = 14000./8.; 00480 double ed = adcChargeSum / chargeScale; 00481 00482 vector<AdSummary> newHistory; 00483 vector<AdSummary>::iterator histIter, histEnd = adHistory.end(); 00484 for(histIter = adHistory.begin(); histIter != histEnd; histIter++){ 00485 double dt = ro->triggerTime() - histIter->triggerTime; 00486 if(dt < dtCut_s){ 00487 AdSummary promptSummary = *histIter; 00488 newHistory.push_back(promptSummary); 00489 double ep = promptSummary.adcSum / chargeScale; 00490 dtNeutronCapture->Fill(dt); 00491 if( ed > edCutLow && ed < edCutHigh ) promptEnergy->Fill(ep); 00492 if( ep > epCutLow && ep < epCutHigh ) delayedEnergy->Fill(ed); 00493 delayedVsPromptEnergy->Fill(ep,ed); 00494 } 00495 } 00496 AdSummary currentSummary; 00497 currentSummary.triggerTime = ro->triggerTime(); 00498 currentSummary.adcSum = adcChargeSum; 00499 newHistory.push_back(currentSummary); 00500 adHistory = newHistory; 00501 } 00502 00503 return StatusCode::SUCCESS; 00504 }
DayaBay::Detector AdExamplePlots::detector [private] |
Definition at line 37 of file AdPlotterAlg.cc.
MsgStream& AdExamplePlots::log [private] |
Definition at line 38 of file AdPlotterAlg.cc.
bool AdExamplePlots::firstReadout [private] |
Definition at line 39 of file AdPlotterAlg.cc.
TimeStamp AdExamplePlots::lastTriggerTime [private] |
Definition at line 40 of file AdPlotterAlg.cc.
vector<AdSummary> AdExamplePlots::adHistory [private] |
Definition at line 41 of file AdPlotterAlg.cc.
Definition at line 46 of file AdPlotterAlg.cc.
Definition at line 48 of file AdPlotterAlg.cc.
Definition at line 50 of file AdPlotterAlg.cc.
Definition at line 51 of file AdPlotterAlg.cc.
Definition at line 52 of file AdPlotterAlg.cc.
Definition at line 53 of file AdPlotterAlg.cc.
Definition at line 54 of file AdPlotterAlg.cc.
Definition at line 55 of file AdPlotterAlg.cc.
Definition at line 56 of file AdPlotterAlg.cc.
Definition at line 59 of file AdPlotterAlg.cc.
Definition at line 60 of file AdPlotterAlg.cc.
Definition at line 61 of file AdPlotterAlg.cc.
Definition at line 62 of file AdPlotterAlg.cc.
Definition at line 63 of file AdPlotterAlg.cc.