@@ -169,13 +169,12 @@ namespace opdet {
169169 // Required functions.
170170 void produce (art::Event & e) override ;
171171 std::vector<raw::OpDetWaveform> sliceWaveforms (std::vector<raw::OpDetWaveform> fWaveforms ,
172- int WaveIndex ,
172+ std::vector< int > PMT_Channels ,
173173 std::vector<int > *MonPulse,
174174 int PairMultiplicityThreshold,
175175 double tickPeriod,
176176 int ticksPerSlice,
177- float PercentTicksBeforeCross,
178- int PMTPerBoard);
177+ float PercentTicksBeforeCross);
179178 std::vector<std::vector<int >> sliceMonPulse (std::vector<int > *MonPulse,
180179 int PairMultiplicityThreshold,
181180 int ticksPerSlice,
@@ -314,6 +313,8 @@ namespace opdet {
314313 produces< std::vector< raw::OpDetWaveform > >();
315314 produces<bool >(" triggerEmulation" );
316315 produces<int >(" pairsOverThreshold" );
316+ produces< std::vector<int > >(" pairsOverThresholdVec" );
317+ produces<int >(" numSlices" );
317318 produces< std::vector< raw::OpDetWaveform > >(" slicedWaveforms" );
318319 produces< std::vector<int > >(" MonPulses" );
319320 produces< std::vector<int > >(" MonPulseSizes" );
@@ -373,65 +374,67 @@ namespace opdet {
373374 art::ServiceHandle<art::TFileService> tfs;
374375 art::ServiceHandle<calib::TriggerEmulationService> fTriggerService ;
375376
376- int PMTPerBoard = fTriggerService ->getPMTPerBoard ();
377- int fTotalCAENBoards = fTriggerService ->getTotalCAENBoards ();
377+ std::vector<int > numPairsOverThreshold;
378378
379- int TotalFlash = fWaveforms .size () / (fTotalCAENBoards * PMTPerBoard);
379+ // get PMT channels
380+ std::vector<int > PMT_Channels;
381+ for (const auto & wvf : fWaveforms ) {
382+ auto ch = wvf.ChannelNumber ();
383+ if (map.isPDType (ch, " pmt_uncoated" ) || map.isPDType (ch, " pmt_coated" )) PMT_Channels.push_back (ch);
384+ }
380385
381- int numPairsOverThreshold = 0 ;
386+ if (PMT_Channels.empty ()) std::cout<<" Error: PMT has *NO* PMT channels in fWaveforms" <<std::endl;
387+ int WaveIndex = PMT_Channels[0 ];
388+ int WaveformSize = fWaveforms [WaveIndex].size ();
382389
383- // Loop through by flash -> compatible with ConstructMonPulse logic
384- for (int FlashCounter = 0 ; FlashCounter < TotalFlash; ++FlashCounter) {
385- int WaveIndex = FlashCounter*PMTPerBoard;
386- int WaveformSize = fWaveforms [WaveIndex].size ();
390+ std::vector<int >* MonPulse = new std::vector<int >(WaveformSize, 0 );
387391
388- std::vector<int >* MonPulse = new std::vector<int >(WaveformSize, 0 );
389-
390- int pairThisFlash = 0 ;
391- // Send 3ms waveforms to ConstructMonPulse
392- fTriggerService ->ConstructMonPulse (fWaveforms , MonThreshold, MonPulse, FlashCounter, &pairThisFlash);
393- numPairsOverThreshold = numPairsOverThreshold + pairThisFlash;
392+ int pairThisFlash = 0 ;
393+ // Send 3ms waveforms to ConstructMonPulse
394+ fTriggerService ->ConstructMonPulse (fWaveforms , MonThreshold, MonPulse, 0 , &pairThisFlash, PMT_Channels);
395+ numPairsOverThreshold.push_back (pairThisFlash);
394396
395- double tickPeriod = sampling_rate (clockData);
397+ double tickPeriod = sampling_rate (clockData);
396398
397- std::vector<raw::OpDetWaveform> SlicedWaveforms = sliceWaveforms (fWaveforms , WaveIndex , MonPulse, PairMultiplicityThreshold, tickPeriod, ticksPerSlice, PercentTicksBeforeCross, PMTPerBoard );
398- std::vector<std::vector<int >> SlicedMonPulse = sliceMonPulse (MonPulse, PairMultiplicityThreshold, ticksPerSlice, PercentTicksBeforeCross);
399+ std::vector<raw::OpDetWaveform> SlicedWaveforms = sliceWaveforms (fWaveforms , PMT_Channels , MonPulse, PairMultiplicityThreshold, tickPeriod, ticksPerSlice, PercentTicksBeforeCross);
400+ std::vector<std::vector<int >> SlicedMonPulse = sliceMonPulse (MonPulse, PairMultiplicityThreshold, ticksPerSlice, PercentTicksBeforeCross);
399401
400- SlicedWaveformsAll.push_back (std::move (SlicedWaveforms));
401- MonPulsesFlat.insert (MonPulsesFlat.end (), (*MonPulse).begin (), (*MonPulse).end ());
402- pulseSizes.push_back (MonPulse->size ());
402+ int numSlices = SlicedMonPulse.size ();
403+ SlicedWaveformsAll.push_back (std::move (SlicedWaveforms));
404+ MonPulsesFlat.insert (MonPulsesFlat.end (), (*MonPulse).begin (), (*MonPulse).end ());
405+ pulseSizes.push_back (MonPulse->size ());
403406
404- if (SaveNewPlots) {
405- // Save histograms
406- // Sliced waveforms
407- for (size_t j; j < SlicedWaveformsAll.size (); ++j) {
408- std::stringstream plotname2;
409- plotname2 << " Sliced_waveforms_" << e.id ().event () << " _Mon_" << MonThreshold << " _" << FlashCounter << " _slice" << j;
410- PlotWaveforms (SlicedWaveformsAll[j], plotname2.str ());
411- }
412- // Long MonPulse
407+ if (SaveNewPlots) {
408+ // Save histograms
409+ // Sliced waveforms
410+ for (size_t j; j < SlicedWaveformsAll.size (); ++j) {
411+ std::stringstream plotname2;
412+ plotname2 << " Sliced_waveforms_" << e.id ().event () << " _Mon_" << MonThreshold << " _slice" << j;
413+ PlotWaveforms (SlicedWaveformsAll[j], plotname2.str ());
414+ }
415+ // Long MonPulse
416+ std::stringstream histname;
417+ histname << " Long_event_" << e.id ().event () << " _Mon_" << MonThreshold;
418+ TH1D* MonHist = tfs->make <TH1D>(histname.str ().c_str (), histname.str ().c_str (),
419+ MonPulse->size (), 0.0 , MonPulse->size () - 1 );
420+ for (size_t i = 0 ; i < MonPulse->size (); i++) {
421+ MonHist->SetBinContent (i + 1 , (*MonPulse)[i]);
422+ }
423+ // Sliced MonPulse
424+ for (size_t idx = 0 ; idx < SlicedMonPulse.size (); ++idx) {
425+ auto const & vec = SlicedMonPulse[idx];
413426 std::stringstream histname;
414- histname << " Long_event_" << e.id ().event () << " _Mon_" << MonThreshold << " _" << FlashCounter;
427+ histname << " Sliced_event_" << e.id ().event () << " _Mon_" << MonThreshold << " _slice" << idx;
428+
415429 TH1D* MonHist = tfs->make <TH1D>(histname.str ().c_str (), histname.str ().c_str (),
416- MonPulse->size (), 0.0 , MonPulse->size () - 1 );
417- for (size_t i = 0 ; i < MonPulse->size (); i++) {
418- MonHist->SetBinContent (i + 1 , (*MonPulse)[i]);
419- }
420- // Sliced MonPulse
421- for (size_t idx = 0 ; idx < SlicedMonPulse.size (); ++idx) {
422- auto const & vec = SlicedMonPulse[idx];
423- std::stringstream histname;
424- histname << " Sliced_event_" << e.id ().event () << " _Mon_" << MonThreshold << " _" << FlashCounter << " _slice" << idx;
425-
426- TH1D* MonHist = tfs->make <TH1D>(histname.str ().c_str (), histname.str ().c_str (),
427- vec.size (), 0.0 , vec.size () - 1 );
428- for (size_t i = 0 ; i < vec.size (); i++) {
429- MonHist->SetBinContent (i + 1 , vec[i]);
430- }
430+ vec.size (), 0.0 , vec.size () - 1 );
431+ for (size_t i = 0 ; i < vec.size (); i++) {
432+ MonHist->SetBinContent (i + 1 , vec[i]);
431433 }
432- }
434+ }
435+ }
433436 delete MonPulse;
434- }
437+ // }
435438
436439 // find the trigger locations for the waveforms - old version, keeping for validation
437440 for (const raw::OpDetWaveform &waveform : fWaveforms ) {
@@ -485,9 +488,21 @@ namespace opdet {
485488 e.put (std::move (triggerFlag), " triggerEmulation" );
486489
487490
491+ // put number of slices in the event
492+ auto numSlicesFlag = std::make_unique<int >(numSlices);
493+ e.put (std::move (numSlicesFlag), " numSlices" );
494+
495+
488496 // put trigger pair result in the event
489- auto pairFlag = std::make_unique<int >(numPairsOverThreshold);
497+ int max_numPairsOverThreshold = 0 ;
498+ if (!numPairsOverThreshold.empty ()) {
499+ for (int n : numPairsOverThreshold) if (n > max_numPairsOverThreshold) max_numPairsOverThreshold = n;
500+ }
501+ auto pairFlag = std::make_unique<int >(max_numPairsOverThreshold);
490502 e.put (std::move (pairFlag), " pairsOverThreshold" );
503+ // put trigger pair result in the event
504+ auto pairFlagVec = std::make_unique<std::vector<int >>(numPairsOverThreshold);
505+ e.put (std::move (pairFlagVec), " pairsOverThresholdVec" );
491506
492507
493508 // put sliced waveforms in the event
@@ -504,7 +519,6 @@ namespace opdet {
504519 // put the waveforms in the event
505520 e.put (std::move (SlicedWaveformsPtr), " slicedWaveforms" );
506521
507-
508522 // put MonPulses in the event
509523 auto flatPtr = std::make_unique<std::vector<int >>(std::move (MonPulsesFlat));
510524 e.put (std::move (flatPtr), " MonPulses" );
@@ -611,13 +625,12 @@ namespace opdet {
611625 // sliceWaveforms function
612626 std::vector<raw::OpDetWaveform> opDetDigitizerSBND::sliceWaveforms (
613627 std::vector<raw::OpDetWaveform> fWaveforms ,
614- int WaveIndex ,
628+ std::vector< int > PMT_Channels ,
615629 std::vector<int >* MonPulse,
616630 int PairMultiplicityThreshold,
617631 double tickPeriod,
618632 int ticksPerSlice,
619- float PercentTicksBeforeCross,
620- int PMTPerBoard)
633+ float PercentTicksBeforeCross)
621634 {
622635 // before and after crossing point (default is ~20% and ~80%)
623636 int ticksBeforeCross = static_cast <int >(std::round (PercentTicksBeforeCross*ticksPerSlice));
@@ -628,8 +641,8 @@ namespace opdet {
628641
629642 std::vector<raw::OpDetWaveform> SlicedWaveforms;
630643 // loop through channels
631- for (int chan = 0 ; chan < PMTPerBoard; ++chan ) {
632- const raw::OpDetWaveform& wf = fWaveforms [WaveIndex + chan];
644+ for (int chan : PMT_Channels ) {
645+ const raw::OpDetWaveform& wf = fWaveforms [chan];
633646
634647 for (auto [start, end] : intervals) {
635648 double sliceTime = wf.TimeStamp () + start * tickPeriod;
0 commit comments