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
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
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
00065
00066
00067 int ia_track[50];
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
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
00097 float ra_tower[5][16];
00098
00099
00100
00101 double ytemp1,ytemp2,ztemp1,ztemp2,ydist,zdist;
00102
00103 int isec,iindy,iindz;
00104
00105
00106
00107
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
00123
00124
00125
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
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
00163
00164
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 }
00176
00177
00178 if( l_found >= 0)
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 }
00201
00202
00203
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
00212 }
00213
00214 }
00215
00216 }
00217
00218
00219 }
00220
00221 }
00222
00223
00224
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 }
00241 }
00242 }
00243
00244
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 }
00260
00261 if( l_found2 >= 0)
00262 {
00263 ra_track[1][j] = dEmcGeaTrack[l_found2].pid;
00264
00265
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 }
00281
00282
00283
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
00308
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
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
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
00405 i_cltr_id = i_cltr_id + 1;
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418 }
00419
00420 dEmcGeaClusterTrack_h->nok = i_cltr_id;
00421
00422
00423
00424
00425
00426
00427
00428 i_trcl_id = 0;
00429
00430 for ( i = 0; i < dEmcGeaTrack_h->nok; i++)
00431 {
00432
00433 l_found = -1;
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
00440
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
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 }
00471
00472 }
00473
00474 }
00475
00476
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 }
00497 }
00498
00499
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
00517
00518
00519 i_trcl_id = i_trcl_id + 1;
00520
00521
00522 }
00523
00524
00525
00526 }
00527
00528
00529 dEmcGeaTrackCluster_h->nok = i_trcl_id;
00530
00531
00532 return STAFCV_OK;
00533 }