LDMX Software
trigscint::TrigScintTrackProducer Class Reference

making tracks from trigger scintillator clusters More...

#include <TrigScintTrackProducer.h>

Public Member Functions

 TrigScintTrackProducer (const std::string &name, framework::Process &process)
 
void configure (framework::config::Parameters &ps) override
 Callback for the EventProcessor to configure itself from the given set of parameters.
 
void produce (framework::Event &event) override
 Process the event and put new data products into it.
 
void onProcessStart () override
 Callback for the EventProcessor to take any necessary action when the processing of events starts, such as creating histograms.
 
void onProcessEnd () override
 Callback for the EventProcessor to take any necessary action when the processing of events finishes, such as calculating job-summary quantities.
 
- Public Member Functions inherited from framework::Producer
 Producer (const std::string &name, Process &process)
 Class constructor.
 
virtual void process (Event &event) final
 Processing an event for a Producer is calling produce.
 
- Public Member Functions inherited from framework::EventProcessor
 DECLARE_FACTORY (EventProcessor, EventProcessor *, const std::string &, Process &)
 declare that we have a factory for this class
 
 EventProcessor (const std::string &name, Process &process)
 Class constructor.
 
virtual ~EventProcessor ()=default
 Class destructor.
 
virtual void beforeNewRun (ldmx::RunHeader &run_header)
 Callback for Producers to add parameters to the run header before conditions are initialized.
 
virtual void onNewRun (const ldmx::RunHeader &run_header)
 Callback for the EventProcessor to take any necessary action when the run being processed changes.
 
virtual void onFileOpen (EventFile &event_file)
 Callback for the EventProcessor to take any necessary action when a new event input ROOT file is opened.
 
virtual void onFileClose (EventFile &event_file)
 Callback for the EventProcessor to take any necessary action when a event input ROOT file is closed.
 
template<class T >
const T & getCondition (const std::string &condition_name)
 Access a conditions object for the current event.
 
TDirectory * getHistoDirectory ()
 Access/create a directory in the histogram file for this event processor to create histograms and analysis tuples.
 
void setStorageHint (framework::StorageControl::Hint hint)
 Mark the current event as having the given storage control hint from this module_.
 
void setStorageHint (framework::StorageControl::Hint hint, const std::string &purposeString)
 Mark the current event as having the given storage control hint from this module and the given purpose string.
 
int getLogFrequency () const
 Get the current logging frequency from the process.
 
int getRunNumber () const
 Get the run number from the process.
 
std::string getName () const
 Get the processor name.
 
void createHistograms (const std::vector< framework::config::Parameters > &histos)
 Internal function which is used to create histograms passed from the python configuration @parma histos vector of Parameters that configure histograms to create.
 

Private Member Functions

ldmx::TrigScintTrack makeTrack (std::vector< ldmx::TrigScintCluster > clusters)
 
void matchXYTracks (std::vector< ldmx::TrigScintTrack > &tracks)
 

Private Attributes

std::vector< ldmx::TrigScintTracktracks_
 
double max_delta_ {0.}
 
double max_delta_vert {0.}
 
double bar_length_y_ {30.}
 
int verbose_ {0}
 
std::string seeding_collection_
 
std::vector< std::string > input_collections_
 
std::string output_collection_
 
std::string pass_name_ {""}
 
bool skip_last_ {false}
 
int vert_bar_start_idx_ {52}
 
int n_bars_y_ {16}
 
int n_bars_x_ {8}
 
float bar_width_y_ {3.}
 
float bar_gap_y_ {2.1}
 
float bar_width_x_ {3.}
 
float bar_gap_x_ {0.1}
 
float x_conv_factor_
 
float x_start_
 
float y_conv_factor_
 
float y_start_
 

Additional Inherited Members

- Protected Member Functions inherited from framework::EventProcessor
void abortEvent ()
 Abort the event immediately.
 
- Protected Attributes inherited from framework::EventProcessor
HistogramPool histograms_
 helper object for making and filling histograms
 
NtupleManagerntuple_ {NtupleManager::getInstance()}
 Manager for any ntuples.
 
logging::logger the_log_
 The logger for this EventProcessor.
 

Detailed Description

making tracks from trigger scintillator clusters

Definition at line 19 of file TrigScintTrackProducer.h.

Constructor & Destructor Documentation

◆ TrigScintTrackProducer()

trigscint::TrigScintTrackProducer::TrigScintTrackProducer ( const std::string & name,
framework::Process & process )
inline

Definition at line 21 of file TrigScintTrackProducer.h.

22 : Producer(name, process) {}
Producer(const std::string &name, Process &process)
Class constructor.
virtual void process(Event &event) final
Processing an event for a Producer is calling produce.

Member Function Documentation

◆ configure()

void trigscint::TrigScintTrackProducer::configure ( framework::config::Parameters & parameters)
overridevirtual

Callback for the EventProcessor to configure itself from the given set of parameters.

The parameters a processor has access to are the member variables of the python class in the sequence that has class_name equal to the EventProcessor class name.

For an example, look at MyProcessor.

Parameters
parametersParameters for configuration.

Reimplemented from framework::EventProcessor.

Definition at line 9 of file TrigScintTrackProducer.cxx.

9 {
10 max_delta_ = ps.get<double>(
11 "delta_max"); // max distance to consider adding in a cluster to track
12 max_delta_vert= ps.get<double>("delta_vert_max"); //max distance between pad 1/2 and 3 along the x axis
13 //to consider make a track using the vertical bars
14 seeding_collection_ = ps.get<std::string>(
15 "seeding_collection"); // probably tagger pad, "TriggerPadTagClusters"
16 input_collections_ = ps.get<std::vector<std::string>>(
17 "further_input_collections"); // {"TriggerPadUpClusters" ,
18 // "TriggerPadDnClusters" }
19 output_collection_ = ps.get<std::string>("output_collection");
20 pass_name_ = ps.get<std::string>("input_pass_name");
21 verbose_ = ps.get<int>("verbosity");
22 vert_bar_start_idx_ = ps.get<int>("vertical_bar_start_index");
23 n_bars_y_ = ps.get<int>("number_horizontal_bars");
24 bar_width_y_ = ps.get<double>("horizontal_bar_width");
25 bar_gap_y_ = ps.get<double>("horizontal_bar_gap");
26 n_bars_x_ = ps.get<int>("number_vertical_bars");
27 bar_width_x_ = ps.get<double>("vertical_bar_width");
28 bar_gap_x_ = ps.get<double>("vertical_bar_gap");
29 skip_last_ = ps.get<bool>("allow_skip_last_collection");
30 bar_length_y_=ps.get<double>("horizontal_bar_length"); //bar lenght of the horizontal bars
31
32 // TO DO: allow any number of input collections
33
34 if (verbose_) {
35 ldmx_log(info) << "In TrigScintTrackProducer: configure done!" << std::endl;
36 ldmx_log(info) << "Got parameters: \nSeeding: " << seeding_collection_
37 << "\nTolerance: " << max_delta_
38 << "\nInput: " << input_collections_.at(0) << " and "
39 << input_collections_.at(1)
40 << "\nInput pass name: " << pass_name_
41 << "\nAllow tracks with no hit in last collection: "
42 << skip_last_
43 << "\nVertical bar start index: " << vert_bar_start_idx_
44 << "\nNumber of horizontal bars: " << n_bars_y_
45 << "\nHorizontal bar width: " << bar_width_y_
46 << "\nHorizontal bar gap: " << bar_gap_y_
47 << "\nNumber of vertical bars: " << n_bars_x_
48 << "\nVertical bar width: " << bar_width_x_
49 << "\nVertical bar gap: " << bar_gap_x_
50 << "\nOutput: " << output_collection_
51 << "\nVerbosity: " << verbose_;
52 }
53 // each bar only goes half this distance up (overlap/zig-zag)
54 y_conv_factor_ = (bar_width_y_ + bar_gap_y_) / 2.;
55 // half height of pad
56 y_start_ = -(n_bars_y_ * (bar_width_y_ + bar_gap_y_) - bar_gap_y_) / 2.;
57 // each bar goes entire distance sideways (no overlap)
58 x_conv_factor_ = bar_width_x_ + bar_gap_x_;
59 // half width of pad
60 x_start_ = -(n_bars_x_ * (bar_width_x_ + bar_gap_x_) - bar_gap_x_) / 2.;
61
62 return;
63}

References framework::config::Parameters::get().

◆ makeTrack()

ldmx::TrigScintTrack trigscint::TrigScintTrackProducer::makeTrack ( std::vector< ldmx::TrigScintCluster > clusters)
private

Definition at line 485 of file TrigScintTrackProducer.cxx.

486 {
487 // for now let's keep a straight, unweighted centroid
488 // consider the possibility that at least one cluster has a centroid
489 // identically == 0. then we need to shift them by 1 if we want to do energy
490 // weighted track centroid later. but no need now
492 float centroid = 0;
493 float centroid_x = 0;
494 float centroid_y = 0;
495 float beam_efrac = 0;
496 float pe = 0;
497 for (uint i = 0; i < clusters.size(); i++) {
498 centroid += (clusters.at(i)).getCentroid();
499 centroid_x += (clusters.at(i)).getCentroidX();
500 centroid_y += (clusters.at(i)).getCentroidY();
501 tr.addConstituent(clusters.at(i));
502 beam_efrac += (clusters.at(i)).getBeamEfrac();
503 pe += (clusters.at(i)).getPE();
504 }
505 centroid /= clusters.size();
506 centroid_x /= clusters.size();
507 if (centroid >= vert_bar_start_idx_) {
508 if (verbose_) {
509 ldmx_log(debug)
510 << " -- In makeTrack made vertical bar track with centroid "
511 << centroid << " and y flag sum " << centroid_y;
512 // try commenting this to check if that helps with an out-of-bounds
513 // problem
514 // << " from clusters with y centroids";
515 // for (uint i = 0; i < clusters.size(); i++)
516 // ldmx_log(debug) << "\tpad " << i << ": centroidY "
517 // << (clusters.at(i)).getCentroidY();
518 }
519 // then the sum of centroid y is 0, 2, 4 or 6
520 // we have 4 divisions, so, the center of it should be divNb/8
521 // (or rather, that's where channel nBars/8 begins)
522 // and then a factor 2 for the zig-zag pattern
523 centroid_y = (centroid_y + 1) * 2 * n_bars_y_ / 8.;
524 // TODO: here we could instead just use quadrant indices 0-3 by dividing by
525 // 2 but that would mean that in the raw, x and y track centroidY would mean
526 // different things
527 if (verbose_) ldmx_log(debug) << " -- new centroidY = " << centroid_y;
528 } else
529 centroid_y /= clusters.size();
530
531 beam_efrac /= clusters.size();
532 pe /= clusters.size();
533
534 float residual = 0;
535 for (uint i = 0; i < clusters.size(); i++)
536 residual += ((clusters.at(i)).getCentroid() - centroid) *
537 ((clusters.at(i)).getCentroid() - centroid);
538 residual = sqrt(residual / clusters.size());
539
540
541 float residual_x = 0; //only for the vertical bars
542 if (centroid>=vert_bar_start_idx_) {
543 for (uint i = 0; i < clusters.size(); i++)
544 residual_x += ((clusters.at(i)).getCentroidX() - centroid_x) *
545 ((clusters.at(i)).getCentroidX() - centroid_x);
546 residual_x = sqrt(residual_x / clusters.size());
547 }
548
549
550 tr.setResidualX(residual_x);
551 tr.setCentroid(centroid);
552 tr.setCentroidX(centroid_x);
553 tr.setCentroidY(centroid_y);
554 tr.setResidual(residual);
555 tr.setBeamEfrac(beam_efrac);
556 tr.setPE(pe);
557
558 if (verbose_) {
559 ldmx_log(debug) << " -- In makeTrack made track with centroid "
560 << centroid << " and residual " << residual << " and pe "
561 << pe << " from clusters with centroids";
562 for (uint i = 0; i < clusters.size(); i++)
563 ldmx_log(debug) << "\tpad " << i << ": centroid "
564 << (clusters.at(i)).getCentroid();
565 }
566
567 return tr;
568}
Represents a track of trigger scintillator clusters.
void setCentroidX(float centroid)
Set the x centroid of the track.
void setResidual(float resid)
Set the detector ID residual of the track.
void setCentroidY(float centroid)
Set the y centroid of the track.
void setPE(float pe)
Set the average cluster pe of the track.
void addConstituent(TrigScintCluster cl)
Add a cluster to the list of track constituents.
void setCentroid(float centroid)
Set the detector ID centroid of the track.
void setBeamEfrac(float e)
Set beam energy fraction of hit.
void setResidualX(float resid)
Set the x residual of the track.

◆ matchXYTracks()

void trigscint::TrigScintTrackProducer::matchXYTracks ( std::vector< ldmx::TrigScintTrack > & tracks)
private

Definition at line 571 of file TrigScintTrackProducer.cxx.

572 {
573 // map quadrant nb to track (can be multiple per quadrant)
574 std::multimap<int, int>
575 y_idx_quad_map; // key = quad, val = track index in collection
576 std::multimap<int, int> x_idx_quad_map;
577
578 std::multimap<int, ldmx::TrigScintTrack> y_quad_map;
579 std::multimap<int, ldmx::TrigScintTrack> x_quad_map;
580 // map track in quadrant back to index in entire track collection
581 // used for updating collection track variables
582 std::map<ldmx::TrigScintTrack, int> y_track_map;
583 std::map<ldmx::TrigScintTrack, int> x_track_map;
584
585 uint trk_idx = -1;
586 for (auto trk : tracks) {
587 trk_idx++;
588 // 1. get the y bar tracks with centroidX = -1
589 if (trk.getCentroidX() == -1) {
590 if (verbose_)
591 ldmx_log(debug) << " -- In matchXYTracks found y track at "
592 << trk.getCentroidY() << "; mapping to quad "
593 << (int)trk.getCentroidY() / (n_bars_y_/2) << " with trk index "
594 << trk_idx;
595 // 2. order them... or map them to quadrants. note that there are 2 layers
596 // so 2*n_bars_y_/4 channels per quadrant
597 y_quad_map.insert(std::make_pair((int)(trk.getCentroidY() / (n_bars_y_/2)), trk));
598 y_track_map[trk] = trk_idx;
599 y_idx_quad_map.insert(
600 std::make_pair((int)(trk.getCentroidY() / (n_bars_y_/2)), trk_idx));
601
602 } else { // 3. get the remaining tracks (from vertical bars) and map them
603 // (back) to (middle of) quadrants
604 x_quad_map.insert(std::make_pair((int)(trk.getCentroidY() / (n_bars_y_/2)), trk));
605 x_track_map[trk] = trk_idx;
606 x_idx_quad_map.insert(
607 std::make_pair((int)(trk.getCentroidY() / (n_bars_y_/2)), trk_idx));
608 if (verbose_)
609 ldmx_log(debug) << " -- In matchXYTracks found x track at (x,y) = ("
610 << trk.getCentroidX() << ", " << trk.getCentroidY()
611 << "); mapping to quad " << (int)trk.getCentroidY() / (n_bars_y_/2)
612 << " with trk index " << trk_idx;
613 }
614 }
615
616 // 4a
617 //
618 // 1) here use the geometry? if we can assume perfect alignment we can take
619 // width and nBars and take nBars/2 as origin
620 // --- now do the matching ---
621
622 // if there is no useful matching to be done: these are the pad width wide
623 // numbers
624 float x0 = 0;
625 // this should be half the pad... could also set
626 // it to full beam spot width
627 float sx0 = fabs(x_start_);
628 float sx0_vert=fabs(bar_length_y_/2); // When there are no hits
629 // along the vertical bars
630
631 // y_start_ is half the pad, so this should be half a quadrant
632 float sy0 = fabs(y_start_) / 4.;
633
634 // assume at least one y track. will have to figure out if there is ever a
635 // reason to use an isolated x track in its place.
636 for (auto yitr = y_quad_map.begin(); yitr != y_quad_map.end(); ++yitr) {
637 int n_yin_quad = y_quad_map.count((*yitr).first);
638 int n_xin_quad = x_quad_map.count((*yitr).first);
639 float y{-9999.}, sy{-9999.}, x{-9999.}, x1{-9999.}, x2{-9999.}, sx1{-9999.},
640 sx2{-9999.}, y1{-9999.}, y2{-9999.}, sy1{-9999.}, sy2{-9999.};
641 // quad midpoint:
642 float y0 = (((*yitr).first * 8)*y_conv_factor_ )+y_start_+ sy0;
643 float sx = 1. / 2 *
644 x_conv_factor_; // rely on x precision being one single bar
645 // width; always used unless x is undeterminable
646
647 // check all x first
648 // do the easiest first:
649 if (n_xin_quad == 0) { // then there's no hope of setting a better x here
650 // just use the beam spot width... and center of pad
651 x = x0;
652 sx = sx0_vert;
653 if (verbose_)
654 ldmx_log(debug) << "\t\t\t no x info in quad " << (*yitr).first
655 << "; will set x to middle of pad, pad half-width as "
656 "precision: set (x, sx)=("
657 << x << ", " << sx << ")";
658 } // 0 x tracks in quadrant
659 else if (n_xin_quad ==
660 1) { // slightly harder: 1 x track -- might be easy if
661 // it's just one y track; if several, need to
662 // think about overlaps. but in overlap case, just
663 // revert to setting x0 and sx0, when we know
664 auto xitr = x_quad_map.find((*yitr).first);
665 x = ((*xitr).second).getCentroidX() * x_conv_factor_ + x_start_;
666
667 if (verbose_)
668 ldmx_log(debug) << "\t\t\t 1 x in quad " << (*yitr).first
669 << ", getting (x, sx)=(" << x << ", " << sx << ")";
670 } // 1 x track in quadrant
671 else if (n_xin_quad == 2) { // finally if we have two tracks, get x1 and x2
672 // and decide later how to use them
673 // don't think we want to experiment with discerning three overlapping
674 // tracks, so not >= 2
675 // continue; //debugging: skip for now -- didn't help
676 auto xitr1 = x_quad_map.lower_bound((*yitr).first);
677 auto xitr2 = x_quad_map.upper_bound((*yitr).first);
678 xitr2--; // upper_bound points to next element
679
680 if (xitr1 != xitr2) { // should be true already but...
681 x1 = ((*xitr1).second).getCentroidX() * x_conv_factor_ + x_start_;
682 x2 = ((*xitr2).second).getCentroidX() * x_conv_factor_ + x_start_;
683 sx1 = x_conv_factor_ / 2.; // 1 bar width
684 sx2 = sx1;
685 x = (x1 + x2) / 2.;
686 sx = fabs(x1 - x2) / 2; // rely on x precision being one single pad width
687 if (verbose_)
688 ldmx_log(debug) << "\t\t -- 2 x in quad: setting y track x "
689 "coordinate to midpoint";
690 }
691 } // if 2 x tracks in quad
692
693 if (n_xin_quad >= 3) { // no implementaion made so far
694 x = x0;
695 sx = sx0;
696 if (verbose_)
697 ldmx_log(debug) << "\t\t\t currently no x info assigned in ambiguous case of "
698 << n_xin_quad
699 << "vertical bar track candidates in quad " << (*yitr).first
700 << "; will set x to middle of pad, pad half-width as "
701 "precision: set (x, sx)=("
702 << x << ", " << sx << ")";
703 } // 3 x tracks in quadrant
704
705 // ok! over y:
706 // can skip 0 y case by construction
707 if (n_yin_quad == 1) { // we can already now tell what the y coordinate and
708 // its precision is
709 y = ((*yitr).second).getCentroidY() * y_conv_factor_ + y_start_;
710 sy = ((*yitr).second).getResidual() * y_conv_factor_;
711 // if all clusters lined up, assign
712 // precision of 1 bar width
713 if (sy == 0) sy = 1. / 2 * y_conv_factor_;
714
715 if (n_xin_quad <= 1) {
716 // 4. every quadrant which just has one of each --> done ;
717 // b) set the sx, sy of the x track now, using the residuals from the
718 // other b1) special case: no x tracks; then x, sx have been set above
719 if (n_xin_quad==1){
720 auto xidx = x_idx_quad_map.find((*yitr).first);
721 tracks.at((*xidx).second).setPosition(x, y);
722 tracks.at((*xidx).second).setSigmaXY(sx, sy);
723 }
724 if (verbose_)
725 ldmx_log(debug) << "\t\t\t in quad " << (*yitr).first
726 << ", set (x, y) = (" << x << ", " << y
727 << ") and (sx, sy) = " << sx << ", " << sy << ")";
728 auto yidx = y_idx_quad_map.find((*yitr).first);
729 tracks.at((*yidx).second).setPosition(x, y);
730 tracks.at((*yidx).second).setSigmaXY(sx, sy);
731 continue;
732 }
733 } // 1 y, 0 or 1 or 3+ x track in quadrant
734
735 if (verbose_)
736 ldmx_log(debug) << "\t\t in quad " << (*yitr).first
737 << ", not single x,y tracks: " << n_xin_quad
738 << " of x and " << n_yin_quad << " of y";
739
740 if (n_yin_quad == 2) { // let's start here and see if we can do >= 2 later
741 // here one could do sth to avoid checking the other y track again in the
742 // outermost loop over y
743 auto yitr1 = y_quad_map.lower_bound((*yitr).first);
744 auto yitr2 = y_quad_map.upper_bound((*yitr).first);
745 yitr2--; // back up once
746 y1 = ((*yitr1).second).getCentroidY() * y_conv_factor_ + y_start_;
747 y2 = ((*yitr2).second).getCentroidY() * y_conv_factor_ + y_start_;
748 sy1 = ((*yitr1).second).getResidual() * y_conv_factor_;
749 sy2 = ((*yitr2).second).getResidual() * y_conv_factor_;
750 if (sy1 == 0) sy1 = 1. / 2 * y_conv_factor_;
751 if (sy2 == 0) sy2 = 1. / 2 * y_conv_factor_;
752 y = (y1 + y2) / 2.;
753 sy = fabs(y1 - y2) / 2 ;
754 if (verbose_)
755 ldmx_log(debug)
756 << "\t\t -- 2 y in quad: setting x track y coordinate to midpoint";
757 } // 2y in quad
758
759 if ((n_xin_quad == 0 || n_xin_quad >= 3) && (n_yin_quad == 2)) { //not using the X tracks for now for >=3
760 if (n_xin_quad == 0){
761 if (verbose_)
762 ldmx_log(debug)
763 << "\t\t -- No x tracks but 2 y tracks in quad: unusual behaviour";
764 }
765 auto yidx1 = y_idx_quad_map.lower_bound((*yitr).first);
766 auto yidx2 = y_idx_quad_map.upper_bound((*yitr).first);
767 yidx2--;
768 tracks.at((*yidx1).second).setPosition(x, y1);
769 tracks.at((*yidx1).second).setSigmaXY(sx, sy1);
770 tracks.at((*yidx2).second).setPosition(x, y2);
771 tracks.at((*yidx2).second).setSigmaXY(sx, sy2);
772 continue;
773 }
774
775 if (n_yin_quad == 1 &&
776 n_xin_quad == 2) { // don't think we want to experiment with discerning
777 // three overlapping tracks, so not >= 2
778
779 // first: set the y track coordinates to x = the mid of x tracks, y = y
780 // of y track
781 auto yidx = y_idx_quad_map.find((*yitr).first);
782 tracks.at((*yidx).second).setPosition(x, y);
783 tracks.at((*yidx).second).setSigmaXY(sx, sy);
784
785 int min_overlap_pe = 250;
786 if (((*yitr).second).getPE() < min_overlap_pe) {
787 // can't tell, really, that either of these belong to the y track. so.
788 // let them keep their own x coordinate but set y to quadrant midpoint,
789 // with uncertainty +/- half quadrant width (1/8 of pad height)
790 y = y0;
791 sy = sy0;
792 if (verbose_)
793 ldmx_log(debug) << "\t\t -- Can't tell which x track should be "
794 "matched to single y track. Setting both x track "
795 "coordinates to y quadrant value:";
796 } // if can't assume overlap
797 else if (verbose_)
798 ldmx_log(debug) << "\t\t -- Found large PE count ("
799 << ((*yitr).second).getPE() << " > " << min_overlap_pe
800 << "), suggesting overlap! Setting both x track "
801 "coordinates to y track value:";
802
803 // consider making two x tracks out if this one, and, anyway have to set
804 // their average as the y track x cocordinate
805 // EXPERIMENTAL : apply only to x tracks, which can be disregarded for
806 // electron counting
807 if (verbose_)
808 ldmx_log(debug) << "\t\t -- (x1, x2, y) = (" << x1 << ", " << x2
809 << ", " << y << ") and (sx1, sx2, sy) = " << sx1 << ", "
810 << sx2 << ", " << sy << ")";
811
812 // now set x track coordinates according to overlap check result
813 auto xidx1 = x_idx_quad_map.lower_bound((*yitr).first);
814 auto xidx2 = x_idx_quad_map.upper_bound((*yitr).first);
815 xidx2--; // upper_bound points to (last+1) element
816 tracks.at((*xidx1).second).setPosition(x1, y);
817 tracks.at((*xidx1).second).setSigmaXY(sx1, sy);
818 tracks.at((*xidx2).second).setPosition(x2, y);
819 tracks.at((*xidx2).second).setSigmaXY(sx2, sy);
820
821 } // 1 y, 2 x tracks in the quadrant
822 else if (n_yin_quad == 2 && n_xin_quad == 1) {
823 // 5b) if there are more y than x: could be an overlap
824
825 // first: set the x track coordinates to x = x of x track, y = the mid of
826 // y tracks
827 auto xidx = x_idx_quad_map.find((*yitr).first);
828 tracks.at((*xidx).second).setPosition(x, y);
829 tracks.at((*xidx).second).setSigmaXY(sx, sy);
830
831 auto xitr = x_quad_map.lower_bound((*yitr).first);
832 int min_overlap_pe = 300;
833 if (((*xitr).second).getPE() < min_overlap_pe) {
834 if (verbose_)
835 ldmx_log(debug)
836 << "\t\t just 1 x track with not-unusual PE in the quad -- can't "
837 "match; setting mid-point values for x ";
838 x = x0;
839 sx = sx0;
840 } // if can't assume overlap
841 else {
842 // consider making two x tracks out if this one, and, anyway have to set
843 // their average as the y track x cocordinate
844 // EXPERIMENTAL : apply only to x tracks, which can be disregarded for
845 // electron counting
846 if (verbose_)
847 ldmx_log(debug) << "\t\t -- Found large PE count ("
848 << ((*xitr).second).getPE() << " > " << min_overlap_pe
849 << ") in x track, suggesting overlap! Setting both y "
850 "track coordinates to x track value:";
851 } // if can assume overlap
852 if (verbose_)
853 ldmx_log(debug) << "\t\t -- (x, y1, y2) = (" << x << ", " << y1 << ", "
854 << y2 << ") and (sx, sy1, sy2) = " << sx << ", " << sy1
855 << ", " << sy2 << ")";
856
857 auto yidx1 = y_idx_quad_map.lower_bound((*yitr).first);
858 auto yidx2 = y_idx_quad_map.upper_bound((*yitr).first);
859 yidx2--; // upper_bound points to next element
860 tracks.at((*yidx1).second).setPosition(x, y1);
861 tracks.at((*yidx1).second).setSigmaXY(sx, sy1);
862 tracks.at((*yidx2).second).setPosition(x, y2);
863 tracks.at((*yidx2).second).setSigmaXY(sx, sy2);
864
865 } // 2 y and 1 x track in quad
866 else if (n_yin_quad == 2 && n_xin_quad == 2) {
867 // MIDPONTS ALL OVER!
868 auto xidx1 = x_idx_quad_map.lower_bound((*yitr).first);
869 auto xidx2 = x_idx_quad_map.upper_bound((*yitr).first);
870 xidx2--;
871 auto yidx1 = y_idx_quad_map.lower_bound((*yitr).first);
872 auto yidx2 = y_idx_quad_map.upper_bound((*yitr).first);
873 yidx2--;
874
875 if (y_idx_quad_map.find((*yitr).first) == y_idx_quad_map.end())
876 ldmx_log(error) << "The two y tracks in the same quadrant at "
877 << (*yitr).first
878 << " appear to not be found in the y track map! "
879 "investigate. Note that yidx1.first = "
880 << (*yidx1).first
881 << " and yidx2.first = " << (*yidx2).first;
882 else {
883 tracks.at((*xidx1).second).setPosition(x1, y);
884 tracks.at((*xidx1).second).setSigmaXY(sx1, sy);
885 tracks.at((*xidx2).second).setPosition(x2, y);
886 tracks.at((*xidx2).second).setSigmaXY(sx2, sy);
887
888 tracks.at((*yidx1).second).setPosition(x, y1);
889 tracks.at((*yidx1).second).setSigmaXY(sx, sy1);
890 tracks.at((*yidx2).second).setPosition(x, y2);
891 tracks.at((*yidx2).second).setSigmaXY(sx, sy2);
892
893 if (verbose_)
894 ldmx_log(debug) << "\t\t -- in a 2 x 2 situaiton; midpoint y: " << y
895 << " for both x tracks, midpoint x: " << x
896 << " for both y tracks";
897 }
898 } // if 2 y, 2 x tracks
899
900 if (n_xin_quad > 2) {
901 if (verbose_)
902 ldmx_log(debug) << "\t\t -*-*-*- more than 2 x tracks in the same quad "
903 "-- nothing done about the x,y coordinates in this "
904 "situation -- implement if needed!!";
905 }
906 if (n_yin_quad > 2) {
907 if (verbose_)
908 ldmx_log(debug) << "\t\t -*-*-*- more than 2 y tracks in the same quad "
909 "-- nothing done about the x,y coordinates in this "
910 "situation -- implement if needed!!";
911 }
912
913 } // over y tracks
914
915 y_quad_map.clear();
916 x_quad_map.clear();
917
918 // return tracks;
919}

◆ onProcessEnd()

void trigscint::TrigScintTrackProducer::onProcessEnd ( )
overridevirtual

Callback for the EventProcessor to take any necessary action when the processing of events finishes, such as calculating job-summary quantities.

Reimplemented from framework::EventProcessor.

Definition at line 927 of file TrigScintTrackProducer.cxx.

927 {
928 ldmx_log(debug) << "Process ends!";
929
930 return;
931}

◆ onProcessStart()

void trigscint::TrigScintTrackProducer::onProcessStart ( )
overridevirtual

Callback for the EventProcessor to take any necessary action when the processing of events starts, such as creating histograms.

Reimplemented from framework::EventProcessor.

Definition at line 921 of file TrigScintTrackProducer.cxx.

921 {
922 ldmx_log(debug) << "Process starts!";
923
924 return;
925}

◆ produce()

void trigscint::TrigScintTrackProducer::produce ( framework::Event & event)
overridevirtual

Process the event and put new data products into it.

Parameters
eventThe Event to process.

Implements framework::Producer.

Definition at line 65 of file TrigScintTrackProducer.cxx.

65 {
66 // parameters.
67 // one pad cluster collection to use as seed
68 // a vector with the other two
69 // a maximum distance between seed centroid and other pad clusters
70 // allowed to belong to the same track
71 // an output collection name a verbosity controller
72
73 if (verbose_) {
74 ldmx_log(debug)
75 << "TrigScintTrackProducer: produce() starts! Event number: "
76 << event.getEventHeader().getEventNumber();
77 }
78 if (!event.exists(seeding_collection_, pass_name_)) {
79 ldmx_log(info) << "No collection called " << seeding_collection_
80 << "; skipping event";
81 // << "; still, not skipping event";
82 return;
83 }
84
85 if (!event.exists(seeding_collection_, pass_name_)) {
86 ldmx_log(info) << "No collection called " << seeding_collection_
87 << "; skipping event";
88 return;
89 }
90 const auto seeds{event.getCollection<ldmx::TrigScintCluster>(
91 seeding_collection_, pass_name_)};
92 uint num_seeds = seeds.size();
93
94 if (verbose_) {
95 ldmx_log(debug) << "Got track seeding cluster collection "
96 << seeding_collection_ << " with " << num_seeds
97 << " entries ";
98 }
99
100 if (!event.exists(input_collections_.at(0), pass_name_)) {
101 ldmx_log(info) << "No collection called " << input_collections_.at(0)
102 << "; skipping event";
103 // << "; still, not skipping event";
104
105 return;
106 }
107 const auto clusters_pad1{event.getCollection<ldmx::TrigScintCluster>(
108 input_collections_.at(0), pass_name_)};
109
110 if (!event.exists(input_collections_.at(1), pass_name_)) {
111 ldmx_log(info) << "No collection called "
112 << input_collections_.at(1)
113 // << "; still, not skipping event";
114 << "; skipping event";
115 std::vector<ldmx::TrigScintTrack> empty{};
116 event.add(output_collection_, empty);
117 return;
118 }
119
120 const auto clusters_pad2{event.getCollection<ldmx::TrigScintCluster>(
121 input_collections_.at(1), pass_name_)};
122
123 if (verbose_) {
124 ldmx_log(debug) << "Got the other two pad collections:"
125 << input_collections_.at(0) << " with "
126 << clusters_pad1.size() << " entries, and "
127 << input_collections_.at(1) << " with "
128 << clusters_pad2.size() << " entries.";
129 }
130 std::vector<ldmx::TrigScintTrack> cleaned_tracks;
131 std::vector<ldmx::TrigScintTrack> cleaned_tracks_y;
132 std::vector<ldmx::TrigScintTrack> cleaned_tracks_x;
133
134 // loop over the clusters in the seeding pad collection, if there are clusters
135 // in all pads
136 // bool skipDn = false;
137 if (num_seeds && clusters_pad1.size()) {
138 // could check this explicitly here: and then just get out of all checks on
139 // the dn pad immediately
140 // if (! clusters_pad2.size())
141 // skipDn = true ;
142 for (const auto &seed : seeds) {
143 // for each seed, search through the other two pads to match all clusters
144 // with centroids within tolerance to tracks
145 float centroid = seed.getCentroid();
146
147 std::vector<ldmx::TrigScintTrack> track_candidates;
148
149 if (verbose_ > 1) {
150 ldmx_log(debug) << "Got seed with centroid " << centroid;
151 }
152
153 // reset for each seed
154 // bool madeTrack = false;
155
156 for (const auto &cluster1 : clusters_pad1) {
157 if (verbose_ > 1) {
158 ldmx_log(debug) << "\tGot pad1 cluster with centroid "
159 << cluster1.getCentroid();
160 }
161 if ((fabs(cluster1.getCentroid() - centroid) < max_delta_ &&
162 centroid < vert_bar_start_idx_) ||
163 (centroid >= vert_bar_start_idx_ && cluster1.getCentroid() >= vert_bar_start_idx_ &&
164 seed.getCentroidX() == cluster1.getCentroidX())) {
165 // use geometry y overlap scheme to see if this is really a match in x
166 // should be done in a map
167
168 if (centroid >= vert_bar_start_idx_ &&
169 seed.getCentroidY() < cluster1.getCentroidY()) {
170 // impossible combination
171 if (verbose_ > 1) {
172 ldmx_log(debug) << "\tSkipping impossible x cluster combination "
173 "with y flags (tag up) ("
174 << seed.getCentroidY() << " "
175 << cluster1.getCentroidY() << ")";
176 }
177 continue;
178 }
179
180 // else: first (possible) match! loop through next pad too
181
182 if (verbose_ > 1) {
183 ldmx_log(debug) << "\t\tIt is close enough!. Check pad2";
184 }
185
186 // try making third pad clusters an optional part of track
187
188 std::vector<ldmx::TrigScintCluster> cluster_vec = {seed, cluster1};
189
190 bool has_match_dn = false;
191
192 for (const auto &cluster2 : clusters_pad2) {
193 if (verbose_ > 1) {
194 ldmx_log(debug) << "\tGot pad2 cluster with centroid "
195 << cluster2.getCentroid();
196 }
197
198 if ((fabs(cluster2.getCentroid() - centroid) < max_delta_ &&
199 centroid < vert_bar_start_idx_) ||
200 (centroid >= vert_bar_start_idx_ && cluster2.getCentroid() >= vert_bar_start_idx_ &&
201 fabs(seed.getCentroidX() - cluster2.getCentroidX()) <= max_delta_vert)) {
202 // use geometry y overlap scheme to see if this is really a match
203 // in x
204
205 if (centroid >= vert_bar_start_idx_ &&
206 (seed.getCentroidY() < cluster2.getCentroidY() ||
207 cluster1.getCentroidY() >
208 cluster2.getCentroidY())) { // impossible
209 if (verbose_ > 1) {
210 ldmx_log(debug)
211 << "\tSkipping impossible x cluster combination with y "
212 "flags (tag up dn) ("
213 << seed.getCentroidY() << " " << cluster1.getCentroidY()
214 << " " << cluster2.getCentroidY() << ")";
215 }
216 continue;
217 }
218
219 // first match! loop through next pad too
220
221 if (verbose_ > 1) {
222 ldmx_log(debug) << "\t\tIt is close enough!. Make a track";
223 }
224
225 // only make this vector now! this ensures against hanging
226 // clusters with indices from earlier in the loop
227 std::vector<ldmx::TrigScintCluster> three_cluster_vec = {
228 seed, cluster1, cluster2};
229
230 /*
231 // here we could break if we didn't want to allow all possible
232 combinations madeTrack=true; break; //we're done with this
233 iteration once there's a track made
234 */
235 // make a track
236 ldmx::TrigScintTrack track = makeTrack(three_cluster_vec);
237 track_candidates.push_back(track);
238 has_match_dn = true;
239 } // if match in pad2
240 } // over clusters in pad2
241 // if there was no match to this in pad 2, make a track with just
242 // these two clusters
243 if (!has_match_dn && skip_last_) {
244 // we allow skipping last pad if needed
245 ldmx::TrigScintTrack track = makeTrack(cluster_vec);
246 track_candidates.push_back(track);
247 }
248
249 } // if possible (x,)y match in pad1
250 /*
251 //same here
252 if (madeTrack)
253 break;
254 */
255
256 } // over clusters in pad1
257
258 // continue to next seed if 0 track candidates
259 if (track_candidates.size() == 0) continue;
260
261 int keep_idx = 0;
262 float min_residual = 1000; // some large number
263
264 // no need to choose between only one candidate track
265 if (track_candidates.size() > 1) {
266 // now for each seed, pick only the track with the smallest residual.
267
268 if (verbose_) {
269 ldmx_log(debug) << "Got " << track_candidates.size()
270 << " tracks to check.";
271 }
272
273 for (uint idx = 0; idx < track_candidates.size(); idx++) {
274 if ((track_candidates.at(idx)).getResidual() < min_residual) {
275 keep_idx = (int)idx;
276 min_residual =
277 (track_candidates.at(idx)).getResidual(); // update minimum
278
279 if (verbose_ > 1) {
280 ldmx_log(debug)
281 << "Track at index " << idx
282 << " has smallest residual so far: " << min_residual;
283 }
284
285 } // finding min residual
286 } // over track candidates
287 } // if more than 1 to choose from
288
289 // store the track at keepIdx, if there was one we made it this far and
290 // keepIdx is 0 or has been updated to the smallest residual track idx
291 // if (keepIdx >= 0) {
292 tracks_.push_back(track_candidates.at(keep_idx));
293 if (verbose_) {
294 ldmx_log(debug) << "Kept track at index " << keep_idx;
295 ldmx_log(trace) << track_candidates.at(keep_idx);
296 }
297 //}
298 } // over seeds
299
300 // done here if there were no tracks found
301 if (tracks_.size() == 0) {
302 if (verbose_) {
303 ldmx_log(debug) << "No tracks found!";
304 }
305 std::vector<ldmx::TrigScintTrack> empty{};
306 event.add(output_collection_, empty);
307 return;
308 }
309 // now, if there are multiple seeds sharing the same downstream hits, this
310 // should also be remedied with a selection on min residual.
311
312 // The logic of this loop kind of assumes I can remove tracks immediately --
313 // that way I can do pairwise checks between more tracks within a single
314 // loop. But for now I haven't figured out how to erase elements in a fool
315 // proof way. So I iterate over a vector...
316
317 std::vector keep_indices(tracks_.size(), 1);
318 if (verbose_ > 1)
319 ldmx_log(debug) << "vector of indices to keep has size "
320 << keep_indices.size();
321
322 for (uint idx = tracks_.size() - 1; idx > 0; idx--) {
323 // since we start in one end, we only have to check matches in one
324 // direction
325 ldmx::TrigScintTrack track = tracks_.at(idx);
326 for (int idx_comp = idx - 1; idx_comp >= 0; idx_comp--) {
327 if (verbose_ > 1)
328 ldmx_log(debug) << "In track disambiguation loop, idx points at "
329 << idx << " and prev idx points at " << idx_comp;
330
331 ldmx::TrigScintTrack next_track = tracks_.at(idx_comp);
332
333 // no need to start pulling constituents from tracks that are
334 // ridiculously far apart
335 if (((fabs(track.getCentroid() - next_track.getCentroid()) <
336 3 * max_delta_) && (track.getCentroid()<vert_bar_start_idx_)) //for the horizontal bars
337 || ((fabs(track.getCentroidX() - next_track.getCentroidX()) < 2*max_delta_vert)
338 && (track.getCentroidY() == next_track.getCentroidY()) && (track.getCentroid()>=vert_bar_start_idx_))) {
339 //and for the vertical bars, check if they are in the same quad and close enough
340 std::vector<ldmx::TrigScintCluster> consts_1 =
341 track.getConstituents();
342 std::vector<ldmx::TrigScintCluster> consts_2 =
343 next_track.getConstituents();
344 if (verbose_ > 1)
345 ldmx_log(debug)
346 << "In track disambiguation loop, got the two tracks, "
347 "with nConstituents "
348 << consts_1.size() << " and " << consts_2.size()
349 << ", respectively. ";
350 // let's do "if either cluster is shared" right now... but could also
351 // have it settable to use a stricter cut: an AND
352 if (((consts_1[1].getCentroid() == consts_2[1].getCentroid() ||
353 ((consts_1.size() > 2) && (consts_2.size() > 2) &&
354 (consts_1[2].getCentroid() == consts_2[2].getCentroid()))) && (track.getCentroid()<vert_bar_start_idx_)) ||
355 //horizontal bars
356 ((track.getCentroid()>=vert_bar_start_idx_) && ((consts_1[1].getCentroidX() == consts_2[1].getCentroidX()) ||
357 (consts_1[2].getCentroidX() == consts_2[2].getCentroidX())
358 || (consts_1[0].getCentroidX() == consts_2[0].getCentroidX())))) { //and vertical bars
359
360 if (verbose_ > 1) {
361 ldmx_log(debug) << "Found overlap! Tracks at index " << idx
362 << " and " << idx_comp;
363 ldmx_log(trace) << tracks_.at(idx);
364 ldmx_log(trace) << tracks_.at(idx_comp);
365 }
366
367 if (((fabs((tracks_.at(idx)).getResidualX() -(tracks_.at(idx_comp)).getResidualX()))< 0.01) //it should be equal
368 && (track.getCentroid()>=vert_bar_start_idx_)){ //specific case for the vertical bars
369 continue; //currently we can't do more here
370 } else if (((tracks_.at(idx)).getResidual() <(tracks_.at(idx_comp)).getResidual() && (track.getCentroid()<vert_bar_start_idx_)) ||
371 ((tracks_.at(idx)).getResidualX() <(tracks_.at(idx_comp)).getResidualX() && (track.getCentroid()>=vert_bar_start_idx_))) {
372 // next track (lower index) is a worse choice, remove its flag for
373 // keeping
374 keep_indices.at(idx_comp) = 0;
375 } else // prefer next track over current. remove current track's
376 // keep
377 // flag
378 keep_indices.at(idx) = 0;
379 /*}
380 else {
381 tracks_.erase(itNext);
382 // removeIdx.push_back(idx+1);
383 // we might see the same index two times in the loop in this
384 case, if there are three seeds sharing the same clusters
385 downstream.
386 // then the third only gets removed if it's even worse than
387 the second.
388 // one could deal with this with an extra overlap check. not
389 sure we will be in this situation any time soon though.
390 }*/
391 } // over matching/overlapping tracks
392 } // over tracks close enough to share constituents
393 } // over constructed tracks at other indices, to match
394 } // over constructed tracks
395
396 for (uint idx = 0; idx < tracks_.size(); idx++) {
397 if (verbose_ > 1) {
398 ldmx_log(debug) << "keep flag for idx " << idx << " is "
399 << keep_indices.at(idx);
400 }
401 if (keep_indices.at(idx)) { // this hasn't been flagged for removal
402
403 cleaned_tracks.push_back(tracks_.at(idx));
404
405 if (verbose_) {
406 ldmx_log(debug) << "After cleaning, keeping track at index " << idx
407 << ": Centroid = " << (tracks_.at(idx)).getCentroid()
408 << "; CentroidX = "
409 << (tracks_.at(idx)).getCentroidX()
410 << "; CentroidY = "
411 << (tracks_.at(idx)).getCentroidY()
412 << "; track PE = " << (tracks_.at(idx)).getPE()
413 << tracks_.at(idx);
414 }
415 } // if index flagged for keeping
416 } // over all (uniquely seeded) tracks in the event
417
418 if (verbose_) {
419 for (uint idx = 0; idx < tracks_.size(); idx++) {
420 ldmx_log(debug) << "Keeping track at index " << idx << ":"
421 << tracks_.at(idx);
422 }
423 }
424
425 if (verbose_) {
426 ldmx_log(debug) << "Running track x,y matching ";
427 }
428
429 if (cleaned_tracks.size() > 0) {
430 matchXYTracks(cleaned_tracks);
431 std::vector<ldmx::TrigScintTrack> matched_tracks =
432 cleaned_tracks; // don't know why this copying needs to happen but it
433 // does
434 // std::vector<ldmx::TrigScintTrack> matchXYTracks( cleanedTracks
435 //); std::vector<ldmx::TrigScintTrack> matchedTracks =
436 // matchXYTracks( cleanedTracks );
437 for (auto trk : matched_tracks) {
438 /* for (uint idx = 0; idx < tracks_.size(); idx++) {
439 if (verbose_ > 1) {
440 ldmx_log(debug) << "keep flag for idx " << idx << " is "
441 << keepIndices.at(idx);
442 }
443 if (keepIndices.at(idx)) { // this hasn't
444 been flagged for removal
445 //check if channel nb is above that of horizontal bars
446 if (tracks_.at(idx).getCentroid() >= vert_bar_start_idx_)
447 */
448 if (trk.getCentroid() >= vert_bar_start_idx_)
449 cleaned_tracks_x.push_back(trk); // acks_.at(idx));
450 else
451 cleaned_tracks_y.push_back(trk); // acks_.at(idx));
452 // cleanedTracksY.push_back(trk);
453 if (verbose_ > 1) {
454 float centr = trk.getCentroid(); // tracks_.at(idx).getCentroid(); //
455 std::string coll_str = centr >= vert_bar_start_idx_ ? "X" : "Y";
456 coll_str = output_collection_ + coll_str;
457 ldmx_log(debug) << "saving track with centroid " << centr
458 << " to output track collection " << coll_str;
459 }
460 // }
461 }
462 }
463
464 } // if there are clusters in all pads
465 else if (verbose_) {
466 ldmx_log(info)
467 << "Not all pads had clusters; (maybe) skipping tracking attempt";
468 }
469
470 if (verbose_) {
471 ldmx_log(debug) << "Done with tracking step. ";
472 }
473
474 event.add(output_collection_, cleaned_tracks);
475 // event.add(output_collection_, matchedTracks);
476
477 event.add(output_collection_ + "Y", cleaned_tracks_y);
478 event.add(output_collection_ + "X", cleaned_tracks_x);
479
480 tracks_.resize(0);
481
482 return;
483}
bool exists(const std::string &name, const std::string &passName, bool unique=true) const
Check for the existence of an object or collection with the given name and pass name in the event.
Definition Event.cxx:105
Stores cluster information from the trigger scintillator pads.
float getCentroidX() const
Get the x centroid of the track.
float getCentroid() const
Get the detector ID centroid of the track.
std::vector< ldmx::TrigScintCluster > getConstituents() const
Get the cluster constituents of the track.
float getCentroidY() const
Get the y centroid of the track.

References framework::Event::exists(), ldmx::TrigScintTrack::getCentroid(), ldmx::TrigScintTrack::getCentroidX(), ldmx::TrigScintTrack::getCentroidY(), and ldmx::TrigScintTrack::getConstituents().

Member Data Documentation

◆ bar_gap_x_

float trigscint::TrigScintTrackProducer::bar_gap_x_ {0.1}
private

Definition at line 94 of file TrigScintTrackProducer.h.

94{0.1}; // mm

◆ bar_gap_y_

float trigscint::TrigScintTrackProducer::bar_gap_y_ {2.1}
private

Definition at line 92 of file TrigScintTrackProducer.h.

92{2.1}; // mm

◆ bar_length_y_

double trigscint::TrigScintTrackProducer::bar_length_y_ {30.}
private

Definition at line 48 of file TrigScintTrackProducer.h.

48{30.};

◆ bar_width_x_

float trigscint::TrigScintTrackProducer::bar_width_x_ {3.}
private

Definition at line 93 of file TrigScintTrackProducer.h.

93{3.}; // mm

◆ bar_width_y_

float trigscint::TrigScintTrackProducer::bar_width_y_ {3.}
private

Definition at line 91 of file TrigScintTrackProducer.h.

91{3.}; // mm

◆ input_collections_

std::vector<std::string> trigscint::TrigScintTrackProducer::input_collections_
private

Definition at line 57 of file TrigScintTrackProducer.h.

◆ max_delta_

double trigscint::TrigScintTrackProducer::max_delta_ {0.}
private

Definition at line 45 of file TrigScintTrackProducer.h.

45{0.};

◆ max_delta_vert

double trigscint::TrigScintTrackProducer::max_delta_vert {0.}
private

Definition at line 47 of file TrigScintTrackProducer.h.

47{0.};

◆ n_bars_x_

int trigscint::TrigScintTrackProducer::n_bars_x_ {8}
private

Definition at line 75 of file TrigScintTrackProducer.h.

75{8};

◆ n_bars_y_

int trigscint::TrigScintTrackProducer::n_bars_y_ {16}
private

Definition at line 72 of file TrigScintTrackProducer.h.

72{16};

◆ output_collection_

std::string trigscint::TrigScintTrackProducer::output_collection_
private

Definition at line 60 of file TrigScintTrackProducer.h.

◆ pass_name_

std::string trigscint::TrigScintTrackProducer::pass_name_ {""}
private

Definition at line 63 of file TrigScintTrackProducer.h.

63{""};

◆ seeding_collection_

std::string trigscint::TrigScintTrackProducer::seeding_collection_
private

Definition at line 54 of file TrigScintTrackProducer.h.

◆ skip_last_

bool trigscint::TrigScintTrackProducer::skip_last_ {false}
private

Definition at line 66 of file TrigScintTrackProducer.h.

66{false};

◆ tracks_

std::vector<ldmx::TrigScintTrack> trigscint::TrigScintTrackProducer::tracks_
private

Definition at line 33 of file TrigScintTrackProducer.h.

◆ verbose_

int trigscint::TrigScintTrackProducer::verbose_ {0}
private

Definition at line 51 of file TrigScintTrackProducer.h.

51{0};

◆ vert_bar_start_idx_

int trigscint::TrigScintTrackProducer::vert_bar_start_idx_ {52}
private

Definition at line 69 of file TrigScintTrackProducer.h.

69{52};

◆ x_conv_factor_

float trigscint::TrigScintTrackProducer::x_conv_factor_
private

Definition at line 96 of file TrigScintTrackProducer.h.

◆ x_start_

float trigscint::TrigScintTrackProducer::x_start_
private

Definition at line 97 of file TrigScintTrackProducer.h.

◆ y_conv_factor_

float trigscint::TrigScintTrackProducer::y_conv_factor_
private

Definition at line 98 of file TrigScintTrackProducer.h.

◆ y_start_

float trigscint::TrigScintTrackProducer::y_start_
private

Definition at line 99 of file TrigScintTrackProducer.h.


The documentation for this class was generated from the following files: