XbAlgo.cc
Go to the documentation of this file.
1 
4 #include "XbAlgo.h"
5 #include "XbArray.h"
6 #include <cstdlib>
7 #include <cstring>
8 
9 using std::vector;
10 using std::stringstream;
11 
12 #define FREE(_x_) { free(_x_); _x_ = nullptr; }
13 
17 static struct t2 carmenmiranda[MAXCM];
19 static struct t2 fake;
20 static int nextra = 0, delay = 0, delaycm = 0, delaymr = 0, delaydn = 0;
26 static int cour[5];
28 static int nbt2cluster;
30 static struct t2list t2cluster[1000];
32 vector < t2list > out;
33 
34 int observer = 0; // To request a specific station
35 
37 void XbAlgoT2Init() {
38  fake.ID = FAKE;
39  fake.time = 1100000;
40  for (int j = 0; j < MAXBINNUMBER; j++)
41  ncompteurt2[j] = ncompteurtot[j] = 0;
42 }
43 
46  return ((cour[1] > 0) && (cour[1] + cour[2] > 1)) && (cour[1] + cour[2] + cour[3] + cour[4] > 2);
47 }
48 
50 int XbAlgoT3ToT() {
51  return ((cour[1] > 0) && (cour[1] + cour[2] > 1));
52 }
53 
55 void HugeShower(struct t2 *input, int nt2, int msec) {
56  int nhugestat=0;
57  // keeping all stations within 100 us to be safe
58  for (int j = 0; j < nt2; j++)
59  if ((input[j].time > msec - 100) && (input[j].time < msec + 100))
60  nhugestat++;
61  if (! nhugestat)
62  return;
63  // building the event
64  t2cluster[nbt2cluster].nelem = nhugestat;
65  t2cluster[nbt2cluster].algo = "BIG";
66  t2cluster[nbt2cluster].point = (struct t2 *) malloc(nhugestat * sizeof(struct t2));
67  int m=0;
68  for (int j = 0; j < nt2; j++)
69  if ((input[j].time > msec - 100) && (input[j].time < msec + 100)) {
70  *(t2cluster[nbt2cluster].point + m) = input[j];
71  m++;
72  }
73  if (nbt2cluster<999) nbt2cluster++;
74 }
75 
77 void XbAlgoFindCluster(int minstat,struct t2 *input, int nt2, unsigned short *nbt2inbin, struct t2 *listt2inbin[MAXBINNUMBER][MAXSTATINONEBIN],int (*T3func)(),const char *algo) {
78  int i,j,k,l,m;
79  int index,nstat;
80  int total = nbt2inbin[0] + nbt2inbin[1] + nbt2inbin[2] + nbt2inbin[3] + nbt2inbin[4];
81  static struct t2 *liste[100];
82 
83  // j: center of the sliding bin-2 -> bin+2 window
84  for (j = 2; j < binnumber - 2; j++) {
85  // if we get enough stations in the sliding window, and there are stations in the central bin
86  if (total >= minstat && nbt2inbin[j] > 0) {
87  // if there is more than MAXSTATINONEBIN in the time bins
88  // (is here to protect from memory violation if it happened, for big showers)
89  if (total >= MAXSTATINONEBIN) {
90  if (input && j>5) HugeShower(input, nt2, (j-5) * binsize);
91  } else {
92  /* for all the stations in the middle of the window */
93  for (k = 0; k < nbt2inbin[j]; k++) {
94  cour[0] = cour[1] = cour[2] = cour[3] = cour[4] = 0;
95  /* counting the neighbour in each crown for all the stations in the window */
96  for (l = -2; l < 3; l++)
97  for (m = 0; m < nbt2inbin[j + l]; m++)
98  cour[(int) neighbour[listt2inbin[j][k]->ID * ROW + (int) listt2inbin[j + l][m]->ID]]++;
99  if (T3func()) { // if the cluster is Ok
100  /* we have to remove stations too far away in time */
101  /* we do it now to optimise */
102  /* now we will use lists of pointers */
103  index = 0;
104  for (l = -2; l < 3; l++)
105  for (m = 0; m < nbt2inbin[j + l]; m++)
106  liste[index++] = listt2inbin[j + l][m];
107  /* 5us per crown + dtime jitter */
108  for (l = 0; l < total; l++) {
109  if (abs(listt2inbin[j][k]->time - liste[l]->time)
110  > 5 * neighbour[listt2inbin[j][k]->ID * ROW + liste[l]->ID] + dtime) {
111  // station not time compatible => 1 less neighbour, replaced by fake station
112  cour[(int) neighbour[listt2inbin[j][k]->ID * ROW + (int) liste[l]->ID]]--;
113  liste[l] = &fake;
114  }
115  }
116  nstat = cour[1] + cour[2] + cour[3] + cour[4];
117  /* we have to mark stations with 2 t2 in the same cluster:
118  * they only count as one, but both are kept */
119  for (i = 0; i < total; i++) {
120  for (l = i + 1; l < total; l++) {
121  if (liste[i]->ID == liste[l]->ID) {
122  cour[(int) neighbour[listt2inbin[j][k]->ID * ROW + (int) liste[l]->ID]]--;
123  }
124  }
125  }
126  if (T3func()) { // check again the cluster once bad timing stations have been removed
127  // found a new cluster: building it
128  nstat++; /* + the central one */
130  t2cluster[nbt2cluster].algo = algo;
131  t2cluster[nbt2cluster].point = (struct t2 *) malloc(nstat * sizeof(struct t2));
132  m = 0;
133  for (l = 0; l < total; l++) {
134  if (neighbour[listt2inbin[j][k]->ID * ROW + liste[l]->ID] > 0) {
135  *(t2cluster[nbt2cluster].point + m) = *liste[l];
136  m++;
137  }
138  }
139  *(t2cluster[nbt2cluster].point + m) = *listt2inbin[j][k];
140  if (nbt2cluster<999) nbt2cluster++;
141  }
142  }
143  }
144  }
145  }
146  // sliding window: add new bin, remove old one.
147  total += nbt2inbin[j + 3] - nbt2inbin[j - 2];
148  nbt2inbin[j - 2] = 0;
149  }
150 }
151 
153 vector < t2list > XbAlgoT2Process(struct t2 *input, int nt2) {
154  static struct t2 min;
155  int nt2cm = 0, ntot = 0;
156  int i, j, l;
157  unsigned int k, m;
158  int mink, supp, tcm, tdn, tmr, nbstat;
159  static struct t2list t2mergedclusters[1000];
160 
161  out.clear();
162  nbt2cluster=0;
163  if (nt2 <= 0)
164  return out;
165  // upgrading configuration if needed
166  if (newt2config) {
167  delay = trivial_algo / 10;
169  newt2config = 0;
170  }
171  // fill the histogram with >13 us bins
172  // WARNING, there is a 50 usec covering with previous second (actually, 5 bins=5*binsize us)
173  // bin size of the histogram is computed dynamically to be fast also when there are few t2s
174  // binsize = 500000 / nt2;
175  // if (binsize > 1000) binsize = 1000;
176  // else if (binsize < 12) binsize = 12; // To get 2 (bins) * 12 (binsize) = 24 us > 20 (4 crowns) + 3 (jitter)
177  binsize = 12; // fixed size now
179  binnumber = 1110000 / binsize;
180  // filling the histogram with t2 from the previous second
181  if (nextra > MAXOVERLAP) {
182  stringstream s;
183  s << "Too many extra triggers: " << nextra;
184  InternalLog(s.str().c_str(),IKWARNING);
185  nextra = MAXOVERLAP;
186  }
187  for (j = 0; j < nextra; j++) {
188  extrat2old[j].time = extrat2[j].time - 1000000; /* -1000000 as it is from previous second */
189  extrat2old[j].ID = extrat2[j].ID;
191  k = 5 + extrat2old[j].time / binsize; /* +5 for the 50us copy */
192  if (5 + extrat2old[j].time / binsize < 0) {
193  stringstream s;
194  s << "Negative new time: " << 5 + extrat2old[j].time / binsize;
195  InternalLog(s.str().c_str(),IKWARNING);
196  k=0; /* could happen if bin size change dramatically from one second to the other one */
197  }
198  if (debug) {
199  stringstream s;
200  s << "extra t2:" << extrat2old[j].time << " -> " << k;
201  InternalLog(s.str().c_str(),IKDEBUG);
202  }
203  if ((l = ncompteurt2[k]++) < MAXSTATINONEBIN)
204  compteurt2[k][l] = &extrat2old[j];
205  if ((extrat2old[j].ID == CARMEN) || (extrat2old[j].ID == MIRANDA)
206  || (extrat2old[j].ID == MOULIN) || (extrat2old[j].ID == ROUGE)
207  || (extrat2old[j].ID == DIA) || (extrat2old[j].ID == NOCHE))
208  carmenmiranda[nt2cm++] = extrat2old[j];
209  if (extrat2old[j].energy >= TOTVALUE)
210  if ((l = ncompteurtot[k]++) < MAXSTATINONEBIN)
211  compteurtot[k][l] = &extrat2old[j];
212  }
213  // filling histogram with all new t2
214  nextra = 0;
215  for (j = 0; j < nt2; j++) {
216  if (input[j].time > 1000000) {
217  stringstream s;
218  s << "Time too big: " << input[j].time << " from LS " << input[j].ID;
219  InternalLog(s.str().c_str(),IKERROR);
220  }
221  if (input[j].ID<100) continue; // WARNING!!!! Removing infill and doublets here. was is XbPm before!!!!!
222  if (input[j].time > 1000000) continue; /* should never happen */
223  k = 5 + input[j].time / binsize; /* +5 for the 50us copy (it's 5 bins) */
224  // keeping t2 from the end of the second for next second
225  if (input[j].time > 1000000 - 5*binsize) {
226  extrat2[nextra++] = input[j];
227  if (nextra >= MAXOVERLAP) {
228  stringstream s;
229  s << "Too many new extra triggers: " << nextra << ", removing 100";
230  InternalLog(s.str().c_str(),IKERROR);
231  nextra = MAXOVERLAP-100;
232  }
233  }
234  if ((l = ncompteurt2[k]++) < MAXSTATINONEBIN)
235  compteurt2[k][l] = &input[j];
236  // filling special doublet trigger list
237  if ((input[j].ID == CARMEN) || (input[j].ID == MIRANDA) ||
238  (input[j].ID == MOULIN) || (input[j].ID == ROUGE) || (input[j].ID == DIA) || (input[j].ID == NOCHE))
239  carmenmiranda[nt2cm++] = input[j];
240  // filling tot t2 histogram
241  if (input[j].energy >= TOTVALUE) {
242  if ((l = ncompteurtot[k]++) < MAXSTATINONEBIN)
243  compteurtot[k][l] = &input[j];
244  ntot++;
245  }
246  }
247  if (verbose) {
248  stringstream s;
249  s << "TOT triggers: " << ntot;
250  InternalLog(s.str().c_str(),IKDEBUG);
251  }
252  /* Find clusters with Full Array algorithm */
253  XbAlgoFindCluster(4,input,nt2,ncompteurt2,compteurt2,&XbAlgoT3FullArray,"2C1&3C2&4C4");
254  /* Find clusters with TOT algorithm */
255  XbAlgoFindCluster(3,NULL,0,ncompteurtot,compteurtot,&XbAlgoT3ToT,"TOT2C1&3C2");
256  // cleaning
257  for (j = binnumber - 5; j < oldbinnumber; j++)
258  ncompteurt2[j] = ncompteurtot[j] = 0;
259  // we have proto-clusters. Now, let's look at them and see if they have triggers in common for merging
260  for (j = 0; j < nbt2cluster; j++) {
261  // first, a t2mergedcluster is a t2cluster ordered in time
262  l = 0;
263  t2mergedclusters[j].nelem = t2cluster[j].nelem;
264  t2mergedclusters[j].algo = t2cluster[j].algo;
265  t2mergedclusters[j].point = (struct t2 *) malloc(t2mergedclusters[j].nelem * sizeof(struct t2));
266  for (k = 0; k < t2cluster[j].nelem; k++) {
267  min = fake;
268  mink = 0;
269  for (m = 0; m < t2cluster[j].nelem; m++) {
270  if (((*(t2cluster[j].point + m)).time) < min.time) {
271  min = *(t2cluster[j].point + m);
272  mink = m;
273  }
274  }
275  *(t2mergedclusters[j].point + k) = min;
276  (*(t2cluster[j].point + mink)).time = 1010000;
277  }
278  // t2cluster is no more needed
279  FREE(t2cluster[j].point);
280  }
281  /* Now, let's check for mixed clusters
282  * There must be less than 100 us between any 2 stations */
283  for (j = 0; j < nbt2cluster; j++) {
284  for (i = j + 1; i < nbt2cluster; i++) {
285  //if (abs((*(t2mergedclusters[j].point)).time - (*(t2mergedclusters[i].point)).time) < 100) {
286  if ((t2mergedclusters[i].nelem>0 && t2mergedclusters[j].nelem>0) && (abs((*(t2mergedclusters[j].point)).time - (*(t2mergedclusters[i].point)).time) < 100)) {
287  supp = 0;
288  for (k = 0; k < t2mergedclusters[j].nelem; k++) {
289  for (m = 0; m < t2mergedclusters[i].nelem; m++) {
290  if (((*(t2mergedclusters[j].point + k)).ID == (*(t2mergedclusters[i].point + m)).ID)
291  && ((*(t2mergedclusters[j].point + k)).time == (*(t2mergedclusters[i].point + m)).time)) {
292  supp = 1;
293  }
294  }
295  }
296  if (supp == 1) {
297  if (debug) {
298  stringstream s;
299  s << "supperposition of " << i << " and " << j;
300  InternalLog(s.str().c_str(),IKDEBUG);
301  }
302  /* we build one out of two */
303  /* we'll keep 'j' and remove 'i'. Change 'j' algo in case to keep "TOT" */
304  if (strstr(t2mergedclusters[i].algo,"TOT")) t2mergedclusters[j].algo=t2mergedclusters[i].algo;
305  for (m = 0; m < t2mergedclusters[i].nelem; m++) {
306  supp = 0;
307  for (k = 0; k < t2mergedclusters[j].nelem; k++) {
308  if (((*(t2mergedclusters[j].point + k)).ID == (*(t2mergedclusters[i].point + m)).ID)
309  && ((*(t2mergedclusters[j].point + k)).time == (*(t2mergedclusters[i].point + m)).time)) {
310  supp = 1;
311  }
312  }
313  if (supp == 0) {
314  /* t2mergedclusters[i].point+m is not in list[j] */
315  t2mergedclusters[j].nelem++;
316  t2mergedclusters[j].point = (struct t2 *) realloc(t2mergedclusters[j].point, t2mergedclusters[j].nelem * sizeof(struct t2));
317  *(t2mergedclusters[j].point + t2mergedclusters[j].nelem - 1) = *(t2mergedclusters[i].point + m);
318  }
319  }
320  /* we remove the other one */
321  t2mergedclusters[i].nelem = 0;
322  FREE(t2mergedclusters[i].point);
323  }
324  }
325  }
326  }
327  // we now have a proper list of merged clusters
328  if (verbose)
329  for (j = 0; j < nbt2cluster; j++) {
330  stringstream s;
331  for (k = 0; k < t2mergedclusters[j].nelem; k++)
332  s << (*(t2mergedclusters[j].point + k)).time << " " << (*(t2mergedclusters[j].point + k)).ID << ", ";
333  if (t2mergedclusters[j].nelem > 0)
334  InternalLog(s.str().c_str(),IKDEBUG);
335  }
336  /* we build the output */
337  for (j = 0; j < nbt2cluster; j++) {
338  /* check for doublets to be counted as only one tank */
339  tcm = tdn = tmr = 0;
340  for (k = 0; k < t2mergedclusters[j].nelem; k++) {
341  if ((*(t2mergedclusters[j].point + k)).ID == CARMEN) tcm++;
342  if ((*(t2mergedclusters[j].point + k)).ID == MIRANDA) tcm++;
343  if ((*(t2mergedclusters[j].point + k)).ID == DIA) tdn++;
344  if ((*(t2mergedclusters[j].point + k)).ID == NOCHE) tdn++;
345  if ((*(t2mergedclusters[j].point + k)).ID == MOULIN) tmr++;
346  if ((*(t2mergedclusters[j].point + k)).ID == ROUGE) tmr++;
347  }
348  nbstat = t2mergedclusters[j].nelem;
349  if (tcm == 2) nbstat--;
350  if (tdn == 2) nbstat--;
351  if (tmr == 2) nbstat--;
352  if (t2mergedclusters[j].nelem > 0 && nbstat >= 3) /* At the end, accept events with 3 stations or more */
353  out.push_back(t2mergedclusters[j]);
354  }
355  // we now have the T3s of this second.
356  // adding special T3 algorithms:
357 
358  // RANDOM T3
359  if (delay != 0)
360  delay--;
361  else {
362  static struct t2list event;
363  event.nelem = 1;
364  int chosen = (int) (1.0 * nt2 * rand() / (RAND_MAX + 1.0));
365  event.point = (struct t2 *) malloc(sizeof(struct t2));
366  event.algo = (char *) "RANDOM";
367  event.point[0] = input[chosen];
368  delay += trivial_algo;
369  out.push_back(event);
370  }
371  // OBSERVER T3
372  if (observer)
373  for (j = 0; j < nt2; j++)
374  if ((input[j].ID == observer)) {
375  static struct t2list event;
376  event.nelem = 1;
377  event.point = (struct t2 *) malloc(sizeof(struct t2));
378  event.algo = (char *) "OBSERVER";
379  event.point[0] = input[j];
380  out.push_back(event);
381  observer = 0;
382  j = nt2;
383  }
384  // DOUBLET T3
385  if (delaycm != 0) delaycm--;
386  if (delaymr != 0) delaymr--;
387  if (delaydn != 0) delaydn--;
388  for (i = 0; i < nt2cm; i++)
389  for (j = 0; j < nt2cm; j++)
390  if (((carmenmiranda[i].time - carmenmiranda[j].time) <= dtime
391  && (carmenmiranda[i].time - carmenmiranda[j].time) >= -dtime)
392  && ((carmenmiranda[i].ID == CARMEN && carmenmiranda[j].ID == MIRANDA && (delaycm == 0))
393  || (carmenmiranda[i].ID == MOULIN && carmenmiranda[j].ID == ROUGE && (delaymr == 0))
394  || (carmenmiranda[i].ID == DIA && carmenmiranda[j].ID == NOCHE && delaydn == 0))) {
395  static struct t2list event;
396  if (carmenmiranda[i].ID == CARMEN || carmenmiranda[j].ID == MIRANDA) {
397  event.algo = (char *) "CARMEN_MIRANDA";
399  }
400  if (carmenmiranda[i].ID == DIA || carmenmiranda[j].ID == NOCHE) {
401  event.algo = (char *) "DIA_NOCHE";
403  }
404  if (carmenmiranda[i].ID == MOULIN || carmenmiranda[j].ID == ROUGE) {
405  event.algo = (char *) "MOULIN_ROUGE";
407  }
408  event.nelem = 2;
409  event.point = (struct t2 *) malloc(2 * sizeof(struct t2));
410  event.point[0] = carmenmiranda[j];
411  event.point[1] = carmenmiranda[i];
412  out.push_back(event);
413  }
414  // Finished...
415  if (verbose && out.size() != 0) {
416  stringstream s;
417  s << "Cluster Rate for second " << second_ << " is " << out.size();
418  InternalLog(s.str().c_str(),IKINFO);
419  }
420  if (debug) {
421  stringstream s;
422  s << "binsize (" << binsize << ") and binnumber (" << binnumber << ") used";
423  InternalLog(s.str().c_str(),IKDEBUG);
424  }
425  return out;
426 }
427 
429 void XbAlgoFree(t2list in) {
430  FREE(in.point);
431 }
432 
434 t3 XbAlgoT3Build(struct t2list in) {
435  t3stat tmp;
436  struct t3 ret;
437  int medusec = 0;
438 
439  ret.algo = in.algo;
440  ret.refSecond = second_;
441  ret.refuSecond = 2000000;
442  for (unsigned int i = 0; i < in.nelem; i++)
443  if (in.point[i].time + 125 < ret.refuSecond)
444  ret.refuSecond = in.point[i].time + 125;
445  for (unsigned int i = 0; i < in.nelem; i++) {
446  tmp.window = 0;
447  tmp.ID = in.point[i].ID;
448  tmp.offset = in.point[i].time - ret.refuSecond;
449  ret.point.push_back(tmp);
450  medusec += tmp.offset;
451  }
452  // adding extra stations if trigger is not a doublet/observer
453  // going up to X crowns, see below
454  if (! (strcmp(in.algo, "MOULIN_ROUGE") == 0
455  || strcmp(in.algo, "DIA_NOCHE") == 0
456  || strcmp(in.algo, "OBSERVER") == 0
457  || strcmp(in.algo, "CARMEN_MIRANDA") == 0))
458  for (int i = 0; i < nstat; i++) {
459  unsigned int j = 0;
460  tmp.ID = array[i].Id;
461  int mindist=99;
462  while (j < in.nelem && in.point[j].ID != tmp.ID) {
463  if (tmp.ID<ROW)
464  if (distcrown[tmp.ID*ROW+in.point[j].ID]<mindist)
465  mindist=distcrown[tmp.ID*ROW+in.point[j].ID];
466  j++;
467  }
468  if (j == in.nelem && /*tmp.ID < 2048 &&*/ mindist<6) { // 5 crowns, XB 18/07/2013 // in simulations we have stations with id's > 2048
469  tmp.window = 30;
470  tmp.offset = medusec / ((int)in.nelem);
471  ret.point.push_back(tmp);
472  }
473  }
474  if (ret.refuSecond < 0) {
475  ret.refSecond--;
476  ret.refuSecond += 1000000;
477  }
478  if (ret.refuSecond > 1000000) {
479  ret.refSecond++;
480  ret.refuSecond -= 1000000;
481  }
482  return ret;
483 }
struct Station * array
int refuSecond
Definition: XbT2.h:32
static struct t2 extrat2old[1024]
Definition: XbAlgo.cc:15
int observer
Definition: XbAlgo.cc:34
unsigned short ID
Definition: XbT2.h:24
static struct t2 extrat2[1024]
t2 at the end of the second that will be used in both seconds
Definition: XbAlgo.cc:15
static struct t2list t2cluster[1000]
t2 clusters
Definition: XbAlgo.cc:30
int newt2config
#define MAXCM
Definition: XbAlgo.h:16
#define FREE(_x_)
Definition: XbAlgo.cc:12
static int delaydn
Definition: XbAlgo.cc:20
int XbAlgoT3FullArray()
Full Array current trigger: 2C1 &amp; 3C2 &amp; 4C4.
Definition: XbAlgo.cc:45
information for one station in a t3: id, offset, window
Definition: XbT2.h:22
static int oldbinnumber
Definition: XbAlgo.cc:25
static struct t2 * compteurt2[110000][30]
histogram of these t2 per time bin, poiting to the precise t2
Definition: XbAlgo.cc:24
std::vector< t3stat > point
Definition: XbT2.h:30
struct t2 * point
Definition: XbT2.h:18
int trivial_algo
int debug
Definition: dump1090.h:276
vector< t2list > out
output of the algorithm: a list of clusters
Definition: XbAlgo.cc:32
int time
Definition: XbT2.h:9
int Id
Definition: XbArray.h:11
void XbAlgoFindCluster(int minstat, struct t2 *input, int nt2, unsigned short *nbt2inbin, struct t2 *listt2inbin[110000][30], int(*T3func)(), const char *algo)
Function called to find clusters.
Definition: XbAlgo.cc:77
unsigned int refSecond
Definition: XbT2.h:31
#define InternalLog(A, B)
Definition: Xb.h:13
static unsigned short ncompteurt2[110000]
number of t2 per time bin
Definition: XbAlgo.cc:22
const int dtime
Definition: XbAlgo.h:7
static int binnumber
Definition: XbAlgo.cc:25
#define MOULIN
Definition: XbArray.h:29
constexpr double s
Definition: AugerUnits.h:163
char * distcrown
Definition: XbArray.cc:11
#define FAKE
Definition: XbArray.h:5
static int delay
Definition: XbAlgo.cc:20
#define MAXOVERLAP
Definition: XbAlgo.h:14
double abs(const SVector< n, T > &v)
#define MAXBINNUMBER
Definition: XbAlgo.h:11
void XbAlgoT2Init()
initialisation of XbAlgoT2 algorithm, building fake station and resetting histograms ...
Definition: XbAlgo.cc:37
#define DIA
Definition: XbArray.h:27
static int nbt2cluster
number of t2 cluster
Definition: XbAlgo.cc:28
a t3: algo, second, usecond and a vector of &lt;t3stat&gt;
Definition: XbT2.h:29
int carmen_miranda
vector< t2list > XbAlgoT2Process(struct t2 *input, int nt2)
Main function, processing T2 and returning clusters of T2.
Definition: XbAlgo.cc:153
#define TOTVALUE
Definition: XbAlgo.h:33
unsigned short ID
Definition: XbT2.h:10
unsigned short energy
Definition: XbT2.h:11
static int delaymr
Definition: XbAlgo.cc:20
static unsigned short ncompteurtot[110000]
Definition: XbAlgo.cc:22
a second level trigger
Definition: XbT2.h:8
short offset
Definition: XbT2.h:23
static int cour[5]
Definition: XbAlgo.cc:26
static int delaycm
Definition: XbAlgo.cc:20
int XbAlgoT3ToT()
ToT current trigger: 2C1 &amp; 3C2.
Definition: XbAlgo.cc:50
#define ROW
Definition: XbArray.h:4
t3 XbAlgoT3Build(struct t2list in)
builds t3 from a list of t2
Definition: XbAlgo.cc:434
unsigned int nelem
Definition: XbT2.h:16
const char * algo
Definition: XbT2.h:33
unsigned int second_
static struct t2 * compteurtot[110000][30]
Definition: XbAlgo.cc:24
unsigned short window
Definition: XbT2.h:25
a list of t2
Definition: XbT2.h:15
char * neighbour
Definition: XbArray.cc:10
static int binsize
Definition: XbAlgo.cc:25
void XbAlgoFree(t2list in)
frees the malloced part of the list of t2
Definition: XbAlgo.cc:429
void HugeShower(struct t2 *input, int nt2, int msec)
Function called when more than MAXSTATINONEBIN are in 5 consecutive bins of the time histogram...
Definition: XbAlgo.cc:55
#define ROUGE
Definition: XbArray.h:30
const char * algo
Definition: XbT2.h:17
constexpr double m
Definition: AugerUnits.h:121
static int nextra
Definition: XbAlgo.cc:20
#define MIRANDA
Definition: XbArray.h:26
#define MAXSTATINONEBIN
Definition: XbAlgo.h:12
static struct t2 fake
the fake trigger, not in cluster with any trigger, to be used when one removes a trigger from a clust...
Definition: XbAlgo.cc:19
static struct t2 carmenmiranda[1024]
t2 from one of the doublets to be used in the doublet special trigger
Definition: XbAlgo.cc:17
#define NOCHE
Definition: XbArray.h:28
#define CARMEN
Definition: XbArray.h:25

, generated on Tue Sep 26 2023.