]> git.uio.no Git - u/mrichter/AliRoot.git/blame - RALICE/icepack/iceconvert/rdmc_mevt.c
Avoid linking with pythia.
[u/mrichter/AliRoot.git] / RALICE / icepack / iceconvert / rdmc_mevt.c
CommitLineData
f67e2651 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
16static int rdmc_add_mevt_WF(waveform **list, int *count, waveform *new, int ipos);
17static 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
24int 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/****************************************************************************/
86int 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
123int 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
179void 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
191void 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
285void 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
338int 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/*************************************************************************/
377int 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
415int 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/****************************************************************************/
446int 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
641int 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}
647int rdmc_del_gen(mevt *ev , int itrack){
648 return rdmc_del_mevt_mtrack( &(ev->gen),
649 &(ev->ntrack),
650 itrack);
651}
652
653int 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
675int 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
693int 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
700int rdmc_del_user(mevt *ev , int iu){
701 return rdmc_del_mevt_special( &(ev->user),
702 &(ev->nuser),
703 iu);
704}
705
706int 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
713int rdmc_del_status(mevt *ev , int is){
714 return rdmc_del_mevt_special( &(ev->status),
715 &(ev->nstat),
716 is);
717}
718
719int 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}
725int rdmc_del_mcinfo(mevt *ev , int imci){
726 return rdmc_del_mevt_special( &(ev->mcinfo),
727 &(ev->nmcinfo),
728 imci);
729
730}
731int 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
754int 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
776int 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
783int 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
789int 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
796int 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
802int 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
809int rdmc_del_mhit(mevt *ev , int ihit){
810 return rdmc_del_mevt_mhit( &(ev->h),
811 &(ev->nhits),
812 ihit);
813}
814
815int rdmc_add_WF(mevt *ev, waveform *wf, int iwf){
816 return rdmc_add_mevt_WF( &(ev->wf), &(ev->nwf), wf, iwf);
817}
818
819int 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
831int 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
852int 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
876int 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
897static 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
918int 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
941int 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
964int 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
987int 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
1012static 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
1035int 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
1059int 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
1071int 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
1084int 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 */
1108int 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 */
1128int 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 */
1163int 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 */
1183int 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 */
1212int 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}