]> git.uio.no Git - u/mrichter/AliRoot.git/blob - RALICE/icepack/iceconvert/rdmc_mevt_uses.c
21-jun-2005 NvE Install scripts for gcc corrected to also include the rdmc stuff
[u/mrichter/AliRoot.git] / RALICE / icepack / iceconvert / rdmc_mevt_uses.c
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