00001
00002 #include <stdio.h>
00003 #include <assert.h>
00004 #include <string.h>
00005 #include <stdlib.h>
00006
00007 #include <TObjArray.h>
00008 #include <TClonesArray.h>
00009
00010 #include <TH2.h>
00011 #include <TFile.h>
00012 #include <TLine.h>
00013 #include <TText.h>
00014
00015 #include "EEqaSorterC.h"
00016
00017 #include "StMuDSTMaker/EZTREE/EztEmcRawData.h"
00018
00019 #include "StEEmcUtil/database/StEEmcDb.h"
00020 #include "StEEmcUtil/database/EEmcDbItem.h"
00021
00022
00023 #include "EEqaPresenter.h"
00024
00025
00026
00027 ClassImp(EEqaSorterC)
00028
00029
00030 EEqaSorterC::EEqaSorterC(StEEmcDb *dbx)
00031 : TObject()
00032 , hMAPMT(0)
00033 , adcThrTw(40)
00034 , adcThrPrs(200)
00035 , adcThrPost(50)
00036 , adcThrSmd(100)
00037 , eeDb(dbx)
00038 {
00039 memset(h2D,0,sizeof(h2D));
00040 memset(hMult,0,sizeof(hMult));
00041 memset(hSmd,0,sizeof(hSmd));
00042 memset(hnHSmd,0,sizeof(hnHSmd));
00043 }
00044
00045
00046 EEqaSorterC::~EEqaSorterC() {
00047 for(int i = 0;i < mxh;i++) {
00048 if (hMult[i]) delete hMult[i];
00049 if (h2D[i]) delete h2D[i];
00050 }
00051 memset(h2D,0,sizeof(h2D));
00052 memset(hMult,0,sizeof(hMult));
00053 if (hMAPMT) delete hMAPMT;
00054 hMAPMT = 0;
00055 for(int iSec = 0;iSec < MaxSectors;iSec++) {
00056 for(int pl = 0;pl < MaxSmdPlains;pl++) {
00057 if (hSmd[iSec][pl]) delete hSmd[iSec][pl];
00058 if (hnHSmd[iSec][pl]) delete hnHSmd[iSec][pl];
00059 }
00060 }
00061 memset(hSmd,0,sizeof(hSmd));
00062 memset(hnHSmd,0,sizeof(hnHSmd));
00063 }
00064
00065
00066 void EEqaSorterC::sort(const EztEmcRawData *t, const EztEmcRawData *s, int ver ) {
00067 sortTower(t);
00068 sortMapmt(s, ver);
00069 }
00070
00071
00072 void EEqaSorterC::sortTower(const EztEmcRawData *t){
00073 if(!t) return;
00074 int nTw=0;
00075 for(int icr=0;icr<t->getNBlocks();icr++) {
00076 if(t->isCrateVoid(icr)) continue;
00077 int crateID=icr+1;
00078 const UShort_t* data=t->data(icr);
00079 for(int i=0;i<t->sizeData(icr) && i<MaxTwCrateCh;i++) {
00080 int chan=i;
00081 const EEmcDbItem *x = eeDb ? eeDb->getByCrate(crateID,chan) : 0;
00082 if(!x) continue;
00083 if(x->fail ) continue;
00084 float adc=data[i]-x->ped;
00085 if(adc<adcThrTw) continue;
00086 nTw++;
00087 int iphi=(x->sec-1)*MaxSubSec+(x->sub-'A');
00088 h2D[0]->Fill(iphi,x->eta);
00089 }
00090 }
00091 hMult[0] ->Fill(nTw);
00092 }
00093
00094
00095 void EEqaSorterC::sortMapmt(const EztEmcRawData *s, int ver){
00096 if(s==0) return;
00097 int nHit[mxh], nSmdH[MaxSectors][MaxSmdPlains];
00098 memset(nHit,0,sizeof(nHit));
00099 memset(nSmdH,0,sizeof(nSmdH));
00100
00101 for(int icr=0;icr<s->getNBlocks();icr++) {
00102 if(s->isCrateVoid(icr)) continue;
00103 int crateID=icr+64;
00104
00105 if(ver<0x22) {
00106 if(icr>=16) break;
00107 crateID=icr+84;
00108 }
00109
00110 const UShort_t* data=s->data(icr);
00111 for(int i=0;i<s->sizeData(icr) && i<MaxMapmtCrateCh;i++) {
00112 int chan=i;
00113 const EEmcDbItem *x = eeDb ? eeDb->getByCrate(crateID,chan) : 0;
00114 if(!x) continue;
00115 if(x->fail) continue;
00116
00117 float thr=0;
00118 char cD=x->name[2];
00119 switch(cD) {
00120 case 'P':
00121 case 'Q': thr=adcThrPrs; break;
00122 case 'R': thr=adcThrPost; break;
00123 case 'U':
00124 case 'V': thr=adcThrSmd; break;
00125 default :;
00126 }
00127 if(thr<=0) continue;
00128 float adc=data[i]-x->ped;
00129 if(adc<thr) continue;
00130
00131
00132 if(x->isSMD()) {
00133 int strip=x->strip;
00134 int iplane =x->plane-'U';
00135 int isec=x->sec-1;
00136 hSmd[isec][iplane]->Fill(strip);
00137 nSmdH[isec][iplane]++;
00138 } else {
00139 int ik=1+cD-'P';
00140 nHit[ik]++;
00141 int iphi=(x->sec-1)*MaxSubSec+(x->sub-'A');
00142 h2D[ik]->Fill(iphi,x->eta);
00143 }
00144 hMAPMT->Fill(crateID,x->mapmtId());
00145 }
00146 }
00147
00148 for(int j=1;j<=3;j++) hMult[j]->Fill(nHit[j]);
00149
00150 for (int j=0; j<MaxSectors; j++) {
00151 for (int pl=0; pl<MaxSmdPlains; pl++) {
00152 hnHSmd[j][pl]->Fill(nSmdH[j][pl]);
00153 }
00154 }
00155 }
00156
00157
00158 void EEqaSorterC::initHisto(TObjArray *HList){
00159 int i;
00160 char tit[500];
00161 sprintf (tit, "EEMC Tower hits>ped+%d; phibin : 1TA=0 3TA=10 5TA=20 7TA=30 9TA=40 11TA=50 ; #eta bin ",adcThrTw);
00162 h2D[0] = new TH2F("TowHits",tit, 60, -0.5, 59.5, 12, 0.5, 12.5);
00163
00164 addJPphiLimits( h2D[0]);
00165
00166
00167 sprintf (tit, "EEMC pres-1 hits>ped+%d; phi bin : 1TA=0 3TA=10 5TA=20 7TA=30 9TA=40 11TA=50 ; #eta bin ",adcThrPrs);
00168 h2D[1] = new TH2F("Pre1Hits",tit , 60, -0.5, 59.5, 12, 0.5, 12.5);
00169 sprintf (tit, "EEMC pres-2 hits>ped+%d; phi bin: 1TA=0 3TA=10 5TA=20 7TA=30 9TA=40 11TA=50 ; #eta bin ",adcThrPrs);
00170 h2D[2] =new TH2F("Pre2Hits",tit , 60, -0.5, 59.5, 12, 0.5, 12.5);
00171
00172 sprintf (tit, "EEMC post hits>ped+%d; phi bin : 1TA=0 3TA=10 5TA=20 7TA=30 9TA=40 11TA=50 ; #eta bin ",adcThrPost);
00173 h2D[3] = new TH2F("PostHits",tit , 60, -0.5, 59.5, 12, 0.5, 12.5);
00174
00175
00176 sprintf (tit, "EEMC # Tower w/ adc>ped+%d; # Towers",adcThrTw);
00177 hMult[0] = new TH1F("HTow", tit, 100, -0.5, 99.5);
00178
00179 sprintf (tit, "EEMC # Pre-1 w/ adc>ped+%d; # Tiles",adcThrPrs);
00180 hMult[1] = new TH1F("HPre1", tit, 100, -0.5, 199.5);
00181 sprintf (tit, "EEMC # Pre-2 w/ adc>ped+%d; # Tiles",adcThrPrs);
00182 hMult[2] = new TH1F("HPre2", tit, 100, -0.5, 199.5);
00183 sprintf (tit, "EEMC # Post w/ adc>ped+%d; # Tiles",adcThrPrs);
00184 hMult[3] = new TH1F("HPost", tit, 100, -0.5, 199.5);
00185
00186
00187 for(i=0;i<mxh;i++) {
00188 if(HList && hMult[i]) HList->Add(hMult[i]);
00189 if(HList && h2D[i]) HList->Add(h2D[i]);
00190 }
00191
00192 hMAPMT= new TH2F("MAPMHits","MAPMT Hits adc>ped+thr; crateID ; tube no.", 48, 63.5, 111.5, 12, 0.5, 12.5);
00193 if (HList && hMAPMT) HList->Add(hMAPMT);
00194
00195 int iSec;
00196 for(iSec=0; iSec<MaxSectors; iSec++) {
00197 char cid[50], ctitl[50];
00198 int pl;
00199 for(pl=0;pl<MaxSmdPlains;pl++) {
00200 char uv='U'+pl;
00201 sprintf (cid, "SmdA%d%c",iSec+1,uv);
00202 sprintf (ctitl, "ESMD %02d%c adc>ped+%02d;"
00203 "Strip no.", iSec+1,uv, adcThrSmd);
00204 hSmd[iSec][pl] = new TH1F(cid, ctitl, 290, -0.5, 289.5);
00205 if (HList && hSmd[iSec][pl]) HList->Add(hSmd[iSec][pl]);
00206
00207 sprintf (cid, "HSmd%d%c",iSec+1,uv);
00208 sprintf (ctitl, "ESMD %02d%c Hits/eve adc>ped+%d; No. Hits", iSec+1, uv,adcThrSmd);
00209 hnHSmd[iSec][pl] = new TH1F(cid, ctitl, 100, -0.5, 99.5);
00210 if (HList && hnHSmd[iSec][pl]) HList->Add(hnHSmd[iSec][pl]);
00211 }
00212 }
00213
00214 }
00215
00216
00217 void EEqaSorterC::saveHisto(TFile *f) const {
00218 if (f) f->cd();
00219 for(int i = 0;i < mxh;i++) {
00220 if (hMult[i]) hMult[i]->Write();
00221 if (h2D[i]) h2D[i]->Write();
00222 }
00223 if (hMAPMT) hMAPMT->Write();
00224 for(int iSec = 0;iSec < MaxSectors;iSec++) {
00225 for(int pl = 0;pl < MaxSmdPlains;pl++) {
00226 if (hSmd[iSec][pl]) hSmd[iSec][pl]->Write();
00227 if (hnHSmd[iSec][pl]) hnHSmd[iSec][pl]->Write();
00228 }
00229 }
00230 }
00231
00232
00233 void EEqaSorterC::resetHisto() {
00234 for(int i = 0;i < mxh;i++) {
00235 if (hMult[i]) hMult[i]->Reset();
00236 if (h2D[i]) h2D[i]->Reset();
00237 }
00238 if (hMAPMT) hMAPMT->Reset();
00239 for(int iSec = 0;iSec < MaxSectors;iSec++) {
00240 for(int pl = 0;pl < MaxSmdPlains;pl++) {
00241 if (hSmd[iSec][pl]) hSmd[iSec][pl]->Reset();
00242 if (hnHSmd[iSec][pl]) hnHSmd[iSec][pl]->Reset();
00243 }
00244 }
00245 }
00246
00247
00248 void EEqaSorterC::initRun() {
00249 }
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284