* about the suitability of this software for any purpose. It is *
* provided "as is" without express or implied warranty. *
**************************************************************************/
+
+/* $Id$ */
+
////////////////////////////////////////////////////
// Stand alone track class //
// Origin: Elisabetta Crescio //
// e-mail: crescio@to.infn.it //
// it is a V2 track with a possible number //
-// of cluster equal to fgkMaxNumberOfClusters //
+// of cluster equal to kMaxNumberOfClusters //
////////////////////////////////////////////////////
-#include "AliRun.h"
-#include "AliITS.h"
-#include "AliITSgeom.h"
+#include "AliITSgeomTGeo.h"
#include "AliITStrackSA.h"
ClassImp(AliITStrackSA)
//_____________________________________
-AliITStrackSA:: AliITStrackSA() : AliITStrackV2(){
+AliITStrackSA:: AliITStrackSA() : AliITStrackMI(),
+fNSA(0)
+{
// Default constructor
SetNumberOfClusters(0);
SetNumberOfClustersSA(0);
ResetIndexSA();
+ for(Int_t nlay=0;nlay<AliITSgeomTGeo::GetNLayers();nlay++){
+ SetNumberOfMarked(nlay,0);
+ }
+ ResetMarked();
}
//___________________________________________________
-AliITStrackSA::AliITStrackSA(const AliITStrackV2& t) :
-AliITStrackV2(t){
+AliITStrackSA::AliITStrackSA(const AliITStrackMI& t) :
+AliITStrackMI(t),
+fNSA(0){
// Copy a V2 track into a SA track
SetNumberOfClustersSA(0);
ResetIndexSA();
+ for(Int_t nlay=0;nlay<AliITSgeomTGeo::GetNLayers();nlay++){
+ SetNumberOfMarked(nlay,0);
+ }
+ ResetMarked();
+
}
//___________________________________________________
AliITStrackSA::AliITStrackSA(const AliITStrackSA& t) :
-AliITStrackV2(t){
+AliITStrackMI(t),
+fNSA(t.fNSA){
// Copy constructor
+
ResetIndexSA();
+ ResetMarked();
Int_t number = t.GetNumberOfClustersSA();
SetNumberOfClustersSA(number);
+ for(Int_t nlay=0;nlay<AliITSgeomTGeo::GetNLayers();nlay++){
+ SetNumberOfMarked(nlay,t.GetNumberOfMarked(nlay));
+ }
for(Int_t i=0;i<number;i++){
fSain[i]=t.fSain[i];
}
-
+ for(Int_t nlay=0;nlay<AliITSgeomTGeo::GetNLayers();nlay++){
+ for(Int_t i=0;i<t.GetNumberOfMarked(nlay);i++){
+ fCluMark[nlay][i]=t.fCluMark[nlay][i];
+ }
+ }
}
//____________________________________________________
-AliITStrackSA::AliITStrackSA(Int_t layer, Int_t ladder, Int_t detector, Double_t Ycoor, Double_t Zcoor, Double_t phi, Double_t tanlambda, Double_t curv, Int_t lab ) {
+AliITStrackSA::AliITStrackSA(Int_t layer, Int_t ladder, Int_t detector, Double_t Ycoor, Double_t Zcoor, Double_t phi, Double_t tanlambda, Double_t curv, Int_t lab ):
+fNSA(0)
+{
// standard constructor. Used for ITS standalone tracking
- AliITS* iTS = (AliITS*)gAlice->GetDetector("ITS");
- if(!iTS){
- Fatal("AliITStrackSA","ITS object not found - Abort\n");
- return;
- }
- AliITSgeom *geom = iTS->GetITSgeom();
- if(!geom){
- Fatal("AliITStrackSA","ITS geometry not found - Abort\n");
- return;
- }
+
// get the azimuthal angle of the detector containing the innermost
// cluster of this track (data member fAlpha)
- Float_t rotmatr[9];
- geom->GetRotMatrix(layer,ladder,detector,rotmatr);
- fAlpha=TMath::ATan2(rotmatr[1],rotmatr[0])+TMath::Pi();
- fAlpha+=TMath::Pi()/2.;
- if(layer==1) fAlpha+=TMath::Pi();
+ TGeoHMatrix m; AliITSgeomTGeo::GetOrigMatrix(layer,ladder,detector,m);
+ const TGeoHMatrix *tm=AliITSgeomTGeo::GetTracking2LocalMatrix(layer,ladder,detector);
+ m.Multiply(tm);
+ Double_t txyz[3]={0.}, xyz[3]={0.};
+ m.LocalToMaster(txyz,xyz);
+ Double_t sAlpha=TMath::ATan2(xyz[1],xyz[0]);
+
+ if (sAlpha<0) sAlpha+=TMath::TwoPi();
+ else if (sAlpha>=TMath::TwoPi()) sAlpha-=TMath::TwoPi();
+
+ Double_t sX=TMath::Sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1]);
- // get the radius of this detector. Procedure taken from the
- // AliITStrackerV2 constructor
- Float_t x=0,y=0,z=0;
- geom->GetTrans(layer,ladder,detector,x,y,z);
+ Init(sAlpha,sX,Ycoor,Zcoor,phi,tanlambda,curv,lab);
+
+}
+//____________________________________________________
+AliITStrackSA::AliITStrackSA(Double_t alpha, Double_t radius, Double_t Ycoor, Double_t Zcoor, Double_t phi, Double_t tanlambda, Double_t curv, Int_t lab ):
+fNSA(0)
+{
+ // standard constructor. Used for ITS standalone tracking
- Double_t fi=TMath::ATan2(rotmatr[1],rotmatr[0])+TMath::Pi();
- fi+=TMath::Pi()/2;
- if (layer==1) fi+=TMath::Pi();
- Double_t cp=TMath::Cos(fi), sp=TMath::Sin(fi);
- fX=x*cp+y*sp;
+ // get the azimuthal angle of the detector containing the innermost
+ // cluster of this track (data member fAlpha)
+ if (alpha<0) alpha+=TMath::TwoPi();
+ else if (alpha>=TMath::TwoPi()) alpha-=TMath::TwoPi();
+ Init(alpha,radius,Ycoor,Zcoor,phi,tanlambda,curv,lab);
+}
+//____________________________________________________
+ void AliITStrackSA::Init(Double_t alpha, Double_t radius, Double_t Ycoor, Double_t Zcoor, Double_t phi, Double_t tanlambda, Double_t curv, Int_t lab ){
+ // initialize parameters
fdEdx = 0;
- fC00 = 0.000009; // 0.000009
- fC10 = 0.;
- fC11 = 0.000003; //0.000030
- fC20 = 0.;
- fC21 = 0.;
- fC22 = 0.000001; //0.000001
- fC30 = 0.;
- fC31 = 0.;
- fC32 = 0.;
- fC33 = 0.000002; //0.000002
- fC40 = 0.;
- fC41 = 0.;
- fC42 = 0.;
- fC43 = 0.;
- fC44 = 0.000001; //0.0000001
-
- fP0 = Ycoor;
- fP1 = Zcoor;
-
- fP2 = TMath::Sin(phi-fAlpha);
- fP3 = tanlambda;
- fP4 = curv;
- for(Int_t i=0; i<kMaxLayer; i++) fIndex[i] = 0; // to be set explicitely
+ Double_t conv=GetBz()*kB2C;
+ Double_t sC[] = {0.000009, // 0.000009
+ 0.,
+ 0.000003, //0.000030
+ 0.,
+ 0.,
+ 0.000001, //0.000001
+ 0.,
+ 0.,
+ 0.,
+ 0.000002, //0.000002
+ 0.,
+ 0.,
+ 0.,
+ 0.,
+ 0.000001/(conv*conv)}; //0.0000001
+
+ Double_t sP[] = {Ycoor,
+ Zcoor,
+ TMath::Sin(phi-alpha),
+ tanlambda,
+ curv/conv};
+
+
+ // dealing with the case B=0 (taken from AliTPCtrack.cxx)
+ Double_t mostProbablePt=AliExternalTrackParam::GetMostProbablePt();
+ Double_t p0=TMath::Sign(1/mostProbablePt,sP[4]);
+ Double_t w0=sC[14]/(sC[14] + p0*p0), w1=p0*p0/(sC[14] + p0*p0);
+ sP[4] = w0*p0 + w1*sP[4];
+ sC[14]*=w1;
+
+ Set(radius,alpha,sP,sC);
+
+ for(Int_t i=0; i<AliITSgeomTGeo::GetNLayers(); i++) fIndex[i] = 0; // to be set explicitely
for(Int_t i=0; i<4; i++) fdEdxSample[i] = 0;
SetNumberOfClusters(0);
SetNumberOfClustersSA(0);
+ for(Int_t nlay=0;nlay<AliITSgeomTGeo::GetNLayers();nlay++) SetNumberOfMarked(nlay,0);
ResetIndexSA();
+ ResetMarked();
SetChi2(0);
SetMass(0.139); // pion mass
SetLabel(lab);
//____________________________________________________________
void AliITStrackSA::AddClusterSA(Int_t layer, Int_t clnumb) {
- // add one clusters to the list (maximum number=fgkMaxNumberOfClusters)
+ // add one clusters to the list (maximum number=kMaxNumberOfClusters)
Int_t presnum = GetNumberOfClustersSA();
- if(presnum>=fgkMaxNumberOfClusters){
+ if(presnum>=kMaxNumberOfClusters){
Warning("AddClusterSA","Maximum number of clusters already reached. Nothing is done\n");
return;
}
SetNumberOfClustersSA(presnum);
}
+//____________________________________________________________
+void AliITStrackSA::AddClusterMark(Int_t layer, Int_t clnumb) {
+ // add one clusters to the list (maximum number=kMaxNumberOfClusters)
+ Int_t presnum = GetNumberOfMarked(layer);
+ // printf("presnum=%d\n",presnum);
+ if(presnum>=kMaxNumberOfClustersL){
+ Warning("AddClusterMark","Maximum number of clusters already reached. Nothing is done\n");
+ return;
+ }
+
+ fCluMark[layer][presnum] = clnumb;
+ presnum++;
+ SetNumberOfMarked(layer,presnum);
+}
+
//____________________________________________________________
void AliITStrackSA::AddClusterV2(Int_t layer,Int_t clnumb) {
// add one clusters to the list (maximum number=6)
Int_t presnum = GetNumberOfClusters();
- if(presnum>=kMaxLayer){
+ if(presnum>=AliITSgeomTGeo::GetNLayers()){
Warning("AddClusterV2","Maximum number of clusters already reached. Nothing is done\n");
return;
}
SetNumberOfClusters(presnum);
}
+//_____________________________________________________________
+void AliITStrackSA::ResetMarked(){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ //Reset array of marked clusters
+ for(Int_t nlay=0;nlay<AliITSgeomTGeo::GetNLayers();nlay++){
+ for(Int_t k=0; k<kMaxNumberOfClustersL; k++) fCluMark[nlay][k]=0;
+ }
+}