]> git.uio.no Git - u/mrichter/AliRoot.git/blob - RALICE/icepack/iceconvert/rdmc_mevt.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.c
1
2 /********implements functions for the mevt structure *********/
3 /* $Header: /net/local/cvsroot/siegmund/rdmc/rdmc_mevt.c,v 1.27 2004/02/19 17:10:10 wiebusch Exp $ */
4
5 #include <string.h>
6 #include <stdlib.h>
7
8 #include "rdmc.h"
9 #include "rdmc_local.h"
10
11 #include "amanda.h"
12 #include "dumand.h"
13 #include "uwi.h"
14 #include "baikal.h"
15
16 static int  rdmc_add_mevt_WF(waveform **list, int *count, waveform *new, int ipos);
17 static int  rdmc_del_mevt_WF(waveform **list, int *count, int ipos);
18
19 /****************************************************************************/
20 /* The function revt() reads an event of a mc file                          */
21 /*     if it was not successfull, try to skip to the next event             */
22 /****************************************************************************/
23
24 int rdmc_revt(mcfile *fp, array *ar, mevt *ev)
25 {
26
27   int r;                                                   /* return value */
28
29   if (feof(fp->fp))                                /* test for end of file */
30     return EOF;
31
32   switch (fp->format) {
33 #ifdef DUMAND_ASCII_F
34   case DUMAND_ASCII_F:
35     r = rdmc_revt_ascii(fp, ev,ar);
36     break;
37 #endif
38 #ifdef UWI_ASCII_F
39   case UWI_ASCII_F:
40     r = rdmc_revt_uwi(fp, ev, ar);
41     break;
42 #endif
43 #ifdef BAIKAL_BIN_F
44   case BAIKAL_BIN_F:                      /* if it is a baikal-like format */
45     r = rdmc_revt_baikal(fp, ev, ar);
46     break;
47 #endif
48 #ifdef AMANDA_ASCII_F
49   case AMANDA_ASCII_F:
50     r = rdmc_revt_amanda(fp, ev, ar);
51     break;
52 #endif
53   default: 
54     r = RDMC_UNKNOWN_FORMAT;
55   } /* switch fp->format */
56
57   if ((r != 0) && (r != EOF)) {               /* if illegal format occured */
58 #if 0
59     long filepos=fp->fpos;              /* shows the current file position */
60                                          /* store the old file position */
61 #endif
62     fp->errline = r;              /* set the source code line of the error */
63     if (fp->sloppy){
64       rdmc_skipevt(fp);                            /* skip to the next event */
65 #if 0
66       fp->fpos = filepos;                       /* restore old file position */
67 #endif
68     }
69 #if 0
70     r = RDMC_ILF;     /* set the return value in case of format error */
71 #endif
72 #if 0
73     if (r)
74       rdmc_err_print(fp,r);
75 #endif
76   }
77
78   return r;
79
80 } /* function revt() */
81
82
83 /****************************************************************************/
84 /* skipevt skips over the next event record in a mc/data file               */
85 /****************************************************************************/
86 int rdmc_skipevt(mcfile *fp)
87 {
88   int r;
89
90   switch(fp->format) {
91 #ifdef DUMAND_ASCII_F
92   case DUMAND_ASCII_F:                        /* for the dumand-like format */
93     r = rdmc_skipevt_ascii(fp);                                /* skip the event */
94     break;
95 #endif
96 #ifdef UWI_ASCII_F
97   case UWI_ASCII_F:                        /* for the UWI-like format */
98     r = rdmc_skipevt_uwi(fp);
99     break;
100 #endif
101 #ifdef AMANDA_ASCII_F
102   case AMANDA_ASCII_F:                        /* for the amanda-like format */
103     r = rdmc_skipevt_amanda(fp);                               /* skip the event */
104     break;
105 #endif
106 #ifdef BAIKAL_BIN_F
107   case BAIKAL_BIN_F:                          /* for the baikal-like format */
108     r = rdmc_skipevt_baikal_mc(fp);                                   /* skip the event */
109     break;
110 #endif
111   default:
112     r = RDMC_UNKNOWN_FORMAT;
113     break;
114   }
115   return r;
116 } /* function skipevt() */
117
118
119 /****************************************************************************/
120 /* The function wevt() writes an event of a mc file                         */
121 /****************************************************************************/
122
123 int rdmc_wevt(mcfile *fp, const mevt *ev, const array *ar)
124 {
125   int r;
126
127 #if (DEBUG == 1)
128     fprintf(stderr, "<Event(write): enr=%i nch=%i %s %s (%s)>\n",
129            ev->enr,ev->nch,(ev->gen!=NULL)?"gen":"",
130            (ev->rec!=NULL)?"rec":"",(fp->mc!=0)?"mc":"data");
131 #endif
132
133   switch(fp->format) {
134 #ifdef DUMAND_ASCII_F
135   case DUMAND_ASCII_F:                            /* for a dumand-like file */
136     r = rdmc_wevt_ascii(fp, ev,ar );
137     break;
138 #endif
139 #ifdef UWI_ASCII_F
140   case UWI_ASCII_F:                                       /* for a UWI file */
141     r = rdmc_wevt_uwi(fp, ev, ar);
142     break;
143 #endif
144 #ifdef AMANDA_ASCII_F
145   case AMANDA_ASCII_F:                            /* for a amanda-like file */
146     r = rdmc_wevt_amanda(fp, ev, ar);
147     break;
148 #endif
149 #ifdef BAIKAL_BIN_F
150   case BAIKAL_BIN_F:                              /* for a baikal-like file */
151     if (fp->info.bai.mc)                          /* if it is a monte carlo file */
152       r = rdmc_wevt_baikal_mc(fp, ev, ar);
153     else                                            /* if it is a data file */
154       r = rdmc_wevt_baikal_data(fp, ev, ar);
155     fp->fpos = ftell(fp->fp);
156     break;
157 #endif
158   default:
159     r = RDMC_UNKNOWN_FORMAT;
160   }
161
162   return r;
163
164 } /* function wevt() */
165
166 /*******************************************/
167 /* Initialization functions ***********/
168 /*******************************************/
169 /**** init =  set to default values ****/
170 /***  clear = free also memory    *****/
171 /****************************************/
172
173
174 /****************************************************************************/
175 /* clear_mevt() frees the memory used by the pointers of a event and        */
176 /*              resets the mevt structure itself                            */
177 /****************************************************************************/
178
179 void rdmc_clear_mevt(mevt *ev)
180 {
181   unsigned long int event_id;
182
183   rdmc_free_mevt(ev);
184
185   event_id=ev->event_id;                         /* save the event-id */
186   rdmc_init_mevt(ev);                              /* re-init the event */
187   ev->event_id = event_id+1;                 /* increment the event id */
188
189 } /* function clear_mevt() */
190
191 void rdmc_free_mevt(mevt *ev){
192   int i;
193   if (ev->h != NULL){                                 /* if there were hits */
194     for (i =0 ; i < ev->nhits ; i++)
195       rdmc_free_mhit(&(ev->h[i]));
196     free(ev->h);                                               /* free them */
197     ev->nhits=0;
198     ev->h=NULL;
199   }
200   if (ev->wf != NULL){                            /* if there were waveforms */
201     for (i =0 ; i < ev->nwf ; i++)
202       rdmc_free_WF(&(ev->wf[i]));
203
204     free(ev->wf);                                               /* free them */
205     ev->nwf = 0;
206     ev->wf  = NULL;
207   }
208
209   if (ev->gen != NULL){                  /* if there were generating tracks */
210     for (i =0 ; i < ev->ntrack ; i++)
211       rdmc_free_mtrack(&(ev->gen[i]));
212     free(ev->gen);                                               /* free it */
213     ev->ntrack=0;
214     ev->gen=NULL;
215   }
216   if ((ev->rec != NULL)&&(ev->fresult != NULL)){ /* if there are recos */
217     for (i =0 ; i < ev->nfit ; i++){
218       rdmc_free_mtrack(&(ev->rec[i]));
219       rdmc_free_mevt_special(&(ev->fresult[i]));
220     }
221     free(ev->rec);                                               /* free it */
222     free(ev->fresult);
223     ev->nfit=0;
224     ev->rec=NULL;
225     ev->fresult=NULL;
226   }
227
228   if (ev->user != NULL){
229     for (i =0 ; i < ev->nuser ; i++)
230       rdmc_free_mevt_special(&(ev->user[i]));
231     ev->nuser=0;
232     free(ev->user);
233     ev->user=NULL;
234   }
235
236   if (ev->status != NULL){
237     for (i =0 ; i < ev->nstat ; i++)
238       rdmc_free_mevt_special(&(ev->status[i]));
239     ev->nstat=0;
240     free(ev->status);
241     ev->status=NULL;
242   }
243   if (ev->ptrig != NULL){
244     for (i =0 ; i < ev->ntrig ; i++)
245       rdmc_free_mevt_special(&(ev->ptrig[i]));
246     ev->ntrig=0;
247     free(ev->ptrig);
248     ev->ptrig=NULL;
249   }
250   if (ev->mcinfo != NULL){
251     for (i =0 ; i < ev->nmcinfo ; i++)
252       rdmc_free_mevt_special(&(ev->mcinfo[i]));
253     ev->nmcinfo=0;
254     free(ev->mcinfo);
255     ev->mcinfo=NULL;
256   }
257
258 #if !NEW_USES
259   if (ev->trig_uses != NULL){
260     free(ev->trig_uses);
261     ev->ntrig_uses = 0;
262   }
263   if (ev->fit_uses != NULL){
264     free(ev->fit_uses);
265     ev->nfit_uses = 0;
266   }
267 #endif
268
269   if (ev->comment != NULL){
270     free(ev->comment);
271     ev->comment=NULL;
272   }
273
274   if (ev->tmp){
275     free(ev->tmp);
276     ev->tmp=NULL;
277   }
278 } /* function free_mevt() */
279
280
281 /****************************************************************************/
282 /* init_mevt() resets the event values to start values                      */
283 /****************************************************************************/
284
285 void rdmc_init_mevt(mevt *ev)
286 {
287    
288   ev->nrun = RDMC_NA;
289   ev->enr = RDMC_NA;
290   ev->mjd = 0;
291   ev->secs = 0;
292   ev->nsecs = 0;
293
294   ev->trigger = 0;
295   ev->trigid = 0;
296   ev->t_offset = 0.0;
297   ev->event_id=0;
298   ev->sort_status=RDMC_NO_SORT;
299   ev->ee = 0;
300   ev->weight = 1.;
301
302   ev->nch = 0;
303   ev->nstr = 0;
304
305   ev->nhits     = 0;
306   ev->nwf       = 0;
307   ev->ntrack    = 0;
308   ev->nfit      = 0;
309   ev->nuser     = 0;
310   ev->nstat     = 0;
311   ev->ntrig     = 0;
312   ev->nmcinfo   = 0;
313   ev->ntrig_uses =0;
314   ev->nfit_uses  =0;
315
316   ev->h          = NULL;
317   ev->wf         = NULL;
318   ev->gen        = NULL;
319   ev->rec        = NULL;
320   ev->fresult    = NULL;
321   ev->user       = NULL;
322   ev->status     = NULL;
323   ev->ptrig      = NULL;
324   ev->mcinfo     = NULL;
325   ev->trig_uses  = NULL;
326   ev->fit_uses   = NULL;
327   ev->comment    = NULL;
328   ev->tmp        = NULL;
329    
330 } /* function init_mevt() */
331
332
333
334 /*************************************************************************/
335 /* counts number of strings in event e                                   */
336 /*************************************************************************/
337
338 int rdmc_count_nstr(const mevt *ev)
339 {
340   /* too speed up we need to do some dirty memory management ! */
341   /* there are usually less hits than MAX_CHANNELS */
342   int i;
343   int nstr = 0;
344   static int do_init=1;
345   static int hitted[RDMC_MAXCHANNELS];
346
347   if(do_init){
348     for (i = 0; i < RDMC_MAXCHANNELS; i++) /* maximum number of strings */
349       hitted[i] = 0;
350     do_init=0;
351   }
352
353   /* now fill the block */
354   for (i = 0; i < ev->nhits; i++){
355     if ((ev->h[i].str <= RDMC_MAXCHANNELS) && (ev->h[i].str > 0))
356       hitted[ev->h[i].str-1]++;
357   }
358
359   /* now evaluate and clean on the fly -> strange loop  */
360   for (i = 0; i < ev->nhits; i++){
361     if ((ev->h[i].str <= RDMC_MAXCHANNELS) && (ev->h[i].str > 0)){
362       if(hitted[ev->h[i].str-1]){
363         hitted[ev->h[i].str-1]=0;
364         nstr++;
365       }
366     }
367   }
368
369   return nstr;
370
371 } /* rdmc_count_nstr() */
372
373
374 /*************************************************************************/
375 /* counts number of channels in event e                                  */
376 /*************************************************************************/
377 int rdmc_count_nch(const mevt *ev)
378 {
379   /* too speed up we need to do some dirty memory management ! */
380   /* there are usually less hits than MAX_CHANNELS */
381   int i;
382   int nch = 0;
383   static int do_init=1;
384   static int hitted[RDMC_MAXCHANNELS];
385
386   if(do_init){
387     for (i = 0; i < RDMC_MAXCHANNELS; i++)
388       hitted[i] = 0;
389     do_init=0;
390   }
391
392   /* now fill the block */
393   for (i = 0; i < ev->nhits; i++){
394     if ((ev->h[i].ch < RDMC_MAXCHANNELS) && (ev->h[i].ch >= 0))
395       hitted[ev->h[i].ch]++;
396   }
397
398   /* now evaluate and clean on the fly -> strange loop  */
399   for (i = 0; i < ev->nhits; i++){
400     if ((ev->h[i].ch < RDMC_MAXCHANNELS) && (ev->h[i].ch >= 0)){
401       if(hitted[ev->h[i].ch]){
402         hitted[ev->h[i].ch]=0;
403         nch++;
404       }
405     }
406   }
407   return nch;
408 } /* rdmc_count_nch() */
409
410 /****************************************************************************/
411 /* ns_evt() calculates the number of strings and fills it in the nstr field */
412 /*         it also fills the string number into the h[].str fields          */
413 /****************************************************************************/
414
415 int rdmc_fill_mhit_str(mevt *ev, const array *ar)
416 {
417
418   int i;
419   int error_flag = 0;                                 /* indicates an error */
420   int geocal;                          /* flag if array is a valid geometry */
421
422   if (ev->nch >= RDMC_MAXCHANNELS) return RDMC_INCONSISTENT_GEOMETRY;
423                                           /* if there are too much channels */
424   geocal = ((ar->is_calib.geo) && (ar->nch >0)) ? 1 : 0;
425
426   for (i = 0; i < ev->nhits; i++) {              /* for all hits */
427     
428     if ( (geocal) && 
429          (ev->h[i].ch >= 0) && 
430          (ev->h[i].ch < ar->nch))    /* if ch in range */
431       ev->h[i].str = ar->str[ev->h[i].ch];           /* write string number */
432     else {                                       /* if channel not in range */
433       ev->h[i].str = 0;                          /* errornous string number */
434     } /* if not (0 < ch < ar->nch) */
435   } /* for i */
436
437   return (error_flag == 0)? ev->nstr:error_flag;/* return number of strings */
438
439 } /* function rdmc_fill_mhit_str() */
440
441 /****************************************************************************/
442 /* event_cp                                                               */
443 /* copy values of channel in into out                                       */
444 /* returns 0 if OK                                                          */
445 /****************************************************************************/
446 int rdmc_cp_mevt(mevt *out,mevt *in)
447 {
448   int r=0;
449 #if 0
450   rdmc_init_mevt(out);
451 #else
452   rdmc_clear_mevt(out);
453 #endif
454
455   /* just copy everything and overwrite dynamic pointers later */
456   memcpy(out,in,sizeof(mevt)); 
457
458   if (in->comment) {
459     out->comment = (char *) malloc(strlen(in->comment)+1);
460     if (!out->comment) {
461       r |= -1;
462     }else
463       strcpy(out->comment, in->comment);
464   }
465
466   if (out->nhits){
467     mhit *from,*to;
468     int i;
469     out->h = (mhit *) malloc(in->nhits*sizeof(mhit));
470     if (!(out->h)) {
471       out->nhits = 0;
472       r |= -1;
473     }else {
474       from = in->h;
475       to = out->h;
476       for (i = 0 ; i < in->nhits ; i++){
477         rdmc_cp_mhit(to,from);
478         to++;
479         from++;
480       }
481     }
482   }
483
484
485   if (out->nwf){                                     /*   copy waveforms  */
486     waveform *from,*to;
487     int i;
488     out->wf = (waveform *) malloc(in->nwf*sizeof(waveform));
489     if (!(out->wf)) {
490       out->nwf = 0;
491       r |= -1;
492     }else {
493       from = in->wf;
494       to = out->wf;
495       for (i = 0 ; i < in->nwf ; i++){
496         rdmc_cp_WF(to,from);
497         to++;
498         from++;
499       }
500     }
501   }
502
503   if (out->ntrack){
504     int i;
505     mtrack *from,*to;
506     out->gen = (mtrack *) malloc(in->ntrack*sizeof(mtrack));
507     if (!(out->gen)) {
508       out->ntrack=0;
509        r |= -1;
510     }else {
511       from = in->gen;
512       to = out->gen;
513       for (i = 0 ; i < in->ntrack ; i++){
514         rdmc_cp_mtrack(to,from);
515         to++;
516         from++;
517       }
518     }
519   }
520
521   if (out->nfit){
522     int i;
523     mtrack *ft_from,*ft_to;
524     mevt_special_t *fr_from,*fr_to;
525     out->rec = (mtrack *) malloc(in->nfit*sizeof(mtrack));
526     if (!(out->rec)) {
527       out->nfit=0;
528       r |= -1;
529     }else {
530       ft_from = in->rec;
531       ft_to = out->rec;
532       out->fresult = (mevt_special_t *) malloc(in->nfit*sizeof(mevt_special_t));
533       if (!(out->fresult)){
534         free(out->rec);
535         out->rec=NULL;
536         out->nfit=0;
537         r |= -1;
538       } else {
539         fr_from = in->fresult;
540         fr_to = out->fresult;
541         for (i = 0 ; i < in->nfit ; i++){
542           rdmc_cp_mtrack(ft_to,ft_from);
543           rdmc_cp_mevt_special(fr_to,fr_from);
544           fr_to++ ; fr_from++ ; ft_to++ ; ft_from++;
545         }
546       }
547     }
548   }
549
550   if (out->nuser){
551     int i;
552     mevt_special_t *from,*to;
553     out->user = (mevt_special_t *) malloc(in->nuser*sizeof(mevt_special_t));
554     if (!(out->user)){
555       out->nuser =0;
556       r |= -1;
557     } else {
558       from = in->user;
559       to = out->user;
560       for (i = 0 ; i < in->nuser ; i++){
561         rdmc_cp_mevt_special(to,from);
562         to++ ; from++;
563       }
564     }
565   }
566
567   if (out->nstat){
568     int i;
569     mevt_special_t *from=in->status,*to;
570     out->status = (mevt_special_t *) malloc(in->nstat*sizeof(mevt_special_t));
571     if (! (to=out->status)){
572       out->nstat =0;
573       r |= -1;
574     }
575     for (i = 0 ; i < in->nstat ; i++){
576       rdmc_cp_mevt_special(to,from);
577       to++ ; from++;
578     }
579   }
580
581   if (out->ntrig){
582     int i;
583     mevt_special_t *from=in->ptrig,*to;
584     out->ptrig = (mevt_special_t *) malloc(in->ntrig*sizeof(mevt_special_t));
585     if (! (to=out->ptrig)){
586       r |= -1;
587       out->ntrig =0;
588     }else {
589       for (i = 0 ; i < in->ntrig ; i++){
590         rdmc_cp_mevt_special(to,from);
591         to++ ; from++;
592       }
593     }
594   }
595
596   if (out->nmcinfo){
597     int i;
598     mevt_special_t *from=in->mcinfo,*to;
599     out->mcinfo = (mevt_special_t *) 
600       malloc(in->nmcinfo*sizeof(mevt_special_t));
601     if (! (to=out->mcinfo)){
602       r |= -1;
603       out->nmcinfo =0 ;
604     }
605     for (i = 0 ; i < in->nmcinfo ; i++){
606       rdmc_cp_mevt_special(to,from);
607       to++ ; from++;
608     }
609   }
610
611   if (out->ntrig_uses){
612     out->trig_uses = (mevt_uses_t *)
613       malloc(in->ntrig_uses*sizeof(mevt_uses_t));
614     if (! (out->trig_uses) ){
615       r |= -1;
616       out->ntrig_uses =0;
617     }else
618       rdmc_cp_mevt_nuses(out->trig_uses,in->trig_uses,in->ntrig_uses);
619   }
620
621   if (out->nfit_uses){
622     out->fit_uses = (mevt_uses_t *)
623       malloc(in->nfit_uses*sizeof(mevt_uses_t));
624     if (! (out->fit_uses) ){
625       r |= -1;
626       out->nfit_uses =0;
627     }else
628       rdmc_cp_mevt_nuses(out->fit_uses,in->fit_uses,in->nfit_uses);
629   }
630
631   if (out->tmp){ /* if there is a new stack delete it */
632     out->tmp=NULL;
633   }
634
635   return r;
636 }
637
638
639 /***************** Functions to add/remove mevt objects *******/
640
641 int rdmc_add_gen(mevt *ev, mtrack *tr, int itrack){
642   return rdmc_add_mevt_mtrack( &(ev->gen), 
643                                &(ev->ntrack),
644                                tr,
645                                itrack);
646 }
647 int rdmc_del_gen(mevt *ev , int itrack){
648   return  rdmc_del_mevt_mtrack( &(ev->gen),
649                                 &(ev->ntrack),
650                                 itrack);
651 }
652
653 int rdmc_add_fit(mevt *ev, mtrack *ft, mevt_special_t *fr, int ifit){
654   int rf=1,rr=1;
655   rf = rdmc_add_mevt_mtrack( &(ev->rec), 
656                              &(ev->nfit),
657                              ft,
658                              ifit);
659   if (!rf){
660     ev->nfit--; /* set counter back  for fresult  */
661     rr=rdmc_add_mevt_special( &(ev->fresult), 
662                               &(ev->nfit),
663                               fr,
664                               ifit);
665     if (rr) {
666       ev->nfit++; /* increase to get the last track back out */
667       rdmc_del_mevt_mtrack( &(ev->rec),
668                             &(ev->nfit),
669                             ifit);
670     }
671   }
672   return (rr || rf) ;
673 }
674
675 int rdmc_del_fit(mevt *ev , int ifit){
676   int rf=1,rr=1;
677   rf = rdmc_del_mevt_mtrack( &(ev->rec), 
678                              &(ev->nfit),
679                              ifit);
680   if (!rf){
681     ev->nfit++; /* set counter back  for fresult  */
682     rr=rdmc_del_mevt_special( &(ev->fresult), 
683                              &(ev->nfit),
684                              ifit);
685     if (rr) {
686       ev->nfit--;
687       /* cannot add it again */
688     }
689   }
690   return (rr || rf) ;
691 }
692
693 int rdmc_add_user(mevt *ev, mevt_special_t *us, int iu){
694   return rdmc_add_mevt_special( &(ev->user), 
695                                &(ev->nuser),
696                                us,
697                                iu);
698 }
699
700 int rdmc_del_user(mevt *ev , int iu){
701   return  rdmc_del_mevt_special( &(ev->user),
702                                 &(ev->nuser),
703                                 iu);
704 }
705
706 int rdmc_add_status(mevt *ev, mevt_special_t *st, int is){
707   return rdmc_add_mevt_special( &(ev->status), 
708                                 &(ev->nstat),
709                                 st,
710                                 is);
711 }
712
713 int rdmc_del_status(mevt *ev , int is){
714   return  rdmc_del_mevt_special( &(ev->status),
715                                 &(ev->nstat),
716                                 is);
717 }
718
719 int rdmc_add_mcinfo(mevt *ev, mevt_special_t *mci, int imci){
720   return rdmc_add_mevt_special( &(ev->mcinfo), 
721                                 &(ev->nmcinfo),
722                                 mci,
723                                 imci);
724 }
725 int rdmc_del_mcinfo(mevt *ev , int imci){
726   return  rdmc_del_mevt_special( &(ev->mcinfo),
727                                  &(ev->nmcinfo),
728                                  imci);
729
730 }
731 int rdmc_add_trigger(mevt *ev, mevt_special_t *tr, int itr, int idef){
732   int imask;
733
734   imask=tr->id;
735   if ((imask < 0)||(idef <0))
736     return 1;
737
738   if (imask >= RDMC_MAXTRIGID)
739     ev->trigger |= ((unsigned long)1<<(RDMC_MAXTRIGID-1));
740   else  
741     ev->trigger |= ((unsigned long)1<<(imask));
742
743   if (idef >= RDMC_MAXTRIGID)
744     ev->trigid |= ((unsigned long)1<<(RDMC_MAXTRIGID-1));
745   else  
746     ev->trigid |= ((unsigned long)1<<(idef));
747
748   return rdmc_add_mevt_special( &(ev->ptrig), 
749                                 &(ev->ntrig),
750                                 tr,
751                                 itr);
752 }
753
754 int rdmc_del_trigger(mevt *ev , int itr, int idef){
755   int imask;
756   if ((itr < 0 ) || (idef < 0) )
757     return 1;
758
759   imask=ev->ptrig[itr].id;
760   if (imask <0 )
761     return 1;
762   
763   if (imask < RDMC_MAXTRIGID)
764     ev->trigger &= (~(1<<(imask)));
765   /* in the else part we keep the overflow bit because it is not uniqe */
766   if (idef < RDMC_MAXTRIGID)
767     ev->trigid &= (~(1<<(idef)));
768   /* in the else part we keep the overflow bit because it is not uniqe */
769
770   return  rdmc_del_mevt_special( &(ev->ptrig),
771                                  &(ev->ntrig),
772                                  itr);
773 }
774
775
776 int rdmc_add_trig_uses(mevt *ev, mevt_uses_t *tu, int ituse){
777   return rdmc_add_mevt_uses( &(ev->trig_uses), 
778                              &(ev->ntrig_uses),
779                              tu,
780                              ituse);
781 }
782
783 int rdmc_del_trig_uses(mevt *ev , int ituse){
784   return rdmc_del_mevt_uses( &(ev->trig_uses), 
785                              &(ev->ntrig_uses),
786                              ituse);
787 }
788
789 int rdmc_add_fit_uses(mevt *ev, mevt_uses_t *fu, int ifuse){
790   return rdmc_add_mevt_uses( &(ev->fit_uses), 
791                              &(ev->nfit_uses),
792                              fu,
793                              ifuse);
794 }
795
796 int rdmc_del_fit_uses(mevt *ev , int ifuse){
797   return rdmc_del_mevt_uses( &(ev->fit_uses), 
798                              &(ev->nfit_uses),
799                              ifuse);
800 }
801
802 int rdmc_add_mhit(mevt *ev, mhit *h, int ihit){
803   return rdmc_add_mevt_mhit( &(ev->h), 
804                              &(ev->nhits),
805                              h,
806                              ihit);
807 }
808
809 int rdmc_del_mhit(mevt *ev , int ihit){
810   return rdmc_del_mevt_mhit( &(ev->h), 
811                              &(ev->nhits),
812                              ihit);
813 }
814
815 int rdmc_add_WF(mevt *ev, waveform *wf, int iwf){
816   return rdmc_add_mevt_WF( &(ev->wf), &(ev->nwf), wf, iwf);
817 }
818
819 int rdmc_del_WF(mevt *ev , int iwf){
820   int rr=1;
821   if(iwf >=0 && iwf < ev->nwf){
822     rdmc_free_WF(&(ev->wf[iwf]));
823
824     rr = rdmc_del_mevt_WF( &(ev->wf), 
825                          &(ev->nwf),
826                            iwf);
827   }
828   return rr ;
829 }
830
831 int  rdmc_add_mevt_mtrack(mtrack **list, int *count, mtrack *new, int ipos){
832   int i;
833   if( ( list == NULL )
834       || (new == NULL )
835       || (count == NULL )
836       || (*count < 0)
837       || (ipos < 0)
838       || (ipos > *count)
839       )
840     return 1;
841   (*count)++;
842   *list = (mtrack *)  realloc(*list, sizeof(mtrack)*(*count)); 
843
844   for (i = (*count - 1) ; i > ipos ; i-- ){
845     rdmc_cp_mtrack( &((*list)[i]), &((*list)[i-1]) );
846   }
847   rdmc_cp_mtrack( &((*list)[ipos]), new );
848
849   return 0;
850
851
852 int  rdmc_add_mevt_special(mevt_special_t **list, int *count
853                            ,mevt_special_t *new, int ipos){
854   int i;
855   if( ( list == NULL )
856       || (new == NULL )
857       || (count == NULL )
858       || (*count < 0)
859       || (ipos < 0)
860       || (ipos > *count)
861       )
862     return 1;
863
864   (*count)++;
865   *list = (mevt_special_t *)  realloc( *list,
866                                        sizeof(mevt_special_t)*(*count));
867
868   for (i = (*count - 1) ; i > ipos ; i-- ){
869     rdmc_cp_mevt_special( &((*list)[i]), &((*list)[i-1]) );
870   }
871   rdmc_cp_mevt_special( &((*list)[ipos]), new );
872   
873   return 0;
874
875
876 int  rdmc_add_mevt_mhit(mhit **list, int *count, mhit *new, int ipos){
877   int i;
878   if( ( list == NULL )
879       || (new == NULL )
880       || (count == NULL )
881       || (*count < 0)
882       || (ipos < 0)
883       || (ipos > *count)
884       )
885     return 1;
886
887   (*count)++;
888   *list = (mhit *)  realloc( *list, sizeof(mhit)*(*count));
889
890   for (i = (*count - 1) ; i > ipos ; i-- ){
891     rdmc_cp_mhit( &((*list)[i]), &((*list)[i-1]) );
892   }
893   rdmc_cp_mhit( &((*list)[ipos]), new );
894   return 0;
895
896
897 static int  rdmc_add_mevt_WF(waveform **list, int *count, waveform *new, int ipos){
898   int i;
899   if( ( list == NULL )
900       || (new == NULL )
901       || (count == NULL )
902       || (*count < 0)
903       || (ipos < 0)
904       || (ipos > *count)
905       )
906     return 1;
907
908   (*count)++;
909   *list = (waveform *)  realloc( *list, sizeof(waveform)*(*count));
910
911   for (i = (*count - 1) ; i > ipos ; i-- ){
912     rdmc_cp_WF( &((*list)[i]), &((*list)[i-1]) );
913   }
914   rdmc_cp_WF( &((*list)[ipos]), new );
915   return 0;
916
917
918 int  rdmc_add_mevt_uses(mevt_uses_t **list, int *count
919                         ,mevt_uses_t *new, int ipos){
920   int i;
921   if( ( list == NULL )
922       || (new == NULL )
923       || (count == NULL )
924       || (*count < 0)
925       || (ipos < 0)
926       || (ipos > *count)
927       )
928     return 1;
929
930   (*count)++;
931   *list = (mevt_uses_t *)  realloc( *list, sizeof(mevt_uses_t)*(*count));
932
933   for (i = (*count - 1) ; i > ipos ; i-- ){
934     rdmc_cp_mevt_nuses( &((*list)[i]), &((*list)[i-1]), 1);
935   }
936   rdmc_cp_mevt_nuses( &((*list)[ipos]), new , 1);
937   return 0;
938
939
940
941 int  rdmc_del_mevt_mtrack(mtrack **list, int *count, int ipos){
942   int i;
943   if( (list == NULL )
944       || (*list == NULL )
945       || (*count <= 0)
946       || (ipos < 0)
947       || (ipos >= *count)
948       )
949     return 1;
950   for (i = ipos ; i < (*count-1) ; i++ ){
951     rdmc_cp_mtrack( &((*list)[i]), &((*list)[i+1]) );
952   }
953   (*count)--;
954   if (*count > 0)
955     *list = (mtrack *) 
956       realloc(*list,sizeof(mtrack)*(*count));
957   else {
958     free(*list);
959     *list=NULL;
960   }
961   return 0;
962
963
964 int  rdmc_del_mevt_special(mevt_special_t **list, int *count, int ipos){
965   int i;
966   if( (list == NULL )
967       || (*list == NULL )
968       || (*count <= 0)
969       || (ipos < 0)
970       || (ipos >= *count)
971       )
972     return 1;
973   for (i = ipos ; i < (*count-1) ; i++ ){
974     rdmc_cp_mevt_special( &((*list)[i]), &((*list)[i+1]) );
975   }
976   (*count)--;
977   if (*count > 0)
978     *list = (mevt_special_t *) 
979       realloc(*list,sizeof(mevt_special_t)*(*count));
980   else {
981     free(*list);
982     *list=NULL;
983   }
984   return 0;
985
986
987 int  rdmc_del_mevt_mhit(mhit **list, int *count, int ipos){
988   int i;
989   if( (list == NULL )
990       || (*list == NULL )
991       || (*count <= 0)
992       || (ipos < 0)
993       || (ipos >= *count)
994       )
995     return 1;
996   for (i = ipos ; i < (*count-1) ; i++ ){
997     rdmc_cp_mhit( &((*list)[i]), &((*list)[i+1]) );
998   }
999   (*count)--;
1000   if (*count > 0)
1001     *list = (mhit *) 
1002       realloc(*list,sizeof(mhit)*(*count));
1003   else {
1004     free(*list);
1005     *list=NULL;
1006   }
1007   return 0;
1008
1009
1010
1011
1012 static int  rdmc_del_mevt_WF(waveform **list, int *count, int ipos){
1013   int i;
1014   if( (list == NULL )
1015       || (*list == NULL )
1016       || (*count <= 0)
1017       || (ipos < 0)
1018       || (ipos >= *count)
1019       )
1020     return 1;
1021   for (i = ipos ; i < (*count-1) ; i++ ){
1022     rdmc_cp_WF( &((*list)[i]), &((*list)[i+1]) );
1023   }
1024   (*count)--;
1025   if (*count > 0)
1026     *list = (waveform *) realloc(*list,(*count)*sizeof(waveform));
1027   else {
1028     free(*list);
1029     *list=NULL;
1030   }
1031   return 0;
1032
1033
1034
1035 int  rdmc_del_mevt_uses(mevt_uses_t **list, int *count, int ipos){
1036   int i;
1037   if( (list == NULL )
1038       || (*list == NULL )
1039       || (*count <= 0)
1040       || (ipos < 0)
1041       || (ipos >= *count)
1042       )
1043     return 1;
1044   for (i = ipos ; i < (*count-1) ; i++ ){
1045     rdmc_cp_mevt_nuses( &((*list)[i]), &((*list)[i+1]), 1 );
1046   }
1047   (*count)--;
1048   if (*count > 0)
1049     *list = (mevt_uses_t *) 
1050       realloc(*list,sizeof(mevt_uses_t)*(*count));
1051   else {
1052     free(*list);
1053     *list=NULL;
1054   }
1055   return 0;
1056
1057
1058
1059 int rdmc_del_ifit_uses(mevt *e , int fitid){
1060   int i;
1061   int r=0;
1062   for (i=0 ; i < e->nfit_uses ; ){
1063     if (e->fit_uses[i].useid == fitid )
1064       r |= rdmc_del_fit_uses(e , i);
1065     else
1066       i++;
1067   }
1068   return r;
1069 }
1070
1071 int rdmc_del_itrig_uses(mevt *e , int trigid){
1072   int i;
1073   int r=0;
1074   
1075   for (i=0 ; i < e->ntrig_uses ; ){
1076     if (e->trig_uses[i].useid == trigid )
1077       r |= rdmc_del_trig_uses(e , i);
1078     else
1079       i++;
1080   }
1081   return r;
1082 }
1083
1084 int rdmc_del_ihit_uses(mevt *e , int hitid){
1085   int i;
1086   int r=0;
1087   
1088   /* remove fit uses */
1089   for (i=0 ; i < e->nfit_uses ; ){
1090     if (e->fit_uses[i].hitid == hitid )
1091       r |= rdmc_del_fit_uses(e , i);
1092     else
1093       i++;
1094   }
1095
1096   /* remove trig uses */
1097   for (i=0 ; i < e->ntrig_uses ; ){
1098     if (e->trig_uses[i].hitid == hitid )
1099       r |= rdmc_del_trig_uses(e , i);
1100     else
1101       i++;
1102   }
1103   return r;
1104 }
1105
1106 /* in order to create objects one needs unique id's*/
1107 /* these functions return them */
1108 int rdmc_unique_mhit_id(const mevt *ev){
1109   int id = ev->nhits-1;
1110   int is_not_unique;
1111
1112   do{
1113     int i;
1114     id++;
1115     is_not_unique=0;
1116     for (i = ev->nhits-1 ; i >=0 ; i-- ){ /* downward to be faster  */
1117       if (ev->h[i].id == id){
1118         is_not_unique = 1;
1119         break;
1120       }
1121     } /*for */
1122   } while (is_not_unique);
1123
1124   return id;
1125 }
1126
1127  /* give new uniqe hit ids if hit id <0 */
1128 int  rdmc_repair_mhit_id(mevt *ev){
1129   int i,j;
1130   int repaired=0;
1131   for (i = 0 ; i < ev->nhits ; i++ ){
1132     if (ev->h[i].id < 0){
1133       ev->h[i].id = rdmc_unique_mhit_id(ev);
1134       repaired++;
1135     }
1136     else{ /* test for a double count  */
1137       for (j = 0 ; j  < i ; j++){
1138         if (ev->h[i].id == ev->h[j].id){
1139           ev->h[i].id = rdmc_unique_mhit_id(ev);
1140           repaired++;
1141         }
1142       } /* for j */
1143     } /* else */
1144   }
1145   if (repaired){ /*  the ids were inconsistent */
1146     /* -> delete all uses ! */
1147     if(ev->ntrig_uses){
1148       ev->ntrig_uses= 0;
1149       free(ev->trig_uses);
1150       ev->trig_uses = NULL;
1151     }
1152     if(ev->nfit_uses){
1153       ev->nfit_uses= 0;
1154       free(ev->fit_uses);
1155       ev->fit_uses = NULL;
1156     }
1157   }
1158   return repaired;
1159 }
1160
1161 /* in order to create objects one needs unique id's*/
1162 /* these functions return them */
1163 int rdmc_unique_gen_id(const mevt *ev){
1164   int id = ev->ntrack+1;
1165   int is_not_unique;
1166
1167   do{
1168     int i;
1169     id++;
1170     is_not_unique=0;
1171     for (i = ev->ntrack-1 ; i >=0 ; i-- ){ /* downward to be faster  */
1172       if (ev->gen[i].tag == id){
1173         is_not_unique = 1;
1174         break;
1175       }
1176     } /*for */
1177   } while (is_not_unique);
1178
1179   return id;
1180 }
1181
1182  /* give new uniqe hit ids if hit id <0 */
1183 int  rdmc_repair_gen_id(mevt *ev){
1184   int i,j;
1185   int repaired=0;
1186   for (i = 0 ; i < ev->ntrack ; i++ ){
1187     if (ev->gen[i].tag < 0){
1188       ev->gen[i].tag = rdmc_unique_gen_id(ev);
1189       repaired++;
1190     } else{ /* test for a double count  */
1191       for (j = 0 ; j  < i ; j++){
1192         if (ev->gen[i].tag == ev->gen[j].tag){
1193           ev->gen[i].tag = rdmc_unique_gen_id(ev);
1194           repaired++;
1195         }
1196       } /* for j */
1197     } /* else */
1198   }
1199   if (repaired){ /*  the ids were inconsistent */
1200     /* -> delete all track parent id's */
1201     for (i = 0 ; i < ev->ntrack ; i++)
1202       ev->gen[i].parent = RDMC_NA;
1203
1204     /* -> delete all hit parent id's */
1205     for (i = 0 ; i < ev->nhits ; i++)
1206       ev->h[i].mt = ev->h[i].ma =  RDMC_NA;
1207   }
1208
1209   return repaired;
1210 }
1211 /* return the index of the hit hitid */
1212 int rdmc_mevt_ihit(mevt *ev, int hitid){
1213   int i;
1214   for (i = 0 ; i < ev->nhits ;  i++){
1215     if (ev->h[i].id == hitid)
1216       return i;
1217   }
1218   return RDMC_NA;
1219 }