StFms  0.0.0
FMS software in the STAR framework
StFmsQAHistoMaker.cxx
Go to the documentation of this file.
1 #include "StFmsQAHistoMaker.h"
2 
3 #include <sstream>
4 #include <string>
5 
6 #include "StEvent/StFmsCluster.h"
7 #include "StEvent/StFmsPoint.h"
8 
9 #include "TObjArray.h"
10 #include "TFile.h"
11 #include "TH1F.h"
12 #include "TH2F.h"
13 #include <TMath.h>
14 #include "TTree.h"
15 #include "TLorentzVector.h"
16 
17 // STAR
18 #include "StMessMgr.h"
19 #include "StEventTypes.h"
20 
21 //StMuDstMaker
22 #include "StMuDSTMaker/COMMON/StMuTypes.hh"
23 #include "StMuDSTMaker/COMMON/StMuDst.h"
24 #include "StMuDSTMaker/COMMON/StMuEvent.h"
26 #include "StMuDSTMaker/COMMON/StMuEmcCollection.h"
27 #include "StMuDSTMaker/COMMON/StMuDst.h"
28 #include "StMuDSTMaker/COMMON/StMuEmcUtil.h"
29 #include "StMuDSTMaker/COMMON/StMuTrack.h"
30 #include "StMuDSTMaker/COMMON/StMuPrimaryVertex.h"
31 #include "StMuDSTMaker/COMMON/StMuTriggerIdCollection.h"
32 
33 //StEmc
34 #include "StEmcClusterCollection.h"
35 #include "StEmcPoint.h"
36 #include "StEmcUtil/geometry/StEmcGeom.h"
37 #include "StEmcUtil/others/emcDetectorName.h"
38 #include "StEmcADCtoEMaker/StBemcData.h"
39 #include "StEmcADCtoEMaker/StEmcADCtoEMaker.h"
40 #include "StEmcRawMaker/defines.h"
41 #include "StEmcRawMaker/StBemcRaw.h"
42 #include "StEmcRawMaker/StBemcTables.h"
43 #include "StEmcRawMaker/StEmcRawMaker.h"
44 #include "StEmcRawMaker/defines.h"
45 #include "StEmcUtil/database/StBemcTables.h"
46 
47 //EEMC
48 #include "StEEmcUtil/database/StEEmcDb.h"
49 #include "StEEmcUtil/database/EEmcDbItem.h"
50 #include "StEEmcUtil/EEmcGeom/EEmcGeomSimple.h"
51 
55 
56 #include <assert.h>
57 
59 
60 StFmsQAHistoMaker::StFmsQAHistoMaker(const char* name):StMaker(name) {
61 
62  SetFmsQA();
63  SetEmcQA();
64  mEmcEt = 0.2; //Et threshold for EMC qa
65  SetTrackQA();
66 }
67 
69 
70  LOG_INFO << " StFmsQAHistoMaker:: destructor " << endm;
71 
72 /* if(hbbcratevsevt) { delete hbbcratevsevt; hbbcratevsevt = 0;}
73  if(hbunchid) { delete hbunchid; hbunchid = 0;}
74 
75  if(hfmsNhitvsevt) { delete hfmsNhitvsevt; hfmsNhitvsevt = 0;}
76  if(hfmshitEvsevt) { delete hfmshitEvsevt; hfmshitEvsevt = 0;}
77  if(hfmsNcluvsevt) { delete hfmsNcluvsevt; hfmsNcluvsevt = 0;}
78  if(hfmscluEvsevt) { delete hfmscluEvsevt; hfmscluEvsevt = 0;}
79  if(hfmsNphovsevt) { delete hfmsNphovsevt; hfmsNphovsevt = 0;}
80  if(hfmsphoEvsevt) { delete hfmsphoEvsevt; hfmsphoEvsevt = 0;}
81 // if(hfmshitEvseta) { delete hfmshitEvseta; hfmshitEvseta = 0;}
82 // if(hfmshitEvsphi) { delete hfmshitEvsphi; hfmshitEvsphi = 0;}
83  if(hfmscluEvseta) { delete hfmscluEvseta; hfmscluEvseta = 0;}
84  if(hfmscluEvsphi) { delete hfmscluEvsphi; hfmscluEvsphi = 0;}
85  if(hfmsphoEvseta) { delete hfmsphoEvseta; hfmsphoEvseta = 0;}
86  if(hfmsphoEvsphi) { delete hfmsphoEvsphi; hfmsphoEvsphi = 0;}
87 
88  if(hemcNhitvsevt) { delete hemcNhitvsevt; hemcNhitvsevt = 0;}
89  if(hemchitEvsevt) { delete hemchitEvsevt; hemchitEvsevt = 0;}
90  if(hemchitEvseta) { delete hemchitEvseta; hemchitEvseta = 0;}
91  if(hemchitEvsphi) { delete hemchitEvsphi; hemchitEvsphi = 0;}
92  if(hemchitEtvsevt) { delete hemchitEtvsevt; hemchitEtvsevt = 0;}
93  if(hemchitEtvseta) { delete hemchitEtvseta; hemchitEtvseta = 0;}
94  if(hemchitEtvsphi) { delete hemchitEtvsphi; hemchitEtvsphi = 0;}
95  if(hemchitEtavsevt) { delete hemchitEtavsevt; hemchitEtavsevt = 0;}
96  if(hemchitPhivsevt) { delete hemchitPhivsevt; hemchitPhivsevt = 0;}
97  if(hemchitEtavsphi) { delete hemchitEtavsphi; hemchitEtavsphi = 0;}
98 
99  if(htpcverzvsevt) { delete htpcverzvsevt; htpcverzvsevt = 0;}
100  if(htpcntrkvsevt) { delete htpcntrkvsevt; htpcntrkvsevt = 0;}
101  if(htpcptvsevt) { delete htpcptvsevt; htpcptvsevt = 0;}
102  if(htpcetavsevt) { delete htpcetavsevt; htpcetavsevt = 0;}
103  if(htpcphivsevt) { delete htpcphivsevt; htpcphivsevt = 0;}
104  if(htpcetavsphi) { delete htpcetavsphi; htpcetavsphi = 0;}
105 */
106 
107 }
108 
109 void StFmsQAHistoMaker::Clear( const char* opt ) {
110 
111 }
112 
113 void StFmsQAHistoMaker::SetOutputFile( Char_t* filename = "default.root" ) {
114 
115  mFilename = filename;
116 }
117 
118 Int_t StFmsQAHistoMaker::InitRun(Int_t runNumber) {
119  // Ensure we can access database information
120  StFmsDbMaker* fmsDbMaker = static_cast<StFmsDbMaker*>(GetMaker("fmsDb"));
121  if (!fmsDbMaker) {
122  return kStErr;
123  } // if
124  // Set up geometry, which stays constant for each run
125  if (!mGeometry.initialize(fmsDbMaker)) {
126  // Return an error if geometry initialization fails
127  return kStErr;
128  } // if
129  return StMaker::InitRun(runNumber);
130 }
131 
132 namespace {
133 template<class Histogram>
134 Histogram* duplicate(const Histogram& histogram, const TString& name,
135  const TString& title) {
136  Histogram* copy = static_cast<Histogram*>(histogram.Clone(name));
137  copy->SetTitle(title);
138  return copy;
139 }
140 } // namespace
141 
143  LOG_INFO << "StFmsQAHistoMaker::Init() " << endm;
144  if (mEmcQA) {
145  // If data, StEmcADCtoEMaker will be in the chain
146  if (StEmcADCtoEMaker* adc2e = (StEmcADCtoEMaker*)StMaker::GetChain()->GetMakerInheritsFrom("StEmcADCtoEMaker")) {
147  mBemcTables = adc2e->getBemcData()->getTables();
148  } // if
149  assert(mBemcTables);
150  } // if
151  mFile = new TFile(mFilename,"recreate");
152  assert(mFile);
153 
154  hbbcratevsevt = new TH2F("hbbcratevsevt","bbc coincidence rate vs event number",2e3,0,2e6,500,1e6,4e6);
155  hbunchid = new TH1F("hbunchid","bunchXing id",120,0,120);
156  if(mFmsQA){
157  hfmsNhitvsevt = new TH2F("hfmsNhitvsevt","FMS #hits vs event number",2e3,0,2e6,1264,0,1264);
158  hfmshitEvsevt = new TH2F("hfmshitEvsevt","FMS hit energy vs event number",2e3,0,2e6,250,0,250);
159  hfmsNcluvsevt = new TH2F("hfmsNcluvsevt","FMS #clusters vs event number",2e3,0,2e6,50,0,50);
160  hfmscluEvsevt = new TH2F("hfmscluEvsevt","FMS cluster energy vs event number",2e3,0,2e6,250,0,250);
161  hfmsNphovsevt = new TH2F("hfmsNphovsevt","FMS #photons vs event number",2e3,0,2e6,50,0,50);
162  hfmsphoEvsevt = new TH2F("hfmsphoEvsevt","FMS photon energy vs event number",2e3,0,2e6,250,0,250);
163  // hfmshitEvseta = new TH2F("hfmshitEvseta","FMS hit energy vs eta",100,2.5,4.5,250,0,250);
164  // hfmshitEvsphi = new TH2F("hfmshitEvsphi","FMS hit energy vs phi",100,-TMath::Pi(),TMath::Pi(),250,0,250);
165  hfmshitEvsChannel = new TH2F("hfmshitEvsChannel", "StEvent FMS hit energy vs channel", 300, 0, 600, 250, 0.1, 250);
166  // Create via clone to ensure identical binning
167  hmufmshitEvsChannel = static_cast<TH2F*>(hfmshitEvsChannel->Clone("hmufmshitEvsChannel"));
168  hmufmshitEvsChannel->SetTitle("StMuDst FMS hit energy vs channel");
169  hmufms1stHitEvsChannel = static_cast<TH2F*>(hmufmshitEvsChannel->Clone("hmufms1stHitEvsChannel"));
170  hmufms1stHitEvsChannel->SetTitle("StMuDst FMS 1st hit in cluster energy vs channel");
171  hmufmsClusterHitEvsChannel = duplicate(
172  *hmufmshitEvsChannel, "hmufmsClusterHitEvsChannel",
173  "StMuDst FMS all hits in clusters energy vs channel");
174  hmufmsNHitsPerCluster = new TH1F("hmufmsNHitsPerCluster", "Hits per cluster",
175  20, 0, 20);
176  hfmscluEvseta = new TH2F("hfmscluEvseta","FMS cluster energy vs eta",100,2.5,4.5,250,0,250);
177  hmufmscluEvseta = static_cast<TH2F*>(hfmscluEvseta->Clone("hmufmscluEvseta"));
178  hmufmscluEvseta->SetTitle("StMuDst FMS cluster energy vs eta");
179  hfmscluEvsphi = new TH2F("hfmscluEvsphi","FMS cluster energy vs phi",100,-TMath::Pi(),TMath::Pi(),250,0,250);
180  hmufmscluEvsphi = static_cast<TH2F*>(hfmscluEvsphi->Clone("hmufmscluEvsphi"));
181  hmufmscluEvsphi->SetTitle("StMuDst FMS cluster energy vs phi");
182  hfmsphoEvseta = new TH2F("hfmsphoEvseta","FMS photon energy vs eta",100,2.5,4.5,250,0,250);
183  hmufmsphoEvseta = static_cast<TH2F*>(hfmsphoEvseta->Clone("hmufmsphoEvseta"));
184  hmufmsphoEvseta->SetTitle("StMuDst FMS photon energy vs eta");
185  hmufms1stphoEvseta = static_cast<TH2F*>(hmufmsphoEvseta->Clone("hmufms1stphoEvseta"));
186  hmufms1stphoEvseta->SetTitle("StMuDst FMS 1st photon in cluster energy vs eta");
187  hfmsphoEvsphi = new TH2F("hfmsphoEvsphi","FMS photon energy vs phi",100,-TMath::Pi(),TMath::Pi(),250,0,250);
188  hmufmsphoEvsphi = static_cast<TH2F*>(hfmsphoEvsphi->Clone("hmufmsphoEvsphi"));
189  hmufmsphoEvsphi->SetTitle("StMuDst FMS photon energy vs phi");
190  hmufmsPairMass = new TH1F("hmufmsPairMass", "#gamma-pair invariant mass (GeV)", 100, 0., 1.);
191  for (int nstb(1); nstb < 5; ++nstb) {
192  std::ostringstream oss;
193  oss << "hfmsy0x0_" << nstb;
194  TH2F* hist = new TH2F(oss.str().c_str(), ";local row;local column",
195  18, 0, 18, 36, 0, 36);
196  hfmsy0x0.insert(std::make_pair(nstb, hist));
197  oss.str("");
198  oss << "Row vs. column, NSTB = " << nstb;
199  hfmsy0x0[nstb]->SetTitle(oss.str().c_str());
200  } // for
201  }
202  if(mEmcQA){
203  // hemcNhitvsevt = new TH2F("hemcNhitvsevt","EMC #towers vs event number",2e3,0,2e6,5520,0,5520);
204  // hemchitEvsevt = new TH2F("hemchitEvsevt","EMC tower energy vs event number",2e3,0,2e6,250,0,250);
205  // hemchitEvseta = new TH2F("hemchitEvseta","EMC tower energy vs eta",300,-1,2,250,0,250);
206  // hemchitEvsphi = new TH2F("hemchitEvsphi","EMC tower energy vs phi",100,-TMath::Pi(),TMath::Pi(),250,0,250);
207  hbemchitEtvsevt = new TH2F("hbemchitEtvsevt","BEMC tower Et vs event number",2e3,0,2e6,250,0,250);
208  heemchitEtvsevt = new TH2F("heemchitEtvsevt","EEMC tower Et vs event number",2e3,0,2e6,250,0,250);
209  hbemchitAdcvsevt = new TH2F("hbemchitAdcvsevt","BEMC tower Adc vs event number",2e3,0,2e6,4096,0,4096);
210  heemchitAdcvsevt = new TH2F("heemchitAdcvsevt","EEMC tower Adc vs event number",2e3,0,2e6,4096,0,4096);
211  hbemchitIdvsevt = new TH2F("hbemchitIdvsevt","BEMC tower Id vs event number",2e3,0,2e6,4800,0,4800);
212  heemchitIdvsevt = new TH2F("heemchitIdvsevt","EEMC tower Id vs event number",2e3,0,2e6,720,0,720);
213  // hemchitEtvseta = new TH2F("hemchitEtvseta","EMC tower Et vs eta",300,-1,2,250,0,250);
214  // hemchitEtvsphi = new TH2F("hemchitEtvsphi","EMC tower Et vs phi",100,-TMath::Pi(),TMath::Pi(),250,0,250);
215  hbemchitAdcvsid = new TH2F("hbemchitAdcvsid","BEMC tower Adc vs Id",4800,0,4800,4096,0,4096);
216  heemchitAdcvsid = new TH2F("heemchitAdcvsid","EEMC tower Adc vs Id",720,0,720,4096,0,4096);
217  hbemchitEtvsid = new TH2F("hbemchitEtvsid","BEMC tower Et vs Id",4800,0,4800,500,0,250);
218  heemchitEtvsid = new TH2F("heemchitEtvsid","EEMC tower Et vs Id",720,0,720,500,0,250);
219  hbemchitEtvseta = new TH2F("hbemchitEtvseta","BEMC tower Et vs eta",300,-1,2,250,0,250);
220  hbemchitEtvsphi = new TH2F("hbemchitEtvsphi","BEMC tower Et vs phi",120,-TMath::Pi(),TMath::Pi(),250,0,250);
221  heemchitEtvseta = new TH2F("heemchitEtvseta","EEMC tower Et vs eta",300,-1,2,250,0,250);
222  heemchitEtvsphi = new TH2F("heemchitEtvsphi","EEMC tower Et vs phi",120,-TMath::Pi(),TMath::Pi(),250,0,250);
223  // hemchitEtavsevt = new TH2F("hemchitEtavsevt","EMC hit eta vs event number",2e3,0,2e6,300,-1,2);
224  // hemchitPhivsevt = new TH2F("hemchitPhivsevt","EMC hit phi vs event number",2e3,0,2e6,100,-TMath::Pi(),TMath::Pi());
225  // hemchitEtavsphi = new TH2F("hemchitEtavsphi","EMC hit eta vs phi",100,-TMath::Pi(),TMath::Pi(),300,-1,2);
226  hbemchitEtavsphi = new TH2F("hbemchitEtavsphi","BEMC hit eta vs phi",120,-TMath::Pi(),TMath::Pi(),300,-1,2);
227  heemchitEtavsphi = new TH2F("heemchitEtavsphi","EEMC hit eta vs phi",120,-TMath::Pi(),TMath::Pi(),300,-1,2);
228  }
229  if(mTrackQA){
230  htpcverzvsevt = new TH2F("htpcverzvsevt","TPC vertex z vs event number",2e3,0,2e6,200,-100,100);
231  htpcntrkvsevt = new TH2F("htpcntrkvsevt","TPC #tracks vs event numer",2e3,0,2e6,100,0,100);
232  htpcptvsevt = new TH2F("htpcptvsevt","TPC track pT vs event number",2e3,0,2e6,100,0,100);
233  htpcetavsevt = new TH2F("htpcetavsevt","TPC track eta vs event number",2e3,0,2e6,100,-2,2);
234  htpcphivsevt = new TH2F("htpcphivsevt","TPC track phi vs event number",2e3,0,2e6,100,-TMath::Pi(),TMath::Pi());
235  htpcetavsphi = new TH2F("htpcetavsphi","TPC track eta vs phi",100,-TMath::Pi(),TMath::Pi(),100,-2,2);
236  }
237  mEeDb = (StEEmcDb*)StMaker::GetChain()->GetDataSet("StEEmcDb");
238  if(!mEeDb){
239  LOG_ERROR << "StEEmcDb not found " <<endm;
240  return kStErr;
241  }
242 
243  if(mEeDb) mEeDb->setThreshold(3);
244 // LOG_INFO << "StFmsQAHistoMaker Init() finished.." << endm;
245  return kStOk;
246 }
247 
248 
250 
251 // LOG_INFO << "StFmsQAHistoMaker::Make(): mFmsQA = "<<mFmsQA<<", mEmcQA = "<<mEmcQA<<", mTrackQA = "<<mTrackQA << endm;
252  StMuDst* muDst = (StMuDst*)GetInputDS("MuDst");
253  if(!muDst){
254  LOG_WARN << "StFmsQAHistoMaker::Make() no MuDst" << endm;
255  return kStWarn;
256  }
257 
258  Rnum = muDst->event()->runNumber();
259  ievt = muDst->event()->eventNumber();
260 
261  //remove FMS LED events;
262  Bool_t checkLed = 0;
263  if (muDst->event()->triggerIdCollection().nominal().isTrigger(320225))checkLed = true;
264 
265  Bool_t LedEvent = false;
266  StL0Trigger& l0 = muDst->event()->l0Trigger();
267  UInt_t mLedBit = l0.lastDsmArray(4);
268  if(mLedBit & 0x0001) LedEvent = true;
269 
270  if(checkLed||LedEvent){
271  LOG_INFO << " FMS LED fired, abort " <<endm;
272  return kStOk;
273  }
274 
275  StRunInfo* runInfo = &(muDst->event()->runInfo());
276  Int_t fillnumber = runInfo->beamFillNumber(blue);
277  Int_t bunchid = l0.bunchCrossingId7bit(Rnum);
278  Int_t bbccoincrate = runInfo->bbcCoincidenceRate();
279 
280  hbbcratevsevt->Fill(ievt,bbccoincrate);
281  hbunchid->Fill(bunchid);
282 
283  if(mFmsQA){
284  fmsEventQa();
285  fmsMuDstQa();
286  }//mFmsQA
287 // LOG_INFO << "begin reading EMC" << endm;
288  if(mEmcQA){
289 
290  StEvent *mEvent = static_cast<StEvent*>(this->GetDataSet("StEvent"));
291  if(!mEvent){
292  LOG_ERROR << " no StEvent " << endm;
293  return kStErr;
294  }
295 
296  StEmcGeom* geom = StEmcGeom::instance("bemc"); // for towers
297  if (!geom) LOG_WARN << " No StEmcGeom!" << endm;
298  assert(geom);
299  StEmcCollection *emc = mEvent->emcCollection();
300  if (!emc) LOG_WARN << " No StEmcCollection" << endm;
301  assert(emc);
302  Int_t emcnhits = 0;
303  Float_t Etcut = mEmcEt; //GeV, only look at hits with Et > 0.2 GeV
304 // LOG_INFO <<" Et cut = "<<Etcut<<endm;
305  //barrel
306  StEmcDetector* detector = emc->detector(kBarrelEmcTowerId);
307  if (!detector) LOG_WARN << " No StEmcDetector!" << endm;
308  if (detector) {
309 
310  for(Int_t m = 1; m <= 120; m++){
311  StEmcModule* module = detector->module(m);
312  if(module){
313  StSPtrVecEmcRawHit& rawHit=module->hits();
314  // emcnhits += rawHit.size();
315  for(UInt_t k = 0; k < rawHit.size(); ++k){
316  if(rawHit[k]){
317  // LOG_INFO <<" bemc k = "<<k<<endm;
318  Int_t did;
319  Int_t m=rawHit[k]->module();
320  Int_t e=rawHit[k]->eta();
321  Int_t s=abs(rawHit[k]->sub());
322  Int_t adc=rawHit[k]->adc();
323  Float_t energy=rawHit[k]->energy();
324 
325  Float_t tower_eta, tower_phi;
326  geom->getId(m,e,s,did);
327  geom->getEtaPhi(did,tower_eta,tower_phi); // to convert software id into eta/phi
328  /* LOG_INFO <<" did = "<<did<<", tower_eta = "<<tower_eta<<", tower_phi = "<<tower_phi<<endm;
329  //2nd way
330  float towerX, towerY, towerZ;
331  StEmcGeom::instance("bemc")->getXYZ(did, towerX, towerY, towerZ);
332  TVector3 tower(towerX, towerY, towerZ);
333  Float_t tmpeta = tower.Eta();
334  Float_t tmpphi = tower.Phi();
335  LOG_INFO <<" tmpeta = "<<tmpeta<<", tmpphi = "<<tmpphi<<endm; */
336 
337  Float_t Et = (energy/cosh(tower_eta));
338 
339  Float_t pedestal;
340  Float_t rms;
341  Int_t status;
342  Int_t CAP(0);
343  mBemcTables->getPedestal(BTOW,did,CAP,pedestal,rms);
344  mBemcTables->getStatus(BTOW,did,status);
345  //same condition as jet finder
346  if(status!=1)continue;
347  if(Et<Etcut)continue;
348  if(adc-pedestal <= 4 )continue;
349  if(adc-pedestal <= 3*rms)continue;
350  // hemchitEvsevt->Fill(ievt,energy);
351  // hemchitEvseta->Fill(tower_eta,energy);
352  // hemchitEvsphi->Fill(tower_phi,energy);
353  hbemchitAdcvsevt->Fill(ievt,(adc-pedestal));
354  hbemchitEtvsevt->Fill(ievt,Et);
355  hbemchitIdvsevt->Fill(ievt,did);
356  // hemchitEtvseta->Fill(tower_eta,Et);
357  // hemchitEtvsphi->Fill(tower_phi,Et);
358  hbemchitEtvseta->Fill(tower_eta,Et);
359  hbemchitEtvsphi->Fill(tower_phi,Et);
360  // hemchitEtavsevt->Fill(ievt,tower_eta);
361  // hemchitPhivsevt->Fill(ievt,tower_phi);
362  // hemchitEtavsphi->Fill(tower_phi,tower_eta);
363  hbemchitEtavsphi->Fill(tower_phi,tower_eta);
364  hbemchitAdcvsid->Fill(did,adc);
365  // hbemchitPedvsid->Fill(did,pedestal);
366  // hbemchitPedRmsvsid->Fill(did,rms);
367  hbemchitEtvsid->Fill(did,Et);
368  emcnhits++;
369  // LOG_INFO <<"pedestal = "<<pedestal<<", rms = "<<rms<<", status = "<<status<<endm;
370 
371  }
372  }
373  }
374  }
375  }
376 
377  //endcap --only include towers which passed basic EEMC QA ( accepted by the jet maker )
378  StMuEmcCollection* muEmc = StMuDst::muEmcCollection();
379  for (Int_t id = 0; id < muEmc->getNEndcapTowerADC(); ++id) {
380  // LOG_INFO<<"eemc id = "<<id<<endm;
381  Int_t rawadc, sec, sub, etabin;
382  muEmc->getEndcapTowerADC(id, rawadc, sec, sub, etabin);
383 
384  // Sanity check
385  if (rawadc < 0 || rawadc >= 4095) continue;
386 
387  assert(1 <= sec && sec <= 12);
388  assert(1 <= sub && sub <= 5);
389  assert(1 <= etabin && etabin <= 12);
390 
391  const EEmcDbItem *dbItem = mEeDb->getT(sec,sub-1+'A',etabin);
392  if(dbItem->fail) continue; //drop broken channels
393  if(dbItem->stat) continue; // drop not working channels and jumpy pedestal channels
394  if(dbItem->gain<=0.) continue; // drop it, unless you work with ADC spectra
395  if(rawadc<dbItem->thr) continue; // drop raw ADC < ped+N*sigPed, N==3 in init
396  Double_t adc = rawadc - (dbItem->ped);
397  //same as jet finder
398  if(adc <= 4)continue;
399  if(adc <= 3*dbItem->sigPed)continue;
400  Double_t energy = adc/(dbItem->gain);
401  const EEmcGeomSimple& geom = EEmcGeomSimple::Instance();
402  TVector3 towerLocation = geom.getTowerCenter(sec-1,sub-1,etabin-1);
403  Float_t eemc_eta = towerLocation.Eta();
404  Float_t eemc_phi = towerLocation.Phi();
405  Float_t Et_eemc = (energy/cosh(towerLocation.Eta()));
406 
407  /*
408  //to make eemc_id = 175;
409  Int_t tmpsec = 3;
410  Int_t tmpsub = 5;
411  Int_t tmpetabin = 8;
412  */
413  /* //to make eemc_id = 548;
414  Int_t tmpsec = 10;
415  Int_t tmpsub = 1;
416  Int_t tmpetabin = 9;
417 
418  TVector3 tmploc = geom.getTowerCenter(tmpsec-1,tmpsub-1,tmpetabin-1);
419  Float_t tmpeta = tmploc.Eta();
420  Float_t tmpphi = tmploc.Phi();
421  // LOG_INFO <<"========== EEMC_id = 175, eta = "<<tmpeta<<", phi = "<<tmpphi << endm;
422  // LOG_INFO <<"========== EEMC_id = 548, eta = "<<tmpeta<<", phi = "<<tmpphi << endm;
423  */
424 
425  if(Et_eemc < Etcut)continue;
426  Int_t eemc_id = (sec-1)*60+(sub-1)*12+(etabin-1);
427 
428  // hemchitEvsevt->Fill(ievt,energy);
429  // hemchitEvseta->Fill(eemc_eta,energy);
430  // hemchitEvsphi->Fill(eemc_phi,energy);
431  heemchitEtvsevt->Fill(ievt,Et_eemc);
432  heemchitAdcvsevt->Fill(ievt,adc);
433  heemchitIdvsevt->Fill(ievt,eemc_id);
434  heemchitEtvseta->Fill(eemc_eta,Et_eemc);
435  heemchitEtvsphi->Fill(eemc_phi,Et_eemc);
436  // hemchitEtavsevt->Fill(ievt,eemc_eta);
437  // hemchitPhivsevt->Fill(ievt,eemc_phi);
438  heemchitEtavsphi->Fill(eemc_phi,eemc_eta);
439  heemchitEtvsid->Fill(eemc_id,Et_eemc);
440  heemchitAdcvsid->Fill(eemc_id,adc);
441 
442  emcnhits++;
443  }
444 
445  // hemcNhitvsevt->Fill(ievt,emcnhits);
446  // LOG_INFO << "debug ievt = "<<ievt<<", emcnhits = "<<emcnhits<<endm;
447 
448 
449  }//mEmcQA
450 
451  if(mTrackQA){
452 
453  Float_t vertex_z_cut = 60.0; //cm
454 
455  Int_t nVertices = muDst->numberOfPrimaryVertices();
456  for(Int_t j = 0; j < nVertices; j++){
457 
458  StMuPrimaryVertex* vertex = muDst->primaryVertex(j);
459  assert(vertex);
460  muDst->setVertexIndex(j);
461  StThreeVectorF r = vertex->position();
462  Float_t verz = r.z();
463  if(vertex->ranking() < 0 || j > 1)continue;
464  htpcverzvsevt->Fill(ievt,verz); //after ranking cut
465  if(fabs(r.z()) > vertex_z_cut) continue; //skip bad vertices
466  Int_t nTracks = muDst->GetNPrimaryTrack();
467  htpcntrkvsevt->Fill(ievt,nTracks);
468  for(Int_t i = 0; i < nTracks; i++){
469 
470  StMuTrack* track = muDst->primaryTracks(i);
471  assert(track);
472  StThreeVectorF momentum = track->momentum();
473  Bool_t flagTrack = isUsableTrack(*track);
474  if(flagTrack == false)continue;
475  Float_t trackpT = track->pt();
476  Float_t trackEta = track->eta();
477  Float_t trackPhi = track->phi();
478  htpcptvsevt->Fill(ievt,trackpT);
479  htpcetavsevt->Fill(ievt,trackEta);
480  htpcphivsevt->Fill(ievt,trackPhi);
481  htpcetavsphi->Fill(trackPhi,trackEta);
482 
483  }
484  }
485  }//mTrackQA
486 
487  return kStOk;
488 }
489 
491  mFile->cd();
492  TH2F* diffEvsChannel = static_cast<TH2F*>(hfmshitEvsChannel->Clone("diffEvsChannel"));
493  diffEvsChannel->Add(hmufmshitEvsChannel, -1.);
494  diffEvsChannel->SetOption();
495  mFile->Write();
496  mFile->Close();
497 
498  return kStOk;
499 }
500 
501 Bool_t StFmsQAHistoMaker::isUsableTrack(const StMuTrack& track)
502 {
503  if(track.flag() < 0)
504  return false;
505 
506  if(track.dcaGlobal().mag()> 3.)
507  return false;
508 
509  int dcaFlag = 1;
510  if(true){
511  Double_t limit = 3.-2.*track.pt();
512  if(!((track.pt()<0.5&&track.dcaGlobal().mag()<=2.)||
513  ((track.pt()>=0.5&&track.pt()<1.0)&&track.dcaGlobal().mag()<=limit)||(track.pt()>=1.0&&track.dcaGlobal().mag()<=1.0))) dcaFlag =0;
514  }
515  if(dcaFlag == 0)
516  return false;
517  if (track.topologyMap().trackFtpcEast() || track.topologyMap().trackFtpcWest()) {
518  return false;
519  }
520  // if(track->eta() < GetEtaLow()) { //GetEtaLow defined in StFourPMaker.cxx
521  // return false;
522  // }
523  // if(track->eta() > GetEtaHigh()) {
524  // return false;
525  // }
526  if(static_cast<double>(track.nHits())/static_cast<double>(track.nHitsPoss()) < .51)
527  return false;
528 
529 
530  return true;
531 }
532 
534  StEvent *event = static_cast<StEvent*>(GetDataSet("StEvent"));
535  if(!event){
536  LOG_ERROR << " no StEvent " << endm;
537  return;
538  }
539  StFmsCollection* fmsCollection = event->fmsCollection();
540  if (!fmsCollection) {
541  LOG_ERROR << "StFmsQAHistoMaker did not find "
542  << "an StFmsCollection in StEvent" << endm;
543  return;
544  } // if
545  const StSPtrVecFmsHit& fmshits = fmsCollection->hits();
546  const StSPtrVecFmsCluster& fmsclusters = fmsCollection->clusters();
547  hfmsNcluvsevt->Fill(ievt,fmsclusters.size());
548  const StSPtrVecFmsPoint& fmspoints = fmsCollection->points();
549  Int_t nphotons = fmspoints.size();
550  Int_t nhits = 0;
551  for (StSPtrVecFmsHitConstIterator i = fmshits.begin(); i != fmshits.end(); ++i) {
552  StFmsHit* hit = *i;
553  if (hit->detectorId() >= 8 && hit->detectorId() <= 11 && hit->adc() > 0) {
554  hfmshitEvsChannel->Fill(hit->channel(), hit->energy());
555  } // if
556  } // for
557  for(StSPtrVecFmsClusterConstIterator iclu = fmsclusters.begin(); iclu != fmsclusters.end(); iclu++){
558  nhits += (*iclu)->nTowers();
559  Float_t clusterE = (*iclu)->energy();
560  hfmscluEvsevt->Fill(ievt,clusterE);
561  Float_t clusterEta = ((*iclu)->fourMomentum()).Eta();
562  Float_t clusterPhi = ((*iclu)->fourMomentum()).Phi();
563  hfmscluEvseta->Fill(clusterEta,clusterE);
564  hfmscluEvsphi->Fill(clusterPhi,clusterE);
565  const int nstb = (*iclu)->detectorId();
566  if (hfmsy0x0.find(nstb) != hfmsy0x0.end()) {
567  if ((*iclu)->x() > 0. && (*iclu)->y() > 0.) {
568  hfmsy0x0[nstb]->Fill((*iclu)->x(), (*iclu)->y());
569  } // if
570  } // if
571  //loop over hits
572  for(StPtrVecFmsHitConstIterator ihit = (*iclu)->hits().begin(); ihit != (*iclu)->hits().end(); ihit++){
573  Float_t hitE = (*ihit)->energy();
574  hfmshitEvsevt->Fill(ievt,hitE);
575  }
576  }
577  for(StSPtrVecFmsPointConstIterator ipts = fmspoints.begin(); ipts != fmspoints.end(); ipts++){
578  Float_t photonE = (*ipts)->energy();
579  hfmsphoEvsevt->Fill(ievt,photonE);
580  Float_t photonEta = ((*ipts)->fourMomentum()).Eta();
581  Float_t photonPhi = ((*ipts)->fourMomentum()).Phi();
582  hfmsphoEvseta->Fill(photonEta,photonE);
583  hfmsphoEvsphi->Fill(photonPhi,photonE);
584  }
585  hfmsNhitvsevt->Fill(ievt,nhits);
586  hfmsNphovsevt->Fill(ievt,nphotons);
587 }
588 
590  StMuDst* muDst = (StMuDst*)GetInputDS("MuDst");
591  if(!muDst){
592  return;
593  } // if
594  // Fill histograms using hits from StMuDst
595  StMuFmsCollection* mufmsCollection = muDst->muFmsCollection();
596  for (int i(0); i < mufmsCollection->numberOfHits(); ++i) {
597  StMuFmsHit* hit = mufmsCollection->getHit(i);
598  if (hit->detectorId() >= 8 && hit->detectorId() <= 11 && hit->adc() > 0) {
599  hmufmshitEvsChannel->Fill(hit->channel(), hit->energy());
600  } // if
601  } // for
602  for (int i(0); i < mufmsCollection->numberOfClusters(); ++i) {
603  StMuFmsCluster* cluster = mufmsCollection->getCluster(i);
604  if (cluster) {
605  hmufmsNHitsPerCluster->Fill(cluster->hits()->GetEntries());
607  cluster->x(), cluster->y(), cluster->detectorId());
608  hmufmscluEvseta->Fill(xyz.Eta(), cluster->energy());
609  hmufmscluEvsphi->Fill(xyz.Phi(), cluster->energy());
610  // Loop over hits in the cluster and fill histograms
611  for (int j(0); j < cluster->hits()->GetEntries(); ++j) {
612  StMuFmsHit* hit = static_cast<StMuFmsHit*>(cluster->hits()->At(j));
613  if (hit) {
614  if (j == 0) {
615  hmufms1stHitEvsChannel->Fill(hit->channel(), hit->energy());
616  } // if
617  hmufmsClusterHitEvsChannel->Fill(hit->channel(), hit->energy());
618  } // if
619  } // for
620  StMuFmsPoint* point = static_cast<StMuFmsPoint*>(cluster->photons()->At(0));
621  if (point) {
622  TVector3 xyz = TVector3(point->x(), point->y(),
623  mGeometry.z(point->detectorId()));
624  hmufms1stphoEvseta->Fill(xyz.Eta(), point->energy());
625  } // if
626  } // if
627  } // for
628  for (int i(0); i < mufmsCollection->numberOfPoints(); ++i) {
629  StMuFmsPoint* point = mufmsCollection->getPoint(i);
630  TVector3 xyz = TVector3(point->x(), point->y(),
631  mGeometry.z(point->detectorId()));
632  hmufmsphoEvseta->Fill(xyz.Eta(), point->energy());
633  hmufmsphoEvsphi->Fill(xyz.Phi(), point->energy());
634  // Loop over other photons and make pairs
635  for (int j(i + 1); j < mufmsCollection->numberOfPoints(); ++j) {
636  TLorentzVector p = mufmsCollection->getPoint(i)->fourMomentum() +
637  mufmsCollection->getPoint(j)->fourMomentum();
638  hmufmsPairMass->Fill(p.M());
639  } // for
640  } // for
641 }
642 
643 /*
644 void StFmsQAHistoMaker::SetFmsPhotonEcut ( Float_t ecutsmall, Float_t ecutlarge ) {
645 
646  mFmsEcutSmall = ecutsmall;
647  mFmsEcutLarge = ecutlarge;
648 }
649 */
650 
TRefArray * photons()
Bool_t initialize(StFmsDbMaker *fmsDbMaker)
Declaration of StMuFmsPoint, the MuDST FMS "point" class.
unsigned int numberOfPoints() const
float energy() const
float energy() const
TRefArray * hits()
float x() const
Declaration of StFmsCluster, a group of adjacent FMS hits.
unsigned int numberOfClusters() const
UShort_t detectorId() const
float energy() const
Definition: StMuFmsPoint.h:44
unsigned short adc() const
StMuFmsCluster * getCluster(int index)
ClassImp(StFmsQAHistoMaker) StFmsQAHistoMaker
StBemcTables * mBemcTables
float y() const
unsigned short channel() const
StSPtrVecFmsPoint & points()
Declaration of StFmsPoint, the StEvent FMS photon structure.
TLorentzVector fourMomentum(float m=0.f) const
float x() const
Definition: StMuFmsPoint.h:46
UShort_t detectorId() const
Definition: StMuFmsPoint.h:42
unsigned int numberOfHits() const
void Clear(const char *opt="")
FMSCluster::StFmsGeometry mGeometry
Float_t z(Int_t detectorId) const
StSPtrVecFmsHit & hits()
Declaration of StMuFmsCluster, the MuDST FMS cluster class.
TH2F * hmufmsClusterHitEvsChannel
Int_t InitRun(Int_t runNumber)
void SetOutputFile(Char_t *filename)
StMuFmsPoint * getPoint(int index)
std::map< int, TH2F * > hfmsy0x0
Bool_t isUsableTrack(const StMuTrack &track)
TVector3 columnRowToGlobalCoordinates(Double_t column, Double_t row, Int_t detectorId) const
StSPtrVecFmsCluster & clusters()
float y() const
Definition: StMuFmsPoint.h:48
unsigned short detectorId() const
StMuFmsHit * getHit(int hitId)