00001
00002
00003
00004
00005
00006
00008
00009 #include "DcaService.h"
00010 #include "StXiMuDst.hh"
00011 #include "TMath.h"
00012 #include "TDataMember.h"
00013 #include "TRealData.h"
00014 #include "phys_constants.h"
00015 #include "math_constants.h"
00016 #include "TClass.h"
00017 #include "StMessMgr.h"
00018 #include <cassert>
00019
00020 Long_t GGetOffset(TClass* cl, TDataMember* that);
00021
00022 ClassImp(DcaService)
00023
00024 double DcaService::B = 0.0;
00025 StThreeVectorD DcaService::PrimVertex(0.,0.,0.);
00026 StThreeVectorD DcaService::Origin(0.,0.,0.);
00027 StHelixD DcaService::Track(0.,0.,0.,DcaService::Origin,0);
00028 Long_t DcaService::offsetDcaXiToPrimVertex = 0;
00029 Long_t DcaService::offsetDcaBachelorToPrimVertex = 0;
00030 Long_t DcaService::offsetDcaPosToPrimVertex = 0;
00031 Long_t DcaService::offsetDcaNegToPrimVertex = 0;
00032
00033 void DcaService::initOffsets() {
00034 offsetDcaXiToPrimVertex = 0;
00035 offsetDcaBachelorToPrimVertex = 0;
00036 offsetDcaPosToPrimVertex = 0;
00037 offsetDcaNegToPrimVertex = 0;
00038 }
00039
00040 void DcaService::setPrimVertex(StStrangeEvMuDst* ev) {
00041 PrimVertex.setX(ev->primaryVertexX());
00042 PrimVertex.setY(ev->primaryVertexY());
00043 PrimVertex.setZ(ev->primaryVertexZ());
00044 }
00045
00046 double DcaService::dcaToPrimVertex(int charge, Float_t x, Float_t y, Float_t z,
00047 Float_t px, Float_t py, Float_t pz) {
00048
00049 double pt = TMath::Sqrt(px*px + py*py);
00050 double bcharge = ((double) charge)*B;
00051 double curvature = TMath::Abs(bcharge)*C_D_CURVATURE/pt;
00052 double dip = TMath::ATan(pz/pt);
00053 int h = ((bcharge > 0) ? -1 : 1);
00054 double phase = TMath::ATan2(py,px) - (h*C_PI_2);
00055 Origin.setX(x);
00056 Origin.setY(y);
00057 Origin.setZ(z);
00058 Track.setParameters(curvature, dip, phase, Origin, h);
00059 return Track.distance(PrimVertex);
00060 }
00061
00062 double DcaService::dcaXiToPrimVertex(StXiMuDst* xi) {
00063 return dcaToPrimVertex(xi->charge(),
00064 xi->decayVertexXiX(), xi->decayVertexXiY(), xi->decayVertexXiZ(),
00065 xi->momXiX(), xi->momXiY(), xi->momXiZ());
00066 }
00067
00068 double DcaService::dcaBachelorToPrimVertex(StXiMuDst* xi) {
00069 return dcaToPrimVertex(xi->charge(),
00070 xi->decayVertexXiX(), xi->decayVertexXiY(), xi->decayVertexXiZ(),
00071 xi->momBachelorX(), xi->momBachelorY(), xi->momBachelorZ());
00072 }
00073
00074 double DcaService::dcaPosToPrimVertex(StV0MuDst* v0) {
00075 return dcaToPrimVertex(1,
00076 v0->decayVertexV0X(), v0->decayVertexV0Y(), v0->decayVertexV0Z(),
00077 v0->momPosX(), v0->momPosY(), v0->momPosZ());
00078 }
00079
00080 double DcaService::dcaNegToPrimVertex(StV0MuDst* v0) {
00081 return dcaToPrimVertex(-1,
00082 v0->decayVertexV0X(), v0->decayVertexV0Y(), v0->decayVertexV0Z(),
00083 v0->momNegX(), v0->momNegY(), v0->momNegZ());
00084 }
00085
00086 double DcaService::signIt() {
00087
00088
00089 StThreeVectorD p1 = Track.at(Track.pathLength(PrimVertex));
00090 StThreeVectorD p2(p1.x()-Track.xcenter(),
00091 p1.y()-Track.ycenter(),0);
00092 StThreeVectorD p3(PrimVertex.x()-Track.xcenter(),
00093 PrimVertex.y()-Track.ycenter(),0);
00094 if (p3.mag2() > p2.mag2()) return -1.0;
00095 return 1.0;
00096 }
00097
00098 void DcaService::replaceDca(TObject* obj, Float_t dca, Long_t& offset, TClass* cl,
00099 const char* memname) {
00100 if (!offset) {
00101 offset = GGetOffset(cl,cl->GetDataMember(memname));
00102 if (!offset) LOG_WARN << Form("OFFSET NOT FOUND: %s in %s\n",
00103 memname,cl->GetName()) << endm;
00104 }
00105 Float_t* cf = (Float_t*) obj;
00106 Float_t* dcaptr = (Float_t*) (((Long_t) cf) + offset);
00107 *dcaptr = dca;
00108 }
00109
00110 void DcaService::replaceDcaXiToPrimVertex(StXiMuDst* xi,Float_t dca) {
00111 replaceDca(xi,dca,offsetDcaXiToPrimVertex,xi->Class(),
00112 "mDcaXiToPrimVertex");
00113 }
00114
00115 void DcaService::replaceDcaBachelorToPrimVertex(StXiMuDst* xi,Float_t dca) {
00116 replaceDca(xi,dca,offsetDcaBachelorToPrimVertex,xi->Class(),
00117 "mDcaBachelorToPrimVertex");
00118 }
00119
00120 void DcaService::replaceDcaPosToPrimVertex(StV0MuDst* v0,Float_t dca) {
00121 replaceDca(v0,dca,offsetDcaPosToPrimVertex,v0->Class(),
00122 "mDcaPosToPrimVertex");
00123 }
00124
00125 void DcaService::replaceDcaNegToPrimVertex(StV0MuDst* v0,Float_t dca) {
00126 replaceDca(v0,dca,offsetDcaNegToPrimVertex,v0->Class(),
00127 "mDcaNegToPrimVertex");
00128 }
00129
00130 void DcaService::fixDcaXiToPrimVertex(StStrangeMuDstMaker* mk) {
00131 initEvent(mk);
00132 for( Int_t j=0; j<mk->GetNXi(); j++ ) {
00133 fixDcaXiToPrimVertex(mk->GetXi(j));
00134 }
00135 }
00136
00137 void DcaService::fixSignedDcaXiToPrimVertex(StStrangeMuDstMaker* mk) {
00138 initEvent(mk);
00139 for( Int_t j=0; j<mk->GetNXi(); j++ ) {
00140 fixSignedDcaXiToPrimVertex(mk->GetXi(j));
00141 }
00142 }
00143
00144 void DcaService::fixSignedDcaBachelorToPrimVertex(StStrangeMuDstMaker* mk) {
00145 initEvent(mk);
00146 for( Int_t j=0; j<mk->GetNXi(); j++ ) {
00147 fixSignedDcaBachelorToPrimVertex(mk->GetXi(j));
00148 }
00149 }
00150
00151 void DcaService::fixSignedDcaPosToPrimVertex(StStrangeMuDstMaker* mk) {
00152 initEvent(mk);
00153 for( Int_t j=0; j<mk->GetNV0(); j++ ) {
00154 fixSignedDcaPosToPrimVertex(mk->GetV0(j));
00155 }
00156 }
00157
00158 void DcaService::fixSignedDcaNegToPrimVertex(StStrangeMuDstMaker* mk) {
00159 initEvent(mk);
00160 for( Int_t j=0; j<mk->GetNV0(); j++ ) {
00161 fixSignedDcaNegToPrimVertex(mk->GetV0(j));
00162 }
00163 }
00164
00165 void DcaService::fixSignedDcasXis(StStrangeMuDstMaker* mk) {
00166 initEvent(mk);
00167 for( Int_t j=0; j<mk->GetNXi(); j++ ) {
00168 StXiMuDst* xi = mk->GetXi(j);
00169 fixSignedDcaXiToPrimVertex(xi);
00170 fixSignedDcaBachelorToPrimVertex(xi);
00171 fixSignedDcaPosToPrimVertex(xi);
00172 fixSignedDcaNegToPrimVertex(xi);
00173 }
00174 }
00175
00176 void DcaService::fixSignedDcasV0s(StStrangeMuDstMaker* mk) {
00177 initEvent(mk);
00178 for( Int_t j=0; j<mk->GetNV0(); j++ ) {
00179 StV0MuDst* v0 = mk->GetV0(j);
00180 fixSignedDcaPosToPrimVertex(v0);
00181 fixSignedDcaNegToPrimVertex(v0);
00182 }
00183 }
00184
00185
00186
00187
00188
00189
00190 Long_t GGetOffset(TClass* cl, TDataMember* that) {
00191
00192
00193
00194
00195 char dmbracket[256];
00196 sprintf(dmbracket,"%s[",that->GetName());
00197 cl->BuildRealData();
00198 TIter next(cl->GetListOfRealData());
00199 TRealData *rdm;
00200 while ((rdm = (TRealData*)next())) {
00201 char *rdmc = (char*)rdm->GetName();
00202
00203
00204 if (that->IsaPointer() && rdmc[0] == '*') rdmc++;
00205
00206 if (rdm->GetDataMember() != that) continue;
00207 if (strcmp(rdmc,that->GetName()) == 0) {
00208 return rdm->GetThisOffset();
00209 }
00210 if (strcmp(rdm->GetName(),that->GetName()) == 0) {
00211 if (rdm->IsObject()) {
00212 return rdm->GetThisOffset();
00213 }
00214 }
00215 if (strstr(rdm->GetName(),dmbracket)) {
00216 return rdm->GetThisOffset();
00217 }
00218 }
00219 return 0;
00220 }
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241