ATLAS Offline Software
Loading...
Searching...
No Matches
ZdcSignalSinc.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
5
6#include <iostream>
7
9
10
12 : m_n_Slices(nSlc)
13 , m_AmpThresh(5.)
14 , m_tClock (25.)
15 , m_Pi(4*atan(double(1.)))
16{
17 m_buf = new double[m_n_Slices];
18 m_Time = 0.;
19 m_Amp = 0.;
21 m_Warn = 0;
22
23 m_p = 0;
24 m_np = 0;
25
26 m_wfm[0] = 0. ;
27 m_wfm[1] = 0. ;
28 m_wfm[2] = 0. ;
29
30 m_tim[0] = 0. ;
31 m_tim[1] = 0. ;
32 m_tim[2] = 0. ;
33
34 m_dt = 0.;
35
36 m_AAAA = 0;
37
38}
39
41
42int ZdcSignalSinc::process(double *buf, double gain, double ped,
43 double frac, bool corr) {
44
45 m_Time = 0.;
46 m_Amp = 0.;
47 m_Err = e_OK;
48 m_Warn = 0;
49
50 if (ped==0) ped=buf[0];
51 for (double *p=m_buf;p<m_buf+m_n_Slices;p++) {
52 double a = *(buf++);
53 //std::cout << "ZDC+++ A" << a << std::endl;
54 if (a>1015) {
56 return m_Err;
57 }
58 *p = a-ped;
59 }
60 if (frac<=0.) {
62 return m_Err;
63 }
64
65 int imax = -1;
66 if (m_buf[0 ]-m_buf[1 ]>m_AmpThresh) {
67 imax = 0;
68 m_Warn += 1;
69 }
70
72 if (imax<0) {
73 imax = m_n_Slices-1;
74 m_Warn += 2;
75 } else {
77 return m_Err;
78 }
79 }
80
81 for (int i=1;i<m_n_Slices-1;i++) {
82 double da1 = m_buf[i]-m_buf[i-1];
83 double da2 = m_buf[i]-m_buf[i+1];
84 if (da1>0. && da2>=0.) {
85 if (da1>m_AmpThresh || da2>m_AmpThresh) {
86 if (imax<0) imax = i;
87 else {
89 return m_Err;
90 }
91 }
92 }
93 }
94
95 if (imax<0) {
97 return m_Err;
98 }
99
100 if (imax==1) m_Warn += 4;
101
102 if (imax>=2) {
103 // printf("%d %f %f\n",imax,m_buf[imax-2],m_AmpThresh);
104 if (m_buf[imax-2]>m_AmpThresh) m_p = imax-2;
105 else m_p = imax-1;
106 } else m_p = imax;
107
109
110 double t_peak = findpeak(imax-m_p);
111 if (m_Err) return m_Err;
112
113 if (frac>=1.) m_Time = t_peak;
114 else m_Time = fraction(frac,t_peak);
115 m_Amp = waveform(t_peak);
116
117 //std::cout << "ZDC+++ m_AMP " << m_Amp << std::endl;
118
119 /*
120 printf("aap: %d %d %d ",imax, m_p, m_np);
121 for (int i=0;i<m_n_Slices;i++) printf("%6.1f ",m_buf[i]);
122 printf(" %6.1f %6.1f %6.1f\n",t_peak*m_tClock,m_Time*m_tClock,m_Amp);
123 */
124
125 if (gain==1.) {
126 if (m_Amp<200.) m_Warn += 8;
127 if (m_Amp>900.) m_Warn += 16;
128 } else {
129 if (m_Amp< 50.) m_Warn += 8;
130 if (m_Amp>250.) m_Warn += 16;
131 }
132 m_Amp *= gain;
134 if (corr) {
135 int off = int(10.+m_Time/m_tClock)-10;
136 double t = m_Time - off*m_tClock;
137
138 if (t< 5.) t = 0.056836274872111 + 1.532763686481279 *t
139 + 0.229808343735056 *t*t - 0.0365636647119192 *t*t*t;
140 else if (t<16.) t = -1.28974955223497 + 2.653578699334604 *t
141 - 0.1371240146140209*t*t + 0.00281211806384422*t*t*t;
142 else t = -42.18688740322650 + 8.61752055701946 *t
143 - 0.4259239806065329*t*t + 0.00753849507486617*t*t*t;
144
145 m_Time = off*m_tClock + t;
146 }
147
148 return m_Err;
149}
150
151int ZdcSignalSinc::getError() const {return m_Err;}
153double ZdcSignalSinc::getTime() const {return m_Time;}
154double ZdcSignalSinc::getAmp() const {return m_Amp;}
155
156double ZdcSignalSinc::waveform(double t) {
157 double f = 0.;
158 for (int i=0; i<m_np; i++) {
159 double x = m_Pi*(t-i);
160 if (x) f += m_buf[m_p+i]*sin(x)/x;
161 else f += m_buf[m_p+i];
162 }
163 return f;
164}
165
166double ZdcSignalSinc::fraction(double frac, double tpeak) {
167 m_tim[0] = 0.; m_wfm[0] = waveform(m_tim[0]);
168 m_tim[1] = tpeak; m_wfm[1] = waveform(m_tim[1]);
169 m_dt = tpeak/2.;
170 double thr = frac*m_wfm[1];
171 while(m_wfm[0]>thr) {
172 m_tim[0] -= 0.1;
173 m_wfm[0] = waveform(m_tim[0]);
174 if (m_tim[0]<-2.) {
175 m_tim[0] = 0.;
176 m_wfm[0] = waveform(m_tim[0]);
178 break;
179 }
180 }
181
182 while (m_dt>0.001) {
183 double t = m_tim[0] + m_dt;
184 double f = waveform(t);
185 if (f>thr) {m_tim[1] = t; m_wfm[1] = f;}
186 else {m_tim[0] = t; m_wfm[0] = f;}
187 m_dt /= 2.;
188 }
189 return (m_tim[0]+m_tim[1])/2.;
190}
191
193
194 m_tim[0] = im; m_tim[1]=im+0.5; m_tim[2]=im+1.;
195 for (int i=0;i<3;i++) m_wfm[i]=waveform(m_tim[i]);
196 m_dt = 0.5;
197 double t = findpeak();
198 return t;
199}
200
202 if (m_dt<0.001) return m_tim[1];
203
204 if (m_wfm[0]<m_wfm[1]) {
205 if (m_wfm[2]<=m_wfm[1]) {
206 m_dt /=2.;
207 double t1 = m_tim[1]-m_dt;
208 double f1 = waveform(t1);
209 if (f1>m_wfm[1]) {
210 m_tim[2] = m_tim[1]; m_wfm[2] = m_wfm[1];
211 m_tim[1] = t1; m_wfm[1] = f1;
212 } else {
213 double t2 = m_tim[1]+m_dt;
214 double f2 = waveform(t2);
215 if (f2>m_wfm[1]) {
216 m_tim[0] = m_tim[1]; m_wfm[0] = m_wfm[1];
217 m_tim[1] = t2; m_wfm[1] = f2;
218 } else {
219 m_tim[0] = t1; m_wfm[0] = f1;
220 m_tim[2] = t2; m_wfm[2] = f2;
221 }
222 }
223 } else {
224 m_tim[0] = m_tim[1]; m_wfm[0] = m_wfm[1];
225 m_tim[1] = m_tim[2]; m_wfm[1] = m_wfm[2];
226 m_tim[2] += m_dt; m_wfm[2] = waveform(m_tim[2]);
227 }
228 } else {
229 if (m_wfm[2]<=m_wfm[1]) {
230 m_tim[2] = m_tim[1]; m_wfm[2] = m_wfm[1];
231 m_tim[1] = m_tim[0]; m_wfm[1] = m_wfm[0];
232 m_tim[0] -= m_dt; m_wfm[0] = waveform(m_tim[0]);
233 return findpeak();
234 } else {
236 return 0.;
237 }
238 }
239 return findpeak();
240}
241
242
243
static Double_t a
int imax(int i, int j)
#define x
const int m_n_Slices
const double m_tClock
int process(double *, double gain=1., double ped=0., double frac=1., bool corr=true)
const double m_AmpThresh
const double m_Pi
double getTime() const
double fraction(double, double)
int getWarning() const
int getError() const
double getAmp() const
double waveform(double t)
double m_wfm[3]
double m_tim[3]