00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "DaqBenchmark.h"
00010
00011 #include <ctime>
00012 #include <sstream>
00013
00014 #include "TH2.h"
00015
00016 #include "Conventions/Electronics.h"
00017 #include "DaqXml/DaqXmlStream.h"
00018 #include "DaqReadoutFormat/RomData.h"
00019 #include "Event/DaqCrate.h"
00020 #include "Event/DaqFadcChannel.h"
00021 #include "Event/DaqLtb.h"
00022 #include "Event/DaqLtbFrame.h"
00023 #include "Event/DaqPmtChannel.h"
00024 #include "Event/DaqPmtCrate.h"
00025 #include "Event/Readout.h"
00026 #include "Event/ReadoutHeader.h"
00027 #include "Event/ReadoutPmtChannel.h"
00028 #include "Event/ReadoutPmtCrate.h"
00029 #include "EventReadoutFormat/EventHeader.h"
00030 #include "EventReadoutFormat/EventReadout.h"
00031 #include "EventReadoutFormat/EventTraits.h"
00032 #include "EventReadoutFormat/RomFragment.h"
00033 #include "EventReadoutFormat/RomHeader.h"
00034 #include "FeeReadoutFormat/FeeHit.h"
00035 #include "FeeReadoutFormat/FeeReadout.h"
00036 #include "FileReadoutFormat/DataSeparatorRecord.h"
00037 #include "FileReadoutFormat/FileBuffer.h"
00038 #include "FileReadoutFormat/FileTraits.h"
00039 #include "LtbReadoutFormat/LtbFrame.h"
00040 #include "LtbReadoutFormat/LtbReadout.h"
00041 #include "LtbReadoutFormat/LtbTime.h"
00042 #include "StatisticsSvc/IStatisticsSvc.h"
00043
00044 using DayaBay::FadcChannelId;
00045 using DayaBay::FeeChannelId;
00046 using DayaBay::DaqCrate;
00047 using DayaBay::DaqFadcChannel;
00048 using DayaBay::DaqLtb;
00049 using DayaBay::DaqLtbFrame;
00050 using DayaBay::DaqPmtChannel;
00051 using DayaBay::DaqPmtCrate;
00052 using DayaBay::Readout;
00053 using DayaBay::ReadoutHeader;
00054 using DayaBay::ReadoutPmtChannel;
00055 using DayaBay::ReadoutPmtCrate;
00056 using DybDaq::DataSeparatorRecord;
00057 using DybDaq::EventHeader;
00058 using DybDaq::EventReadout;
00059 using DybDaq::EventTraits;
00060 using DybDaq::FeeHit;
00061 using DybDaq::FeeReadout;
00062 using DybDaq::FileBuffer;
00063 using DybDaq::FileTraits;
00064 using DybDaq::RomData;
00065 using DybDaq::RomFragment;
00066 using DybDaq::RomHeader;
00067 using DybDaq::LtbFrame;
00068 using DybDaq::LtbReadout;
00069 using DybDaq::LtbTime;
00070
00071 using std::string;
00072 using std::stringstream;
00073
00074 static const string i(" ");
00075 static const unsigned int kMaxSlotCount = 22U;
00076 static const unsigned int kMaxFeeChannelCount = 32U;
00077 static const unsigned int kBytesInInt = 4U;
00078
00079 #define TIME_T_BUILTIN_TYPE unsigned long
00080
00081 DaqBenchmark::DaqBenchmark(const string& name,
00082 ISvcLocator* pSvcLocator) :
00083 GaudiAlgorithm(name,
00084 pSvcLocator),
00085 m_statsSvc(0),
00086 m_feeLowGainHistograms( new TH1F**[kMaxSlotCount]),
00087 m_feeHighGainHistograms( new TH1F**[kMaxSlotCount]),
00088 m_feeTdcHistograms( new TH1F**[kMaxSlotCount]),
00089 m_fadcHistograms( new TH2F**[kMaxSlotCount]),
00090 m_eventCount(0),
00091 m_payloadLength(0),
00092 m_beginTime(0),
00093 m_firstEventTime(0),
00094 m_lastEventTime(0) {
00095 for(unsigned int slot = 0;
00096 slot != kMaxSlotCount;
00097 ++slot) {
00098 m_feeLowGainHistograms[slot] = 0;
00099 m_feeHighGainHistograms[slot] = 0;
00100 m_feeTdcHistograms[slot] = 0;
00101 m_fadcHistograms[slot] = 0;
00102 }
00103 declareProperty("UseDaqFormat",
00104 m_useDaqFormat=true,
00105 "True is the benchmarks should us the DaqFormat products");
00106 declareProperty("UseDaqEvent",
00107 m_useDaqEvent=false,
00108 "True is the benchmarks should us the DaqEvent products");
00109 declareProperty("UseReadoutEvent",
00110 m_useReadoutEvent=false,
00111 "True is the benchmarks should us the ReadoutEvent products");
00112 }
00113
00114 DaqBenchmark::~DaqBenchmark() {
00115
00116 }
00117
00118 StatusCode DaqBenchmark::initialize()
00119 {
00120 StatusCode sc = service("StatisticsSvc",
00121 m_statsSvc,
00122 true);
00123 if (sc.isFailure()) {
00124 error() << "Failed to get StatisticsSvc" << endreq;
00125 return sc;
00126 }
00127 m_beginTime = time(0);
00128 return sc;
00129 }
00130
00131 StatusCode DaqBenchmark::finalize()
00132 {
00133 if (m_lastEventTime != m_firstEventTime) {
00134 time_t now = time(0);
00135 const double moduleDelta = difftime(now,
00136 m_beginTime);
00137 const double eventDelta = difftime(m_lastEventTime,
00138 m_firstEventTime);
00139 info() << "Benchmark factor for this job was " << std::setprecision(2) << (moduleDelta/ eventDelta) << "." << endreq;
00140 info() << "Analysis byte rate was " << std::setprecision(2) << (m_payloadLength / (moduleDelta * 1024U * 1024U)) << " MB/s." << endreq;
00141 info() << "Data taking event rate was " << std::setprecision(4) << ((m_eventCount - 1) / eventDelta) << " Hz." << endreq;
00142 info() << "Analysis event rate was " << std::setprecision(4) << ((m_eventCount - 1) / moduleDelta) << " Hz." << endreq;
00143 }
00144
00145 if( m_statsSvc ) {
00146 m_statsSvc->release();
00147 }
00148 return StatusCode::SUCCESS;
00149 }
00150
00151 StatusCode DaqBenchmark::execute() {
00152 const ReadoutHeader* readoutHeader = get<ReadoutHeader>("/Event/Readout/ReadoutHeader");
00153 if (0 == readoutHeader) {
00154 error() << "Failed to get readout header." << endreq;
00155 return StatusCode::FAILURE;
00156 }
00157
00158 if (m_useDaqFormat) {
00159 StatusCode sc = handleDaqFormat(*readoutHeader);
00160 if (sc.isFailure()) {
00161 return sc;
00162 }
00163 }
00164 if (m_useDaqEvent) {
00165 StatusCode sc = handleDaqEvent(*readoutHeader);
00166 if (sc.isFailure()) {
00167 return sc;
00168 }
00169 }
00170 if (m_useReadoutEvent) {
00171 StatusCode sc = handleReadoutEvent(*readoutHeader);
00172 if (sc.isFailure()) {
00173 return sc;
00174 }
00175 }
00176 ++m_eventCount;
00177 if (0 == (m_eventCount % 1000)) {
00178 info() << " Processed " << m_eventCount << " events" << endreq;
00179 }
00180 return StatusCode::SUCCESS;
00181 }
00182
00183 TH1F** DaqBenchmark::getSlotLowGainHistograms(const unsigned int slot) {
00184 return getSlotHistogram(m_feeLowGainHistograms,
00185 slot);
00186 }
00187
00188 TH1F** DaqBenchmark::getSlotHighGainHistograms(const unsigned int slot) {
00189 return getSlotHistogram(m_feeHighGainHistograms,
00190 slot);
00191 }
00192
00193 TH1F** DaqBenchmark::getSlotTdcHistograms(const unsigned int slot) {
00194 return getSlotHistogram(m_feeTdcHistograms,
00195 slot);
00196 }
00197
00198 TH1F** DaqBenchmark::getSlotHistogram(TH1F*** histograms,
00199 const unsigned int slot) {
00200 TH1F** result = histograms[slot];
00201 if (0 == result) {
00202 result = new TH1F*[kMaxFeeChannelCount];
00203 histograms[slot] = result;
00204 for (unsigned int channel = 0;
00205 channel != kMaxFeeChannelCount;
00206 ++channel) {
00207 result[channel] = 0;
00208 }
00209 }
00210 return result;
00211 }
00212
00213 TH2F** DaqBenchmark::getSlotFadcHistograms(const unsigned int slot) {
00214 return getSlotHistogram(m_fadcHistograms,
00215 slot);
00216 }
00217
00218 TH2F** DaqBenchmark::getSlotHistogram(TH2F*** histograms,
00219 const unsigned int slot) {
00220 TH2F** result = histograms[slot];
00221 if (0 == result) {
00222 result = new TH2F*[kMaxFeeChannelCount];
00223 histograms[slot] = result;
00224 for (unsigned int channel = 0;
00225 channel != kMaxFeeChannelCount;
00226 ++channel) {
00227 result[channel] = 0;
00228 }
00229 }
00230 return result;
00231 }
00232
00233 static const string getName(const string& field,
00234 const unsigned int slot,
00235 const unsigned int channelId) {
00236
00237 stringstream name;
00238 name << field << " for slot_" << std::setfill('0') << std::setw(2) << slot
00239 << "_channel_" << std::setfill('0') << std::setw(2) << channelId;
00240 return name.str();
00241 }
00242
00243 static const string getPath(const unsigned int slot,
00244 const unsigned int channelId,
00245 const char* name) {
00246
00247 stringstream path;
00248 path << "/file0//benchmark"
00249 << "/slot_" << std::setfill('0') << std::setw(2) << slot
00250 << "/channel_" << std::setfill('0') << std::setw(2) << channelId
00251 << "/" << name;
00252 return path.str();
00253 }
00254
00255 TH1F* DaqBenchmark::getLowGainHistogram(TH1F** slotLowGainHistograms,
00256 const unsigned int slot,
00257 const unsigned int channelNumber) {
00258 TH1F* result = slotLowGainHistograms[channelNumber];
00259 if (0 == result) {
00260 const string name = getName("Low Gain ADC",
00261 slot,
00262 channelNumber);
00263 result = new TH1F(name.c_str(),
00264 "ADC, low gain",
00265 4096,
00266 0,
00267 4096);
00268 slotLowGainHistograms[channelNumber] = result;
00269 m_statsSvc->put(getPath(slot,
00270 channelNumber,
00271 name.c_str()),
00272 result);
00273 }
00274 return result;
00275 }
00276
00277 TH1F* DaqBenchmark::getHighGainHistogram(TH1F** slotHighGainHistograms,
00278 const unsigned int slot,
00279 const unsigned int channelNumber) {
00280 TH1F* result = slotHighGainHistograms[channelNumber];
00281 if (0 == result) {
00282 const string name = getName("High Gain ADC",
00283 slot,
00284 channelNumber);
00285 result = new TH1F(name.c_str(),
00286 "ADC, high gain",
00287 4096,
00288 0,
00289 4096);
00290 slotHighGainHistograms[channelNumber] = result;
00291 m_statsSvc->put(getPath(slot,
00292 channelNumber,
00293 name.c_str()),
00294 result);
00295 }
00296 return result;
00297 }
00298
00299 TH1F* DaqBenchmark::getTdcHistogram(TH1F** slotTdcHistograms,
00300 const unsigned int slot,
00301 const unsigned int channelNumber) {
00302 TH1F* result = slotTdcHistograms[channelNumber];
00303 if (0 == result) {
00304 const string name = getName("TDC",
00305 slot,
00306 channelNumber);
00307 result = new TH1F(name.c_str(),
00308 "TDC",
00309 1000,
00310 300,
00311 1300);
00312 slotTdcHistograms[channelNumber] = result;
00313 m_statsSvc->put(getPath(slot,
00314 channelNumber,
00315 name.c_str()),
00316 result);
00317 }
00318 return result;
00319 }
00320
00321 TH2F* DaqBenchmark::getFadcHistogram(TH2F** slotFadcHistograms,
00322 const unsigned int slot,
00323 const unsigned int channelNumber) {
00324 TH2F* result = slotFadcHistograms[channelNumber];
00325 if (0 == result) {
00326 const string name = getName("FADC",
00327 slot,
00328 channelNumber);
00329 result = new TH2F(name.c_str(),
00330 "FADC",
00331 0,
00332 120,
00333 120,
00334 0,
00335 256,
00336 256);
00337 slotFadcHistograms[channelNumber] = result;
00338 m_statsSvc->put(getPath(slot,
00339 channelNumber,
00340 name.c_str()),
00341 result);
00342 }
00343 return result;
00344 }
00345
00346 static const time_t getEventTime(const EventReadout& event) {
00347 const EventReadout::RomFragmentPtrList& fragments = event.romFragments();
00348 unsigned int ltbModuleType = event.header().eventTraits().moduleType(EventTraits::kLtbModule);
00349 EventReadout::RomFragmentPtrList::const_iterator fragment = fragments.begin();
00350 while((ltbModuleType != ((*fragment)->header().moduleType()))
00351 && fragment != fragments.end()) {
00352 ++fragment;
00353 }
00354 if (fragment == fragments.end()) {
00355 return 0;
00356 }
00357 const LtbReadout& ltbReadout = dynamic_cast<const LtbReadout&>((*fragment)->unwrappedData());
00358 const LtbReadout::LtbFramePtrList& frames = ltbReadout.ltbFrames();
00359 if (0 == frames.size()) {
00360 return 0;
00361 }
00362 return (*(frames.begin()))->dateTime().unixTime();
00363 }
00364
00365 StatusCode DaqBenchmark::handleDaqFormat(const ReadoutHeader& readoutHeader) {
00366 const EventReadout* event = 0;
00367 const DaqCrate* daqCrate = readoutHeader.daqCrate();
00368 if (0 == daqCrate) {
00369 const Readout* readout = readoutHeader.readout();
00370 if (0 == readout) {
00371 error() << "Failed to get DAQ readout or readout from header" << endreq;
00372 return StatusCode::FAILURE;
00373 }
00374 event = readout->eventReadout();
00375 if (0 == event) {
00376 error() << "Failed to get event readout from readout" << endreq;
00377 return StatusCode::FAILURE;
00378 }
00379 } else {
00380 event = &(daqCrate->eventReadout());
00381 }
00382
00383 m_lastEventTime = getEventTime(*event);
00384 if (0 == m_firstEventTime) {
00385 m_firstEventTime = m_lastEventTime;
00386 }
00387 handleEvent(*event);
00388 m_payloadLength += event->header().totalSize() * kBytesInInt;
00389 return StatusCode::SUCCESS;
00390 }
00391
00392 void DaqBenchmark::handleEvent(const DybDaq::EventReadout& event) {
00393 const EventReadout::RomFragmentPtrList& fragments = event.romFragments();
00394 for (EventReadout::RomFragmentPtrList::const_iterator fragment = fragments.begin();
00395 fragment != fragments.end();
00396 ++fragment) {
00397 handleFragment(*(*fragment));
00398 }
00399 }
00400
00401 void DaqBenchmark::handleFragment(const RomFragment& fragment) {
00402 const RomHeader& header = fragment.header();
00403 const unsigned int slot = header.slot();
00404 const unsigned int kFeeModuleType = header.eventTraits().moduleType(EventTraits::kFeeModule);
00405 if (kFeeModuleType == header.moduleType()) {
00406 handleFee(dynamic_cast<const FeeReadout&>(fragment.unwrappedData()),
00407 slot);
00408 }
00409 }
00410
00411 void DaqBenchmark::handleFee(const FeeReadout& readout,
00412 const unsigned int slot) {
00413 TH1F** slotLowGainHistograms = getSlotLowGainHistograms(slot);
00414 TH1F** slotHighGainHistograms = getSlotHighGainHistograms(slot);
00415 TH1F** slotTdcHistograms = getSlotTdcHistograms(slot);
00416
00417 const FeeReadout::FeeHitPtrList& hits = readout.feeHits();
00418 for (FeeReadout::FeeHitPtrList::const_iterator hitPtr = hits.begin();
00419 hitPtr != hits.end();
00420 ++hitPtr) {
00421 const FeeHit& hit = *(*hitPtr);
00422 const unsigned int channelNumber = hit.channelId() + 1;
00423 TH1F* rangeHistogram = 0;
00424 if (hit.isHighRangeAdc()) {
00425 rangeHistogram = getLowGainHistogram(slotLowGainHistograms,
00426 slot,
00427 channelNumber);
00428 } else {
00429 rangeHistogram = getHighGainHistogram(slotHighGainHistograms,
00430 slot,
00431 channelNumber);
00432 }
00433 rangeHistogram->Fill(hit.adc());
00434 TH1F* tdcHistogram = getTdcHistogram(slotTdcHistograms,
00435 slot,
00436 channelNumber);
00437 tdcHistogram->Fill(hit.tdc());
00438 }
00439 }
00440
00441 static const time_t getEventTime(const TimeStamp& time) {
00442 time_t seconds = time.GetSec();
00443 return seconds;
00444 }
00445
00446 StatusCode DaqBenchmark::handleReadoutEvent(const ReadoutHeader& readoutHeader) {
00447 const Readout* readout = readoutHeader.readout();
00448 if (0 == readout) {
00449 error() << "Failed to get readout from header" << endreq;
00450 return StatusCode::FAILURE;
00451 }
00452
00453 m_lastEventTime = getEventTime(readout->triggerTime());
00454 if (0 == m_firstEventTime) {
00455 m_firstEventTime = m_lastEventTime;
00456 }
00457 const ReadoutPmtCrate* pmtReadout = dynamic_cast<const ReadoutPmtCrate*>(readout);
00458 if (0 != pmtReadout) {
00459 handleEvent(*pmtReadout);
00460 }
00461 return StatusCode::SUCCESS;
00462 }
00463
00464 void DaqBenchmark::handleEvent(const DayaBay::ReadoutPmtCrate& crate) {
00465 const std::vector<DayaBay::FeeChannelId> channels = const_cast<ReadoutPmtCrate&>(crate).channels();
00466 std::vector<DayaBay::FeeChannelId>::const_iterator finished = channels.end();
00467 for (std::vector<DayaBay::FeeChannelId>::const_iterator channel = channels.begin();
00468 channel != finished;
00469 ++channel) {
00470 handleChannel(const_cast<ReadoutPmtCrate&>(crate).channel(*channel));
00471 }
00472 }
00473
00474 void DaqBenchmark::handleChannel(const ReadoutPmtChannel& channel) {
00475 const FeeChannelId& feeChannelId = channel.channelId();
00476 const unsigned int slot = feeChannelId.board();
00477 TH1F** slotLowGainHistograms = getSlotLowGainHistograms(slot);
00478 TH1F** slotHighGainHistograms = getSlotHighGainHistograms(slot);
00479 TH1F** slotTdcHistograms = getSlotTdcHistograms(slot);
00480
00481 const unsigned int channelNumber = feeChannelId.connector();
00482 TH1F* lowGainHistogram = getLowGainHistogram(slotLowGainHistograms,
00483 slot,
00484 channelNumber);
00485 TH1F* highGainHistogram = getHighGainHistogram(slotHighGainHistograms,
00486 slot,
00487 channelNumber);
00488 unsigned int hit = 0;
00489 const std::vector<int>& charges = channel.adc();
00490 const std::vector<int>::const_iterator finishedCharges = charges.end();
00491 for(std::vector<int>::const_iterator charge = charges.begin();
00492 finishedCharges != charge;
00493 ++charge) {
00494 if (channel.adcRange(hit) == DayaBay::FeeGain::kHigh) {
00495 highGainHistogram->Fill(*charge);
00496 } else {
00497 lowGainHistogram->Fill(*charge);
00498 }
00499 ++hit;
00500 }
00501
00502 TH1F* tdcHistogram = getTdcHistogram(slotTdcHistograms,
00503 slot,
00504 channelNumber);
00505 const std::vector<int>& times = channel.tdc();
00506 const std::vector<int>::const_iterator finishedTimes = times.end();
00507 for(std::vector<int>::const_iterator time = times.begin();
00508 finishedTimes != time;
00509 ++time) {
00510 tdcHistogram->Fill(*time);
00511 }
00512 }
00513
00514 StatusCode DaqBenchmark::handleDaqEvent(const ReadoutHeader& readoutHeader) {
00515 const DaqCrate* daqCrate = readoutHeader.daqCrate();
00516 if (0 == daqCrate) {
00517 error() << "Failed to get readout from header" << endreq;
00518 return StatusCode::FAILURE;
00519 }
00520
00521 m_lastEventTime = getEventTime(daqCrate->triggerTime());
00522 if (0 == m_firstEventTime) {
00523 m_firstEventTime = m_lastEventTime;
00524 }
00525 const DaqPmtCrate* pmtCrate = daqCrate->asPmtCrate();
00526 if (0 != pmtCrate) {
00527 handleEvent(*pmtCrate);
00528 }
00529 return StatusCode::SUCCESS;
00530 }
00531
00532 void DaqBenchmark::handleEvent(const DayaBay::DaqPmtCrate& crate) {
00533 {
00534 const DaqLtb& triggerBoard = crate.localTriggerBoard();
00535 const DaqLtb::LtbFramePtrList& frames = triggerBoard.frames();
00536 const DaqLtb::LtbFramePtrList::const_iterator finished = frames.end();
00537 for(DaqLtb::LtbFramePtrList::const_iterator frame = frames.begin();
00538 finished != frame;
00539 ++frame) {
00540 handleFrame(*(*frame));
00541 }
00542 }
00543
00544 {
00545 const DaqPmtCrate::PmtChannelPtrList& channels = crate.pmtChannelReadouts();
00546 const DaqPmtCrate::PmtChannelPtrList::const_iterator finished = channels.end();
00547 for (DaqPmtCrate::PmtChannelPtrList::const_iterator channel = channels.begin();
00548 channel != finished;
00549 ++channel) {
00550 handleChannel(*(*channel));
00551 }
00552 }
00553
00554 {
00555 const DaqPmtCrate::FadcChannelPtrList& channels = crate.fadcChannelReadouts();
00556 const DaqPmtCrate::FadcChannelPtrList::const_iterator finished = channels.end();
00557 for (DaqPmtCrate::FadcChannelPtrList::const_iterator channel = channels.begin();
00558 channel != finished;
00559 ++channel) {
00560 handleChannel(*(*channel));
00561 }
00562 }
00563 }
00564
00565 void DaqBenchmark::handleFrame(const DaqLtbFrame& ) {
00566 }
00567
00568 void DaqBenchmark::handleChannel(const DaqPmtChannel& channel) {
00569 const FeeChannelId& feeChannelId = channel.channelId();
00570 const unsigned int slot = feeChannelId.board();
00571 TH1F** slotLowGainHistograms = getSlotLowGainHistograms(slot);
00572 TH1F** slotHighGainHistograms = getSlotHighGainHistograms(slot);
00573 TH1F** slotTdcHistograms = getSlotTdcHistograms(slot);
00574
00575 const unsigned int channelNumber = feeChannelId.connector();
00576 TH1F* lowGainHistogram = getLowGainHistogram(slotLowGainHistograms,
00577 slot,
00578 channelNumber);
00579 TH1F* highGainHistogram = getHighGainHistogram(slotHighGainHistograms,
00580 slot,
00581 channelNumber);
00582 TH1F* tdcHistogram = getTdcHistogram(slotTdcHistograms,
00583 slot,
00584 channelNumber);
00585
00586 const unsigned int finished = channel.hitCount();
00587 for(unsigned int hit = 0;
00588 hit != finished;
00589 ++hit) {
00590 if (channel.isHighGainAdc(hit)) {
00591 highGainHistogram->Fill(channel.adc(hit));
00592 } else {
00593 lowGainHistogram->Fill(channel.adc(hit));
00594 }
00595 tdcHistogram->Fill(channel.tdc(hit));
00596 }
00597 }
00598
00599 void DaqBenchmark::handleChannel(const DaqFadcChannel& channel) {
00600 const FadcChannelId& fadcChannelId = channel.channelId();
00601 const unsigned int slot = fadcChannelId.board();
00602 TH2F** slotFadcHistograms = getSlotFadcHistograms(slot);
00603
00604 const unsigned int channelNumber = fadcChannelId.connector();
00605 TH2F* fadcHistogram = getFadcHistogram(slotFadcHistograms,
00606 slot,
00607 channelNumber);
00608
00609 const DaqFadcChannel::FadcSamples& samples = channel.samples();
00610 unsigned int bin = 0;
00611 const DaqFadcChannel::FadcSamples::const_iterator finished = samples.end();
00612 for (DaqFadcChannel::FadcSamples::const_iterator sample = samples.begin();
00613 finished != sample;
00614 ++sample) {
00615 fadcHistogram->Fill(bin,
00616 *sample,
00617 1.0);
00618 ++bin;
00619 }
00620 }
00621