00001
00002 #include "StjTPCMuDst.h"
00003
00004 #include "StEventTypes.h"
00005 #include "StMuDSTMaker/COMMON/StMuTypes.hh"
00006
00007 #include <mudst/StMuEmcPosition.h>
00008 #include <StEmcUtil/geometry/StEmcGeom.h>
00009 #include "StEEmcUtil/EEmcGeom/EEmcGeomSimple.h"
00010
00011 #include <TVector3.h>
00012
00013 int StjTPCMuDst::currentVertexIndex() const
00014 {
00015 return StMuDst::currentVertexIndex();
00016 }
00017
00018 void StjTPCMuDst::setVertexIndex(int i)
00019 {
00020 StMuDst::setVertexIndex(i);
00021 }
00022
00023 int StjTPCMuDst::numberOfVertices() const
00024 {
00025 return StMuDst::numberOfPrimaryVertices();
00026 }
00027
00028 StjPrimaryVertex StjTPCMuDst::getVertex() const
00029 {
00030 StjPrimaryVertex vertex;
00031
00032 if (StMuPrimaryVertex* muVertex = StMuDst::primaryVertex()) {
00033 vertex.mPosition = muVertex->position().xyz();
00034 vertex.mPosError = muVertex->posError().xyz();
00035 vertex.mVertexFinderId = muVertex->vertexFinderId();
00036 vertex.mRanking = muVertex->ranking();
00037 vertex.mNTracksUsed = muVertex->nTracksUsed();
00038 vertex.mNBTOFMatch = muVertex->nBTOFMatch();
00039 vertex.mNCTBMatch = muVertex->nCTBMatch();
00040 vertex.mNBEMCMatch = muVertex->nBEMCMatch();
00041 vertex.mNEEMCMatch = muVertex->nEEMCMatch();
00042 vertex.mNCrossCentralMembrane = muVertex->nCrossCentralMembrane();
00043 vertex.mSumTrackPt = muVertex->sumTrackPt();
00044 vertex.mMeanDip = muVertex->meanDip();
00045 vertex.mChiSquared = muVertex->chiSquared();
00046 vertex.mRefMultPos = muVertex->refMultPos();
00047 vertex.mRefMultNeg = muVertex->refMultNeg();
00048 vertex.mRefMultFtpcEast = muVertex->refMultFtpcEast();
00049 vertex.mRefMultFtpcWest = muVertex->refMultFtpcWest();
00050 }
00051
00052 return vertex;
00053 }
00054
00055 StjTrackList StjTPCMuDst::getTrackList()
00056 {
00057 StjTrackList ret;
00058
00059 int nTracks = StMuDst::numberOfPrimaryTracks();
00060
00061 double magneticField = StMuDst::event()->magneticField()/10.0;
00062 for(int i = 0; i < nTracks; ++i) {
00063 const StMuTrack* mutrack = StMuDst::primaryTracks(i);
00064
00065 if(mutrack->flag() < 0) continue;
00066
00067 if(mutrack->topologyMap().trackFtpcEast() || mutrack->topologyMap().trackFtpcWest()) continue;
00068
00069 StjTrack track = createTrack(mutrack, i, magneticField);
00070
00071 ret.push_back(track);
00072 }
00073
00074 return ret;
00075 }
00076
00077 StjTrack StjTPCMuDst::createTrack(const StMuTrack* mutrack, int i, double magneticField)
00078 {
00079 StjTrack track;
00080
00081 track.runNumber = StMuDst::event()->runId();
00082 track.eventId = StMuDst::event()->eventId();
00083 track.detectorId = kTpcId;
00084
00085 TVector3 p(mutrack->momentum().x(), mutrack->momentum().y(), mutrack->momentum().z());
00086
00087 track.pt = p.Pt();
00088 track.eta = p.Eta();
00089 track.phi = p.Phi();
00090 track.flag = mutrack->flag();
00091 track.nHits = mutrack->nHits();
00092 track.charge = mutrack->charge();
00093 track.nHitsPoss = mutrack->nHitsPoss();
00094 track.nHitsDedx = mutrack->nHitsDedx();
00095 track.nHitsFit = mutrack->nHitsFit();
00096 track.nSigmaPion = mutrack->nSigmaPion();
00097 track.nSigmaKaon = mutrack->nSigmaKaon();
00098 track.nSigmaProton = mutrack->nSigmaProton();
00099 track.nSigmaElectron = mutrack->nSigmaElectron();
00100 track.Tdca = mutrack->dcaGlobal().mag();
00101 track.dcaX = mutrack->dcaGlobal().x();
00102 track.dcaY = mutrack->dcaGlobal().y();
00103 track.dcaZ = mutrack->dcaZ();
00104 track.dcaD = mutrack->dcaD();
00105 track.chi2 = mutrack->chi2();
00106 track.chi2prob = mutrack->chi2prob();
00107 track.BField = magneticField;
00108
00109
00110
00111
00112
00113 track.bemcRadius = 238.6;
00114
00115 StThreeVectorF vertex = StMuDst::primaryVertex()->position();
00116 track.vertexZ = vertex.z();
00117
00118 StThreeVectorD momentumAt, positionAt;
00119 StMuEmcPosition EmcPosition;
00120
00121 if (EmcPosition.trackOnEmc(&positionAt, &momentumAt, mutrack, track.BField, track.bemcRadius))
00122 {
00123 track.exitDetectorId = kBarrelEmcTowerId;
00124 track.exitEta = positionAt.pseudoRapidity();
00125 track.exitPhi = positionAt.phi();
00126 StEmcGeom::instance("bemc")->getId(track.exitPhi, track.exitEta, track.exitTowerId);
00127 }
00128 else if(EmcPosition.trackOnEEmc(&positionAt, &momentumAt, mutrack))
00129 {
00130 track.exitDetectorId = kEndcapEmcTowerId;
00131 track.exitEta = positionAt.pseudoRapidity();
00132 track.exitPhi = positionAt.phi();
00133 int sector, subsector, etabin;
00134 EEmcGeomSimple::Instance().getTower(positionAt.xyz(),sector,subsector,etabin);
00135 track.exitTowerId = sector*60+subsector*12+etabin;
00136 }
00137 else
00138 {
00139 track.exitDetectorId = -999;
00140 track.exitEta = -999;
00141 track.exitPhi = -999;
00142 track.exitTowerId = -999;
00143 }
00144
00145 track.dEdx = mutrack->dEdx();
00146 track.beta = mutrack->globalTrack() ? mutrack->globalTrack()->btofPidTraits().beta() : 0;
00147 track.trackIndex = i;
00148 track.id = mutrack->id();
00149 track.firstPoint = mutrack->firstPoint().xyz();
00150 track.lastPoint = mutrack->lastPoint().xyz();
00151
00152 return track;
00153 }