00001 #ifndef TRG_VERSION
00002 #define TRG_VERSION 0x32
00003 #endif
00004
00005 #include "gl3EMC.h"
00006
00007 #include "gl3Event.h"
00008
00009 #include <sys/types.h>
00010 #include <sys/stat.h>
00011 #include <fcntl.h>
00012 #include <unistd.h>
00013 #include <errno.h>
00014 #include <stdio.h>
00015 #include <math.h>
00016
00017 #ifndef OLD_DAQ_READER
00018 #include <DAQ_READER/daq_dta.h>
00019 #endif
00020
00021 #include "daqFormats.h"
00022 #include "l3BankUtils.h"
00023 #include "l3Swap.h"
00024 #include <rtsLog.h>
00025
00026 #ifndef OLD_DAQ_READER
00027 #include <DAQ_EMC/daq_emc.h>
00028 #endif
00029
00030 gl3EMC::gl3EMC(l3EmcCalibration *BarrelCalib, l3EmcCalibration *EndcapCalib)
00031 {
00032 barrelCalib = BarrelCalib;
00033 endcapCalib = EndcapCalib;
00034
00035 if (barrelCalib)
00036 nBarrelTowers = barrelCalib->getNTowers();
00037 else
00038 nBarrelTowers = 0;
00039
00040 if (endcapCalib)
00041 nEndcapTowers = endcapCalib->getNTowers();
00042 else
00043 nEndcapTowers = 0;
00044
00045 nTotalTowers = nBarrelTowers + nEndcapTowers;
00046
00047 tower = new gl3EmcTower[nTotalTowers];
00048 barrelTower = tower;
00049 endcapTower = tower + nBarrelTowers;
00050
00051 for (int i=0; i<nBarrelTowers; i++) {
00052 barrelTower[i].setTowerInfo(barrelCalib->getTowerInfo(i));
00053 }
00054
00055 for (int i=0; i<nEndcapTowers; i++) {
00056 endcapTower[i].setTowerInfo(endcapCalib->getTowerInfo(i));
00057 }
00058
00059 reset();
00060 }
00061
00062 gl3EMC::~gl3EMC() {
00063 delete[] tower;
00064 }
00065
00066
00067 #ifdef OLD_DAQ_READER
00068 int gl3EMC::readFromEvpReader(evpReader *evp, char *mem)
00069 #else
00070 int gl3EMC::readFromEvpReader(daqReader *rdr, char *mem)
00071 #endif
00072 {
00073 int i,j;
00074 #ifdef OLD_DAQ_READER
00075 int ret = emcReader(mem);
00076 #endif
00077
00078 #ifdef OLD_DAQ_READER
00079 if(ret <= 0) {
00080 #else
00081 daq_dta *dd = rdr->det("emc_pseudo")->get("legacy");
00082
00083 if(!dd) {
00084 #endif
00085 LOG(NOTE, "No EMC data present...",0,0,0,0,0);
00086 return 0;
00087 }
00088
00089 #ifndef OLD_DAQ_READER
00090 dd->iterate();
00091 emc_t *pEMC = (emc_t *)dd->Void;
00092
00093 #endif
00094
00095 for(i=0;i<nBarrelTowers;i++) {
00096 barrelTower[i].setADC(0);
00097 barrelTower[i].setNTracks(0);
00098 }
00099
00100 for(i=0;i<nEndcapTowers;i++) {
00101 endcapTower[i].setADC(0);
00102 endcapTower[i].setNTracks(0);
00103 }
00104
00105
00106 if(barrelCalib) {
00107 if(nBarrelTowers < BTOW_MAXFEE * BTOW_DATSIZE) {
00108 LOG(WARN, "nBarrelTowers = %d, smaller than %d",nBarrelTowers,BTOW_MAXFEE * BTOW_DATSIZE,0,0,0);
00109 }
00110 }
00111
00112 if(endcapCalib) {
00113 if(nEndcapTowers < ETOW_MAXFEE * ETOW_DATSIZE) {
00114 LOG(WARN, "nEndcapTowers = %d, smaller than %d",nEndcapTowers,ETOW_MAXFEE * ETOW_DATSIZE,0,0,0);
00115 }
00116 }
00117
00118
00119 if(barrelCalib) {
00120 #ifdef OLD_DAQ_READER
00121 if(emc.btow_in) {
00122 #else
00123 if(pEMC->btow_in) {
00124 #endif
00125 LOG(DBG, "Reading BTOW data",0,0,0,0,0);
00126 for(i=0;i<BTOW_MAXFEE*BTOW_DATSIZE;i++) {
00127
00128 int daqid = i;
00129 int id = barrelCalib->daqToId(daqid);
00130
00131 #ifdef OLD_DAQ_READER
00132 if(emc.btow[i] != 0)
00133 LOG(DBG, "i=%d id=%d adc=%d",daqid,id,emc.btow[i]);
00134 #else
00135 if(pEMC->btow[i] != 0)
00136 LOG(DBG, "i=%d id=%d adc=%d",daqid,id,pEMC->btow[i]);
00137 #endif
00138
00139 if(id >= nBarrelTowers) continue;
00140
00141 #ifdef OLD_DAQ_READER
00142 barrelTower[id].setADC(emc.btow[i]);
00143 #else
00144 barrelTower[id].setADC(pEMC->btow[i]);
00145 #endif
00146 barrelTower[id].setNTracks(0);
00147 }
00148 }
00149 }
00150
00151
00152 if(endcapCalib) {
00153 #ifdef OLD_DAQ_READER
00154 if(emc.etow_in) {
00155 #else
00156 if(pEMC->etow_in) {
00157 #endif
00158 LOG(DBG, "Reading etow data",0,0,0,0,0);
00159 for(i=0;i<ETOW_MAXFEE;i++) {
00160 for(j=0;j<ETOW_DATSIZE;j++) {
00161
00162 int daqid = i + j*ETOW_MAXFEE;
00163 int id = endcapCalib->daqToId(daqid);
00164
00165 if(id >= nEndcapTowers) continue;
00166
00167 #ifdef OLD_DAQ_READER
00168 if(emc.etow[i][j] != 0)
00169 LOG(DBG, "etow: i=%d j=%d daqid=%d id=%d adc=%d",i,j,daqid,id, emc.etow[i][j]);
00170 #else
00171 if(pEMC->etow[i][j] != 0)
00172 LOG(DBG, "etow: i=%d j=%d daqid=%d id=%d adc=%d",i,j,daqid,id, pEMC->etow[i][j]);
00173 #endif
00174
00175 #ifdef OLD_DAQ_READER
00176 endcapTower[id].setADC(emc.etow[i][j]);
00177 #else
00178 endcapTower[id].setADC(pEMC->etow[i][j]);
00179 #endif
00180 endcapTower[id].setNTracks(0);
00181 }
00182 }
00183 }
00184 }
00185 return 0;
00186 }
00187
00188
00189 int gl3EMC::readRawData(L3_P *l3p)
00190 {
00191
00192 int ret=0;
00193
00194 if (l3p->emc[0].len > 10000) {
00195 LOG(ERR,"Illegal length of BTOW contribution",0,0,0,0,0);
00196 return 0;
00197 }
00198
00199 if (l3p->emc[3].len > 10000) {
00200 LOG(ERR," ---> ERROR <--- Illegal length of ETOW contribution\n",0,0,0,0,0);
00201 return 0;
00202 }
00203
00204
00205 if (l3p->emc[0].len) {
00206 if (readEMCSECP((EMCSECP*)offlen2ptr(l3p, l3p->emc[0]))) {
00207
00208
00209 for (int i=0; i < nBarrelTowers; i++) {
00210 barrelTower[i].setADC(0);
00211 barrelTower[i].setNTracks(0);
00212 }
00213 }
00214 }
00215
00216 if (l3p->emc[3].len) {
00217 ret = readEMCSECP((EMCSECP*)offlen2ptr(l3p, l3p->emc[3]));
00218 }
00219
00220
00221 if (ret) {
00222
00223
00224
00225 LOG(ERR,"Error reading endcap",0,0,0,0,0);
00226
00227 for (int i=0; i < nEndcapTowers; i++) {
00228 endcapTower[i].setADC(0);
00229 endcapTower[i].setNTracks(0);
00230 }
00231 }
00232
00233 Ebarrel = 0.0;
00234 for (int i=0; i < nBarrelTowers; i++) {
00235 Ebarrel += barrelTower[i].getEnergy();
00236 }
00237
00238 Eendcap = 0.0;
00239 for (int i=0; i < nEndcapTowers; i++) {
00240 Eendcap += endcapTower[i].getEnergy();
00241 }
00242
00243 Etotal = Ebarrel + Eendcap;
00244
00245 return 0;
00246 }
00247
00248
00249 int gl3EMC::readEMCSECP(EMCSECP* secp)
00250 {
00251
00252 enum {barrel, endcap} secpType;
00253
00254 l3EmcCalibration *calib = NULL;
00255 gl3EmcTower *twr = NULL;
00256 int nCrates;
00257
00258 if (!secp) {
00259 return -2;
00260 }
00261
00262 if(strncmp(secp->bh.bank_type, CHAR_EMCSECP, 8) == 0) {
00263 secpType = barrel;
00264 calib = barrelCalib;
00265 twr = barrelTower;
00266 nCrates = 30;
00267
00268 } else if (strncmp(secp->bh.bank_type, CHAR_EECSECP, 8) == 0) {
00269 secpType = endcap;
00270 calib = endcapCalib;
00271 twr = endcapTower;
00272 nCrates = 6;
00273
00274 } else {
00275 LOG(ERR,"Unknown bank type '%s'", secp->bh.bank_type,0,0,0,0);
00276 return -3;
00277 }
00278
00279 if (calib == NULL) {
00280 return -4;
00281 }
00282
00283
00284
00285
00286 int nFibers = (swap32(secp->bh.length)-10)/2;
00287
00288 for (int i=0; i<nFibers; i++) {
00289 EMCRBP* rbp = (EMCRBP*)offlen2ptr(secp, secp->fiber[i]);
00290 if (!rbp) continue;
00291
00292 int nBANKS = (swap32(rbp->bh.length)-10)/2;
00293
00294 if (nBANKS < 1) {
00295 LOG(ERR, "EMC data coming in without BTOW bank?!?!?\n",0,0,0,0,0);
00296 return -5;
00297 }
00298
00299 bankHeader *dataBank = (bankHeader *)
00300 offlen2ptr(rbp, rbp->banks[0]);
00301
00302 if (!dataBank) continue;
00303
00304
00305
00306
00307
00308
00309 unsigned short* data = (unsigned short*)
00310 (((char *)dataBank) + 40 + 4 + 128);
00311
00312
00313 for(int c=0; c<nCrates; c++) {
00314
00315 unsigned short cr_count = data[c+30*0];
00316 unsigned short cr_errflag = data[c+30*1];
00317
00318
00319
00320 if (secpType == barrel && c<15) {
00321
00322
00323
00324 if (cr_count != 164) errFlags |= 1;
00325 if (cr_errflag) errFlags |= 1;
00326
00327 }
00328
00329
00330 }
00331
00332
00333 data += nCrates*4;
00334
00335 for (int daqid=0; daqid < calib->getNTowers(); daqid++) {
00336 int id = calib->daqToId(daqid);
00337
00338 twr[id].setADC(data[daqid]);
00339 twr[id].setNTracks(0);
00340
00341 }
00342 }
00343
00344
00345 return 0;
00346 }
00347
00348 int gl3EMC::matchTracks(gl3Event *event)
00349 {
00350 LOG(ERR, "matchTracks currently not available",0,0,0,0,0);
00351
00352 return -1;
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367 }
00368
00369 void gl3EMC::reset()
00370 {
00371
00372 errFlags = 0;
00373
00374 Etotal = 0.;
00375 Ebarrel = 0.;
00376 Eendcap = 0.;
00377
00378 for (int i=0; i<nBarrelTowers; i++) {
00379 barrelTower[i].setADC(0);
00380 }
00381
00382 for (int i=0; i<nEndcapTowers; i++) {
00383 endcapTower[i].setADC(0);
00384 }
00385
00386
00387 }