15 #include "TLorentzVector.h"
18 #include "StMessMgr.h"
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"
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"
48 #include "StEEmcUtil/database/StEEmcDb.h"
49 #include "StEEmcUtil/database/EEmcDbItem.h"
50 #include "StEEmcUtil/EEmcGeom/EEmcGeomSimple.h"
70 LOG_INFO <<
" StFmsQAHistoMaker:: destructor " << endm;
129 return StMaker::InitRun(runNumber);
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);
143 LOG_INFO <<
"StFmsQAHistoMaker::Init() " << endm;
146 if (StEmcADCtoEMaker* adc2e = (StEmcADCtoEMaker*)StMaker::GetChain()->GetMakerInheritsFrom(
"StEmcADCtoEMaker")) {
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);
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);
165 hfmshitEvsChannel =
new TH2F(
"hfmshitEvsChannel",
"StEvent FMS hit energy vs channel", 300, 0, 600, 250, 0.1, 250);
173 "StMuDst FMS all hits in clusters energy vs channel");
176 hfmscluEvseta =
new TH2F(
"hfmscluEvseta",
"FMS cluster energy vs eta",100,2.5,4.5,250,0,250);
179 hfmscluEvsphi =
new TH2F(
"hfmscluEvsphi",
"FMS cluster energy vs phi",100,-TMath::Pi(),TMath::Pi(),250,0,250);
182 hfmsphoEvseta =
new TH2F(
"hfmsphoEvseta",
"FMS photon energy vs eta",100,2.5,4.5,250,0,250);
187 hfmsphoEvsphi =
new TH2F(
"hfmsphoEvsphi",
"FMS photon energy vs phi",100,-TMath::Pi(),TMath::Pi(),250,0,250);
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));
198 oss <<
"Row vs. column, NSTB = " << nstb;
199 hfmsy0x0[nstb]->SetTitle(oss.str().c_str());
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);
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);
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);
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);
237 mEeDb = (StEEmcDb*)StMaker::GetChain()->GetDataSet(
"StEEmcDb");
239 LOG_ERROR <<
"StEEmcDb not found " <<endm;
252 StMuDst* muDst = (StMuDst*)GetInputDS(
"MuDst");
254 LOG_WARN <<
"StFmsQAHistoMaker::Make() no MuDst" << endm;
258 Rnum = muDst->event()->runNumber();
259 ievt = muDst->event()->eventNumber();
263 if (muDst->event()->triggerIdCollection().nominal().isTrigger(320225))checkLed =
true;
265 Bool_t LedEvent =
false;
266 StL0Trigger& l0 = muDst->event()->l0Trigger();
267 UInt_t mLedBit = l0.lastDsmArray(4);
268 if(mLedBit & 0x0001) LedEvent =
true;
270 if(checkLed||LedEvent){
271 LOG_INFO <<
" FMS LED fired, abort " <<endm;
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();
290 StEvent *mEvent =
static_cast<StEvent*
>(this->GetDataSet(
"StEvent"));
292 LOG_ERROR <<
" no StEvent " << endm;
296 StEmcGeom* geom = StEmcGeom::instance(
"bemc");
297 if (!geom) LOG_WARN <<
" No StEmcGeom!" << endm;
299 StEmcCollection *emc = mEvent->emcCollection();
300 if (!emc) LOG_WARN <<
" No StEmcCollection" << endm;
306 StEmcDetector* detector = emc->detector(kBarrelEmcTowerId);
307 if (!detector) LOG_WARN <<
" No StEmcDetector!" << endm;
310 for(Int_t m = 1; m <= 120; m++){
311 StEmcModule* module = detector->module(m);
313 StSPtrVecEmcRawHit& rawHit=module->hits();
315 for(UInt_t k = 0; k < rawHit.size(); ++k){
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();
325 Float_t tower_eta, tower_phi;
326 geom->getId(m,e,s,did);
327 geom->getEtaPhi(did,tower_eta,tower_phi);
337 Float_t Et = (energy/cosh(tower_eta));
343 mBemcTables->getPedestal(BTOW,did,CAP,pedestal,rms);
346 if(status!=1)
continue;
347 if(Et<Etcut)
continue;
348 if(adc-pedestal <= 4 )
continue;
349 if(adc-pedestal <= 3*rms)
continue;
378 StMuEmcCollection* muEmc = StMuDst::muEmcCollection();
379 for (Int_t
id = 0;
id < muEmc->getNEndcapTowerADC(); ++id) {
381 Int_t rawadc, sec, sub, etabin;
382 muEmc->getEndcapTowerADC(
id, rawadc, sec, sub, etabin);
385 if (rawadc < 0 || rawadc >= 4095)
continue;
387 assert(1 <= sec && sec <= 12);
388 assert(1 <= sub && sub <= 5);
389 assert(1 <= etabin && etabin <= 12);
391 const EEmcDbItem *dbItem =
mEeDb->getT(sec,sub-1+
'A',etabin);
392 if(dbItem->fail)
continue;
393 if(dbItem->stat)
continue;
394 if(dbItem->gain<=0.)
continue;
395 if(rawadc<dbItem->thr)
continue;
396 Double_t adc = rawadc - (dbItem->ped);
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()));
425 if(Et_eemc < Etcut)
continue;
426 Int_t eemc_id = (sec-1)*60+(sub-1)*12+(etabin-1);
453 Float_t vertex_z_cut = 60.0;
455 Int_t nVertices = muDst->numberOfPrimaryVertices();
456 for(Int_t j = 0; j < nVertices; j++){
458 StMuPrimaryVertex* vertex = muDst->primaryVertex(j);
460 muDst->setVertexIndex(j);
461 StThreeVectorF r = vertex->position();
462 Float_t verz = r.z();
463 if(vertex->ranking() < 0 || j > 1)
continue;
465 if(fabs(r.z()) > vertex_z_cut)
continue;
466 Int_t nTracks = muDst->GetNPrimaryTrack();
468 for(Int_t i = 0; i < nTracks; i++){
470 StMuTrack* track = muDst->primaryTracks(i);
472 StThreeVectorF momentum = track->momentum();
474 if(flagTrack ==
false)
continue;
475 Float_t trackpT = track->pt();
476 Float_t trackEta = track->eta();
477 Float_t trackPhi = track->phi();
492 TH2F* diffEvsChannel =
static_cast<TH2F*
>(
hfmshitEvsChannel->Clone(
"diffEvsChannel"));
494 diffEvsChannel->SetOption();
506 if(track.dcaGlobal().mag()> 3.)
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;
517 if (track.topologyMap().trackFtpcEast() || track.topologyMap().trackFtpcWest()) {
526 if(static_cast<double>(track.nHits())/static_cast<double>(track.nHitsPoss()) < .51)
534 StEvent *
event =
static_cast<StEvent*
>(GetDataSet(
"StEvent"));
536 LOG_ERROR <<
" no StEvent " << endm;
540 if (!fmsCollection) {
541 LOG_ERROR <<
"StFmsQAHistoMaker did not find "
542 <<
"an StFmsCollection in StEvent" << endm;
545 const StSPtrVecFmsHit& fmshits = fmsCollection->
hits();
546 const StSPtrVecFmsCluster& fmsclusters = fmsCollection->
clusters();
548 const StSPtrVecFmsPoint& fmspoints = fmsCollection->
points();
549 Int_t nphotons = fmspoints.size();
551 for (StSPtrVecFmsHitConstIterator i = fmshits.begin(); i != fmshits.end(); ++i) {
553 if (hit->detectorId() >= 8 && hit->detectorId() <= 11 && hit->adc() > 0) {
557 for(StSPtrVecFmsClusterConstIterator iclu = fmsclusters.begin(); iclu != fmsclusters.end(); iclu++){
558 nhits += (*iclu)->nTowers();
559 Float_t clusterE = (*iclu)->energy();
561 Float_t clusterEta = ((*iclu)->fourMomentum()).Eta();
562 Float_t clusterPhi = ((*iclu)->fourMomentum()).Phi();
565 const int nstb = (*iclu)->detectorId();
567 if ((*iclu)->x() > 0. && (*iclu)->y() > 0.) {
568 hfmsy0x0[nstb]->Fill((*iclu)->x(), (*iclu)->y());
572 for(StPtrVecFmsHitConstIterator ihit = (*iclu)->hits().begin(); ihit != (*iclu)->hits().end(); ihit++){
573 Float_t hitE = (*ihit)->energy();
577 for(StSPtrVecFmsPointConstIterator ipts = fmspoints.begin(); ipts != fmspoints.end(); ipts++){
578 Float_t photonE = (*ipts)->energy();
580 Float_t photonEta = ((*ipts)->fourMomentum()).Eta();
581 Float_t photonPhi = ((*ipts)->fourMomentum()).Phi();
590 StMuDst* muDst = (StMuDst*)GetInputDS(
"MuDst");
596 for (
int i(0); i < mufmsCollection->
numberOfHits(); ++i) {
611 for (
int j(0); j < cluster->
hits()->GetEntries(); ++j) {
622 TVector3 xyz = TVector3(point->
x(), point->
y(),
630 TVector3 xyz = TVector3(point->
x(), point->
y(),
Bool_t initialize(StFmsDbMaker *fmsDbMaker)
Declaration of StMuFmsPoint, the MuDST FMS "point" class.
unsigned int numberOfPoints() const
TH1F * hmufmsNHitsPerCluster
Declaration of StFmsCluster, a group of adjacent FMS hits.
unsigned int numberOfClusters() const
UShort_t detectorId() const
unsigned short adc() const
TH2F * hmufms1stHitEvsChannel
StMuFmsCluster * getCluster(int index)
ClassImp(StFmsQAHistoMaker) StFmsQAHistoMaker
StBemcTables * mBemcTables
unsigned short channel() const
StSPtrVecFmsPoint & points()
Declaration of StFmsPoint, the StEvent FMS photon structure.
TLorentzVector fourMomentum(float m=0.f) const
UShort_t detectorId() const
unsigned int numberOfHits() const
void Clear(const char *opt="")
FMSCluster::StFmsGeometry mGeometry
Float_t z(Int_t detectorId) const
Declaration of StMuFmsCluster, the MuDST FMS cluster class.
TH2F * hmufmsClusterHitEvsChannel
TH2F * hmufmshitEvsChannel
Int_t InitRun(Int_t runNumber)
void SetOutputFile(Char_t *filename)
TH2F * hmufms1stphoEvseta
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()
unsigned short detectorId() const
StMuFmsHit * getHit(int hitId)