source: Sophya/trunk/ArchTOIPipe/ProcWSophya/simtoipr.cc@ 1442

Last change on this file since 1442 was 1442, checked in by ansari, 25 years ago

Ajout de processeurs simples - Deglitcher + Filtre, + programme test - Reza 15/3/2001

File size: 6.1 KB
Line 
1#include "simtoipr.h"
2#include "toimanager.h"
3#include "pexceptions.h"
4#include "ctimer.h"
5
6SimpleDeglitcher::SimpleDeglitcher(int wsz, double ns, int maxnpt)
7{
8 if (wsz < 5) wsz = 5;
9 if (wsz%2 == 0) wsz++;
10 if (maxnpt > wsz) maxnpt = wsz;
11
12 cout << "SimpleDeglitcher::SimpleDeglitcher() WSize= " << wsz
13 << " nSig=" << ns << " maxNPt=" << maxnpt << endl;
14
15 wsize = wsz;
16 nsig = ns;
17 maxpoints = maxnpt;
18 totnscount = glnscount = glcount = 0;
19}
20
21SimpleDeglitcher::~SimpleDeglitcher()
22{
23}
24
25void SimpleDeglitcher::init() {
26 cout << "SimpleDeglitcher::init" << endl;
27 declareInput("in");
28 declareOutput("out");
29 declareOutput("mean");
30 declareOutput("sigma");
31 name = "SimpleDeglitcher";
32 // upExtra = 1; A quoi ca sert ?
33}
34
35void SimpleDeglitcher::run() {
36
37 // TOIManager* mgr = TOIManager::getManager();
38 int snb = getMinIn();
39 int sne = getMaxIn();
40
41 bool fgout = checkOutputTOIIndex(0);
42 bool fgmean = checkOutputTOIIndex(1);
43 bool fgsigma = checkOutputTOIIndex(2);
44
45 if (!checkInputTOIIndex(0)) {
46 cerr << " SimpleDeglitcher::run() - Input TOI (in) not connected! "
47 << endl;
48 throw ParmError("SimpleDeglitcher::run() Input TOI (in) not connected!");
49 }
50 if (!fgout && !fgmean && !fgsigma) {
51 cerr << " SimpleDeglitcher::run() - No Output TOI connected! "
52 << endl;
53 throw ParmError("SimpleDeglitcher::run() No output TOI connected!");
54 }
55
56 if (!fgout) {
57 cout << "Warning: SimpleDeglitcher::run() - No TOI connected to out \n"
58 << " No deglitching would be performed !" << endl;
59 }
60
61 cout << " SimpleDeglitcher::run() SN=" << snb << " - " << sne << endl;
62 try {
63 // Le debut
64 int wsz2 = wsize/2;
65 Vector vin(wsize);
66 int k;
67 for(k=0; k<wsize; k++)
68 vin(k) = getData(0, k+snb);
69 double s = vin.Sum()/wsize;
70 double mean = s/wsize;
71 double s2 = vin.SumX2();
72 double sigma = sqrt(s2/wsize-mean*mean);
73 int kgl = -1;
74 int ii,lastput;
75 bool fgglitch = false;
76 double valcur,valsub,valadd;
77 for(k=0;k<sne-snb;k++) {
78 totnscount++;
79 if (k%10000 == 0) cout << " DBG: K=" << k << endl;
80 // Calcul mean-sigma
81 if ((k>wsz2) && (k<sne-snb-wsz2)) {
82 valsub = vin((k+wsz2)%wsize);
83 vin((k+wsz2)%wsize) = valadd = getData(0, k+snb);
84 s += (valadd-valsub);
85 s2 += (valadd*valadd-valsub-valsub);
86 mean = s/wsize;
87 sigma = sqrt(s2/wsize-mean*mean);
88 }
89
90 // On gere les sorties Mean et Sigma
91 if (fgmean)
92 putData(1, k+snb, mean, 0);
93 if (fgsigma)
94 putData(2, k+snb, sigma, 0);
95
96 if (!fgout) continue; // Pas de sortie out (deglitche)
97
98 valcur = vin(k%wsize);
99
100 if (valcur < mean+nsig*sigma) { // inferieur au seuil
101 if (fgglitch) {
102 if (k-kgl < maxpoints) { // On vient de detecter un glitch
103 glcount++;
104 for(ii=kgl; ii<k; ii++) {
105 putData(0, ii+snb, mean, 7);
106 glnscount++;
107 }
108 lastput = snb+k-1;
109 }
110 else {
111 for(ii=kgl; ii<k; ii++) {
112 putData(0, ii+snb, vin(ii%wsize), 0);
113 }
114 lastput = snb+k-1;
115 }
116 }
117 putData(0, k+snb, valcur, 0);
118 lastput = snb+k;
119 kgl = -1; fgglitch = false;
120 }
121 else { // Superieur au seuil
122 if (fgglitch) {
123 if (k-kgl+1 >= maxpoints) { // serie de points > seuil
124 for(ii=kgl; ii<=k; ii++) // -> Donc pas glitch
125 putData(0, ii+snb, vin(ii%wsize), 0);
126 lastput = snb+k;
127 fgglitch = false;
128 }
129 }
130 else {
131 if (kgl < 0) { // debut possible de glitch
132 fgglitch = true; kgl = k;
133 }
134 else { // On est toujours dans une serie > seuil
135 putData(0, k+snb, valcur, 0);
136 lastput = snb+k;
137 }
138 }
139 }
140
141 if (k%5000 == 0) cout << " ---DBG2: K=" << k << " glcount="
142 << glcount << " LastPut= " << lastput << endl;
143 } // Boucle sur les num-sample
144 cout << " La fin lastput=" << lastput << " SNE=" << sne;
145 for(k=lastput-snb; k<sne-snb; k++)
146 putData(0, k+snb, vin(k%wsize), 0);
147 cout << " DBG3- OUT of try bloc ! " << endl;
148
149 } // Bloc try
150 catch (PException & exc) {
151 cerr << "SimpleDeglitcher: Catched Exception " << (string)typeid(exc).name()
152 << "\n .... Msg= " << exc.Msg() << endl;
153 }
154}
155
156
157
158SimpleFilter::SimpleFilter(int wsz, FilterKind fk, double a, double s)
159{
160 if (wsz < 3) wsz = 3;
161 if (wsz%2 == 0) wsz++;
162 cout << "SimpleFilter::SimpleFilter() wsz= " << wsz
163 << " fk=" << fk << endl;
164 wsize = wsz;
165 totnscount = 0;
166 coef = new double[wsz];
167 for(int kk=0; kk<wsz; kk++)
168 coef[kk] = 1./wsize;
169}
170
171SimpleFilter::~SimpleFilter()
172{
173 delete[] coef;
174}
175
176void SimpleFilter::init() {
177 cout << "SimpleFilter::init" << endl;
178 declareInput("in");
179 declareOutput("out");
180 name = "SimpleFilter";
181 // upExtra = 1;
182}
183
184void SimpleFilter::run() {
185 // TOIManager* mgr = TOIManager::getManager();
186 int snb = getMinIn();
187 int sne = getMaxIn();
188
189 cout << " SimpleFilter::run(): snb=" << snb << " sne=" << sne << endl;
190
191 bool fgout = checkOutputTOIIndex(0);
192
193 if (!checkInputTOIIndex(0)) {
194 cerr << " SimpleFilter::run() - Input TOI (in) not connected! "
195 << endl;
196 throw ParmError("SimpleFilter::run() Input TOI (in) not connected!");
197 }
198 if (!fgout) {
199 cerr << " SimpleFilter::run() - No Output TOI connected! "
200 << endl;
201 throw ParmError("SimpleFilter::run() No output TOI connected!");
202 }
203
204
205 try {
206 // Le debut
207 int wsz2 = wsize/2;
208 Vector vin(wsize);
209 int k;
210 for(k=0; k<wsize; k++)
211 vin(k) = getData(0, k+snb);
212 double mean = vin.Sum()/wsize;
213 for(k=0; k<wsize/2; k++) vin(k) = mean;
214 for(k=0;k<sne-snb;k++) {
215 totnscount++;
216 // Calcul mean-sigma
217 if ((k>wsz2) && (k<sne-snb-wsz2))
218 vin((k+wsz2)%wsize) = getData(0, k+snb);
219 // if (k == sne-snb-wsz2) {
220 // }
221 double sortie = 0;
222 for(int ii=0; ii<wsize; ii++) {
223 sortie += vin((ii+k)%wsize)*coef[ii];
224 }
225 putData(0,k+snb,sortie,0);
226 } // Boucle sur les num-sample
227 } // Bloc try
228
229 catch (PException & exc) {
230 cerr << "SimpleFilter: Catched Exception " << (string)typeid(exc).name()
231 << "\n .... Msg= " << exc.Msg() << endl;
232 }
233
234
235}
Note: See TracBrowser for help on using the repository browser.