StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
StFcsTrgQaMaker.cxx
1 
2 /*
3  *
4  * \class StFcsTrgQaMaker
5  *
6  */
7 
8 #include "StFcsTrgQaMaker.h"
9 
10 #include "StRoot/StEvent/StEvent.h"
11 #include "StRoot/St_base/StMessMgr.h"
12 #include "StRoot/StEvent/StTriggerData.h"
13 #include "StRoot/StEvent/StFcsCollection.h"
14 #include "StRoot/StEvent/StFcsHit.h"
15 #include "StRoot/StEvent/StFcsCluster.h"
16 #include "StRoot/StFcsDbMaker/StFcsDb.h"
17 #include "StRoot/StSpinPool/StFcsTriggerSimMaker/StFcsTriggerSimMaker.h"
18 
19 #include "StRoot/RTS/src/TRG_FCS/fcs_trg_base.h"
20 
21 #include "TH1F.h"
22 #include "TH2F.h"
23 #include "TString.h"
24 #include "TFile.h"
25 
26 #include <string.h>
27 #include <time.h>
28 
29 StFcsTrgQaMaker::StFcsTrgQaMaker(const Char_t* name) : StMaker(name) {};
30 
31 StFcsTrgQaMaker::~StFcsTrgQaMaker(){};
32 
33 Int_t StFcsTrgQaMaker::Init(){
34  mFcsDb = static_cast< StFcsDb*>(GetDataSet("fcsDb"));
35  if(!mFcsDb){
36  LOG_FATAL << "Error finding StFcsDb"<< endm;
37  return kStFatal;
38  }
39  mFcsTrgSimMkr = static_cast< StFcsTriggerSimMaker*>(GetMaker("FcsTrgSim"));
40  if(!mFcsTrgSimMkr){
41  LOG_FATAL << "Error finding StFcsTrgSimMaker"<< endm;
42  return kStFatal;
43  }
44  fcs_trg_base* trg=mFcsTrgSimMkr->getTriggerEmu();
45  if(!trg){
46  LOG_FATAL << "Error finding fcs_trg_base from StFcsTrgSimMaker"<< endm;
47  return kStFatal;
48  }
49 
50  if(mRun>0){
51  int yday=mRun/1000;
52  sprintf(mFilename,"%d/%d.trgQa.root",yday,mRun);
53  }else if(mFilename==0){
54  char* fname = "fcs.trgqa.root";
55  mFilename=fname;
56  }
57  printf("StFcsTrgQaMaker::Init - Opening %s\n",mFilename);
58  mFile=new TFile(mFilename,"RECREATE");
59 
60  const char* NS[2]={"N","S"};
61  const char* JP[5]={"A","B","C","D","E"};
62 
63  mTow[0] = new TH2F("ETow","Ecal; +-col; -row",22*2+1,-22.5,22.5,34,-34.5,-0.5);
64  mTow[1] = new TH2F("HTow","Hcal; +-col; -row",13*2+1,-13.5,13.5,20,-20.5,-0.5);
65 
66  mETot[0] = new TH1F("ETotN", "ETotN", 256,0,512);
67  mETot[1] = new TH1F("ETotS", "ETotS", 256,0,512);
68  mHTot[0] = new TH1F("HTotN", "HTotN", 256,0,256);
69  mHTot[1] = new TH1F("HTotS", "HTotS", 256,0,256);
70 
71  mEHT[0] = new TH1F("EHTN" ,"MAX EHT", 256,0,256);
72  mEHT[1] = new TH1F("EHTS" ,"MAX EHT", 256,0,256);
73  mEHTMap = new TH2F("EHTMap","MAX E2x2Map",21,-10.5,10.5,16,-16.5,-0.5);
74  mHHT[0] = new TH1F("HHTN" ,"MAX HHT", 256,0,256);
75  mHHT[1] = new TH1F("HHTS" ,"MAX HHT", 256,0,256);
76  mHHTMap = new TH2F("HHTMap","MAX H2x2Map",13,-6.5,6.5,10,-10.5,-0.5);
77 
78  for(int ns=0; ns<2; ns++){
79  for(int j=0; j<5; j++){
80  mJP[ns][j] = new TH1F(Form("JP%1s_%1s",JP[j],NS[ns]),
81  Form("JP%1s_%1s",JP[j],NS[ns]),256,0,512);
82  }
83  }
84  mJPMap[0] = new TH1F("JP2",Form("JP2 THR A=%d,BC=%d,DE=%d",trg->JPATHR2,trg->JPBCTHR2,trg->JPDETHR2),11,-5.5,5.5);
85  mJPMap[1] = new TH1F("JP1",Form("JP1 THR A=%d,BC=%d,DE=%d",trg->JPATHR1,trg->JPBCTHR1,trg->JPDETHR1),11,-5.5,5.5);
86  mJPMap[2] = new TH1F("JP0",Form("JP0 THR A=%d,BC=%d,DE=%d",trg->JPATHR0,trg->JPBCTHR0,trg->JPDETHR0),11,-5.5,5.5);
87 
88  mE4x4 = new TH1F("E4x4", "MAX E4x4", 256,0,256);
89  mEM4x4 = new TH1F("EM4x4", "MAX EM4x4", 256,0,256);
90  mELE4x4 = new TH1F("ELE4x4", "MAX ELE4x4", 256,0,256);
91  mERatio = new TH1F("EMRatio", "MAX EM Ratio=E/(E+Hmax)", 64,0,1.05);
92  mELERatio = new TH1F("ELERatio","MAX ELE Ratio=E/(E+Hmax)", 64,0,1.05);
93 
94  mH4x4 = new TH1F("H4x4", "MAX H4x4", 256,0,256);
95  mEH4x4 = new TH1F("EH4x4", "MAX E+H4x4", 256,0,256);
96  mHAD4x4 = new TH1F("HAD4x4", "MAX Had4x4", 256,0,256);
97  mHRatio = new TH1F("HRatio", "MAX E+H Ratio=E/(E+H)", 64,0,1.05);
98  mHADRatio = new TH1F("HADRatio","MAX Had Ratio=E/(E+H)", 64,0,1.05);
99 
100  mE4x4Map[0] = new TH2F("EM4x4MapEM2", Form("EM EM2=%d",trg->EMTHR2), 19,-9.5,9.5,15,-15.5,-0.5);
101  mE4x4Map[1] = new TH2F("EM4x4MapEM1", Form("EM EM1=%d",trg->EMTHR1), 19,-9.5,9.5,15,-15.5,-0.5);
102  mE4x4Map[2] = new TH2F("EM4x4MapEM0", Form("EM EM0=%d",trg->EMTHR0), 19,-9.5,9.5,15,-15.5,-0.5);
103  mE4x4Map[3] = new TH2F("EM4x4MapELE2", Form("EM ELE2=%d",trg->ELETHR2),19,-9.5,9.5,15,-15.5,-0.5);
104 
105  mELE4x4Map[0] = new TH2F("ELE4x4MapELE2",Form("ELE ELE2=%d",trg->ELETHR2), 19,-9.5,9.5,15,-15.5,-0.5);
106  mELE4x4Map[1] = new TH2F("ELE4x4MapELE1",Form("ELE ELE1=%d",trg->ELETHR1), 19,-9.5,9.5,15,-15.5,-0.5);
107 
108  mEH4x4Map[0] = new TH2F("EHMapHAD2", Form("E+H HAD2=%d",trg->HADTHR2), 19,-9.5,9.5,15,-15.5,-0.5);
109  mEH4x4Map[1] = new TH2F("EHMapHAD1", Form("E+H HAD1=%d",trg->HADTHR1), 19,-9.5,9.5,15,-15.5,-0.5);
110  mEH4x4Map[2] = new TH2F("EHMapHAD0", Form("E+H HAD0=%d",trg->HADTHR0), 19,-9.5,9.5,15,-15.5,-0.5);
111 
112  mDsmOut = new TH1F("DsmOut","DsmOut",33,0,33);
113  mDepOut = new TH1F("DepOut","DepOut",33,0,33);
114  mTcuBit = new TH1F("TcuBit","TcuBit",33,0,33);
115  mTcuDep = new TH1F("TcuDep","TcuDepMismatch",33,0,33);
116  mSimDep = new TH1F("SimDep","SimDepMismatch",33,0,33);
117 
118  const float maxadc=500;
119  mAdc[0]=new TH2F("EN_Id_Adc","EcalNorth; Id; ADC",mFcsDb->maxId(0),0.0,mFcsDb->maxId(0),500,0.0,maxadc);
120  mAdc[1]=new TH2F("ES_Id_Adc","EcalSouth; Id; ADC",mFcsDb->maxId(1),0.0,mFcsDb->maxId(1),500,0.0,maxadc);
121  mAdc[2]=new TH2F("HN_Id_Adc","HcalNorth; Id; ADC",mFcsDb->maxId(2),0.0,mFcsDb->maxId(2),500,0.0,maxadc);
122  mAdc[3]=new TH2F("HS_Id_Adc","HcalSouth; Id; ADC",mFcsDb->maxId(3),0.0,mFcsDb->maxId(3),500,0.0,maxadc);
123  mAdc[4]=new TH2F("PN_Id_Adc","PresNorth; Id; ADC",mFcsDb->maxId(4),0.0,mFcsDb->maxId(4),500,0.0,maxadc);
124  mAdc[5]=new TH2F("PS_Id_Adc","PresSouth; Id; ADC",mFcsDb->maxId(5),0.0,mFcsDb->maxId(5),500,0.0,maxadc);
125  return kStOK;
126 };
127 
129  fcs_trg_base* trg=mFcsTrgSimMkr->getTriggerEmu();
130  if(!trg){
131  LOG_FATAL << "Error finding fcs_trg_base from StFcsTrgSimMaker"<< endm;
132  return kStFatal;
133  }
134 
135  //Getting StEvent and FcsCollection
136  StEvent* event= (StEvent*)GetInputDS("StEvent");
137  StFcsCollection *fcs = 0;
138  if(!event) {
139  LOG_INFO << "No StEvent found" << endm;
140  }else{
141  fcs=event->fcsCollection();
142  }
143  if(!fcs){
144  LOG_INFO << "No StFcsCollection found" << endm;
145  return kStErr;
146  }
147  if(fcs->isDataExist()==0) {
148  LOG_INFO << "No FCS data in this event" << endm;
149  return kStOk;
150  }
151  //Getting Trigger Data
152  StTriggerData* trgd = event->triggerData();
153  if(!trgd){
154  TObjectSet *os = (TObjectSet*)GetDataSet("StTriggerData");
155  if(os){
156  trgd = (StTriggerData*)os->GetObject();
157  if(trgd){
158  //LOG_INFO << "got StTriggerData addr="<<trgd<<endm;
159  }else{
160  LOG_ERROR << "could not get StTriggerData from DataSet."<<endm;
161  return kStErr;
162  }
163  }else{
164  LOG_ERROR << "could not get StTriggerData DataSet."<<endm;
165  return kStErr;
166  }
167  }
168  unsigned int tcubit = trgd->lastDSM(2) + (trgd->lastDSM(5)<<16);
169 
170  //TCU bits
171  for(int i=0; i<32; i++) if((tcubit >> i) & 0x1) mTcuBit->Fill(i);
172 
173  //DSM out
174  unsigned int dsmout=trg->dsmout;
175  for(int i=0; i<32; i++) if((dsmout >> i) & 0x1) mDsmOut->Fill(i);
176  mDsmOut->Fill(32);
177 
178  //DEP out
179  int depout=0;
180  int det=6; //access DEPIO
181  int nhit=fcs->numberOfHits(det);
182  StSPtrVecFcsHit& hits = fcs->hits(det);
183  //printf("DEP TRG data n = %d\n",nhit);
184  for (int i=0; i<nhit; i++){
185  int ehp = hits[i]->ehp();
186  int ns = hits[i]->ns();
187  int dep = hits[i]->dep();
188  int ch = hits[i]->channel();
189  if(ehp!=3) continue; //DEPIO boards only
190  if(dep==0 && (ch==4 || ch==5) ){ //stage3 DEP to TCU
191  int ntb = hits[i]->nTimeBin();
192  for(int j=0; j<ntb; j++){
193  int adc = hits[i]->adc(j);
194  unsigned short tb = hits[i]->timebin(j);
195  //printf("DEPIO3 data = ehp%1d ns%1d dep%2d ch%2d tb%3d 0x%x\n",ehp,ns,dep,ch,tb,adc);
196  if(tb!=mS3off) continue;
197  if(ch==4) depout += adc;
198  if(ch==5) depout += (adc << 8);
199  }
200  }
201  if(dep==1 && ch==36){ //stage2 north/south DEP to TCU
202  int ntb = hits[i]->nTimeBin();
203  for(int j=0; j<ntb; j++){
204  int adc = hits[i]->adc(j);
205  unsigned short tb = hits[i]->timebin(j);
206  //printf("DEPIO2 data = ehp%1d ns%1d dep%02d ch%02d tb%03d 0x%x\n",ehp,ns,dep,ch,tb,adc);
207  if(tb!=mS2off) continue;
208  if(ns==0) depout += (adc&0xff) << 16;
209  if(ns==1) depout += (adc&0xff) << 24;
210  }
211  }
212  }
213  for(int i=0; i<32; i++) if((depout >> i) & 0x1) mDepOut->Fill(i);
214 
215  const char* BIT[32]={"HAD0","HAD1","HAD2",
216  "EM0","EM1","EM2",
217  "JP2","JPA1","JPBC1","JPDE1","JPA0","JPBC0","JPDE0",
218  "DiJP","DiJPAsy","DiELEA",
219  "ELE0-N","ELE1-N","ELE2-N","EM3-N","EHT-N","HHT-N","ETOT-N","HTOT-N",
220  "ELE0-S","ELE1-S","ELE2-S","EM3-S","EHT-S","HHT-S","ETOT-S","HTOT-S"};
221  if(GetDebug()){
222  LOG_INFO << Form("FCSBits SIM = %08x ",dsmout);
223  for(int i=0; i<32; i++){ if((dsmout>>i)&1) {LOG_INFO << BIT[i] << " ";} } LOG_INFO<<endm;
224  LOG_INFO << Form("FCSBits DEP = %08x ",depout);
225  for(int i=0; i<32; i++){ if((depout>>i)&1) {LOG_INFO << BIT[i] << " ";} } LOG_INFO<<endm;
226  LOG_INFO << Form("FCSBits TCU = %08x ",tcubit);
227  for(int i=0; i<32; i++){ if((tcubit>>i)&1) {LOG_INFO << BIT[i] << " ";} } LOG_INFO<<endm;
228  }
229 
230  //Mismatch
231  LOG_INFO << Form("FCSBitsMM DEP-TCU Mismatch ");
232  for(int i=0; i<32; i++) if(((depout>> i)&1) != ((tcubit>>i)&1)) {mTcuDep->Fill(i); LOG_INFO << BIT[i] << " ";}
233  LOG_INFO<<endm;
234  LOG_INFO << Form("FCSBitsMM SIM-DEP Mismatch ");
235  for(int i=0; i<32; i++) if(((dsmout >>i)&1) != ((depout>>i)&1)) {mSimDep->Fill(i); LOG_INFO << BIT[i] << " ";}
236  LOG_INFO<<endm;
237 
238  //Tower
239  for(int det=0; det<4; det++){
240  int nhit=fcs->numberOfHits(det);
241  StSPtrVecFcsHit& hits = fcs->hits(det);
242  for (int i=0; i<nhit; i++){
243  int id = hits[i]->id();
244  int ehp = hits[i]->ehp();
245  int ns = hits[i]->ns();
246  int c = mFcsDb->getColumnNumber(det,id);
247  int r = mFcsDb->getRowNumber(det,id);
248  float cc = c * (ns*2-1);
249  float rr = - r;
250  mTow[ehp]->Fill(cc,rr,hits[i]->energy());
251  }
252  }
253 
254  unsigned int max;
255  int maxns,maxc,maxr;
256  int maxns2,maxc2,maxr2;
257  int maxns3,maxc3,maxr3;
258  int maxns4,maxc4,maxr4;
259  int maxns5,maxc5,maxr5;
260  //Ecal HT 2x2
261  for(int ns=0; ns<kFcsNorthSouth; ns++){
262  max=0;
263  for(int c=0; c<kFcsEcal4x4NCol+1; c++){
264  for(int r=0; r<kFcsEcal4x4NRow+1; r++){
265  if(trg->e2x2[ns][r][c]>max){ //find max Ecal 2x2
266  max=trg->e2x2[ns][r][c]; maxr=r; maxc=c;
267  }
268  }
269  }
270  if(max>0){
271  mEHT[ns]->Fill(max);
272  mEHTMap->Fill((maxc+1)*(ns*2-1),-maxr-1);
273  }
274  }
275 
276  //Hcal HT 2x2
277  for(int ns=0; ns<kFcsNorthSouth; ns++){
278  max=0;
279  for(int c=0; c<kFcsHcal4x4NCol+1; c++){
280  for(int r=0; r<kFcsHcal4x4NRow+1; r++){
281  if(trg->h2x2[ns][r][c]>max){ //find max Hcal 2x2
282  max=trg->h2x2[ns][r][c]; maxr=r; maxc=c;
283  }
284  }
285  }
286  if(max>0){
287  mHHT[ns]->Fill(max);
288  mHHTMap->Fill((maxc+1)*(ns*2-1),-maxr-1);
289  }
290  }
291 
292  //Ecal Tot
293  mETot[0]->Fill(trg->etot[0]);
294  mETot[1]->Fill(trg->etot[1]);
295 
296  //Hcal Tot
297  mHTot[0]->Fill(trg->htot[0]);
298  mHTot[1]->Fill(trg->htot[1]);
299 
300  //JP
301  for(int ns=0; ns<kFcsNorthSouth; ns++){
302  for(int j=0; j<5; j++){
303  if(trg->jet[ns][j]>max){ //find max JP
304  mJP[ns][j]->Fill(trg->jet[ns][j]);
305  if((trg->d_out.s2[ns].s2_to_s3[0].d[1]>>j)&0x1) mJPMap[0]->Fill((j+1)*(ns*2-1));
306  if((trg->d_out.s2[ns].s2_to_s3[1].d[1]>>j)&0x1) mJPMap[1]->Fill((j+1)*(ns*2-1));
307  if((trg->d_out.s2[ns].s2_to_s3[0].d[2]>>j)&0x1) mJPMap[2]->Fill((j+1)*(ns*2-1));
308  }
309  }
310  }
311 
312  //Ecal 4x4
313  for(int ns=0; ns<kFcsNorthSouth; ns++){
314  max=0;
315  int emmax=0, elemax=0, summax=0, hadmax=0;
316  for(int c=0; c<kFcsEcal4x4NCol; c++){
317  for(int r=0; r<kFcsEcal4x4NRow; r++){
318  int esum=trg->esum[ns][r][c];
319  int sum=trg->sum[ns][r][c];
320  if(esum>max){ //find max Ecal 4x4
321  max=esum; maxns=ns; maxr=r; maxc=c;
322  }
323  if(esum>emmax && trg->ratiomax[ns][r][c] > 1.0/(1.0+(float)trg->EM_HERATIO_THR/128)){
324  emmax=esum; maxns2=ns; maxr2=r; maxc2=c;
325  }
326  if(esum>elemax && trg->ratiomax[ns][r][c] > 1.0/(1.0+(float)trg->EM_HERATIO_THR/128) && trg->epdcoin[ns][r][c]){
327  elemax=esum; maxns3=ns; maxr3=r; maxc3=c;
328  }
329  if(sum>summax){
330  summax=sum; maxns4=ns; maxr4=r; maxc4=c;
331  }
332  if(sum>hadmax && trg->ratio[ns][r][c] < 1.0/(1.0+(float)trg->HAD_HERATIO_THR/128)){
333  hadmax=sum; maxns5=ns; maxr5=r; maxc5=c;
334  }
335  int cc=(c+1)*(ns*2-1);
336  int rr=-r-1;
337  if(esum > trg->EMTHR2) mE4x4Map[0]->Fill(cc,rr);
338  if(esum > trg->EMTHR1) mE4x4Map[1]->Fill(cc,rr);
339  if(esum > trg->EMTHR0) mE4x4Map[2]->Fill(cc,rr);
340  if(esum > trg->ELETHR2) mE4x4Map[3]->Fill(cc,rr);
341  if(trg->epdcoin[ns][r][c]){
342  if(esum > trg->ELETHR2) mELE4x4Map[0]->Fill(cc,rr);
343  if(esum > trg->ELETHR1) mELE4x4Map[1]->Fill(cc,rr);
344  }
345  if(sum > trg->HADTHR2) mEH4x4Map[0]->Fill(cc,rr);
346  if(sum > trg->HADTHR1) mEH4x4Map[1]->Fill(cc,rr);
347  if(sum > trg->HADTHR0) mEH4x4Map[2]->Fill(cc,rr);
348  }
349  }
350  if(max>0) mE4x4->Fill(max);
351  if(emmax>0) mEM4x4->Fill(emmax);
352  if(elemax>0) mELE4x4->Fill(elemax);
353  if(summax>0) mEH4x4->Fill(summax);
354  if(hadmax>0) mHAD4x4->Fill(summax);
355  if(max>0) mERatio->Fill(trg->ratiomax[maxns][maxr][maxc]);
356  if(elemax>0) mELERatio->Fill(trg->ratiomax[maxns3][maxr3][maxc3]);
357  if(summax>0) mHRatio->Fill(trg->ratio[maxns4][maxr4][maxc4]);
358  if(hadmax>0) mHADRatio->Fill(trg->ratio[maxns5][maxr5][maxc5]);
359  }
360 
361  for(int det=0; det<kFcsNDet; det++){
362  StSPtrVecFcsHit& hits = fcs->hits(det);
363  int nh=fcs->numberOfHits(det);
364  for(int i=0; i<nh; i++) mAdc[det]->Fill(hits[i]->id(),(float)hits[i]->adcSum());
365  }
366 
367  return kStOK;
368 };
369 
371  mFile->Write();
372  mFile->Close();
373  printf("StFcsTrgQaMaker::Finish - Closing %s\n",mFilename);
374  return kStOK;
375 };
376 
377 ClassImp(StFcsTrgQaMaker);
378 
379 /*
380  * $Id: StFcsTrgQaMaker.cxx,v 1.6 2021/05/30 21:41:58 akio Exp $
381  * $Log: StFcsTrgQaMaker.cxx,v $
382  * Revision 1.6 2021/05/30 21:41:58 akio
383  * A lots of update for trigger comissionong Run21 OO200
384  *
385  * Revision 1.5 2021/03/30 13:36:51 akio
386  * change to StSpinPoll for include
387  *
388  * Revision 1.4 2021/03/30 13:31:27 akio
389  * StFcsDbMAker->StFcsDB
390  *
391  * Revision 1.3 2020/07/24 17:21:31 akio
392  * adding hist for DsmOut
393  *
394  * Revision 1.2 2020/06/01 19:34:41 akio
395  * adding normarization histo
396  *
397  * Revision 1.1 2020/05/29 18:59:32 akio
398  * Initial version of FCS Trigger QA maker
399  *
400  *
401  */
virtual Int_t Finish()
int getColumnNumber(int det, int id) const
get the row number for the channel
Definition: StFcsDb.cxx:490
int getRowNumber(int det, int id) const
maximum number of id
Definition: StFcsDb.cxx:485
virtual Int_t Make()
Definition: Stypes.h:40
int maxId(int det) const
number of column
Definition: StFcsDb.cxx:468
virtual TObject * GetObject() const
The depricated method (left here for the sake of the backward compatibility)
Definition: TObjectSet.h:56
Definition: Stypes.h:44
Definition: Stypes.h:41