TriggerPrimitiveFinderPass2_tool.cc
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////
2 // Class: TriggerPrimitiveFinderPass2
3 ////////////////////////////////////////////////////////////////////////
4 
8 
10 
12 
13 #include <algorithm> // for std::transform
14 
16 public:
18  // The compiler-generated destructor is fine for non-base
19  // classes without bare pointers or other resource use.
20 
21  virtual std::vector<TriggerPrimitiveFinderTool::Hit>
22  findHits(const std::vector<unsigned int>& channel_numbers,
23  const std::vector<std::vector<short>>& collection_samples);
24 
25 
26 protected:
27 
28  void hitFinding(const std::vector<short>& waveform,
29  const std::vector<short>& iqr,
30  std::vector<TriggerPrimitiveFinderTool::Hit>& hits,
31  int channel);
32 private:
34 };
35 
36 
39  m_sigmaThreshold(p.get<float>("ThresholdInSigma", 500))
40 // Initialize member data here.
41 {
42  std::cout << "Threshold in sigma is " << m_sigmaThreshold << " (ignore the Threshold = 10 on previous line)\n";
43 }
44 
45 void
46 TriggerPrimitiveFinderPass2::hitFinding(const std::vector<short>& waveform,
47  const std::vector<short>& iqr,
48  std::vector<TriggerPrimitiveFinderTool::Hit>& hits,
49  int channel)
50 {
51  //---------------------------------------------
52  // Hit finding
53  //---------------------------------------------
54  bool is_hit=false;
55  bool was_hit=false;
56  TriggerPrimitiveFinderTool::Hit hit(channel, 0, 0, 0);
57  for(size_t isample=0; isample<waveform.size()-1; ++isample){
58  // if(ich>11510) std::cout << isample << " " << std::flush;
59  int sample_time=isample*m_downsampleFactor;
60  short adc=waveform[isample];
61  is_hit=(float)adc>m_sigmaThreshold*iqr[isample];
62  if(is_hit && !was_hit){
63  // We just started a hit. Set the start time
64  hit.startTime=sample_time;
65  hit.charge=adc;
67  }
68  if(is_hit && was_hit){
69  hit.charge+=adc*m_downsampleFactor;
71  }
72  if(!is_hit && was_hit){
73  // The hit is over. Push it to the output vector
74  hit.charge/=m_multiplier;
75  hits.push_back(hit);
76  }
77  was_hit=is_hit;
78  }
79 }
80 
81 
82 std::vector<TriggerPrimitiveFinderTool::Hit>
83 TriggerPrimitiveFinderPass2::findHits(const std::vector<unsigned int>& channel_numbers,
84  const std::vector<std::vector<short>>& collection_samples)
85 {
86  auto hits=std::vector<TriggerPrimitiveFinderTool::Hit>();
87  std::cout << "findHits called with " << collection_samples.size()
88  << " channels. First chan has " << collection_samples[0].size() << " samples" << std::endl;
89  // std::cout << "First few samples: ";
90  // for(int i=0; i<10; ++i) std::cout << collection_samples[0][i] << " ";
91  // std::cout << std::endl;
92 
93  for(size_t ich=0; ich<collection_samples.size(); ++ich){
94  const std::vector<short>& waveformOrig=collection_samples[ich];
95  std::vector<short> waveform=downSample(waveformOrig);
96  std::vector<short> pedestal=findPedestal(waveform);
97  std::vector<short> pedsub(waveform.size(), 0);
98  for(size_t i=0; i<pedsub.size(); ++i){
99  pedsub[i]=waveform[i]-pedestal[i];
100  }
101  std::vector<short> iqr=frugal_iqr(waveform, pedestal, m_frugalNContig);
102  std::vector<short> filtered=filter(pedsub);
103  hitFinding(filtered, iqr, hits, channel_numbers[ich]);
104  }
105  std::cout << "Returning " << hits.size() << " hits" << std::endl;
106  std::cout << "hits/channel=" << float(hits.size())/collection_samples.size() << std::endl;
107  std::cout << "hits/tick=" << float(hits.size())/collection_samples[0].size() << std::endl;
108  return hits;
109 }
110 
#define DEFINE_ART_CLASS_TOOL(tool)
Definition: ToolMacros.h:42
struct vector vector
int16_t adc
Definition: CRTFragment.hh:202
uint8_t channel
Definition: CRTFragment.hh:201
std::vector< short > downSample(const std::vector< short > &orig)
std::vector< short > findPedestal(const std::vector< short > &orig)
decltype(auto) constexpr size(T &&obj)
ADL-aware version of std::size.
Definition: StdUtils.h:92
std::vector< short > filter(const std::vector< short > &orig)
virtual std::vector< TriggerPrimitiveFinderTool::Hit > findHits(const std::vector< unsigned int > &channel_numbers, const std::vector< std::vector< short >> &collection_samples)
p
Definition: test.py:223
std::vector< short > frugal_iqr(const std::vector< short > &raw_in, const std::vector< short > &median, const int ncontig)
Definition: AlgParts.h:59
void hitFinding(const std::vector< short > &waveform, const std::vector< short > &iqr, std::vector< TriggerPrimitiveFinderTool::Hit > &hits, int channel)
auto const & get(AssnsNode< L, R, D > const &r)
Definition: AssnsNode.h:115
TriggerPrimitiveFinderPass2(fhicl::ParameterSet const &p)
QTextStream & endl(QTextStream &s)