5 #include "fcs_trg_base.h"
6 #include "fcs_ecal_epd_mask.h"
12 static const int EtoHmap[15][9][2] = {
13 { { 0, 0},{ 0, 1},{ 0, 1},{ 0, 2},{ 0, 2},{ 0, 3},{ 0, 4},{ 0, 4},{ 0, 4}},
14 { { 0, 0},{ 0, 1},{ 0, 1},{ 0, 2},{ 0, 2},{ 0, 3},{ 0, 4},{ 0, 4},{ 0, 4}},
15 { { 1, 0},{ 1, 1},{ 1, 1},{ 1, 2},{ 1, 2},{ 1, 3},{ 1, 4},{ 1, 4},{ 1, 4}},
16 { { 2, 0},{ 2, 1},{ 2, 1},{ 2, 2},{ 2, 2},{ 2, 3},{ 2, 4},{ 2, 4},{ 2, 4}},
17 { { 2, 0},{ 2, 1},{ 2, 1},{ 2, 2},{ 2, 2},{ 2, 3},{ 2, 4},{ 2, 4},{ 2, 4}},
18 { { 3, 0},{ 3, 1},{ 3, 1},{ 3, 2},{ 3, 2},{ 3, 3},{ 3, 4},{ 3, 4},{ 3, 4}},
19 { { 3, 0},{ 3, 1},{ 3, 1},{ 3, 2},{ 3, 2},{ 3, 3},{ 3, 4},{ 3, 4},{ 3, 4}},
20 { { 4, 0},{ 4, 1},{ 4, 1},{ 4, 2},{ 4, 2},{ 4, 3},{ 4, 4},{ 4, 4},{ 4, 4}},
21 { { 5, 0},{ 5, 1},{ 5, 1},{ 5, 2},{ 5, 2},{ 5, 3},{ 5, 4},{ 5, 4},{ 5, 4}},
22 { { 5, 0},{ 5, 1},{ 5, 1},{ 5, 2},{ 5, 2},{ 5, 3},{ 5, 4},{ 5, 4},{ 5, 4}},
23 { { 6, 0},{ 6, 1},{ 6, 1},{ 6, 2},{ 6, 2},{ 6, 3},{ 6, 4},{ 6, 4},{ 6, 4}},
24 { { 6, 0},{ 6, 1},{ 6, 1},{ 6, 2},{ 6, 2},{ 6, 3},{ 6, 4},{ 6, 4},{ 6, 4}},
25 { { 7, 0},{ 7, 1},{ 7, 1},{ 7, 2},{ 7, 2},{ 7, 3},{ 7, 4},{ 7, 4},{ 7, 4}},
26 { { 8, 0},{ 8, 1},{ 8, 1},{ 8, 2},{ 8, 2},{ 8, 3},{ 8, 4},{ 8, 4},{ 8, 4}},
27 { { 8, 0},{ 8, 1},{ 8, 1},{ 8, 2},{ 8, 2},{ 8, 3},{ 8, 4},{ 8, 4},{ 8, 4}}
30 static const int EtoH3map[15][9][4] = {
31 {{-1,-1,-1, 0},{-1,-1, 0, 1},{-1,-1, 1, 2},{-1,-1, 1, 2},{-1,-1, 2, 3},{-1,-1, 2, 3},{-1,-1, 3, 4},{-1,-1, 4,-1},{-1,-1, 4,-1}},
32 {{-1, 0,-1, 5},{ 0, 1, 5, 6},{ 1, 2, 6, 7},{ 1, 2, 6, 7},{ 2, 3, 7, 8},{ 2, 3, 7, 8},{ 3, 4, 8, 9},{ 4,-1, 9,-1},{ 4,-1, 9,-1}},
33 {{-1, 0,-1, 5},{ 0, 1, 5, 6},{ 1, 2, 6, 7},{ 1, 2, 6, 7},{ 2, 3, 7, 8},{ 2, 3, 7, 8},{ 3, 4, 8, 9},{ 4,-1, 9,-1},{ 4,-1, 9,-1}},
34 {{-1, 5,-1,10},{ 5, 6,10,11},{ 6, 7,11,12},{ 6, 7,11,12},{ 7, 8,12,13},{ 7, 8,12,13},{ 8, 9,13,14},{ 9,-1,14,-1},{ 9,-1,14,-1}},
35 {{-1,10,-1,15},{10,11,15,16},{11,12,16,17},{11,12,16,17},{12,13,17,18},{12,13,17,18},{13,14,18,19},{14,-1,19,-1},{14,-1,19,-1}},
36 {{-1,10,-1,15},{10,11,15,16},{11,12,16,17},{11,12,16,17},{12,13,17,18},{12,13,17,18},{13,14,18,19},{14,-1,19,-1},{14,-1,19,-1}},
37 {{-1,15,-1,20},{15,16,20,21},{16,17,21,22},{16,17,21,22},{17,18,22,23},{17,18,22,23},{18,19,23,24},{19,-1,24,-1},{19,-1,24,-1}},
38 {{-1,20,-1,25},{20,21,25,26},{21,22,26,27},{21,22,26,27},{22,23,27,28},{22,23,27,28},{23,24,28,29},{24,-1,29,-1},{24,-1,29,-1}},
39 {{-1,20,-1,25},{20,21,25,26},{21,22,26,27},{21,22,26,27},{22,23,27,28},{22,23,27,28},{23,24,28,29},{24,-1,29,-1},{24,-1,29,-1}},
40 {{-1,25,-1,30},{25,26,30,31},{26,27,31,32},{26,27,31,32},{27,28,32,33},{27,28,32,33},{28,29,33,34},{29,-1,34,-1},{29,-1,34,-1}},
41 {{-1,25,-1,30},{25,26,30,31},{26,27,31,32},{26,27,31,32},{27,28,32,33},{27,28,32,33},{28,29,33,34},{29,-1,34,-1},{29,-1,34,-1}},
42 {{-1,30,-1,35},{30,31,35,36},{31,32,36,37},{31,32,36,37},{32,33,37,38},{32,33,37,38},{33,34,38,39},{34,-1,39,-1},{34,-1,39,-1}},
43 {{-1,35,-1,40},{35,36,40,41},{36,37,41,42},{36,37,41,42},{37,38,42,43},{37,38,42,43},{38,39,43,44},{39,-1,44,-1},{39,-1,44,-1}},
44 {{-1,35,-1,40},{35,36,40,41},{36,37,41,42},{36,37,41,42},{37,38,42,43},{37,38,42,43},{38,39,43,44},{39,-1,44,-1},{39,-1,44,-1}},
45 {{-1,40,-1,-1},{40,41,-1,-1},{41,42,-1,-1},{41,42,-1,-1},{42,43,-1,-1},{42,43,-1,-1},{43,44,-1,-1},{44,-1,-1,-1},{44,-1,-1,-1}}
52 if(fcs_trgDebug>=2) printf(
"Stage2v1 ns=%d\n",ns);
55 static u_int ETbTdep[16][10];
56 static u_int ETbTadr[16][10];
57 static u_int HTbTdep[10][6];
58 static u_int HTbTadr[10][6];
62 for(
int r=0; r<16; r++){
63 printf(
"Ecal r=%2d : ",r);
64 for(
int c=0; c<10; c++){
65 ETbTdep[r][c]= c/2 + (r/4)*5;
66 ETbTadr[r][c]= c%2 + (r%4)*2;
67 printf(
"%2d-%1d ",ETbTdep[r][c],ETbTadr[r][c]);
72 for(
int r=0; r<10; r++){
73 printf(
"HCal r=%2d : ",r);
74 for(
int c=0; c<6; c++){
82 HTbTdep[r][c]= c/2 + ((r-1)/4)*3;
83 HTbTadr[r][c]= c%2 + ((r-1)%4)*2;
85 printf(
"%2d-%1d ",HTbTdep[r][c],HTbTadr[r][c]);
93 for(
int r=0; r<9; r++){
94 if(fcs_trgDebug>=2) printf(
"H4x4 ");
95 for(
int c=0; c<5; c++){
97 = hcal[HTbTdep[r ][c ]].d[HTbTadr[r ][c ]]
98 + hcal[HTbTdep[r ][c+1]].d[HTbTadr[r ][c+1]]
99 + hcal[HTbTdep[r+1][c ]].d[HTbTadr[r+1][c ]]
100 + hcal[HTbTdep[r+1][c+1]].d[HTbTadr[r+1][c+1]];
102 if(fcs_trgDebug>=2) printf(
"%5d ",hsum[ns][r][c]);
104 if(fcs_trgDebug>=2) printf(
"\n");
109 for(
int i=0;i<DEP_ECAL_TRG_COU;i++) {
110 for(
int j=0;j<8;j++) {
111 if(s2_ch_mask[geo.ns] & (1ll<<i)) {
115 if(ecal[i].d[j] > EHTTHR) ecal_ht |= 1 ;
121 for(
int i=0;i<DEP_HCAL_TRG_COU;i++) {
122 for(
int j=0;j<8;j++) {
123 if(s2_ch_mask[geo.ns] & (1ll<<(20+i))) {
127 if(hcal[i].d[j] > HHTTHR) hcal_ht |= 1 ;
133 for(
int i=0;i<DEP_PRE_TRG_COU;i++) {
134 for(
int j=0;j<8;j++) {
135 if(s2_ch_mask[geo.ns] & (1ll<<(28+i))) {
139 if(pres[i].d[j]) fpre_or |= 1 ;
144 for(
int r=0; r<16; r++){
145 for(
int c=0; c<10; c++){
146 e2x2[ns][r][c]=ecal[ETbTdep[r][c]].d[ETbTadr[r][c]];
150 for(
int r=0; r<10; r++){
151 for(
int c=0; c<6; c++){
152 h2x2[ns][r][c]=hcal[HTbTdep[r][c]].d[HTbTadr[r][c]];
161 u_int EM1 =0, EM2 =0, EM3=0;
162 u_int GAM1=0, GAM2=0, GAM3=0;
163 u_int ELE1=0, ELE2=0, ELE3=0;
164 u_int HAD1=0, HAD2=0, HAD3=0;
165 u_int ETOT=0, HTOT=0;
166 for(
int r=0; r<15; r++){
167 if(fcs_trgDebug>=2) printf(
"E4x4 ");
168 for(
int c=0; c<9; c++){
170 = ecal[ETbTdep[r ][c ]].d[ETbTadr[r ][c ]]
171 + ecal[ETbTdep[r ][c+1]].d[ETbTadr[r ][c+1]]
172 + ecal[ETbTdep[r+1][c ]].d[ETbTadr[r+1][c ]]
173 + ecal[ETbTdep[r+1][c+1]].d[ETbTadr[r+1][c+1]];
177 u_int h=hsum[ns][EtoHmap[r][c][0]][EtoHmap[r][c][1]];
181 for(
int iz=0; iz<4; iz++){
182 int iHCalID = EtoH3map[r][c][iz];
183 if(iHCalID < 0)
continue;
184 int irow = iHCalID/5;
185 int icol = iHCalID%5;
186 if(hmax < hsum[ns][irow][icol]) hmax = hsum[ns][irow][icol];
192 sum[ns][r][c] = esum[ns][r][c] + h;
195 if(sum[ns][r][c]==0) {
198 ratio[ns][r][c] = float(esum[ns][r][c]) / float(sum[ns][r][c]);
203 for(
int dep=0; dep<6; dep++){
205 if(fcs_readPresMaskFromText==0){
206 mask = fcs_ecal_epd_mask[r][c][dep];
208 mask = PRES_MASK[r][c][dep];
210 for(
int j=0; j<4; j++) {
211 for(
int k=0; k<8; k++){
212 if( (mask >> (j*8 + k)) & 0x1) {
213 epdcoin[ns][r][c] |= (pres[dep].d[j] >> k) & 0x1;
222 u_int hmax128 = hmax*128 ;
224 if(hmax128 < esum[ns][r][c] * EM_HERATIO_THR){
225 if(esum[ns][r][c] > EMTHR1){
227 if(epdcoin[ns][r][c]==0) {GAM1 = 1;}
230 if(esum[ns][r][c] > EMTHR2){
232 if(epdcoin[ns][r][c]==0) {GAM2 = 1;}
235 if(esum[ns][r][c] > EMTHR3){
237 if(epdcoin[ns][r][c]==0) {GAM3 = 1;}
242 if(h128 > esum[ns][r][c] * HAD_HERATIO_THR){
243 if(sum[ns][r][c] > HADTHR1) HAD1 = 1;
244 if(sum[ns][r][c] > HADTHR2) HAD2 = 1;
245 if(sum[ns][r][c] > HADTHR3) HAD3 = 1;
247 if(fcs_trgDebug>=2) printf(
"%5d %1d %3.2f ",esum[ns][r][c],epdcoin[ns][r][c],ratio[ns][r][c]);
249 if(fcs_trgDebug>=2) printf(
"\n");
253 int e_col_start[3] = { 0, 1, 3};
254 int e_col_stop[3] = { 4, 5, 9};
255 int e_row_start[2] = { 0, 5};
256 int e_row_stop[2] = {10,15};
257 int h_col_start[3] = { 0, 1, 2};
258 int h_col_stop[3] = { 2, 3, 5};
259 int h_row_start[2] = { 0, 3};
260 int h_row_stop[2] = { 6, 9};
261 int JP1[6] = {0,0,0,0,0,0};
262 int JP2[6] = {0,0,0,0,0,0};
264 for(
int jc=0; jc<3; jc++){
265 for(
int jr=0; jr<2; jr++){
267 for(
int c=e_col_start[jc]; c<=e_col_stop[jc]; c++){
268 for(
int r=e_row_start[jr]; r<=e_row_stop[jr]; r++){
269 jet[ns][j] += ecal[ETbTdep[r][c]].d[ETbTadr[r][c]];
272 for(
int c=h_col_start[jc]; c<=h_col_stop[jc]; c++){
273 for(
int r=h_row_start[jr]; r<=h_row_stop[jr]; r++){
274 jet[ns][j] += hcal[HTbTdep[r][c]].d[HTbTadr[r][c]];
277 if(jet[ns][j]>0xff) jet[ns][j]=0xff;
278 if(jet[ns][j]>JETTHR1) JP1[j] = 1;
279 if(jet[ns][j]>JETTHR2) JP2[j] = 1;
283 if(fcs_trgDebug>=2) printf(
"JP6C = %3d %3d %3d %3d %3d %3d\n",jet[ns][0],jet[ns][1],jet[ns][2],jet[ns][3],jet[ns][4],jet[ns][5]);
287 esub[0] = esum[ns][ 0][0]+esum[ns][ 0][2]+esum[ns][ 0][4]+esum[ns][ 0][6]+esum[ns][ 0][8]
288 + esum[ns][ 2][0]+esum[ns][ 2][2]+esum[ns][ 2][4]+esum[ns][ 2][6]+esum[ns][ 2][8];
289 esub[1] = esum[ns][ 4][0]+esum[ns][ 4][2]+esum[ns][ 4][4]+esum[ns][ 4][6]+esum[ns][ 4][8]
290 + esum[ns][ 6][0]+esum[ns][ 6][2]+esum[ns][ 6][4]+esum[ns][ 6][6]+esum[ns][ 6][8];
291 esub[2] = esum[ns][ 8][0]+esum[ns][ 8][2]+esum[ns][ 8][4]+esum[ns][ 8][6]+esum[ns][ 8][8]
292 + esum[ns][10][0]+esum[ns][10][2]+esum[ns][10][4]+esum[ns][10][6]+esum[ns][10][8];
293 esub[3] = esum[ns][12][0]+esum[ns][12][2]+esum[ns][12][4]+esum[ns][12][6]+esum[ns][12][8]
294 + esum[ns][14][0]+esum[ns][14][2]+esum[ns][14][4]+esum[ns][14][6]+esum[ns][14][8];
295 for(
int i=0; i<4; i++) if(esub[i]>0xff) esub[i]=0xff;
299 hsub[0] = hsum[ns][ 1][0]+hsum[ns][ 1][2]+hsum[ns][ 1][4];
300 hsub[1] = hsum[ns][ 3][0]+hsum[ns][ 3][2]+hsum[ns][ 3][4];
301 hsub[2] = hsum[ns][ 5][0]+hsum[ns][ 5][2]+hsum[ns][ 5][4];
302 hsub[3] = hsum[ns][ 7][0]+hsum[ns][ 7][2]+hsum[ns][ 7][4];
303 for(
int i=0; i<4; i++) if(hsub[i]>0xff) hsub[i]=0xff;
306 etot[ns] = esub[0] + esub[1] + esub[2] + esub[3];
307 htot[ns] = hsub[0] + hsub[1] + hsub[2] + hsub[3];
308 if(etot[ns]>ETOTTHR) ETOT=1;
309 if(htot[ns]>HTOTTHR) HTOT=1;
310 if(fcs_trgDebug>=2) printf(
"E/H Tot = %3d %3d\n",etot[ns],htot[ns]);
313 output[0].d[0] = EM1 + (EM2 <<1) + (EM3 <<2);
314 output[0].d[1] = ELE1 + (ELE2<<1) + (ELE3<<2);
315 output[0].d[2] = GAM1 + (GAM2<<1) + (GAM3<<2);
316 output[0].d[3] = HAD1 + (HAD2<<1) + (HAD3<<2);
317 output[0].d[4] = (JP1[0] << 0) + (JP1[1]<<1) + (JP1[2]<<2) + (JP1[3]<<3) + (JP1[4]<<4) + (JP1[5]<<5);
318 output[0].d[5] = ETOT + (HTOT<<1);
319 output[0].d[6] = (fpre_or<<2) | (hcal_ht<<1) | (ecal_ht);
320 output[0].d[7] = 0xCD ;
327 output[1].d[4] = (JP2[0] << 0) + (JP2[1]<<1) + (JP2[2]<<2) + (JP2[3]<<3) + (JP2[4]<<4) + (JP2[5]<<5);
330 output[1].d[7] = 0xAB ;
333 printf(
"FCS STG2 NS=%1d output = %02x %02x %02x %02x %02x %02x %02x %02x\n",
335 output[0].d[0],output[0].d[1],output[0].d[2],output[0].d[3],
336 output[0].d[4],output[0].d[5],output[0].d[6],output[0].d[7]);