/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ /* $Id$ */ //------------------------------------------------------------------------- // Implementation of the AliKalmanTrack class // that is the base for AliTPCtrack, AliITStrackV2 and AliTRDtrack // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch //------------------------------------------------------------------------- #include "AliTracker.h" #include "AliKalmanTrack.h" #include "TGeoManager.h" ClassImp(AliKalmanTrack) //_______________________________________________________________________ AliKalmanTrack::AliKalmanTrack(): fLab(-3141593), fFakeRatio(0), fChi2(0), fMass(AliPID::ParticleMass(AliPID::kPion)), fN(0), fLocalConvConst(0), fStartTimeIntegral(kFALSE), fIntegratedLength(0) { // // Default constructor // if (AliTracker::GetFieldMap()==0) { AliFatal("The magnetic field has not been set!"); } for(Int_t i=0; i 100) return; for (Int_t i=0; i helix parameters //-------------------------------------------------------------------- Double_t alpha,x,cs,sn; GetExternalParameters(x,helix); alpha=GetAlpha(); cs=TMath::Cos(alpha); sn=TMath::Sin(alpha); helix[5]=x*cs - helix[0]*sn; // x0 helix[0]=x*sn + helix[0]*cs; // y0 //helix[1]= // z0 helix[2]=TMath::ASin(helix[2]) + alpha; // phi0 //helix[3]= // tgl helix[4]=helix[4]/GetLocalConvConst(); // C } Double_t AliKalmanTrack::MeanMaterialBudget(Double_t *start, Double_t *end, Double_t *mparam) { // // calculate mean material budget and material properties beween point start and end // mparam - returns parameters used for dEdx and multiple scatering // // mparam[0] - density mean // mparam[1] - rad length // mparam[2] - A mean // mparam[3] - Z mean // mparam[4] - length // mparam[5] - Z/A mean // mparam[6] - number of boundary crosses // mparam[0]=0; mparam[1]=1; mparam[2] =0; mparam[3] =0, mparam[4]=0, mparam[5]=0; mparam[6]=0; // Double_t bparam[6], lparam[6]; // bparam - total param - lparam - local parameters for (Int_t i=0;i<6;i++) bparam[i]=0; // if (!gGeoManager) { printf("ERROR: no TGeo\n"); return 0.; } // Double_t length; Double_t dir[3]; length = TMath::Sqrt((end[0]-start[0])*(end[0]-start[0])+ (end[1]-start[1])*(end[1]-start[1])+ (end[2]-start[2])*(end[2]-start[2])); mparam[4]=length; if (lengthInitTrack(start, dir); // printf("%s length=%f\n",gGeoManager->GetPath(),length); if (!startnode) { printf("ERROR: start point out of geometry\n"); return 0.0; } TGeoMaterial *material = startnode->GetVolume()->GetMedium()->GetMaterial(); lparam[0] = material->GetDensity(); lparam[1] = material->GetRadLen(); lparam[2] = material->GetA(); lparam[3] = material->GetZ(); lparam[4] = length; lparam[5] = lparam[3]/lparam[2]; if (material->IsMixture()) { lparam[1]*=lparam[0]; // different normalization in the modeler for mixture TGeoMixture * mixture = (TGeoMixture*)material; lparam[5] =0; Double_t sum =0; for (Int_t iel=0;ielGetNelements();iel++){ sum += mixture->GetWmixt()[iel]; lparam[5]+= mixture->GetZmixt()[iel]*mixture->GetWmixt()[iel]/mixture->GetAmixt()[iel]; } lparam[5]/=sum; } gGeoManager->FindNextBoundary(length); Double_t snext = gGeoManager->GetStep(); Double_t step = 0.0; // If no boundary within proposed length, return current density if (snext>=length) { for (Int_t ip=0;ip<5;ip++) mparam[ip] = lparam[ip]; return lparam[0]; } // Try to cross the boundary and see what is next while (length>TGeoShape::Tolerance()) { mparam[6]+=1.; currentnode = gGeoManager->Step(); step += snext+1.E-6; bparam[1] += snext*lparam[1]; bparam[2] += snext*lparam[2]; bparam[3] += snext*lparam[3]; bparam[5] += snext*lparam[5]; bparam[0] += snext*lparam[0]; if (snext>=length) break; if (!currentnode) break; // printf("%s snext=%f density=%f bparam[0]=%f\n", gGeoManager->GetPath(),snext,density,bparam[0]); if (!gGeoManager->IsEntering()) { gGeoManager->SetStep(1.E-3); currentnode = gGeoManager->Step(); if (!gGeoManager->IsEntering() || !currentnode) { // printf("ERROR: cannot cross boundary\n"); mparam[0] = bparam[0]/step; mparam[1] = bparam[1]/step; mparam[2] = bparam[2]/step; mparam[3] = bparam[3]/step; mparam[5] = bparam[5]/step; mparam[4] = step; mparam[0] = 0.; // if crash of navigation take mean density 0 mparam[1] = 1000000; // and infinite rad length return bparam[0]/step; } step += 1.E-3; snext += 1.E-3; bparam[0] += lparam[0]*1.E-3; bparam[1] += lparam[1]*1.E-3; bparam[2] += lparam[2]*1.E-3; bparam[3] += lparam[3]*1.E-3; bparam[5] += lparam[5]*1.E-3; } length -= snext; material = currentnode->GetVolume()->GetMedium()->GetMaterial(); lparam[0] = material->GetDensity(); lparam[1] = material->GetRadLen(); lparam[2] = material->GetA(); lparam[3] = material->GetZ(); lparam[5] = lparam[3]/lparam[2]; if (material->IsMixture()) { lparam[1]*=lparam[0]; TGeoMixture * mixture = (TGeoMixture*)material; lparam[5]=0; Double_t sum =0; for (Int_t iel=0;ielGetNelements();iel++){ sum+= mixture->GetWmixt()[iel]; lparam[5]+= mixture->GetZmixt()[iel]*mixture->GetWmixt()[iel]/mixture->GetAmixt()[iel]; } lparam[5]/=sum; } gGeoManager->FindNextBoundary(length); snext = gGeoManager->GetStep(); } mparam[0] = bparam[0]/step; mparam[1] = bparam[1]/step; mparam[2] = bparam[2]/step; mparam[3] = bparam[3]/step; mparam[5] = bparam[5]/step; return bparam[0]/step; } Double_t AliKalmanTrack::GetConvConst() { return 1000/0.299792458/AliTracker::GetBz(); } void AliKalmanTrack::SaveLocalConvConst() { //--------------------------------------------------------------------- // Saves local conversion constant "curvature (1/cm) -> pt (GeV/c)" //--------------------------------------------------------------------- if (AliTracker::UniformField()) { fLocalConvConst=1000/0.299792458/AliTracker::GetBz(); } else { Float_t r[3]; GetXYZ(r); fLocalConvConst=1000/0.299792458/AliTracker::GetBz(r); } }