#include "analysis.h" void debug(event*) ; /* ------------------------------------------------------------------------------ */ int main ( int argc , char* argv[] ) { FILE* infile ; FILE* outfile ; event* evt ; int Nevts = 0 ; ScanArguments ( argc , argv ) ; if ( (infile=fopen(InpFile,"r")) ) { if ( strcmp(OutFile,"")==0 ) outfile = stdout ; else outfile=fopen(OutFile,"w") ; if ( outfile ) { while ( (evt=read_event(infile)) ) { Nevts++ ; fprintf(outfile,"------------------------------------------------------\n") ; fprintf(outfile," Event number %d\n",evt->number) ; fprintf(outfile,"------------------------------------------------------\n") ; printf("Event number %d has been read\n",evt->number) ; test_event_tracks_list(evt) ; print_all_tracks ( evt , outfile ) ; analyse_event ( evt ) ; fprintf(outfile,"\n %3d tracks, Etot=%7.3f Px=%7.3f Py=%7.3f Pz=%7.3f\n\n", evt->ntrack, evt->E, evt->px, evt->py, evt->pz) ; select_tracks ( evt ) ; test_event_tracks_list(evt) ; printf("Event number %d has undergone tracks selection\n",evt->number) ; fprintf(outfile," ------- after tracks selection ------\n") ; print_all_tracks ( evt , outfile ) ; analyse_event ( evt ) ; fprintf(outfile,"\n %3d tracks, Etot=%7.3f Px=%7.3f Py=%7.3f Pz=%7.3f\n\n", evt->ntrack, evt->E, evt->px, evt->py, evt->pz) ; sort_tracks ( evt ) ; test_event_tracks_list(evt) ; printf("Event number %d has been sorted\n",evt->number) ; fprintf(outfile," ------- after tracks sorting ------\n") ; print_all_tracks ( evt , outfile ) ; Destroy_event ( evt ) ; } fprintf(outfile,"\n\n %d events have been processed\n\nBye bye...\n",Nevts) ; } else { fprintf(stderr,"Error opening output file %s\n",OutFile) ; exit (-3) ; } } else { fprintf(stderr,"Error opening input file %s\n",InpFile) ; exit (-2) ; } return 0 ; } /* --------------------------------------------------------------------------------------------- */ void ScanArguments ( int argc , char* argv[] ) { int i ; debug_mode = 0 ; strncpy(InpFile,"",30) ; strncpy(OutFile,"",30) ; if ( argc<2 ) ArgError() ; for ( i=1 ; i4 ) ArgError () ; strncpy(InpFile,argv[1],30) ; if ( argc==3 ) strncpy(OutFile,argv[2],30) ; */ } /* --------------------------------------------------------------------------------------------- */ void ArgError () { fprintf(stderr,"Error in calling sequence\n") ; fprintf(stderr,"Usage: analysis [-d] [-o ]\n") ; exit(-1) ; } /* ------------------------------------------------------------------------------ */ void analyse_event( event* evt ) { track * ThisTrack ; evt->px = 0 ; evt->py = 0 ; evt->pz = 0 ; evt->E = 0 ; evt->ntrack = 0 ; for ( ThisTrack=evt->FirstTrack ; ThisTrack ; ThisTrack=ThisTrack->NextTrack ) { evt->px += ThisTrack->P.x ; evt->py += ThisTrack->P.y ; evt->pz += ThisTrack->P.z ; evt->E += ThisTrack->E ; evt->ntrack ++ ; } } /* ------------------------------------------------------------------------------ */ void select_tracks( event * evt ) { track * ThisTrack , * next_track ; if ( debug_mode ) dump_evt ( evt ) ; ThisTrack = evt->FirstTrack ; while ( ThisTrack ) { if ( good_track(ThisTrack) ) { /* the track is ``good'', so move to the next one */ ThisTrack = ThisTrack->NextTrack ; } else { /* the track is ``bad'', so remove it from the event and then move to the next one */ next_track = ThisTrack->NextTrack ; remove_track_from_event ( evt , ThisTrack ) ; ThisTrack = next_track ; } } } /* ------------------------------------------------------------------------------ */ void sort_tracks_aux ( track ** ptr_begin_track , event* evt ) { track * begin_track ; begin_track = *ptr_begin_track ; if ( debug_mode ) dump_evt (evt) ; if ( begin_track ) { track * before_max_track = NULL ; track * max_track = begin_track ; track * last_track = begin_track ; track *trk , *before_trk ; for ( before_trk=begin_track , trk=begin_track->NextTrack ; trk ; before_trk=trk , trk=trk->NextTrack ) { last_track = trk ; if ( trk->E > max_track->E ) { max_track = trk ; before_max_track = before_trk ; } } if ( max_track != begin_track ) { last_track->NextTrack = begin_track ; before_max_track->NextTrack = NULL ; *ptr_begin_track = max_track ; } sort_tracks_aux ( &(max_track->NextTrack) , evt ) ; } } /* ------------------------------------------------------------------------------ */ void sort_tracks ( event * evt ) { sort_tracks_aux( &(evt->FirstTrack) , evt ) ; evt->LastTrack = get_last_track ( evt ) ; } /* ------------------------------------------------------------------------------ */ int good_track ( track* trk ) { if ( trk->chi2 > 5. ) return 0 ; if ( trk->Nhits < 40 ) return 0 ; if ( radius(trk->origin) > 10. ) return 0 ; return 1 ; } /* ------------------------------------------------------------------------------ */ void print_all_tracks ( event* evt , FILE* outfile ) { track* trk ; for ( trk=evt->FirstTrack ; trk ; trk=trk->NextTrack ) { Print_track ( trk , outfile , 0 ) ; } } /* ------------------- */ void debug ( event* evt ) { track* trk ; char command[20] ; for(;;) { printf("Command > ") ; if ( scanf("%s",command) ) { if ( strcmp(command,"first")==0 ) { trk = evt->FirstTrack ; } else if ( strcmp(command,"last")==0 ) { trk = evt->LastTrack ; } else if ( strcmp(command,"next")==0 ) { trk = trk->NextTrack ; } else if ( strcmp(command,"exit")==0 ) { break ; } else { printf("Unknown command\n Use first,last,next,prev,exit\n") ; } printf("current=%x next=%x\n",trk,trk->NextTrack) ; Print_track ( trk , NULL , 1 ) ; } else { printf("Error reading from keyboard...\n") ; break ; } } } /* ------------------- */ void dump ( track* trk ) { track* t ; for ( t=trk ; t ; t=t->NextTrack ) { printf(" %x\n",t) ; } } /* ------------------- */ void dump_evt ( event* evt ) { char dummy ; track* t ; for ( t=evt->FirstTrack ; t ; t=t->NextTrack ) { /* printf(" %x\n",t) ; */ Print_track ( t , stdout , 1 ) ; } scanf("%c",&dummy) ; /* printf(" %x is last\n",evt->LastTrack) ; */ }