// @(#) $Id$ // Original: AliHLTTrack.cxx,v 1.32 2005/06/14 10:55:21 cvetan // Author: Anders Vestbo , Uli Frankenfeld //*-- Copyright © ALICE HLT Group #include "AliHLTTPCLogging.h" #include "AliHLTTPCTrack.h" #include "AliHLTTPCTransform.h" #include "AliHLTTPCVertex.h" #include "AliHLTTPCSpacePointData.h" #if __GNUC__ >= 3 using namespace std; #endif /** \class AliHLTTPCTrack //
//_____________________________________________________________
// AliHLTTPCTrack
//
// Track base class
//Begin_Html
//
//End_Html
*/ ClassImp(AliHLTTPCTrack) AliHLTTPCTrack::AliHLTTPCTrack() { //Constructor fNHits = 0; fMCid = -1; fKappa=0; fRadius=0; fCenterX=0; fCenterY=0; ComesFromMainVertex(false); fQ = 0; fPhi0=0; fPsi=0; fR0=0; fTanl=0; fZ0=0; fPt=0; fLength=0; fIsLocal=true; fRowRange[0]=0; fRowRange[1]=0; SetFirstPoint(0,0,0); SetLastPoint(0,0,0); memset(fHitNumbers,0,159*sizeof(UInt_t)); fPID = 0; fSector=0; fPterr=0; fPsierr=0; fZ0err=0; fTanlerr=0; fPoint[0]=fPoint[1]=fPoint[2]=0; fPointPsi=0; } void AliHLTTPCTrack::Set(AliHLTTPCTrack *tpt) { //setter SetRowRange(tpt->GetFirstRow(),tpt->GetLastRow()); SetPhi0(tpt->GetPhi0()); SetKappa(tpt->GetKappa()); SetNHits(tpt->GetNHits()); SetFirstPoint(tpt->GetFirstPointX(),tpt->GetFirstPointY(),tpt->GetFirstPointZ()); SetLastPoint(tpt->GetLastPointX(),tpt->GetLastPointY(),tpt->GetLastPointZ()); SetPt(tpt->GetPt()); SetPsi(tpt->GetPsi()); SetTgl(tpt->GetTgl()); SetPterr(tpt->GetPterr()); SetPsierr(tpt->GetPsierr()); SetTglerr(tpt->GetTglerr()); SetCharge(tpt->GetCharge()); SetHits(tpt->GetNHits(),(UInt_t *)tpt->GetHitNumbers()); #ifdef do_mc SetMCid(tpt->GetMCid()); #endif SetPID(tpt->GetPID()); SetSector(tpt->GetSector()); } Int_t AliHLTTPCTrack::Compare(const AliHLTTPCTrack *track) const { // compare tracks if(track->GetNHits() < GetNHits()) return 1; if(track->GetNHits() > GetNHits()) return -1; return 0; } AliHLTTPCTrack::~AliHLTTPCTrack() { //Nothing to do } Double_t AliHLTTPCTrack::GetP() const { // Returns total momentum. return fabs(GetPt())*sqrt(1. + GetTgl()*GetTgl()); } Double_t AliHLTTPCTrack::GetPseudoRapidity() const { //get pseudo rap return 0.5 * log((GetP() + GetPz()) / (GetP() - GetPz())); } /* Double_t AliHLTTPCTrack::GetEta() const { return GetPseudoRapidity(); } */ Double_t AliHLTTPCTrack::GetRapidity() const { //get rap const Double_t kmpi = 0.13957; return 0.5 * log((kmpi + GetPz()) / (kmpi - GetPz())); } void AliHLTTPCTrack::Rotate(Int_t slice,Bool_t tolocal) { //Rotate track to global parameters //If flag tolocal is set, the track is rotated //to local coordinates. Float_t psi[1] = {GetPsi()}; if(!tolocal) AliHLTTPCTransform::Local2GlobalAngle(psi,slice); else AliHLTTPCTransform::Global2LocalAngle(psi,slice); SetPsi(psi[0]); Float_t first[3]; first[0] = GetFirstPointX(); first[1] = GetFirstPointY(); first[2] = GetFirstPointZ(); if(!tolocal) AliHLTTPCTransform::Local2Global(first,slice); else AliHLTTPCTransform::Global2LocHLT(first,slice); //AliHLTTPCTransform::Global2Local(first,slice,kTRUE); SetFirstPoint(first[0],first[1],first[2]); Float_t last[3]; last[0] = GetLastPointX(); last[1] = GetLastPointY(); last[2] = GetLastPointZ(); if(!tolocal) AliHLTTPCTransform::Local2Global(last,slice); else AliHLTTPCTransform::Global2LocHLT(last,slice); //AliHLTTPCTransform::Global2Local(last,slice,kTRUE); SetLastPoint(last[0],last[1],last[2]); Float_t center[3] = {GetCenterX(),GetCenterY(),0}; if(!tolocal) AliHLTTPCTransform::Local2Global(center,slice); else AliHLTTPCTransform::Global2LocHLT(center,slice); //AliHLTTPCTransform::Global2Local(center,slice,kTRUE); SetCenterX(center[0]); SetCenterY(center[1]); SetPhi0(atan2(fFirstPoint[1],fFirstPoint[0])); SetR0(sqrt(fFirstPoint[0]*fFirstPoint[0]+fFirstPoint[1]*fFirstPoint[1])); if(!tolocal) fIsLocal=kFALSE; else fIsLocal=kTRUE; } void AliHLTTPCTrack::CalculateHelix() { // #### -B0-CHANGE-START == JMT // for straight line fit if (AliHLTTPCTransform::GetBFieldValue() == 0.0 ){ fRadius = 999999; //just zero SetPhi0(atan2(fFirstPoint[1],fFirstPoint[0])); SetR0(sqrt(fFirstPoint[0]*fFirstPoint[0]+fFirstPoint[1]*fFirstPoint[1])); } // for helix fit else { // #### -B0-UNCHANGED-START == JMT //Calculate Radius, CenterX and CenterY from Psi, X0, Y0 fRadius = fPt / (AliHLTTPCTransform::GetBFieldValue()); if(fRadius) fKappa = -fQ*1./fRadius; else fRadius = 999999; //just zero Double_t trackPhi0 = fPsi + fQ * AliHLTTPCTransform::PiHalf(); fCenterX = fFirstPoint[0] - fRadius * cos(trackPhi0); fCenterY = fFirstPoint[1] - fRadius * sin(trackPhi0); SetPhi0(atan2(fFirstPoint[1],fFirstPoint[0])); SetR0(sqrt(fFirstPoint[0]*fFirstPoint[0]+fFirstPoint[1]*fFirstPoint[1])); // #### -B0-UNCHANGED-END == JMT } // #### -B0-CHANGE-END == JMT } Double_t AliHLTTPCTrack::GetCrossingAngle(Int_t padrow,Int_t slice) { //Calculate the crossing angle between track and given padrow. //Take the dot product of the tangent vector of the track, and //vector perpendicular to the padrow. //In order to do this, we need the tangent vector to the track at the //point. This is done by rotating the radius vector by 90 degrees; //rotation matrix: ( 0 1 ) // ( -1 0 ) Float_t angle=0;//Angle perpendicular to the padrow in local coordinates if(slice>=0)//Global coordinates { AliHLTTPCTransform::Local2GlobalAngle(&angle,slice); if(!CalculateReferencePoint(angle,AliHLTTPCTransform::Row2X(padrow))) cerr<<"AliHLTTPCTrack::GetCrossingAngle : Track does not cross line in slice "< 1) cosbeta=1; return acos(cosbeta); } Bool_t AliHLTTPCTrack::GetCrossingPoint(Int_t padrow,Float_t *xyz) { //Assumes the track is given in local coordinates if(!IsLocal()) { cerr<<"GetCrossingPoint: Track is given on global coordinates"<GetX(); Double_t yc = GetCenterY() - vertex->GetY(); Double_t distx1 = xc*(1 + GetRadius()/sqrt(xc*xc + yc*yc)); Double_t disty1 = yc*(1 + GetRadius()/sqrt(xc*xc + yc*yc)); Double_t distance1 = sqrt(distx1*distx1 + disty1*disty1); Double_t distx2 = xc*(1 - GetRadius()/sqrt(xc*xc + yc*yc)); Double_t disty2 = yc*(1 - GetRadius()/sqrt(xc*xc + yc*yc)); Double_t distance2 = sqrt(distx2*distx2 + disty2*disty2); //Choose the closest: if(distance1 < distance2) { closestx = distx1 + vertex->GetX(); closesty = disty1 + vertex->GetY(); } else { closestx = distx2 + vertex->GetX(); closesty = disty2 + vertex->GetY(); } //Get the z coordinate: Double_t angle1 = atan2((closesty-GetCenterY()),(closestx-GetCenterX())); if(angle1 < 0) angle1 = angle1 + AliHLTTPCTransform::TwoPi(); Double_t angle2 = atan2((GetFirstPointY()-GetCenterY()),(GetFirstPointX()-GetCenterX())); if(angle2 < 0) angle2 = angle2 + AliHLTTPCTransform::TwoPi(); Double_t diff_angle = angle1 - angle2; diff_angle = fmod(diff_angle,AliHLTTPCTransform::TwoPi()); if((GetCharge()*diff_angle) < 0) diff_angle = diff_angle + GetCharge()*AliHLTTPCTransform::TwoPi(); Double_t stot = fabs(diff_angle)*GetRadius(); closestz = GetFirstPointZ() - stot*GetTgl(); } void AliHLTTPCTrack::Print() const { //print out parameters of track // BEGINN ############################################## MODIFIY JMT #if 1 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCTrack::Print","Print values") <<"NH="<