FairRoot/PandaRoot
PndEmcPSAFPGADigitalFilterAnalyser.cxx
Go to the documentation of this file.
2 
8 #include "PndEmcWaveform.h"
9 #include <iostream>
10 #include <fstream>
11 #include <string>
12 
18  increasement = 0;
19  ma_value_delay = 0.;
20  useMWDFilter = false;
21  baseline_value = 0.;
22  pulse_finished = true;
23  ith_pulse = 0;
24 }
25 
31  increasement = 0;
32  ma_value_delay = 0.;
33  useMWDFilter = false;
34  baseline_value = 0.;
35  pulse_finished = true;
36  ith_pulse = 0;
37 }
38 
40  delete MWD_filter;
41 }
42 
44 {
45  useMWDFilter = flag;
46 }
50  return;
51 }
52 
54  analysis_start_position = anl_start;
55  baseline_stop_position = bl_stop;
56  return;
57 }
58 
61 }
62 
64  local_time = 0;
65  Number_of_hits = 0;
72  pulse_detected = false;
73 
74  pulse_finished = true;
75  ith_pulse = 0;
76  rising_count = 0;
77  return;
78 }
80 {
81  //std::cout<<"PndEmcPSAFPGADigitalFilterAnalyser::Process# MWD used = "<<useMWDFilter<<std::endl;
82  reset();
83  std::vector<double> signal = waveform->GetSignal();
84  std::vector<double>::iterator it;
85  //read directly
86  baseline_value = waveform->GetBaseline();
87  //std::cout<<"PndEmcPSAFPGADigitalFilterAnalyser:: Process, baseline_value#"<<baseline_value<<std::endl;
88  for(it = signal.begin(); it < signal.end();it++){
89  this->put(*it);
90  }
91  return this->nHits();
92 }
93 //new version put
94 /*void PndEmcPSAFPGADigitalFilterAnalyser::put(float valueToStore)
95  {
96 //std::cout<<"local_time#"<<local_time<<", val#"<<valueToStore<<std::endl;
97 float mwd_val = valueToStore;
98 if(useMWDFilter)
99 mwd_val = MWD_filter->put(valueToStore);
100 
101 float signal = mwd_val - baseline_value;
102 float signal_delayed = Signal_delay->put(signal);
103 float cf_value = CF_filter->put(signal);
104 //float raw_signal = valueToStore - baseline_value;
105 //float cf_value = CF_filter->put(raw_signal);
106 float cf_value_delayed = CF_delay->put(cf_value);
107 float ma_value = MA_triggering->put(signal);
108 
109 int dT = local_time - rough_pulse_timing;
110 //bool pulse_conditon = (cf_value > cf_value_delayed);
111 
112 if((cf_value > cf_value_delayed ) && (ma_value > 2*analyserParams.hit_threshold))
113 {
114 ++ rising_count;
115 if(!pulse_detected && rising_count>=3 ){
116 // cout<<"Detect pulse # time#"<<local_time<<", value#"<<cf_value<<endl;
117 rising_count = 0;
118 pulse_detected = true;
119 pulse_finished = false;
120 CF_Fitter->reset();
121 CF_Fitter->putPoint(local_time, cf_value_delayed);
122 cf_zero_crossing_points = 1;
123 rough_pulse_timing = local_time;
124 ++Number_of_hits;
125 integral[Number_of_hits-1] = 0.;
126 amplitude[Number_of_hits-1] = 0.;
127 }
128 }
129 if(pulse_detected){
130 if(( dT < 3*analyserParams.cf_delay) && (signal_delayed > amplitude[Number_of_hits-1])){
131 amplitude[Number_of_hits-1] = signal_delayed;
132 //time[Number_of_hits -1 ] = local_time;
133 }
134 if(cf_zero_crossing_points < analyserParams.cf_fitter_length) {
135 CF_Fitter->putPoint(local_time, cf_value_delayed);
136 cf_zero_crossing_points++;
137 // std::cout<<" after pulse_detected , local_time #"<<local_time<<", cf#"<<cf_value<<std::endl;
138 }
139 if((cf_value < cf_value_delayed)&&(dT > 3*analyserParams.cf_delay) ){
140 // cout<<"Begin next search, time#"<<local_time<<", dT#"<<dT<<", 3*CF_WIDTH#"<<3*analyserParams.cf_delay<<endl;
141 pulse_detected = false;
142 rising_count = 0;
143 CF_Fitter->fit();
144 double a = CF_Fitter->offset();
145 double k = CF_Fitter->slope();
146 double average = CF_Fitter->average();
147 cf_zero_crossing_points = 0;
148 if(k > 0)
149 time[Number_of_hits-1] = (average-a)/k;
150 else
151 -- Number_of_hits;
152 }
153 }
154 if(!pulse_finished){
155 if( (dT > analyserParams.cf_delay) && (ma_value < signal_delayed) && (ma_value < analyserParams.hit_threshold))
156 {
157 ++ ith_pulse;
158 pulse_finished = true;
159 // cout<<"Finish pulse #"<<local_time<<", time diff#"<<dT<<", sig_delay_value#"<<signal_delayed<<endl;
160 //recalculate results;
161 // cout<<"iafactor = "<<analyserParams.iafactor<<", Integ = "<<integral[0]<<endl;
162 if(ith_pulse == 1 && Number_of_hits>=2){
163 amplitude[1] = integral[0]/analyserParams.iafactor - amplitude[0];
164 }
165 }
166 integral[ith_pulse] += signal_delayed;
167 }
168 local_time++;
169 }*/
170 
171 //orginal put
173 {
174  //float mwd_val = MWD_filter->put(valueToStore);
175  float mwd_val = valueToStore;
176  if(useMWDFilter)
177  mwd_val = MWD_filter->put(valueToStore);
178 
180  local_time++;
181  return;
182  }
184  baseline_value_calculated += mwd_val;
185  //
186  // uncomment lines below for automatic baseline calculation; does not work for high rates
188  local_time++;
189  return;
190  }
191  float signal = mwd_val - baseline_value;
192  float signal_delayed = Signal_delay->put(signal);
193  float cf_value = CF_filter->put(signal);
194  float cf_value_delayed = CF_delay->put(cf_value);
195  float ma_value = MA_triggering->put(signal);
196  //cout<<"local_time #"<<local_time<<", raw#"<<valueToStore<<", mwd#"<<signal<<", ma#"<<ma_value<<", cfd#"<<cf_value<<endl;
197  int dT = local_time - rough_pulse_timing;
198  if (!pulse_detected) {
199  if((cf_value_delayed < 0.0) && (cf_value > 0.0) && (ma_value > analyserParams.hit_threshold)) {
200  //cout<<"detect pulse #"<<local_time<<", value#"<<cf_value <<endl;
201  // hit detected
202  // CF
203  //cout<<"hit ["<<Number_of_hits<<"] # idx"<<cf_zero_crossing_points<<", #"<<local_time<<", v#"<<cf_value_delayed<<endl;
204  CF_Fitter->reset();
205  CF_Fitter->putPoint(local_time, cf_value_delayed);
207  pulse_detected = true;
208  rough_pulse_timing = local_time;
209  integral[Number_of_hits] = 0.0;
210  amplitude[Number_of_hits] = 0.0;
211  }
212  } else {
213  // CF timing
215  //cout<<"hit ["<<Number_of_hits<<"] # idx"<<cf_zero_crossing_points<<", #"<<local_time<<", v#"<<cf_value_delayed<<endl;
216  CF_Fitter->putPoint(local_time, cf_value_delayed);
218  }
219  // Integral
220  integral[Number_of_hits] += signal_delayed;
221  // Amplitude
222  if( (dT < 2*analyserParams.cf_delay) && (signal_delayed > amplitude[Number_of_hits]) ) {
223  //cout<<"update amp t#"<<local_time<<", a#"<<signal_delayed<<endl;
224  amplitude[Number_of_hits] = signal_delayed;
225  }
226  // Finalize pulse detection
227  //cout<<"dT#"<<dT<<", cf_delay#"<<analyserParams.cf_delay;
228  //cout<<"ma #"<<ma_value<<", signal_delayed #"<<signal_delayed<<", analyserParams.hit_threshold#"<<analyserParams.hit_threshold<<endl;
229  if( (dT > 2*analyserParams.cf_delay) && (signal_delayed < analyserParams.hit_threshold)){
230  //cout<<"finish pulse #"<<local_time<<", cf_value_delayed#"<<cf_value_delayed<<", dT#"<<dT<<endl;
233  pulse_detected = false;
234  CF_Fitter->fit();
235  double a = CF_Fitter->offset();
236  double k = CF_Fitter->slope();
237  time[Number_of_hits] = 0.0;
238  //if(k > 0){
239  // if(-a/k < 0 || -a/k > 3*analyserParams.cf_delay ) time[Number_of_hits] = CF_Fitter->averageX();
240  // else
241  // time[Number_of_hits] = -a/k;
242  // Number_of_hits++;
243  //}
244  if(k > 0 && -a/k > 0 && -a/k < 3*analyserParams.cf_delay){
245  time[Number_of_hits] = -a/k;
246  Number_of_hits++;
247  }
248  }
249  }
250 
251  local_time++;
252 }
253 
254 
255 
float put(float valueToStore)
virtual void init(PndEmcPSAFPGASampleAnalyser::SampleAnalyserParams &params)
float integral[MAX_NUMBER_OF_HITS]
virtual std::vector< double > GetSignal() const
float put(float valueToStore)
Double_t GetBaseline() const
void set(float tau, unsigned int newBufferSize)
void putPoint(double ix, double iy)
float amplitude[MAX_NUMBER_OF_HITS]
Int_t a
Definition: anaLmdDigi.C:126
virtual void setBaselineInterval(int anl_start, int bl_stop)
virtual float put(float valueToStore)
represents a simulated waveform in an emc crystal
virtual Int_t Process(const PndEmcWaveform *waveform)
Find Hits in Waveform.
PndEmcPSAFPGAFilterDelay * Signal_delay
virtual float put(float valueToStore)
ClassImp(PndAnaContFact)
PndEmcPSAFPGAFilterDelay * CF_delay
virtual void init(SampleAnalyserParams &params)