00001
00002 #include "StjBEMCMuDst.h"
00003
00004 #include <StMuDSTMaker/COMMON/StMuDst.h>
00005 #include <StMuDSTMaker/COMMON/StMuEvent.h>
00006
00007 #include <StEvent/StEmcRawHit.h>
00008 #include <StEvent/StEmcCollection.h>
00009 #include <StEvent/StEmcModule.h>
00010 #include <StEvent/StEmcDetector.h>
00011 #include <StEvent/StEvent.h>
00012
00013 #include <StEmcUtil/geometry/StEmcGeom.h>
00014
00015
00016 #include <StEmcRawMaker/defines.h>
00017 #include <StEmcRawMaker/StBemcTables.h>
00018
00019 #include "StEmcADCtoEMaker/StEmcADCtoEMaker.h"
00020 #include "StEmcSimulatorMaker/StEmcSimulatorMaker.h"
00021
00022 #include <TVector3.h>
00023
00024 #include <iostream>
00025
00026 using namespace std;
00027
00028 int StjBEMCMuDst::_runNumber = -1;
00029 int StjBEMCMuDst::_eventId = -1;
00030 StjTowerEnergyList StjBEMCMuDst::_list;
00031
00032 StjBEMCMuDst::StjBEMCMuDst(bool doTowerSwapFix) : _bemcTables(0)
00033 {
00034
00035 if (StEmcADCtoEMaker* adc2e = (StEmcADCtoEMaker*)StMaker::GetChain()->GetMakerInheritsFrom("StEmcADCtoEMaker")) {
00036 _bemcTables = adc2e->getBemcData()->getTables();
00037 }
00038
00039
00040 if (StEmcSimulatorMaker* emcSim = (StEmcSimulatorMaker*)StMaker::GetChain()->GetMakerInheritsFrom("StEmcSimulatorMaker")) {
00041 _bemcTables = emcSim->getTables();
00042 }
00043
00044 assert(_bemcTables);
00045
00046 _setVertex = false;
00047 }
00048
00049 StjTowerEnergyList StjBEMCMuDst::getEnergyList()
00050 {
00051 if(isNewEvent()) _list = getlist();
00052 return _list;
00053 }
00054
00055 void StjBEMCMuDst::setVertex(float vx, float vy, float vz)
00056 {
00057 _setVertex = true;
00058
00059 _vx = vx;
00060 _vy = vy;
00061 _vz = vz;
00062 }
00063
00064 bool StjBEMCMuDst::isNewEvent()
00065 {
00066 if(_runNumber != StMuDst::event()->runId()) return true;
00067 if(_eventId != StMuDst::event()->eventId()) return true;
00068 return false;
00069 }
00070
00071 StjTowerEnergyList StjBEMCMuDst::getlist()
00072 {
00073 _runNumber = StMuDst::event()->runId();
00074 _eventId = StMuDst::event()->eventId();
00075
00076 StjTowerEnergyList ret;
00077
00078 StEmcCollection* emcCollection = findEmcCollection();
00079 if (emcCollection) {
00080 StEmcDetector* detector = emcCollection->detector(kBarrelEmcTowerId);
00081 if (detector) {
00082 for(unsigned int m = 1; m <= detector->numberOfModules(); ++m) {
00083 StSPtrVecEmcRawHit& rawHits = detector->module(m)->hits();
00084 for(size_t k = 0; k < rawHits.size(); ++k) {
00085 ret.push_back(readTowerHit(*rawHits[k]));
00086 }
00087 }
00088 }
00089 }
00090
00091 return ret;
00092 }
00093
00094 StEmcCollection* StjBEMCMuDst::findEmcCollection()
00095 {
00096 StEvent* event = dynamic_cast<StEvent*>(StMaker::GetChain()->GetInputDS("StEvent") );
00097 return (event) ? event->emcCollection() : StMuDst::emcCollection();
00098 }
00099
00100 StjTowerEnergy StjBEMCMuDst::readTowerHit(const StEmcRawHit& hit)
00101 {
00102 StjTowerEnergy ret;
00103
00104 ret.runNumber = StMuDst::event()->runId();
00105 ret.eventId = StMuDst::event()->eventId();
00106
00107 ret.detectorId = 9;
00108
00109 int towerId;
00110 StEmcGeom::instance("bemc")->getId(hit.module(), hit.eta(), abs(hit.sub()), towerId);
00111
00112 ret.towerId = towerId;
00113
00114 float towerX, towerY, towerZ;
00115 StEmcGeom::instance("bemc")->getXYZ(towerId, towerX, towerY, towerZ);
00116 TVector3 tower(towerX, towerY, towerZ);
00117
00118 ret.towerR = tower.Perp();
00119 ret.towerEta = tower.Eta();
00120 ret.towerPhi = tower.Phi();
00121
00122 if (_setVertex) {
00123 ret.vertexX = _vx;
00124 ret.vertexY = _vy;
00125 ret.vertexZ = _vz;
00126 }
00127 else {
00128 StThreeVectorF vertex = StMuDst::event()->primaryVertexPosition();
00129
00130 ret.vertexX = vertex.x();
00131 ret.vertexY = vertex.y();
00132 ret.vertexZ = vertex.z();
00133 }
00134
00135 ret.energy = hit.energy();
00136 ret.adc = hit.adc();
00137
00138 float pedestal, rms;
00139 int CAP(0);
00140 _bemcTables->getPedestal(BTOW, towerId, CAP, pedestal, rms);
00141 ret.pedestal = pedestal;
00142 ret.rms = rms;
00143
00144 int status;
00145 _bemcTables->getStatus(BTOW, towerId, status);
00146 ret.status = status;
00147
00148 return ret;
00149 }