2 /********implements functions for the mevt_uses structure *********/
10 static int comp_uses(const void *h1, const void *h2);
13 void rdmc_init_mevt_uses(mevt_uses_t *u){
19 void rdmc_free_mevt_uses(mevt_uses_t *u){
23 void rdmc_clear_mevt_uses(mevt_uses_t *u){
24 rdmc_free_mevt_uses(u);
25 rdmc_init_mevt_uses(u);
29 void rdmc_cp_mevt_nuses(mevt_uses_t *out, mevt_uses_t *in, int nuses){
31 if ((in == NULL) || (out == NULL) || (in == out))
33 memcpy(out,in,nuses*sizeof(mevt_uses_t));
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);
43 static int comp_uses(const void *h1, const void *h2){
45 const mevt_uses_t *u1=h1,*u2=h2;
46 s = u1->useid - u2->useid;
49 s = u1->hitid - u2->hitid;
65 int rdmc_create_fit_uses(mevt *e, int ifit){
69 rdmc_init_mevt_uses(&use);
72 /* loop over all hits in the old event */
73 for (i=0 ; i < e->nhits ; i++ ){
75 rdmc_add_mevt_uses(&(e->fit_uses),&(e->nfit_uses)
81 int rdmc_create_trig_uses(mevt *e, int itrig){
85 rdmc_init_mevt_uses(&use);
88 /* loop over all hits in the old event */
89 for (i=0 ; i < e->nhits ; i++ ){
91 rdmc_add_mevt_uses(&(e->trig_uses),&(e->ntrig_uses)
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){
101 static int *ich=NULL;
104 /* first sort fit_uses data for fit number */
105 rdmc_sort_uses(e->fit_uses, e->nfit_uses);
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 */
114 if (iuse >= e->nfit_uses) return 0;
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));
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 ) {
129 /* consider this hit as non existent for good reason */
131 nch++; /* assume a different channel was hit */
134 rdmc_warnprintf("ev=%i, fit=%i hit id=%i is not existent ",e->enr,ifit,e->fit_uses[iuse].hitid);
136 } else if ( ich[e->h[ihit].ch] == 0){
137 nch++; /* count all newly hit channels */
138 ich[e->h[ihit].ch] += 1;