00001
00002
00003
00004
00005
00006
00007 #include "mEmcGeaClusterEval.h"
00008 #include "emlLib.h"
00009
00025 long mEmcGeaClusterEval_(
00026 TABLE_HEAD_ST *dEmcEvent_h, DEMCEVENT_ST *dEmcEvent ,
00027 TABLE_HEAD_ST *dEmcGeaTrack_h, DEMCGEATRACK_ST *dEmcGeaTrack ,
00028 TABLE_HEAD_ST *dEmcGeaTowerTrack_h, DEMCGEATOWERTRACK_ST *dEmcGeaTowerTrack ,
00029 TABLE_HEAD_ST *dEmcClusterLocalExt_h, DEMCCLUSTERLOCALEXT_ST *dEmcClusterLocalExt ,
00030 TABLE_HEAD_ST *dEmcGeaTrackCluster_h, DEMCGEATRACKCLUSTER_ST *dEmcGeaTrackCluster ,
00031 TABLE_HEAD_ST *dEmcGeaClusterTrack_h, DEMCGEACLUSTERTRACK_ST *dEmcGeaClusterTrack )
00032 {
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 int i_cltr_id,i_trcl_id;
00062 int i,j,k,k1;
00063 int l_found,l_found1,l_found2;
00064 int i_track;
00065 int ll;
00066 int i_twrkey;
00067 float ra_work[12];
00068 int i_work1;
00069 float nom_edep;
00070
00071
00072
00073 int AtLeastOneContributorFound = 0 ;
00074
00075 int maxNumOfTracksPerTower = 50;
00076
00077
00078
00079 int maxNumOfTracksKeptPerTower = 3;
00080
00081
00082
00083
00084 int ia_track[maxNumOfTracksPerTower];
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 float ra_track[12][maxNumOfTracksPerTower];
00097
00098 if(dEmcGeaTrack_h->nok <=0) return (STAFCV_BAD);
00099 if(dEmcGeaTowerTrack_h->nok <=0) return (STAFCV_BAD);
00100 if(dEmcClusterLocalExt_h->nok <=0) return (STAFCV_BAD);
00101
00102 i_cltr_id = 0;
00103
00104
00105
00106
00107
00108
00109 for( i = 0; i < dEmcClusterLocalExt_h->nok; i++)
00110 {
00111
00112
00113 AtLeastOneContributorFound = 0 ;
00114
00115
00116
00117 for (ll = 0; ll < sizeof(ra_track)/sizeof(ra_track[0][0]); ll++)
00118 {
00119 *((float *)ra_track + ll) = 0.0;
00120 }
00121 for (ll = 0; ll < sizeof(ia_track)/sizeof(ia_track[0]); ll++)
00122 {
00123 *(ia_track + ll) = 0;
00124 }
00125
00126
00127
00128 for( j = 0; j < 16 && dEmcClusterLocalExt[i].partesum[j] > 0.0; j++)
00129 {
00130 i_twrkey = dEmcClusterLocalExt[i].twrlist[j];
00131
00132
00133
00134 l_found = -1;
00135 k = 0;
00136 while( l_found < 0 && k < dEmcGeaTowerTrack_h->nok )
00137 {
00138 if( i_twrkey == dEmcGeaTowerTrack[k].twrkey)
00139 {
00140 l_found = k;
00141 AtLeastOneContributorFound = 1 ;
00142 }
00143 k = k + 1;
00144 }
00145
00146 if( l_found >= 0)
00147 {
00148
00149
00150
00151 for( k = 0; k <= maxNumOfTracksKeptPerTower-1; k++)
00152 {
00153 i_track = dEmcGeaTowerTrack[l_found].trkno[k];
00154 if( i_track > 0)
00155 {
00156 l_found1 = -1;
00157 k1 = 0;
00158
00159 while( l_found1 < 0 && k1 < maxNumOfTracksPerTower)
00160 {
00161 if( (ia_track[k1] == i_track) || (ia_track[k1] == 0))
00162 l_found1 = k1;
00163 k1 = k1 + 1;
00164
00165 }
00166
00167
00168
00169
00170 if( l_found1 >= 0)
00171 {
00172 ia_track[l_found1] = i_track;
00173 ra_track[0][l_found1] = ra_track[0][l_found1] +
00174 dEmcGeaTowerTrack[l_found].edep[k];
00175 }
00176
00177 }
00178
00179 }
00180
00181 }
00182
00183
00184 }
00185
00186
00187
00188 if( AtLeastOneContributorFound )
00189 {
00190
00191 for( j = 0; j < maxNumOfTracksPerTower - 1; j++)
00192 {
00193
00194 for( k = 1; k < maxNumOfTracksPerTower; k++)
00195 {
00196 if(ra_track[0][k-1] < ra_track[0][k])
00197 {
00198 i_work1 = ia_track[k-1];
00199 for ( k1 = 0; k1 <= 11; k1++) ra_work[k1] = ra_track[k1][k-1];
00200 for ( k1 = 0; k1 <= 11; k1++) ra_track[k1][k-1]
00201 = ra_track[k1][k];
00202 for ( k1 = 0; k1 <= 11; k1++) ra_track[k1][k] = ra_work[k1];
00203 ia_track[k-1] = ia_track[k];
00204 ia_track[k] = i_work1;
00205 }
00206 }
00207 }
00208
00209
00210
00211 for( j = 0; j <= maxNumOfTracksKeptPerTower-1; j++)
00212 {
00213 l_found2 = -1;
00214 k = 0;
00215
00216 while( k < dEmcGeaTrack_h->nok && l_found2 < 0 && ia_track[j] > 0)
00217 {
00218 if(dEmcGeaTrack[k].trkno == ia_track[j])
00219 {
00220 l_found2 = k;
00221 }
00222 k = k + 1;
00223
00224 }
00225
00226 if( l_found2 >= 0)
00227 {
00228 ra_track[1][j] = dEmcGeaTrack[l_found2].pid;
00229
00230 ra_track[2][j] = dEmcGeaTrack[l_found2].ptot;
00231 ra_track[3][j] = dEmcGeaTrack[l_found2].impxyz[0];
00232 ra_track[4][j] = dEmcGeaTrack[l_found2].impxyz[1];
00233 ra_track[5][j] = dEmcGeaTrack[l_found2].impxyz[2];
00234 ra_track[6][j] = dEmcGeaTrack[l_found2].twrhit;
00235 ra_track[7][j] = dEmcGeaTrack[l_found2].edep;
00236 ra_track[8][j] = dEmcGeaTrack[l_found2].anclvl;
00237 ra_track[9][j] = dEmcGeaTrack[l_found2].xyz[0];
00238 ra_track[10][j] = dEmcGeaTrack[l_found2].xyz[1];
00239 ra_track[11][j] = dEmcGeaTrack[l_found2].xyz[2];
00240 }
00241
00242 }
00243
00244 }
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268 if( AtLeastOneContributorFound )
00269 {
00270 dEmcGeaClusterTrack[i_cltr_id].id = i_cltr_id;
00271 dEmcGeaClusterTrack[i_cltr_id].clusid = i;
00272 dEmcGeaClusterTrack[i_cltr_id].input = 0;
00273
00274
00275 dEmcGeaClusterTrack[i_cltr_id].evno = dEmcClusterLocalExt[i].evno;
00276 dEmcGeaClusterTrack[i_cltr_id].keycent = dEmcClusterLocalExt[i].twrlist[0];
00277 dEmcGeaClusterTrack[i_cltr_id].type = dEmcClusterLocalExt[i].type;
00278 dEmcGeaClusterTrack[i_cltr_id].arm = dEmcClusterLocalExt[i].arm;
00279 dEmcGeaClusterTrack[i_cltr_id].sector = dEmcClusterLocalExt[i].sector;
00280 dEmcGeaClusterTrack[i_cltr_id].mease = dEmcClusterLocalExt[i].e;
00281
00282
00283 if (dEmcGeaClusterTrack[i_cltr_id].type == 1 )
00284 dEmcGeaClusterTrack[i_cltr_id].ecore = dEmcClusterLocalExt[i].ecore;
00285 if (dEmcGeaClusterTrack[i_cltr_id].type == 2)
00286 dEmcGeaClusterTrack[i_cltr_id].ecore = dEmcClusterLocalExt[i].ecorr;
00287
00288 dEmcGeaClusterTrack[i_cltr_id].tof = dEmcClusterLocalExt[i].tof;
00289 dEmcGeaClusterTrack[i_cltr_id].tofmin = dEmcClusterLocalExt[i].tofmin;
00290 dEmcGeaClusterTrack[i_cltr_id].tofmax = dEmcClusterLocalExt[i].tofmax;
00291
00292 dEmcGeaClusterTrack[i_cltr_id].etof = dEmcClusterLocalExt[i].ecent;
00293 dEmcGeaClusterTrack[i_cltr_id].etofmin = dEmcClusterLocalExt[i].etofmin;
00294 dEmcGeaClusterTrack[i_cltr_id].etofmax = dEmcClusterLocalExt[i].etofmax;
00295 dEmcGeaClusterTrack[i_cltr_id].twrhit = dEmcClusterLocalExt[i].twrhit;
00296
00297 for ( k=0 ; k<= 2 ; k++)
00298 {
00299 dEmcGeaClusterTrack[i_cltr_id].e_sh[k] = dEmcClusterLocalExt[i].e_sh[k];
00300 dEmcGeaClusterTrack[i_cltr_id].disp[k] = dEmcClusterLocalExt[i].disp[k];
00301 dEmcGeaClusterTrack[i_cltr_id].padisp[k] = dEmcClusterLocalExt[i].padisp[k];
00302 dEmcGeaClusterTrack[i_cltr_id].measxyz[k] = dEmcClusterLocalExt[i].xyz[k];
00303 }
00304 for( k=0; k<=8; k++)
00305 {
00306 dEmcGeaClusterTrack[i_cltr_id].partesum[k] = dEmcClusterLocalExt[i].partesum[k];
00307 }
00308
00309
00310 dEmcGeaClusterTrack[i_cltr_id].chi2_sh = dEmcClusterLocalExt[i].chi2 ;
00311 dEmcGeaClusterTrack[i_cltr_id].prob_photon_sh = dEmcClusterLocalExt[i].prob_photon ;
00312
00313
00314
00315 for( k = 0 ; k<= maxNumOfTracksKeptPerTower-1 ; k++)
00316 {
00317 dEmcGeaClusterTrack[i_cltr_id].trkno[k] = ia_track[k];
00318 dEmcGeaClusterTrack[i_cltr_id].edep[k] = ra_track[0][k];
00319 dEmcGeaClusterTrack[i_cltr_id].pid[k] = ra_track[1][k];
00320 dEmcGeaClusterTrack[i_cltr_id].ptot[k] = ra_track[2][k];
00321 dEmcGeaClusterTrack[i_cltr_id].tracktwrhit[k] = ra_track[6][k];
00322 dEmcGeaClusterTrack[i_cltr_id].edep_nom[k] = ra_track[7][k];
00323 dEmcGeaClusterTrack[i_cltr_id].ancestry[k] = ra_track[8][k];
00324 for( j = 0; j <= 2; j++)
00325 {
00326 dEmcGeaClusterTrack[i_cltr_id].xyz[j][k] = ra_track[3+j][k];
00327 dEmcGeaClusterTrack[i_cltr_id].vertex[j][k] = ra_track[9+j][k];
00328 }
00329 }
00330
00331 if(dEmcGeaClusterTrack[i_cltr_id].mease > 0.0)
00332 {
00333 for( k =0; k <= maxNumOfTracksKeptPerTower-1 ; k++)
00334 {
00335 dEmcGeaClusterTrack[i_cltr_id].efrac[k] =
00336 dEmcGeaClusterTrack[i_cltr_id].edep[k] /
00337 dEmcGeaClusterTrack[i_cltr_id].mease;
00338 }
00339 }
00340
00341
00342
00343
00344
00345 dEmcGeaClusterTrack[i_cltr_id].charged = (long)dEmcClusterLocalExt_h->nok;
00346
00347 for( k=0; k<8; k++)
00348 {
00349 dEmcGeaClusterTrack[i_cltr_id].chglist[k] = 0.;
00350 }
00351
00352
00353
00354
00355
00356
00357
00358 dEmcGeaClusterTrack[i_cltr_id].pc3proj[0] = (float)dEmcClusterLocalExt[i].deadmap;
00359 dEmcGeaClusterTrack[i_cltr_id].pc3proj[1] = (float)dEmcClusterLocalExt[i].warnmap;
00360
00361
00362 dEmcGeaClusterTrack[i_cltr_id].pc3proj[2] = 0;
00363
00364
00365 i_cltr_id = i_cltr_id + 1;
00366
00367 }
00368
00369
00370 }
00371
00372 dEmcGeaClusterTrack_h->nok = i_cltr_id;
00373
00374
00375
00376
00377
00378
00379
00380 i_trcl_id = 0;
00381
00382 for ( i = 0; i < dEmcGeaTrack_h->nok; i++)
00383 {
00384
00385 l_found = -1;
00386 AtLeastOneContributorFound = 0 ;
00387
00388
00389 for (ll = 0; ll < sizeof(ra_track)/sizeof(ra_track[0][0]); ll++)
00390 {
00391 *((float *)ra_track + ll) = 0;
00392 }
00393
00394
00395
00396 for(j = 0; j <= maxNumOfTracksKeptPerTower-1 ; j++) ia_track[j] = -1;
00397 i_track = dEmcGeaTrack[i].trkno;
00398 nom_edep = dEmcGeaTrack[i].edep;
00399
00400 for ( j = 0; j < dEmcGeaClusterTrack_h->nok; j++)
00401 {
00402 for ( k = 0; k <= maxNumOfTracksKeptPerTower-1 ; k++)
00403 {
00404 if ( dEmcGeaClusterTrack[j].trkno[k] == i_track
00405 && l_found < maxNumOfTracksPerTower - 1 )
00406 {
00407 l_found = l_found + 1;
00408 AtLeastOneContributorFound = 1 ;
00409 ia_track[l_found] = dEmcGeaClusterTrack[j].clusid;
00410 ra_track[0][l_found] = dEmcGeaClusterTrack[j].pid[k];
00411 ra_track[1][l_found] = dEmcGeaClusterTrack[j].ptot[k];
00412 ra_track[2][l_found] = dEmcGeaClusterTrack[j].edep[k];
00413
00414
00415
00416 if(nom_edep > 0.1)
00417 {
00418
00419 ra_track[3][l_found] =
00420 dEmcGeaClusterTrack[j].edep[k] / nom_edep;
00421 }
00422 else
00423 {
00424 ra_track[3][l_found] = 0.0;
00425 }
00426 }
00427
00428 }
00429
00430 }
00431
00432
00433
00434 if ( AtLeastOneContributorFound )
00435 {
00436 for (j = 0; j < l_found; j++)
00437 {
00438 for ( k = 1; k <= l_found; k++)
00439 {
00440 if (ra_track[3][k-1] < ra_track[3][k])
00441 {
00442 i_work1 = ia_track[k-1];
00443 for ( k1 = 0; k1 <= 11; k1++) ra_work[k1] =
00444 ra_track[k1][k-1];
00445 for ( k1 = 0; k1 <= 11; k1++) ra_track[k1][k-1]
00446 = ra_track[k1][k];
00447 for ( k1 = 0; k1 <= 11; k1++) ra_track[k1][k] =
00448 ra_work[k1];
00449 ia_track[k-1] = ia_track[k];
00450 ia_track[k] = i_work1;
00451 }
00452 }
00453 }
00454
00455
00456
00457 dEmcGeaTrackCluster[i_trcl_id].id = i_trcl_id + 1;
00458 dEmcGeaTrackCluster[i_trcl_id].trkno = i_track;
00459 dEmcGeaTrackCluster[i_trcl_id].track_ptr = i;
00460 dEmcGeaTrackCluster[i_trcl_id].nom_edep = nom_edep;
00461 dEmcGeaTrackCluster[i_trcl_id].input = 0;
00462 for (k = 0; k <= maxNumOfTracksKeptPerTower-1 ; k++)
00463 {
00464 dEmcGeaTrackCluster[i_trcl_id].clusid[k] = ia_track[k];
00465 dEmcGeaTrackCluster[i_trcl_id].pid = ra_track[0][0];
00466 dEmcGeaTrackCluster[i_trcl_id].ptot = ra_track[1][0];
00467 dEmcGeaTrackCluster[i_trcl_id].edep[k] = ra_track[2][k];
00468 dEmcGeaTrackCluster[i_trcl_id].efrac[k] = ra_track[3][k];
00469 }
00470
00471 i_trcl_id = i_trcl_id + 1;
00472
00473
00474 }
00475
00476
00477
00478 }
00479
00480
00481 dEmcGeaTrackCluster_h->nok = i_trcl_id;
00482
00483
00484 return STAFCV_OK;
00485 }