mEmcGeaTowerEval.c

Go to the documentation of this file.
00001 #include <math.h>
00002 #include "mEmcGeaTowerEval.h"
00003 #include "emlLib.h"
00004 
00013 long mEmcGeaTowerEval_(
00014   TABLE_HEAD_ST   *dEmcGeometry_h,   DEMCGEOMETRY_ST     *dEmcGeometry ,
00015   TABLE_HEAD_ST      *dEmcEvent_h,      DEMCEVENT_ST        *dEmcEvent ,
00016   TABLE_HEAD_ST *dEmcCalibTower_h, DEMCCALIBTOWER_ST   *dEmcCalibTower ,
00017   TABLE_HEAD_ST   *dEmcGeaTrack_h,   DEMCGEATRACK_ST     *dEmcGeaTrack ,
00018   TABLE_HEAD_ST *dEmcGeaTowerTrack_h, DEMCGEATOWERTRACK_ST *dEmcGeaTowerTrack ,
00019   TABLE_HEAD_ST *dEmcGeaTowerEval_h, DEMCGEATOWEREVAL_ST *dEmcGeaTowerEval )
00020 {
00021 /*:>--------------------------------------------------------------------
00022 **: ROUTINE:    mEmcGeaTowerEval_
00023 **: DESCRIPTION: Physics Analysis Module ANSI C template.
00024 **:             This is an ANSI C Physics Analysis Module template
00025 **:             automatically generated by stic from mEmcGeaTowerEval.idl.
00026 **:             Please edit comments and code.
00027 **: AUTHOR:     hpl - H.P. Lovecraft, hplovecraft@cthulhu.void
00028 **: ARGUMENTS:
00029 **:       IN:
00030 **:       dEmcGeometry    - PLEASE FILL IN DESCRIPTION HERE
00031 **:      dEmcGeometry_h   - header Structure for dEmcGeometry
00032 **:          dEmcEvent    - PLEASE FILL IN DESCRIPTION HERE
00033 **:         dEmcEvent_h   - header Structure for dEmcEvent
00034 **:     dEmcCalibTower    - PLEASE FILL IN DESCRIPTION HERE
00035 **:    dEmcCalibTower_h   - header Structure for dEmcCalibTower
00036 **:       dEmcGeaTrack    - PLEASE FILL IN DESCRIPTION HERE
00037 **:      dEmcGeaTrack_h   - header Structure for dEmcGeaTrack
00038 **:  dEmcGeaTowerTrack    - PLEASE FILL IN DESCRIPTION HERE
00039 **:  dEmcGeaTowerTrack_h   - header Structure for dEmcGeaTowerTrack
00040 **:    INOUT:
00041 **:      OUT:
00042 **:   dEmcGeaTowerEval    - PLEASE FILL IN DESCRIPTION HERE
00043 **:  dEmcGeaTowerEval_h   - header Structure for dEmcGeaTowerEval
00044 **: RETURNS:    STAF Condition Value
00045 **:>------------------------------------------------------------------*/
00046 
00047   int i_twrev_id;
00048   int i_calib_id,i_gtr_id;
00049   int ll;
00050   int i,j,k;
00051   int twrkey,arm,sector,indy,indz;
00052 
00053   /* ra_track[j][0] -> PID
00054      ra_track[j][1] -> ptot
00055      ra_track[j][2] -> vertex x
00056      ra_track[j][3] -> vertex y
00057      ra_track[j][4] -> vertex z
00058      ra_track[j][5] -> ancestry level
00059      ra_track[j][6] ->               */
00060   float ra_track[3][7];
00061 
00062   /* ia_track[j][0] -> true track number
00063      ia_track[j][1] -> true track number of parent
00064      ia_track[j][2] -> PID of parent */
00065   int   ia_track[3][3];
00066 
00067   static int l_first = 1;
00068   static float emc_geom[2][4][48][96][3];
00069   float event_vertex[3];
00070   
00071   double d_work1,d_work2,d_work3,d_work4,d_work;
00072   float r_work1;
00073   static float r_speedoflight = 30.0;
00074 
00075   
00076   int size;
00077 
00078   /* Sanity check */
00079 
00080   if(dEmcGeometry_h->nok <=0) return (STAFCV_BAD);
00081   if(dEmcEvent_h->nok <=0) return (STAFCV_BAD);
00082   if(dEmcGeaTrack_h->nok <=0) return (STAFCV_BAD);
00083   if(dEmcGeaTowerTrack_h->nok <=0) return (STAFCV_BAD);
00084 
00085   /* Initalization */
00086 
00087   if(l_first == 1)
00088     {
00089       l_first = 0;
00090       for (ll = 0; ll < sizeof(emc_geom)/sizeof(emc_geom[0][0][0][0][0]); ll++)
00091         {
00092           *((float *)emc_geom + ll) = 0.0;
00093         }
00094       for( i = 0; i < dEmcGeometry_h->nok; i++)
00095         {
00096           arm = dEmcGeometry[i].arm;
00097           sector = dEmcGeometry[i].sector;
00098           indy = dEmcGeometry[i].ind[1];
00099           indz = dEmcGeometry[i].ind[0];
00100           for( j = 0; j < 3; j++)
00101             {
00102               emc_geom[arm][sector][indy][indz][j] = 
00103                 dEmcGeometry[i].actxyz[j];
00104             }
00105         }
00106     }
00107 
00108   i_twrev_id = 0;
00109   for( i = 0; i < 3; i++)
00110     {
00111       event_vertex[i] = dEmcEvent[0].xyz[i];
00112     }
00113   
00114 
00115 
00116   /* Loop over all entries in TowerTrack */
00117   
00118   for( i = 0; i < dEmcGeaTowerTrack_h->nok; i++)
00119     {
00120       for (ll = 0; ll < sizeof(ra_track)/sizeof(ra_track[0][0]); ll++)
00121         {
00122           *((float *)ra_track + ll) = 0.0;
00123         }
00124       for (ll = 0; ll < sizeof(ia_track)/sizeof(ia_track[0][0]); ll++)
00125         {
00126           *((int *)ia_track + ll) = 0;
00127         }
00128 
00129       /* Translate software key to arm, sector, y and z index */
00130       
00131       twrkey = dEmcGeaTowerTrack[i].twrkey;
00132       arm = twrkey / 100000;
00133       sector = (twrkey - arm * 100000) / 10000;
00134       indy = (twrkey - arm * 100000 - sector * 10000) / 100;
00135       indz = twrkey - arm * 100000 - sector * 10000 - indy * 100;
00136 
00137 
00138       /* Get the row index of the corresponding tower in CalibTower
00139          to write tof, measured e */
00140 
00141       i_calib_id = -1;
00142       j = 0;
00143       while( i_calib_id < 0 && j < dEmcCalibTower_h->nok)
00144         {
00145           if(dEmcCalibTower[j].swkey == twrkey) i_calib_id = j;
00146           j++;
00147         }
00148 
00149 
00150       /* Loop over tracks in TowerTrack
00151          get the row index of the corresponding track in GeaTrack
00152          to retrieve ptot, ancestry, pid, etc. */
00153       j = 0;
00154       while( j <= 2 && dEmcGeaTowerTrack[i].trkno[j] > 0)
00155         {
00156           ia_track[j][0] = dEmcGeaTowerTrack[i].trkno[j];
00157           
00158           /* Search track and get its vertex, ancestry, etc. */
00159           i_gtr_id = -1;
00160           k = 0;
00161           while( i_gtr_id < 0 && k < dEmcGeaTrack_h->nok)
00162             {
00163               if( ia_track[j][0] == dEmcGeaTrack[k].trkno) i_gtr_id = k;
00164               k++;
00165             }
00166           if(i_gtr_id > -1)
00167             {
00168               ia_track[j][1] = dEmcGeaTrack[i_gtr_id].itparent;
00169               ia_track[j][2] = dEmcGeaTrack[i_gtr_id].idparent;
00170               ra_track[j][0] = dEmcGeaTrack[i_gtr_id].pid;
00171               ra_track[j][1] = dEmcGeaTrack[i_gtr_id].ptot;
00172               ra_track[j][2] = dEmcGeaTrack[i_gtr_id].xyz[0];
00173               ra_track[j][3] = dEmcGeaTrack[i_gtr_id].xyz[1];
00174               ra_track[j][4] = dEmcGeaTrack[i_gtr_id].xyz[2];
00175               ra_track[j][5] = dEmcGeaTrack[i_gtr_id].anclvl;
00176             } /* Entry in dEmcGeaTrack found */
00177           j++;
00178         }  /* Loop over j, trkno[j] in dEmcGeaTowerTrack */
00179       
00180       /* Write dEmcGeaTowerEval */
00181 
00182       dEmcGeaTowerEval[i_twrev_id].id = i_twrev_id;
00183       dEmcGeaTowerEval[i_twrev_id].input = dEmcEvent[0].serialno;
00184       dEmcGeaTowerEval[i_twrev_id].twrkey = twrkey;
00185       dEmcGeaTowerEval[i_twrev_id].arm = arm;
00186       dEmcGeaTowerEval[i_twrev_id].sector = sector;
00187       dEmcGeaTowerEval[i_twrev_id].indy = indy;
00188       dEmcGeaTowerEval[i_twrev_id].indz = indz;
00189 
00190       for( j = 0; j < 3; j++)
00191         {
00192           dEmcGeaTowerEval[i_twrev_id].trkno[j] = ia_track[j][0];
00193           dEmcGeaTowerEval[i_twrev_id].itparent[j] = ia_track[j][1];
00194           dEmcGeaTowerEval[i_twrev_id].idparent[j] = ia_track[j][2];
00195           dEmcGeaTowerEval[i_twrev_id].pid[j] = ra_track[j][0];
00196           dEmcGeaTowerEval[i_twrev_id].ptot[j] = ra_track[j][1];
00197           dEmcGeaTowerEval[i_twrev_id].vertex[j][0] = ra_track[j][2];
00198           dEmcGeaTowerEval[i_twrev_id].vertex[j][1] = ra_track[j][3];
00199           dEmcGeaTowerEval[i_twrev_id].vertex[j][2] = ra_track[j][4];
00200           dEmcGeaTowerEval[i_twrev_id].ancestry[j] = ra_track[j][5];
00201         }
00202 
00203       /* Calculate nominal (event vertex) and actual (track vertex)
00204          distances (using the highest Edep particle
00205          and the sin theta values */
00206 
00207       d_work1 = 0.0;
00208       d_work2 = 0.0;
00209       d_work3 = 0.0;
00210       d_work4 = 0.0;
00211       for( j = 0; j < 3; j++)
00212         {
00213           d_work = emc_geom[arm][sector][indy][indz][j] - event_vertex[j];
00214           d_work1 = d_work1 + d_work * d_work;
00215           if( j < 2 ) d_work3 = d_work3 + d_work * d_work;
00216 
00217           /* Use coordinates of the first (highest Edep) track */
00218           d_work = emc_geom[arm][sector][indy][indz][j] - ra_track[0][j+2];
00219           d_work2 = d_work2 + d_work * d_work;
00220           if( j < 2 ) d_work4 = d_work4 + d_work * d_work;
00221         }
00222       d_work1 = sqrt(d_work1);  /* Distance from event vertex */
00223       d_work2 = sqrt(d_work2);  /* Distance from track vertex */
00224       d_work3 = sqrt(d_work3);  /* xy plane distance from event vertex */
00225       d_work4 = sqrt(d_work4);  /* xy plane distance from track vertex */
00226 
00227       if (d_work1 > 0.0 && d_work2 > 0.0)
00228         {
00229           dEmcGeaTowerEval[i_twrev_id].dist_nom = d_work1;
00230           dEmcGeaTowerEval[i_twrev_id].dist_act = d_work2;
00231           dEmcGeaTowerEval[i_twrev_id].sinthe_nom = d_work3 / d_work1;
00232           dEmcGeaTowerEval[i_twrev_id].sinthe_act = d_work4 / d_work2;
00233         }
00234       else      
00235         {
00236           dEmcGeaTowerEval[i_twrev_id].dist_nom = 0.0;
00237           dEmcGeaTowerEval[i_twrev_id].dist_act = 0.0;
00238           dEmcGeaTowerEval[i_twrev_id].sinthe_nom = 0.0;
00239           dEmcGeaTowerEval[i_twrev_id].sinthe_act = 0.0;
00240         }
00241       
00242       /* Transfer info from dEmcGeaTowerTrack */
00243 
00244       for( j = 0; j < 3; j++)
00245         {
00246           dEmcGeaTowerEval[i_twrev_id].trkno[j] = 
00247             dEmcGeaTowerTrack[i].trkno[j];
00248           dEmcGeaTowerEval[i_twrev_id].edep[j] = 
00249             dEmcGeaTowerTrack[i].edep[j];
00250           r_work1 = 
00251             dEmcGeaTowerTrack[i].toffirst[j] - d_work1 / r_speedoflight;
00252           if(r_work1 > 0.0)
00253             {
00254               dEmcGeaTowerEval[i_twrev_id].toffirst[j] = r_work1;
00255             }
00256           else
00257             {
00258               dEmcGeaTowerEval[i_twrev_id].toffirst[j] = 0.0;
00259             }
00260         }
00261       
00262 
00263       if(i_calib_id >= 0)
00264         {
00265           dEmcGeaTowerEval[i_twrev_id].mease = 
00266             dEmcCalibTower[i_calib_id].ecal;
00267           r_work1 = dEmcCalibTower[i_calib_id].tof - d_work1 / r_speedoflight;
00268           if(r_work1 > 0.0)
00269             {
00270               dEmcGeaTowerEval[i_twrev_id].tof = r_work1;
00271             }
00272           else
00273             {
00274               dEmcGeaTowerEval[i_twrev_id].tof = 0.0;
00275             }
00276         }
00277       else      
00278         {
00279           dEmcGeaTowerEval[i_twrev_id].mease = 0.0;
00280           dEmcGeaTowerEval[i_twrev_id].tof = 0.0;
00281         }
00282       
00283       i_twrev_id = i_twrev_id + 1;
00284       
00285 
00286 
00287     }  /* Loop over i, all rows of dEmcGeaTowerTrack */
00288   
00289 
00290   dEmcGeaTowerEval_h->nok = i_twrev_id;
00291   
00292 
00293   return STAFCV_OK;
00294 }