mEmcGeaClusterEval2.c

Go to the documentation of this file.
00001 #include "mEmcGeaClusterEval2.h"
00002 #include "emlLib.h"
00003 
00019 long type_of_call mEmcGeaClusterEval2_(
00020   TABLE_HEAD_ST      *dEmcEvent_h,      DEMCEVENT_ST        *dEmcEvent ,
00021   TABLE_HEAD_ST   *dEmcGeaTrack_h,   DEMCGEATRACK_ST     *dEmcGeaTrack ,
00022   TABLE_HEAD_ST *dEmcGeaTowerTrack_h, DEMCGEATOWERTRACK_ST *dEmcGeaTowerTrack ,
00023   TABLE_HEAD_ST *dEmcClusterExt_h, DEMCCLUSTEREXT_ST   *dEmcClusterExt ,
00024   TABLE_HEAD_ST *dEmcGeaTrackCluster_h, DEMCGEATRACKCLUSTER_ST *dEmcGeaTrackCluster ,
00025   TABLE_HEAD_ST *dEmcGeaClusterTrack_h, DEMCGEACLUSTERTRACK_ST *dEmcGeaClusterTrack )
00026 {
00027 /*:>--------------------------------------------------------------------
00028 **: ROUTINE:    mEmcGeaClusterEval2_
00029 **: DESCRIPTION: Physics Analysis Module ANSI C template.
00030 **:             This is an ANSI C Physics Analysis Module template
00031 **:             automatically generated by stic from mEmcGeaClusterEval2.idl.
00032 **:             Please edit comments and code.
00033 **: AUTHOR:     hpl - H.P. Lovecraft, hplovecraft@cthulhu.void
00034 **: ARGUMENTS:
00035 **:       IN:
00036 **:          dEmcEvent    - PLEASE FILL IN DESCRIPTION HERE
00037 **:         dEmcEvent_h   - header Structure for dEmcEvent
00038 **:       dEmcGeaTrack    - PLEASE FILL IN DESCRIPTION HERE
00039 **:      dEmcGeaTrack_h   - header Structure for dEmcGeaTrack
00040 **:  dEmcGeaTowerTrack    - PLEASE FILL IN DESCRIPTION HERE
00041 **:  dEmcGeaTowerTrack_h   - header Structure for dEmcGeaTowerTrack
00042 **:     dEmcClusterExt    - PLEASE FILL IN DESCRIPTION HERE
00043 **:    dEmcClusterExt_h   - header Structure for dEmcClusterExt
00044 **:    INOUT:
00045 **:      OUT:
00046 **:  dEmcGeaTrackCluster    - PLEASE FILL IN DESCRIPTION HERE
00047 **:  dEmcGeaTrackCluster_h   - header Structure for dEmcGeaTrackCluster
00048 **:  dEmcGeaClusterTrack    - PLEASE FILL IN DESCRIPTION HERE
00049 **:  dEmcGeaClusterTrack_h   - header Structure for dEmcGeaClusterTrack
00050 **: RETURNS:    STAF Condition Value
00051 **:>------------------------------------------------------------------*/
00052 
00053 
00054 
00055   int i_cltr_id,i_trcl_id;
00056   int i,j,j1,j2,k,k1,k2;
00057   int ll;
00058   int l_found,l_found1,l_found2;
00059   int i_track;
00060   
00061   
00062    int size;
00063 
00064    /* ia_track will store the track numbers of the tracks contributing
00065       to a specific cluster 
00066    */
00067    int   ia_track[50];
00068 
00069    /* ra_track will store data of tracks listed in ia_track.
00070       Field: 0 - energy (cumulates "edep" field of TowerTrack)
00071              1 - pid
00072              1 - ptot
00073              3-5 - impact xyz
00074              6 - twrhit
00075              7 - edep ("edep" field of GeaTrack)
00076              8 - anclvl
00077              9-11 - vertex xyz
00078    */
00079    float ra_track[12][50];
00080    
00081    int i_size;
00082    int i_size1;
00083    int i_size2;
00084    int i_size3;
00085    
00086    int itemp,i_twrkey;
00087    float r_e;
00088    float r_work;
00089    float r_edep;
00090    
00091    float ra_work[12];
00092    int   i_work1;
00093    float nom_edep;
00094    
00095    int ia_tower[4][16];  
00096    /* GEANT track number 1,2,3 and towerindex for max. 16 contributors */
00097    float ra_tower[5][16];
00098    /* GEANT deposited energy 1,2,3, attributed energy, total GEANT energy */
00099 
00100 
00101    double ytemp1,ytemp2,ztemp1,ztemp2,ydist,zdist;
00102 
00103    int isec,iindy,iindz;
00104    
00105 
00106 
00107    /*     Executable  */
00108 
00109 
00110 
00111   if(dEmcGeaTrack_h->nok <=0) return (STAFCV_BAD);
00112   if(dEmcGeaTowerTrack_h->nok <=0) return (STAFCV_BAD);
00113   if(dEmcClusterExt_h->nok <=0) return (STAFCV_BAD);
00114   
00115   i_cltr_id = 0;
00116   i_size = 600;
00117   i_size1 = 50;
00118   i_size2 = 64;
00119   i_size3 = 80;
00120   
00121   
00122   /* First part.  Figure out cluster overlaps, i.e. which track deposited */
00123   /* energy in a specific cluster */
00124 
00125   /* Loop over all clusters found */
00126 
00127   for( i = 0; i < dEmcClusterExt_h->nok; i++)
00128     {
00129       
00130       for (ll = 0; ll < sizeof(ra_track)/sizeof(ra_track[0][0]); ll++)
00131         {
00132           *((float *)ra_track + ll) = 0.0;
00133         }
00134       for (ll = 0; ll < sizeof(ia_track)/sizeof(ia_track[0]); ll++)
00135         {
00136           *(ia_track + ll) = 0;
00137         }
00138       for (ll = 0; ll < sizeof(ia_tower)/sizeof(ia_tower[0][0]); ll++)
00139         {
00140           *((int *)ia_tower + ll) = 0;
00141         }
00142       for (ll = 0; ll < sizeof(ra_tower)/sizeof(ra_tower[0][0]); ll++)
00143         {
00144           *((float *)ra_tower + ll) = 0.0;
00145         }
00146 
00147       /* Loop over all towers included in a cluster */
00148 
00149 
00150       for( j = 0; j < 16 && dEmcClusterExt[i].partesum[j] > 0.0; j++)
00151         {
00152           i_twrkey = dEmcClusterExt[i].twrlist[j];
00153           if(j==0)
00154             {
00155               ra_tower[3][j] = dEmcClusterExt[i].partesum[j];
00156             }
00157           else
00158             {
00159               ra_tower[3][j] = dEmcClusterExt[i].partesum[j]
00160                 - dEmcClusterExt[i].partesum[j-1];
00161             }
00162           /* Energy in the tower attributed to this cluster */
00163           
00164           /* Loop over all tracks contributing to the tower */
00165 
00166           l_found = -1;
00167           k = 0;
00168           while( l_found < 0 && k < dEmcGeaTowerTrack_h->nok )
00169             {
00170               if( i_twrkey == dEmcGeaTowerTrack[k].twrkey)
00171                 {
00172                   l_found = k;
00173                 }
00174               k = k + 1;
00175             } /* while Loop over GeaTowerTrack to find contributor */
00176 
00177 
00178           if( l_found >= 0)  /* Contributor found */
00179             {
00180               ia_tower[3][j] = i_twrkey;
00181               
00182               for( k = 0; k <= 2; k++)
00183                 {
00184                   i_track = dEmcGeaTowerTrack[l_found].trkno[k];
00185                   ia_tower[k][j] = i_track;
00186                   ra_tower[k][j] = dEmcGeaTowerTrack[l_found].edep[k];
00187                   ra_tower[4][j] = ra_tower[4][j] + ra_tower[k][j];
00188                   
00189                   if( i_track > 0)
00190                     {
00191                       l_found1 = -1;
00192                       k1 = 0;
00193                       
00194                       while( l_found1 < 0 && k1 < i_size1)
00195                         {
00196                           if( (ia_track[k1] == i_track) || (ia_track[k1] == 0))
00197                               l_found1 = k1;
00198                           k1 = k1 + 1;
00199 
00200                         }  /* while Loop over ia_track (already registered?) */
00201 
00202                       /* Let's hope you either found the track or there is
00203                          still free space in the array */
00204 
00205                       if( l_found1 >= 0)
00206                         {
00207                           ia_track[l_found1] = i_track;
00208                           ra_track[0][l_found1] = ra_track[0][l_found1] +
00209                             dEmcGeaTowerTrack[l_found].edep[k];
00210 
00211                           /* Total energy in this tower */
00212                         }
00213                       
00214                     } /* trkno[k] > 0 */
00215                   
00216                 } /* for Loop over k within a specific GeaTowerTrack record */
00217               
00218               
00219             }  /* l_found > 0, found tower */
00220 
00221         } /* for Loop over j, non-zero towers in a specific cluster */
00222 
00223       /*  You are done with all tower contributors of a cluster */
00224       /* Sort them decreasing */
00225 
00226       for( j = 0; j < i_size1 - 1; j++)
00227         {
00228           for( k = j + 1; k < i_size1; k++)
00229 
00230             {
00231               if(ra_track[0][k-1] < ra_track[0][k])
00232                 {
00233                   i_work1 = ia_track[k-1];
00234                   ia_track[k-1] = ia_track[k];
00235                   ia_track[k] = i_work1;
00236                   for ( k1 = 0; k1 <= 11; k1++) ra_work[k1] = ra_track[k1][k-1];
00237                   for ( k1 = 0; k1 <= 11; k1++) ra_track[k1][k-1] 
00238                                                  = ra_track[k1][k];
00239                   for ( k1 = 0; k1 <= 11; k1++) ra_track[k1][k] = ra_work[k1];
00240                 }  /* End interchange of elements */
00241             }      /* End sort inner loop */
00242         }          /* End sort outer loop */
00243 
00244       /* Search pid and ptot for the top 3 tracks */
00245 
00246       for( j = 0; j <= 2; j++)
00247         {
00248           l_found2 = -1;
00249           k = 0;
00250           
00251           while( k < dEmcGeaTrack_h->nok && l_found2 < 0 && ia_track[j] > 0)
00252             {
00253               if(dEmcGeaTrack[k].trkno == ia_track[j])
00254                 {
00255                   l_found2 = k;
00256                 }
00257               k = k + 1;
00258               
00259             } /* for Loop over k, entries in dEmcGeaTrack */
00260 
00261           if( l_found2 >= 0)
00262             {
00263               ra_track[1][j] = dEmcGeaTrack[l_found2].pid;
00264 
00265               /*              ra_track[2][j] = dEmcGeaTrack[l_found2].ekin; */
00266               ra_track[2][j] = dEmcGeaTrack[l_found2].ptot;
00267               ra_track[3][j] = dEmcGeaTrack[l_found2].impxyz[0];
00268               ra_track[4][j] = dEmcGeaTrack[l_found2].impxyz[1];
00269               ra_track[5][j] = dEmcGeaTrack[l_found2].impxyz[2];
00270               ra_track[6][j] = dEmcGeaTrack[l_found2].twrhit;
00271               ra_track[7][j] = dEmcGeaTrack[l_found2].edep;
00272               ra_track[8][j] = dEmcGeaTrack[l_found2].anclvl;
00273               ra_track[9][j] = dEmcGeaTrack[l_found2].xyz[0];
00274               ra_track[10][j] = dEmcGeaTrack[l_found2].xyz[1];
00275               ra_track[11][j] = dEmcGeaTrack[l_found2].xyz[2];
00276               
00277               
00278             }
00279           
00280         }    /* for Loop over j to search for pid at ptot of top 3 tracks */
00281       
00282       
00283       /* Write output record for this cluster */
00284       
00285       dEmcGeaClusterTrack[i_cltr_id].id = i_cltr_id;
00286       dEmcGeaClusterTrack[i_cltr_id].clusid = i;
00287       dEmcGeaClusterTrack[i_cltr_id].input = 0;
00288       dEmcGeaClusterTrack[i_cltr_id].type =
00289         dEmcClusterExt[i].type;
00290       dEmcGeaClusterTrack[i_cltr_id].arm =
00291         dEmcClusterExt[i].arm;
00292       dEmcGeaClusterTrack[i_cltr_id].sector =
00293         dEmcClusterExt[i].sector;
00294       
00295       
00296       dEmcGeaClusterTrack[i_cltr_id].charged =
00297             dEmcClusterExt[i].charged;
00298       for ( k=0; k<3; k++)
00299         {
00300           dEmcGeaClusterTrack[i_cltr_id].pc3proj[k] =
00301             dEmcClusterExt[i].pc3proj[k];
00302           
00303         }
00304       dEmcGeaClusterTrack[i_cltr_id].chi2_sh = 
00305             dEmcClusterExt[i].chi2_sh;
00306       /*
00307       dEmcGeaClusterTrack[i_cltr_id].prob_photon_sh = 
00308             dEmcClusterExt[i].prob_photon_sh;
00309       */
00310       dEmcGeaClusterTrack[i_cltr_id].prob_photon_sh = 
00311             dEmcClusterExt[i].prob_photon;
00312       for ( k=0; k<2; k++)
00313         {
00314                 dEmcGeaClusterTrack[i_cltr_id].e_sh[k] = 
00315                   dEmcClusterExt[i].e_sh[k];
00316         }
00317 
00318       for( k = 0; k<= 2; k++)
00319         {
00320           dEmcGeaClusterTrack[i_cltr_id].trkno[k] = ia_track[k];
00321           /* Get the sum of ......
00322            */
00323 
00324           i_track = ia_track[k];
00325           j = 0;
00326           r_edep = 0.0;
00327           
00328           while(j<16 && dEmcClusterExt[i].partesum[j] > 0.0)
00329             {
00330               i_twrkey = dEmcClusterExt[i].twrlist[j];
00331               for( j1 = 0; j1 < 16; j1++ )
00332                 
00333                 {
00334                   if(ia_tower[3][j1] == i_twrkey)
00335                     {
00336                       for ( j2 = 0; j2 < 3; j2++)
00337                         {
00338                           if (ia_tower[j2][j1] == i_track)
00339                             {
00340                               r_edep = r_edep +
00341                                 ra_tower[j2][j1] * ra_tower[3][j1] 
00342                                 / ra_tower[4][j1];
00343                             }
00344                         }
00345                     }
00346                 }
00347               j++;
00348             }
00349           dEmcGeaClusterTrack[i_cltr_id].edep[k] = r_edep;
00350 
00351           /*
00352           dEmcGeaClusterTrack[i_cltr_id].edep[k] = ra_track[0][k];
00353           */
00354 
00355           dEmcGeaClusterTrack[i_cltr_id].pid[k] = ra_track[1][k];
00356 
00357           
00358           dEmcGeaClusterTrack[i_cltr_id].ptot[k] = ra_track[2][k];
00359           dEmcGeaClusterTrack[i_cltr_id].tracktwrhit[k] = ra_track[6][k];
00360           dEmcGeaClusterTrack[i_cltr_id].edep_nom[k] = ra_track[7][k];
00361           dEmcGeaClusterTrack[i_cltr_id].ancestry[k] = ra_track[8][k];
00362           for( j = 0; j <= 2; j++)
00363             {
00364               dEmcGeaClusterTrack[i_cltr_id].xyz[j][k] = ra_track[3+j][k];
00365               dEmcGeaClusterTrack[i_cltr_id].vertex[j][k] = ra_track[9+j][k];
00366             }
00367 
00368           dEmcGeaClusterTrack[i_cltr_id].measxyz[k] = 
00369             dEmcClusterExt[i].xyz[k];
00370         }
00371 
00372       dEmcGeaClusterTrack[i_cltr_id].mease = 
00373             dEmcClusterExt[i].e;
00374       if(dEmcClusterExt[i].e > 0.0)
00375         {
00376           for( k =0; k <= 2; k++)
00377             {
00378               dEmcGeaClusterTrack[i_cltr_id].efrac[k] =
00379                 dEmcGeaClusterTrack[i_cltr_id].edep[k] /
00380                 dEmcGeaClusterTrack[i_cltr_id].mease;
00381             }
00382         }
00383       dEmcGeaClusterTrack[i_cltr_id].tof = dEmcClusterExt[i].tof;
00384       dEmcGeaClusterTrack[i_cltr_id].tofmin = dEmcClusterExt[i].tofmin;
00385       dEmcGeaClusterTrack[i_cltr_id].tofmax = dEmcClusterExt[i].tofmax;
00386       dEmcGeaClusterTrack[i_cltr_id].etof = dEmcClusterExt[i].ecent;
00387       dEmcGeaClusterTrack[i_cltr_id].twrhit = dEmcClusterExt[i].twrhit;
00388       for( k=0; k<2; k++)
00389         {
00390           dEmcGeaClusterTrack[i_cltr_id].disp[k] = 
00391             dEmcClusterExt[i].disp[k];
00392           dEmcGeaClusterTrack[i_cltr_id].padisp[k] = 
00393             dEmcClusterExt[i].padisp[k];
00394         }
00395       for( k=0; k<8; k++)
00396         {
00397           dEmcGeaClusterTrack[i_cltr_id].partesum[k] = 
00398             dEmcClusterExt[i].partesum[k];
00399           dEmcGeaClusterTrack[i_cltr_id].chglist[k] = 
00400             dEmcClusterExt[i].chglist[k];
00401         }
00402       
00403 
00404       /* Increment STAF row counter */
00405       i_cltr_id = i_cltr_id + 1;
00406 
00407       /* Silly fix to avoid all 0 outputs - something may be fishy
00408          if Lead Glass sector 1 ??? */
00409 
00410       /* This correction seems to have gone wrong !!!
00411       if (dEmcGeaClusterTrack[i_cltr_id - 1].pid[k] == 0)
00412         {
00413           i_cltr_id = i_cltr_id - 1;
00414         }
00415 
00416       */
00417       
00418     }    /* Loop over i, all clusters recognized in dEmcClusterExt */
00419   
00420   dEmcGeaClusterTrack_h->nok = i_cltr_id;
00421   
00422 
00423   /* -------------------------------------------------------------   */
00424 
00425   /* Second part.  Loop over all tracks that deposited anything in the 
00426      calorimeter.  Point to clusters where a specific track contributed */
00427 
00428   i_trcl_id = 0;
00429 
00430   for ( i = 0; i < dEmcGeaTrack_h->nok; i++)
00431     {
00432       
00433       l_found = -1;   /* Found at least one cluster where it contributed */
00434       for (ll = 0; ll < sizeof(ra_track)/sizeof(ra_track[0][0]); ll++)
00435         {
00436           *((float *)ra_track + ll) = 0.0;
00437         }
00438 
00439       /* Since 0 is a valid pointer now, "not found" is indicated
00440          by -1 */
00441       for(j = 0; j <= 2; j++) ia_track[j] = -1;
00442       i_track = dEmcGeaTrack[i].trkno;
00443       nom_edep = dEmcGeaTrack[i].edep;
00444       
00445       for ( j = 0; j < dEmcGeaClusterTrack_h->nok; j++)
00446         {
00447           for ( k = 0; k <= 2; k++)
00448             {
00449               if ( dEmcGeaClusterTrack[j].trkno[k] == i_track
00450                    && l_found < i_size1 - 1 )
00451                 {
00452                   l_found = l_found + 1;
00453                   ia_track[l_found] = dEmcGeaClusterTrack[j].clusid;
00454                   ra_track[0][l_found] = dEmcGeaClusterTrack[j].pid[k];
00455                   ra_track[1][l_found] = dEmcGeaClusterTrack[j].ptot[k];
00456                   ra_track[2][l_found] = dEmcGeaClusterTrack[j].edep[k];
00457                   /*
00458                   ra_track[3][l_found] = dEmcGeaClusterTrack[j].efrac[k];
00459                   */
00460                   if(nom_edep > 0.1)
00461                     {
00462                       
00463                       ra_track[3][l_found] = 
00464                         dEmcGeaClusterTrack[j].edep[k] / nom_edep;
00465                     }
00466                   else
00467                     {
00468                       ra_track[3][l_found] = 0.0;
00469                     }
00470                 }  /* New cluster found where it contributed */
00471               
00472             }  /* Loop over k = 0, 2, within one dEmcGeaClusterTrack record */
00473           
00474         }   /* Loop over j = 0,dEmcGeaClusterTrack_h.nok   */
00475 
00476       /* Sort descending the clusters where the track contributed */
00477 
00478       if (l_found > - 1 )
00479         {
00480           for (j = 0; j < l_found; j++)
00481             {
00482               for ( k = 1; k <= l_found; k++) 
00483                 {
00484                   if (ra_track[3][k-1] < ra_track[3][k])
00485                     {
00486                       i_work1 = ia_track[k-1];
00487                       for ( k1 = 0; k1 <= 11; k1++) ra_work[k1] = 
00488                                                      ra_track[k1][k-1];
00489                       for ( k1 = 0; k1 <= 11; k1++) ra_track[k1][k-1] 
00490                                                      = ra_track[k1][k];
00491                       for ( k1 = 0; k1 <= 11; k1++) ra_track[k1][k] = 
00492                                                      ra_work[k1];
00493                       ia_track[k-1] = ia_track[k];
00494                       ia_track[k] = i_work1;
00495                     }
00496                 }  /* End loop over k, inner sort loop */
00497             }      /* End loop over j, outer sort loop */
00498       
00499           /* Write out a new record of dEmcGeaTrackCluster */
00500           
00501           dEmcGeaTrackCluster[i_trcl_id].id = i_trcl_id + 1;
00502           dEmcGeaTrackCluster[i_trcl_id].trkno = i_track;
00503           dEmcGeaTrackCluster[i_trcl_id].track_ptr = i;
00504           dEmcGeaTrackCluster[i_trcl_id].nom_edep = nom_edep;
00505           dEmcGeaTrackCluster[i_trcl_id].input = 0;
00506           for (k = 0; k <= 2; k++)
00507             {
00508               dEmcGeaTrackCluster[i_trcl_id].clusid[k] = ia_track[k];
00509               dEmcGeaTrackCluster[i_trcl_id].pid = ra_track[0][0];
00510               dEmcGeaTrackCluster[i_trcl_id].ptot = ra_track[1][0];
00511               dEmcGeaTrackCluster[i_trcl_id].edep[k] = ra_track[2][k];
00512               dEmcGeaTrackCluster[i_trcl_id].efrac[k] = ra_track[3][k];
00513             }
00514 
00515           /*
00516           printf("true = %f %f \n",dEmcGeaTrackCluster[i_trcl_id].ptot,
00517                  dEmcGeaTrackCluster[i_trcl_id].edep[0]);
00518           */      
00519           i_trcl_id = i_trcl_id + 1;
00520           
00521 
00522         }   /* End if(l_found) - found at least one cluster where contrib. */
00523       
00524 
00525       
00526     }   /*  Loop over i = 0,dEmcGeaTrack_h.nok , all tracks depositing E */
00527   
00528 
00529   dEmcGeaTrackCluster_h->nok = i_trcl_id;
00530   
00531 
00532     return STAFCV_OK;
00533 }