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
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
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
00054
00055
00056
00057
00058
00059
00060 float ra_track[3][7];
00061
00062
00063
00064
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
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
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
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
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
00139
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
00151
00152
00153 j = 0;
00154 while( j <= 2 && dEmcGeaTowerTrack[i].trkno[j] > 0)
00155 {
00156 ia_track[j][0] = dEmcGeaTowerTrack[i].trkno[j];
00157
00158
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 }
00177 j++;
00178 }
00179
00180
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
00204
00205
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
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);
00223 d_work2 = sqrt(d_work2);
00224 d_work3 = sqrt(d_work3);
00225 d_work4 = sqrt(d_work4);
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
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 }
00288
00289
00290 dEmcGeaTowerEval_h->nok = i_twrev_id;
00291
00292
00293 return STAFCV_OK;
00294 }