00001 #include "StMuEmcPosition.h"
00002 #include <math.h>
00003 #include "SystemOfUnits.h"
00004 #include "PhysicalConstants.h"
00005 #include "StPhysicalHelixD.hh"
00006
00007 #include "StMcEvent.hh"
00008 #include "StMcEventTypes.hh"
00009 #include "StMcEventMaker/StMcEventMaker.h"
00010 #include "StEvent.h"
00011 #include "StEventTypes.h"
00012 #include "StEmcUtil/geometry/StEmcGeom.h"
00013 #include "StEEmcUtil/EEmcGeom/EEmcGeomSimple.h"
00014
00015
00016 #include "StMuDSTMaker/COMMON/StMuTrack.h"
00017
00018
00019 ClassImp(StMuEmcPosition)
00020
00021 StMuEmcPosition::StMuEmcPosition():TObject()
00022 {
00023 mGeom[0] = StEmcGeom::getEmcGeom("bemc");
00024 mGeom[1] = StEmcGeom::getEmcGeom("bprs");
00025 mGeom[2] = StEmcGeom::getEmcGeom("bsmde");
00026 mGeom[3] = StEmcGeom::getEmcGeom("bsmdp");
00027 }
00028
00029 StMuEmcPosition::~StMuEmcPosition()
00030 {
00031 }
00032
00033 bool StMuEmcPosition::projTrack(StThreeVectorD* atFinal, StThreeVectorD* momentumAtFinal,
00034 const StMuTrack* track, double magField, double radius, int option)
00035 {
00036 StThreeVectorD Zero(0,0,0);
00037 *atFinal=Zero;
00038 *momentumAtFinal=Zero;
00039
00040
00041
00042
00043
00044
00045
00046 StPhysicalHelixD helix = track->outerHelix();
00047 const StThreeVectorF momentum = track->momentum();
00048 pairD pathLength = helix.pathLength(radius);
00049 double charge = track->charge();
00050
00051 double s,s1,s2;
00052 s=0;
00053 s1 = pathLength.first;
00054 s2 = pathLength.second;
00055
00056 bool goProj;
00057 goProj = kFALSE;
00058
00059 if (finite(s1) == 0 && finite(s2) == 0) { return kFALSE;}
00060
00061 if (option == 1)
00062
00063 {
00064 if (s1 >= 0 && s2 >= 0) {s = s1; goProj = kTRUE; }
00065 if (s1 >= 0 && s2 < 0) { s = s1; goProj = kTRUE; }
00066 if (s1 < 0 && s2 >= 0) { s = s2; goProj = kTRUE; }
00067 }
00068
00069 if (option == -1)
00070
00071 {
00072 if (s1 <= 0 && s2 <= 0) { s = s2; goProj = kTRUE; }
00073 if (s1 <= 0 && s2 > 0) { s = s1; goProj = kTRUE; }
00074 if (s1 > 0 && s2 <= 0) { s = s2; goProj = kTRUE; }
00075 }
00076
00077 if (goProj)
00078 {
00079 *atFinal = helix.at( s );
00080 *momentumAtFinal = helix.momentumAt( s, magField*tesla );
00081 if (charge == 0) *momentumAtFinal = momentum;
00082 }
00083 return goProj;
00084 }
00085
00086 bool StMuEmcPosition::projTrack(StThreeVectorD* atFinal, StThreeVectorD* momentumAtFinal,
00087 StMcTrack* mcTrack, double magField, double radius, int option)
00088 {
00089 StThreeVectorD Zero(0,0,0);
00090 *atFinal=Zero;
00091 *momentumAtFinal=Zero;
00092
00093 const StThreeVectorF& origin = mcTrack->startVertex()->position();
00094 const StThreeVectorF& momentum = mcTrack->momentum();
00095 double charge = mcTrack->particleDefinition()->charge();
00096 StPhysicalHelixD helix(momentum, origin, magField*tesla, charge);
00097 pairD pathLength = helix.pathLength(radius);
00098
00099 double s,s1,s2;
00100 s=0;
00101 s1 = pathLength.first;
00102 s2 = pathLength.second;
00103
00104 bool goProj;
00105 goProj = kFALSE;
00106
00107 if (finite(s1) == 0 && finite(s2) == 0) { return kFALSE;}
00108
00109 if (option == 1)
00110
00111 {
00112 if (s1 >= 0 && s2 >= 0) { s = s1; goProj = kTRUE; }
00113 if (s1 >= 0 && s2 < 0) { s = s1; goProj = kTRUE; }
00114 if (s1 < 0 && s2 >= 0) { s = s2; goProj = kTRUE; }
00115 }
00116
00117 if (option == -1)
00118
00119 {
00120 if (s1 <= 0 && s2 <= 0) { s = s2; goProj = kTRUE; }
00121 if (s1 <= 0 && s2 > 0) { s = s1; goProj = kTRUE; }
00122 if (s1 > 0 && s2 <= 0) { s = s2; goProj = kTRUE; }
00123 }
00124
00125 if (goProj)
00126 {
00127 *atFinal = helix.at( s );
00128 *momentumAtFinal = helix.momentumAt( s, magField*tesla );
00129 if (charge == 0) *momentumAtFinal = momentum;
00130 }
00131 return goProj;
00132 }
00133
00134 bool StMuEmcPosition::trackOnEmc( StThreeVectorD* position, StThreeVectorD* momentum, const StMuTrack* track, double magField, double emcRadius )
00135 {
00136 return trackOnBEmc(position, momentum, track, magField, emcRadius);
00137 }
00138
00139 bool StMuEmcPosition::trackOnBEmc( StThreeVectorD* position, StThreeVectorD* momentum, const StMuTrack* track, double magField, double emcRadius )
00140 {
00141
00142
00143
00144
00145
00146
00147 StPhysicalHelixD helix = track->outerHelix();
00148 const StThreeVectorD& origin = helix.origin();
00149
00150
00151 float xO = origin.x();
00152 float yO = origin.y();
00153 float distToOrigin = ::sqrt( ::pow(xO, 2) + ::pow(yO, 2) );
00154 if ( distToOrigin < emcRadius )
00155 {
00156 bool projTrackOk = projTrack( position, momentum, track, magField, emcRadius );
00157 if ( projTrackOk )
00158 {
00159 int m = 0, e = 0, s = 0;
00160 float phi = position->phi();
00161 float eta = position->pseudoRapidity();
00162 if ( mGeom[0]->getBin(phi, eta, m, e, s) == 0 && s != -1 ) return kTRUE;
00163 }
00164 }
00165
00166 return kFALSE;
00167 }
00168
00169 bool StMuEmcPosition::trackOnEmc( StThreeVectorD* position, StThreeVectorD* momentum,
00170 StMcTrack* mcTrack, double magField, double emcRadius )
00171 {
00172 return trackOnBEmc(position, momentum, mcTrack, magField, emcRadius );
00173 }
00174
00175 bool StMuEmcPosition::trackOnBEmc( StThreeVectorD* position, StThreeVectorD* momentum,
00176 StMcTrack* mcTrack, double magField, double emcRadius )
00177 {
00178 float startVertexX = mcTrack->startVertex()->position().x();
00179 float startVertexY = mcTrack->startVertex()->position().y();
00180 float startVtxToOrigin = ::sqrt( ::pow( startVertexX, 2 ) + ::pow( startVertexY, 2 ) );
00181
00182 if ( !mcTrack->stopVertex() && startVtxToOrigin < emcRadius )
00183 {
00184 bool projTrackOk = projTrack( position, momentum, mcTrack, magField, emcRadius );
00185 if ( projTrackOk )
00186 {
00187 int m = 0, e = 0, s = 0;
00188 float phi = position->phi();
00189 float eta = position->pseudoRapidity();
00190 if ( mGeom[0]->getBin(phi, eta, m, e, s) == 0 && s != -1 ) return kTRUE;
00191 }
00192 }
00193
00194
00195 float stopVtxToOrigin = -1;
00196 if ( mcTrack->stopVertex() )
00197 {
00198 float stopVertexX = mcTrack->stopVertex()->position().x();
00199 float stopVertexY = mcTrack->stopVertex()->position().y();
00200 stopVtxToOrigin = ::sqrt( ::pow( stopVertexX,2 ) + ::pow(stopVertexY,2) );
00201 }
00202
00203 if (stopVtxToOrigin >= emcRadius)
00204 {
00205 bool projTrackOk = projTrack( position, momentum, mcTrack, magField, emcRadius );
00206 if ( projTrackOk )
00207 {
00208 int m = 0, e = 0, s = 0;
00209 float phi = position->phi();
00210 float eta = position->pseudoRapidity();
00211 if ( mGeom[0]->getBin(phi, eta, m, e, s) == 0 && s != -1 ) return kTRUE;
00212 }
00213 }
00214
00215 return kFALSE;
00216 }
00217
00218
00219 bool StMuEmcPosition::trackOnEEmc(StThreeVectorD* position, StThreeVectorD* momentum, const StMuTrack* track, double magField, double z) const
00220 {
00221 if (track->eta() < 0) return false;
00222 StPhysicalHelixD outerHelix = track->outerHelix();
00223 if (fabs(outerHelix.origin().z()) > fabs(z)) return false;
00224 StThreeVectorD r(0,0,z);
00225 StThreeVectorD n(0,0,1);
00226 double s = outerHelix.pathLength(r,n);
00227 if (!finite(s)) return false;
00228 if (s == StHelix::NoSolution) return false;
00229 if (s < 0) return false;
00230 *position = outerHelix.at(s);
00231 int sector, subsector, etabin;
00232 if (!EEmcGeomSimple::Instance().getTower(position->xyz(), sector, subsector, etabin)) return false;
00233 *momentum = outerHelix.momentumAt(s, magField*tesla);
00234 return true;
00235 }
00236
00237 int StMuEmcPosition::getTowerEtaPhi( double eta, double phi, float* towerEta, float* towerPhi )
00238 {
00239 *towerEta = 0; *towerPhi = 0;
00240 float tempTowerEta = 0, tempTowerPhi = 0;
00241 int m = 0, e = 0, s = 0, towerId = -1;
00242
00243 mGeom[0]->getBin(phi, eta, m, e, s);
00244 if (m==0) return -1;
00245 if (s<0) s=1;
00246 mGeom[0]->getId(m, e, s, towerId);
00247 mGeom[0]->getEtaPhi(towerId, tempTowerEta, tempTowerPhi);
00248 *towerEta = tempTowerEta;
00249 *towerPhi = tempTowerPhi;
00250 return 0;
00251 }
00252
00253 int StMuEmcPosition::getNextTowerId(float Eta, float Phi, int nTowersdEta, int nTowersdPhi)
00254 {
00255 int m,e,s;
00256 mGeom[0]->getBin( Phi, Eta, m, e, s );
00257 if(m>0 && m<=120)
00258 {
00259 if(s<0) s=1;
00260 return getNextTowerId(m,e,s,nTowersdEta,nTowersdPhi);
00261 }
00262 return 0;
00263 }
00264
00265 int StMuEmcPosition::getNextTowerId(int id, int nTowersdEta, int nTowersdPhi)
00266 {
00267 if(id<1 || id>4800) return 0;
00268 int m,e,s;
00269 mGeom[0]->getBin(id,m,e,s);
00270 return getNextTowerId(m,e,s,nTowersdEta,nTowersdPhi);
00271 }
00272
00273 int StMuEmcPosition::getNextTowerId(int m, int e, int s, int nTowersdEta, int nTowersdPhi)
00274 {
00275 if(m<1 || m>120) return 0;
00276 if(e<1 || e>20) return 0;
00277 if(s<1 || s>2) return 0;
00278 return getNextId(1,m,e,s,nTowersdEta,nTowersdPhi);
00279 }
00280
00281 int StMuEmcPosition::getNextId(int det,int m, int e, int s, int nEta, int nPhi)
00282 {
00283 if(det<1 || det>4) return 0;
00284 if(m<1 || m>120) return 0;
00285 if(s<1 || s>mGeom[det-1]->NSub()) return 0;
00286 if(e<1 || e>mGeom[det-1]->NEta()) return 0;
00287
00288 int ef=e+nEta;
00289 int sf=s+nPhi;
00290 int mf=m;
00291
00292 int NE=mGeom[det-1]->NEta();
00293 int NS=mGeom[det-1]->NSub();
00294
00295 if(abs(ef)>NE) return 0;
00296
00297 do
00298 {
00299 if(sf<=0)
00300 {
00301 sf += NS;
00302 mf--;
00303 if(mf==60) mf = 120;
00304 if(mf==0) mf = 60;
00305 }
00306 if(sf>NS)
00307 {
00308 sf -= NS;
00309 mf++;
00310 if(mf==61) mf = 1;
00311 if(mf==121) mf = 61;
00312 }
00313 } while(sf<=0 || sf>NS);
00314
00315 if(ef<=0)
00316 {
00317 ef = 1-ef;
00318 sf = NS-sf+1;
00319 if(ef>NE) return 0;
00320 int rid,etmp,stmp;
00321 float eta,phi;
00322 mGeom[det-1]->getId(mf, ef, sf, rid);
00323 mGeom[det-1]->getEtaPhi(rid, eta, phi);
00324 mGeom[det-1]->getBin(phi,-eta,mf,etmp,stmp);
00325 }
00326
00327 int rid;
00328 if(mf<1 || mf>120) return 0;
00329 if(ef<1 || ef>NE) return 0;
00330 if(sf<1 || sf>NS) return 0;
00331 mGeom[det-1]->getId(mf, ef, sf, rid);
00332 return rid;
00333
00334 }
00335
00336 float StMuEmcPosition::getDistTowerToTrack( double trackEta, double trackPhi,
00337 int nTowersdEta, int nTowersdPhi )
00338
00339 {
00340 int towerId = 0;
00341 float towerEta = 0, towerToTrackdEta = 0;
00342 float towerPhi = 0, towerToTrackdPhi = 0;
00343 float mdistTowerToTrack = 0;
00344
00345 towerId = getNextTowerId( trackEta, trackPhi, nTowersdEta, nTowersdPhi );
00346 if (towerId != 0)
00347 {
00348
00349 mGeom[0]->getEtaPhi(towerId, towerEta, towerPhi);
00350 towerToTrackdEta = towerEta-trackEta;
00351 towerToTrackdPhi = towerPhi-trackPhi;
00352
00353 mdistTowerToTrack = ::sqrt( ::pow(towerToTrackdEta, 2) + ::pow(towerToTrackdPhi, 2) );
00354
00355 return mdistTowerToTrack;
00356 }
00357 else
00358 return -1;
00359 }
00360
00361 StThreeVectorF StMuEmcPosition::getPosFromVertex( const StThreeVectorF& position,int TowerId )
00362 {
00363 StThreeVectorF Zero(0,0,0);
00364 if(TowerId<1 || TowerId>4800) return Zero;
00365
00366 float xTower,yTower,zTower;
00367
00368 mGeom[0]->getXYZ(TowerId, xTower, yTower, zTower);
00369 StThreeVectorF towerPosition(xTower, yTower, zTower);
00370 StThreeVectorF PositionFromVertex = towerPosition - position;
00371
00372 return PositionFromVertex;
00373 }
00374
00375 StThreeVectorF StMuEmcPosition::getPosFromVertex( StMcVertex* vertex,int TowerId )
00376 {
00377 StThreeVectorF Zero(0,0,0);
00378 if(TowerId<1 || TowerId>4800) return Zero;
00379
00380 float xTower,yTower,zTower;
00381 StThreeVectorF position = vertex->position();
00382 mGeom[0]->getXYZ(TowerId, xTower, yTower, zTower);
00383 StThreeVectorF towerPosition(xTower, yTower, zTower);
00384 StThreeVectorF PositionFromVertex = towerPosition - position;
00385
00386 return PositionFromVertex;
00387 }
00388
00389 float StMuEmcPosition::getThetaFromVertex( const StThreeVectorF& vertex,int TowerId )
00390 {
00391 StThreeVectorF p=getPosFromVertex(vertex,TowerId );
00392 return p.theta();
00393 }
00394
00395 float StMuEmcPosition::getThetaFromVertex( StMcVertex* vertex,int TowerId )
00396 {
00397 StThreeVectorF p=getPosFromVertex(vertex,TowerId );
00398 return p.theta();
00399 }
00400
00401 float StMuEmcPosition::getEtaFromVertex( const StThreeVectorF& vertex,int TowerId )
00402 {
00403 StThreeVectorF p=getPosFromVertex(vertex,TowerId );
00404 return p.pseudoRapidity();
00405 }
00406
00407 float StMuEmcPosition::getEtaFromVertex( StMcVertex* vertex,int TowerId )
00408 {
00409 StThreeVectorF p=getPosFromVertex(vertex,TowerId );
00410 return p.pseudoRapidity();
00411 }
00412
00413 float StMuEmcPosition::getPhiFromVertex( const StThreeVectorF& vertex,int TowerId )
00414 {
00415 StThreeVectorF p=getPosFromVertex(vertex,TowerId );
00416 return p.phi();
00417 }
00418
00419 float StMuEmcPosition::getPhiFromVertex( StMcVertex* vertex,int TowerId )
00420 {
00421 StThreeVectorF p=getPosFromVertex(vertex,TowerId );
00422 return p.phi();
00423 }