]>
Commit | Line | Data |
---|---|---|
f67e2651 | 1 | |
2 | /********implements functions for the mevt_uses structure *********/ | |
3 | ||
4 | #include <string.h> | |
5 | #include <stdlib.h> | |
6 | #include <malloc.h> | |
7 | ||
8 | #include "rdmc.h" | |
9 | ||
10 | static int comp_uses(const void *h1, const void *h2); | |
11 | ||
12 | ||
13 | void rdmc_init_mevt_uses(mevt_uses_t *u){ | |
14 | u->hitid = RDMC_NA; | |
15 | u->useid = RDMC_NA; | |
16 | return; | |
17 | } | |
18 | ||
19 | void rdmc_free_mevt_uses(mevt_uses_t *u){ | |
20 | return; | |
21 | } | |
22 | ||
23 | void rdmc_clear_mevt_uses(mevt_uses_t *u){ | |
24 | rdmc_free_mevt_uses(u); | |
25 | rdmc_init_mevt_uses(u); | |
26 | return; | |
27 | } | |
28 | ||
29 | void rdmc_cp_mevt_nuses(mevt_uses_t *out, mevt_uses_t *in, int nuses){ | |
30 | ||
31 | if ((in == NULL) || (out == NULL) || (in == out)) | |
32 | return; | |
33 | memcpy(out,in,nuses*sizeof(mevt_uses_t)); | |
34 | return; | |
35 | } | |
36 | ||
37 | ||
38 | /* sorts the uses array for a) uses id and the hit_id */ | |
39 | void rdmc_sort_uses(mevt_uses_t *use, int nuse){ | |
40 | qsort(use,nuse,sizeof(mevt_uses_t),comp_uses); | |
41 | } | |
42 | ||
43 | static int comp_uses(const void *h1, const void *h2){ | |
44 | int s; | |
45 | const mevt_uses_t *u1=h1,*u2=h2; | |
46 | s = u1->useid - u2->useid; | |
47 | switch (s){ | |
48 | case 0 : | |
49 | s = u1->hitid - u2->hitid; | |
50 | switch (s){ | |
51 | case 0 : | |
52 | s= -1; | |
53 | break; | |
54 | default: | |
55 | break; | |
56 | } | |
57 | break; | |
58 | default: | |
59 | break; | |
60 | } | |
61 | return s; | |
62 | } | |
63 | ||
64 | ||
65 | int rdmc_create_fit_uses(mevt *e, int ifit){ | |
66 | mevt_uses_t use; | |
67 | int i; | |
68 | ||
69 | rdmc_init_mevt_uses(&use); | |
70 | use.useid=ifit; | |
71 | ||
72 | /* loop over all hits in the old event */ | |
73 | for (i=0 ; i < e->nhits ; i++ ){ | |
74 | use.hitid=e->h[i].id; | |
75 | rdmc_add_mevt_uses(&(e->fit_uses),&(e->nfit_uses) | |
76 | ,&use,e->nfit_uses); | |
77 | } /* all old hits */ | |
78 | return 0; | |
79 | } | |
80 | ||
81 | int rdmc_create_trig_uses(mevt *e, int itrig){ | |
82 | mevt_uses_t use; | |
83 | int i; | |
84 | ||
85 | rdmc_init_mevt_uses(&use); | |
86 | use.useid=itrig; | |
87 | ||
88 | /* loop over all hits in the old event */ | |
89 | for (i=0 ; i < e->nhits ; i++ ){ | |
90 | use.hitid=e->h[i].id; | |
91 | rdmc_add_mevt_uses(&(e->trig_uses),&(e->ntrig_uses) | |
92 | ,&use,e->ntrig_uses); | |
93 | } /* all old hits */ | |
94 | return 0; | |
95 | } | |
96 | ||
97 | ||
98 | /* count the number of channels which are used by fit or trigger i*/ | |
99 | int rdmc_count_fit_nch_uses(mevt *e, array *a, int ifit){ | |
100 | int nch=0; | |
101 | static int *ich=NULL; | |
102 | int iuse; | |
103 | ||
104 | /* first sort fit_uses data for fit number */ | |
105 | rdmc_sort_uses(e->fit_uses, e->nfit_uses); | |
106 | ||
107 | #if 1 | |
108 | /* get pointer to first element for fit i */ | |
109 | for (iuse=0 ; iuse < e->nfit_uses ; iuse++){ | |
110 | if (e->fit_uses[iuse].useid == ifit){ | |
111 | break; /* ok we found one */ | |
112 | } | |
113 | } | |
114 | if (iuse >= e->nfit_uses) return 0; | |
115 | #else | |
116 | iuse=0; | |
117 | #endif | |
118 | ||
119 | /* get temporary array for the number of channels and init to 0*/ | |
120 | ich = alloca(a->nch*sizeof(int)); | |
121 | memset(ich,0,a->nch*sizeof(int)); | |
122 | ||
123 | /* flag each channel number which was hit */ | |
124 | while (iuse < e->nfit_uses) { | |
125 | if(e->fit_uses[iuse].useid == ifit){ | |
126 | int ihit = rdmc_mevt_ihit(e, e->fit_uses[iuse].hitid ); | |
127 | if (ihit == RDMC_NA ) { | |
128 | #if 1 | |
129 | /* consider this hit as non existent for good reason */ | |
130 | #else | |
131 | nch++; /* assume a different channel was hit */ | |
132 | #endif | |
133 | #if 0 | |
134 | rdmc_warnprintf("ev=%i, fit=%i hit id=%i is not existent ",e->enr,ifit,e->fit_uses[iuse].hitid); | |
135 | #endif | |
136 | } else if ( ich[e->h[ihit].ch] == 0){ | |
137 | nch++; /* count all newly hit channels */ | |
138 | ich[e->h[ihit].ch] += 1; | |
139 | } | |
140 | #if 1 | |
141 | }else{ | |
142 | break; | |
143 | #endif | |
144 | } | |
145 | iuse++; | |
146 | } | |
147 | ||
148 | return nch; | |
149 | } | |
150 | ||
151 | ||
152 | ||
153 | ||
154 | ||
155 |