10 fSamplingFreq = samplingFreq;
12 fBaselineRMS = baselineRMS;
13 fTriggerPosition = triggerPosition;
14 FindMaximumPosition(pulse);
20 ComputeDecayAndRise(pulse,7,0.1,0.9,0.3);
21 ComputeSlowDecay(pulse,7,0.3,0.1);
22 CheckSaturation(pulse, ADCMax, ADCMin);
27 fSamplingFreq = samplingFreq;
29 fBaselineRMS = baselineRMS;
30 fTriggerPosition = triggerPosition;
37 int window = fTriggerPosition/2;
38 int size = (int) pulse.Size();
39 int from = fTriggerPosition-window;
40 double baseline = pulse.GetMean(TMath::FloorNint(0.8*fTriggerPosition));
41 QVector temp = pulse - baseline;
45 if((from+2*window)>=size){
62 fMaxPos = (double)temp.Abs().GetMaxIndex(2*window,from);
71 if(fMaxPos >= 0. && fMaxPos < pulse.Size())
72 fHeight = double(pulse[(
size_t)lround(fMaxPos)] - fBaseline);
80 size_t fNPoints = pulse.Size();
82 if( fNPoints > 1000) {
83 meansize = meansize*2;
85 size_t bufsize=(fNPoints)/2;
86 double* binbuf = (
double*) malloc(bufsize*
sizeof(
double));
89 for (
size_t i=0; i<bufsize; i++) {
91 for (
size_t j=0; j<meansize; j++) {
92 if ((fNPoints-bufsize+i+j)< fNPoints) {
93 temp = pulse[(fNPoints-bufsize)+i+j];
103 for (
int i = bufsize-1; i>=0; i--)
104 if ((binbuf[i]-fBaseline) > nBaseRMS*fBaselineRMS) {
105 fEnd= (fNPoints-bufsize) + i ;
116 double binbuf[bufsize];;
117 int maxbin = (int)fMaxPos;
123 for(
int i = maxbin; i > maxbin - bufsize; i--){
124 binv = pulse[i] - fBaseline;
125 binbuf[i - (maxbin - bufsize) - 1] = binv;
127 if(fBaselineRMS == 0) fBaselineRMS = 1;
128 for(
int i = maxbin - bufsize; i > 0; i--){
129 for(
int j = bufsize - 1; j > 0; j--) {
130 binbuf[j] = binbuf[j-1];
132 binbuf[0] = pulse[i] - fBaseline;
133 if( binbuf[bufsize - 1] <= binbuf[0] + 2*fBaselineRMS && binbuf[bufsize - 1] >= binbuf[0] - 2*fBaselineRMS ){
134 fStart = i + bufsize -1;
145 int t1 = (int)fStart;
146 int t2 = (int)fMaxPos;
147 for(
int t =
int(fStart)+1; t < fMaxPos; t++) {
148 if((pulse[t] - fBaseline) < percLow*fHeight/100) t1 = t;
149 if((pulse[t] - fBaseline) < percHigh*fHeight/100) t2 = t;
158 int t1 = (int)fMaxPos;
160 for(
int t =
int(fMaxPos)+1; t < fEnd; t++) {
161 if((pulse[t] - fBaseline) > percHigh*fHeight/100) t1 = t;
162 if((pulse[t] - fBaseline) > percLow*fHeight/100) t2 = t;
178 fIsSaturatedHigh=
false;
179 fIsSaturatedLow=
false;
180 double max = pulse.GetMax();
181 double min = pulse.GetMin();
183 if(
max > ADCMax) fIsSaturatedHigh=
true;
184 if(
min < ADCMin) fIsSaturatedLow=
true;
192 QVector smoothed = pulse;
194 int size = smoothed.Size();
196 int num = smoothingSize;
197 for(
int i=0;i<size;i++)
201 for(
int k=1;k<=(num-1)/2;k++) {
204 smoothed[i]+=pulse[i-k]*(num-2*k);
209 smoothed[i]+=pulse[i+k]*(num-2*k);
214 smoothed[i]-=fBaseline;
218 double max = fHeight;
219 int max_pos=(int) fMaxPos;
221 double x1 = 0,x0 = 0;
225 for(n = max_pos; n >= 0; n--) {
226 if(smoothed[n]<
max*fracMax &×1==
false) {
227 x1=n+(
max*fracMax-smoothed[n])/(smoothed[n+1]-smoothed[n]);
230 if(smoothed[n]<
max*fracMin) {
231 x0=n+(
max*fracMin-smoothed[n])/(smoothed[n+1]-smoothed[n]);
244 if(max_pos != size-1 && max_pos >= 0.) {
245 for(n=max_pos;n<size;n++) {
246 if(smoothed[n]<
max*fracMax &×1==
false) {
247 x1=n-1+((
max*fracMax-smoothed[n-1])/(smoothed[n]-smoothed[n-1]));
250 if(smoothed[n]<
max*fracMinDecay &×1==
true) {
251 x0=n-1+((
max*fracMinDecay-smoothed[n-1])/(smoothed[n]-smoothed[n-1]));
255 if(n!=size) DT=(x0-x1);
265 QVector smoothed = pulse;
267 int size = smoothed.Size();
269 int num = smoothingSize;
270 for(
int i=0;i<size;i++)
274 for(
int k=1;k<=(num-1)/2;k++) {
277 smoothed[i]+=pulse[i-k]*(num-2*k);
282 smoothed[i]+=pulse[i+k]*(num-2*k);
287 smoothed[i]-=fBaseline;
291 double max = fHeight;
292 int max_pos=(int) fMaxPos;
294 double x1 = 0,x0 = 0;
298 if(max_pos != size-1 && max_pos >= 0.) {
299 for(n=max_pos;n<size;n++) {
300 if(smoothed[n]<
max*fracMax &×1==
false) {
301 x1=n-1+((
max*fracMax-smoothed[n-1])/(smoothed[n]-smoothed[n-1]));
304 if(smoothed[n]<
max*fracMinDecay &×1==
true) {
305 x0=n-1+((
max*fracMinDecay-smoothed[n-1])/(smoothed[n]-smoothed[n-1]));
309 if(n!=size) DT=(x0-x1);
double min(const Diana::QVector &v)
error class with error type and description
QError FindEnd(const Diana::QVector &pulse, size_t meansize, double nBaseRMS)
QPulseBasicParams(int triggerPosition, double baseline, double baselineRMS, int samplingFreq=1000)
QError FindMaximumPosition(const Diana::QVector &pulse)
QError ComputeRaise(const Diana::QVector &pulse, double percLow, double percHigh)
QError ComputeHeight(const Diana::QVector &pulse)
QError ComputeDecay(const Diana::QVector &pulse, double percHigh, double percLow)
QError ComputeDecayAndRise(const Diana::QVector &pulse, int smoothingSize, float fracMin, float fracMax, float fracMinDecay)
QError CheckSaturation(const Diana::QVector &pulse, int ADCMax, int ADCMin)
QError ComputeSlowDecay(const Diana::QVector &pulse, int smoothingSize, float fracMax, float fracMinDecay)
QError FindStart(const Diana::QVector &pulse, int bufsize)
the Diana namespace is needed because sometimes we use Qt libraries, that use same class names of our...