///////////////////////////////////////////////////////////////////////////////
#include "AliExternalTrackParam.h"
#include "AliKalmanTrack.h"
-#include "AliTracker.h"
-#include "AliStrLine.h"
#include "AliESDVertex.h"
return Local2GlobalPosition(r,fAlpha);
}
-
-//_____________________________________________________________________________
-void AliExternalTrackParam::ApproximateHelixWithLine(Double_t xk, Double_t b, AliStrLine *line)
-{
- //------------------------------------------------------------
- // Approximate the track (helix) with a straight line tangent to the
- // helix in the point defined by r (F. Prino, prino@to.infn.it)
- //------------------------------------------------------------
- Double_t mom[3];
- Double_t azim = TMath::ASin(fP[2])+fAlpha;
- Double_t theta = TMath::Pi()/2. - TMath::ATan(fP[3]);
- mom[0] = TMath::Sin(theta)*TMath::Cos(azim);
- mom[1] = TMath::Sin(theta)*TMath::Sin(azim);
- mom[2] = TMath::Cos(theta);
- Double_t pos[3];
- GetXYZAt(xk,b,pos);
- line->SetP0(pos);
- line->SetCd(mom);
-}
//_____________________________________________________________________________
void AliExternalTrackParam::Print(Option_t* /*option*/) const
{
}
-Bool_t AliExternalTrackParam::PropagateTo(Double_t xToGo, Double_t mass, Double_t maxStep, Bool_t rotateTo){
+Bool_t AliExternalTrackParam::PropagateTo(Double_t xToGo, Double_t b, Double_t mass, Double_t maxStep, Bool_t rotateTo){
//----------------------------------------------------------------
- // Propagate this track to the plane X=xk (cm)
- // correction for unhomogenity of the magnetic field and the
+ //
+ // Very expensive function ! Don't abuse it !
+ //
+ // Propagates this track to the plane X=xk (cm)
+ // in the magnetic field "b" (kG),
// the correction for the material is included
//
- // Require acces to magnetic field and geomanager
+ // Requires acces to geomanager
//
// mass - mass used in propagation - used for energy loss correction
// maxStep - maximal step for propagation
Double_t dir = (xpos<xToGo) ? 1.:-1.;
//
while ( (xToGo-xpos)*dir > kEpsilon){
+ if (TMath::Abs(fP[2]) >= kAlmost1) { return kFALSE;}
Double_t step = dir*TMath::Min(TMath::Abs(xToGo-xpos), maxStep);
Double_t x = xpos+step;
Double_t xyz0[3],xyz1[3],param[7];
GetXYZ(xyz0); //starting global position
- Float_t pos0[3] = {xyz0[0],xyz0[1],xyz0[2]};
- Double_t magZ = AliTracker::GetBz(pos0);
- if (!GetXYZAt(x,magZ,xyz1)) return kFALSE; // no prolongation
+ if (!GetXYZAt(x,b,xyz1)) return kFALSE; // no prolongation
AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param);
- if (!PropagateTo(x,magZ)) return kFALSE;
- Double_t distance = param[4];
- if (!CorrectForMaterial(distance,param[1],param[0],mass)) return kFALSE;
+ if (!PropagateTo(x,b)) return kFALSE;
+
+ Double_t rho=param[0],x0=param[1],distance=param[4];
+ Double_t d=distance*rho/x0;
+
+ if (!CorrectForMaterial(d,x0,mass)) return kFALSE;
if (rotateTo){
GetXYZ(xyz0); // global position
Double_t alphan = TMath::ATan2(xyz0[1], xyz0[0]);
return kTRUE;
}
-//_____________________________________________________________________________
-Bool_t AliExternalTrackParam::CorrectForMaterial(Double_t d, Double_t x0, Double_t rho, Double_t mass)
-{
- //
- // Take into account material effects assuming:
- // x0 - mean rad length
- // rho - mean density
- //
- // multiple scattering
- //
- if (mass<=0) {
- AliError("Non-positive mass");
- return kFALSE;
- }
- Double_t p2=(1.+ fP[3]*fP[3])/(fP[4]*fP[4]);
- Double_t beta2=p2/(p2 + mass*mass);
- Double_t theta2=14.1*14.1/(beta2*p2*1e6)*d/x0*rho;
- //
- fC[5] += theta2*(1.- fP[2]*fP[2])*(1. + fP[3]*fP[3]);
- fC[9] += theta2*(1. + fP[3]*fP[3])*(1. + fP[3]*fP[3]);
- fC[13] += theta2*fP[3]*fP[4]*(1. + fP[3]*fP[3]);
- fC[14] += theta2*fP[3]*fP[4]*fP[3]*fP[4];
- //
- Double_t dE=0.153e-3/beta2*(log(5940*beta2/(1-beta2+1e-10)) - beta2)*d*rho;
- fP[4] *=(1.- TMath::Sqrt(p2+mass*mass)/p2*dE);
- //
- Double_t sigmade = 0.02*TMath::Sqrt(TMath::Abs(dE)); // energy loss fluctuation
- Double_t sigmac2 = sigmade*sigmade*fP[4]*fP[4]*(p2+mass*mass)/(p2*p2);
- fC[14] += sigmac2;
- return kTRUE;
-}
const Double_t kMostProbableMomentum=0.35;
class AliKalmanTrack;
-class AliStrLine;
class AliESDVertex;
class AliExternalTrackParam: public TObject {
Bool_t GetCovarianceXYZPxPyPz(Double_t cv[21]) const;
Bool_t GetPxPyPzAt(Double_t x, Double_t b, Double_t p[3]) const;
Bool_t GetXYZAt(Double_t x, Double_t b, Double_t r[3]) const;
- void ApproximateHelixWithLine(Double_t xk, Double_t b, AliStrLine *line);
void Print(Option_t* option = "") const;
// MI
- virtual Bool_t CorrectForMaterial(Double_t d, Double_t x0, Double_t rho, Double_t mass);
- virtual Bool_t PropagateTo(Double_t x, Double_t mass, Double_t maxStep, Bool_t rotateTo=kTRUE);
+ virtual Bool_t PropagateTo(Double_t x, Double_t b, Double_t mass, Double_t maxStep, Bool_t rotateTo=kTRUE);
private:
Double_t fX; // X coordinate for the point of parametrisation
track1 = (AliESDtrack*)fTrkArray.At(i);
alpha=track1->GetAlpha();
mindist = TMath::Cos(alpha)*fNominalPos[0]+TMath::Sin(alpha)*fNominalPos[1];
- AliStrLine *line1 = new AliStrLine();
- track1->ApproximateHelixWithLine(mindist,field,line1);
+
+ Double_t pos[3]; track1->GetXYZAt(mindist,field,pos);
+ Double_t dir[3]; track1->GetPxPyPzAt(mindist,field,dir);
+ AliStrLine *line1 = new AliStrLine(pos,dir);
for(Int_t j=i+1; j<nacc; j++){
track2 = (AliESDtrack*)fTrkArray.At(j);
alpha=track2->GetAlpha();
mindist = TMath::Cos(alpha)*fNominalPos[0]+TMath::Sin(alpha)*fNominalPos[1];
- AliStrLine *line2 = new AliStrLine();
- track2->ApproximateHelixWithLine(mindist,field,line2);
+
+ Double_t pos[3]; track2->GetXYZAt(mindist,field,pos);
+ Double_t dir[3]; track2->GetPxPyPzAt(mindist,field,dir);
+ AliStrLine *line2 = new AliStrLine(pos,dir);
+
Double_t distCA=line2->GetDCA(line1);
if(fDCAcut<=0 || (fDCAcut>0&&distCA<fDCAcut)){
Double_t pnt1[3],pnt2[3],crosspoint[3];
track1 = (AliESDtrack*)fTrkArray.At(i);
Double_t alpha=track1->GetAlpha();
Double_t mindist = TMath::Cos(alpha)*fNominalPos[0]+TMath::Sin(alpha)*fNominalPos[1];
- AliStrLine *line1 = new AliStrLine();
- track1->ApproximateHelixWithLine(mindist,field,line1);
+
+ Double_t pos[3]; track1->GetXYZAt(mindist,field,pos);
+ Double_t dir[3]; track1->GetPxPyPzAt(mindist,field,pos);
+ AliStrLine *line1 = new AliStrLine(pos,dir);
Double_t p0[3],cd[3];
line1->GetP0(p0);
#pragma link C++ class AliKalmanTrack+;
#pragma link C++ class AliHelix+;
#pragma link C++ class AliExternalTrackParam+;
-#pragma link C++ class AliStrLine+;
#pragma link C++ class AliLog+;
#pragma link C++ class AliPID+;
#pragma link C++ class AliTrackPointArray+;
#pragma link C++ class AliTrackPointArray+;
#pragma link C++ class AliTrackPoint+;
#pragma link C++ class AliCluster+;
-#pragma link C++ class AliTracker+;
#pragma link C++ class AliESDFMD+;
#pragma link C++ class AliFMDMap+;
#pragma link C++ class AliSimulation+;
#pragma link C++ class AliReconstruction+;
#pragma link C++ class AliVertexGenFile+;
+#pragma link C++ class AliTracker+;
#pragma link C++ class AliVertexer+;
#pragma link C++ class AliVertexerTracks+;
+#pragma link C++ class AliStrLine+;
#pragma link C++ class AliV0vertexer+;
#pragma link C++ class AliCascadeVertexer+;
AliESDpid.cxx AliESDkink.cxx AliESDV0MI.cxx \
AliESDCaloCluster.cxx \
AliKalmanTrack.cxx AliHelix.cxx AliExternalTrackParam.cxx \
- AliStrLine.cxx \
AliLog.cxx AliPID.cxx AliESDV0MIParams.cxx \
AliRunTag.cxx AliLHCTag.cxx AliDetectorTag.cxx AliEventTag.cxx \
AliTagCreator.cxx AliTagAnalysis.cxx AliEventTagCuts.cxx \
- AliTrackPointArray.cxx AliTracker.cxx AliCluster.cxx \
+ AliTrackPointArray.cxx AliCluster.cxx \
AliESDFMD.cxx AliFMDMap.cxx AliFMDFloatMap.cxx \
AliESDMultITS.cxx
AliGausCorr.cxx AliTrackReference.cxx \
AliTrackMap.cxx AliTrackMapper.cxx AliCollisionGeometry.cxx \
AliMemoryWatcher.cxx \
-AliVertexer.cxx AliVertexerTracks.cxx \
+AliTracker.cxx \
+AliVertexer.cxx AliVertexerTracks.cxx AliStrLine.cxx \
AliV0vertexer.cxx AliCascadeVertexer.cxx\
AliMC.cxx AliSimulation.cxx AliReconstruction.cxx AliVertexGenFile.cxx \
AliCDBEntry.cxx AliCDBId.cxx AliCDBMetaData.cxx \