X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliKalmanTrack.cxx;h=92df4af77cfd24124241509e795ccc97cfd820f3;hb=c4460410202661b3feb05b611a25f70c09a33ede;hp=253d32b39ec00aff0de6bafb66c1723231f39a73;hpb=39d4ae589f29291296d2f93504918c5fe6b5e647;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliKalmanTrack.cxx b/STEER/AliKalmanTrack.cxx index 253d32b39ec..92df4af77cf 100644 --- a/STEER/AliKalmanTrack.cxx +++ b/STEER/AliKalmanTrack.cxx @@ -21,19 +21,17 @@ // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch //------------------------------------------------------------------------- #include -#include #include "AliKalmanTrack.h" -#include "AliCluster3D.h" ClassImp(AliKalmanTrack) //_______________________________________________________________________ AliKalmanTrack::AliKalmanTrack():AliExternalTrackParam(), - fLab(-3141593), fFakeRatio(0), fChi2(0), fMass(AliPID::ParticleMass(AliPID::kPion)), + fLab(-3141593), fN(0), fStartTimeIntegral(kFALSE), fIntegratedLength(0) @@ -45,13 +43,12 @@ ClassImp(AliKalmanTrack) for(Int_t i=0; iGetX(), - GetY() - c->GetY(), - GetZ() - c->GetZ() - }; - - Double_t f=GetSnp(); - if (TMath::Abs(f) >= kAlmost1) return kVeryBig; - Double_t r=TMath::Sqrt(1.- f*f); - Double_t a=f/r, b=GetTgl()/r; - - Double_t s2=333.*333.; //something reasonably big (cm^2) - - TMatrixDSym v(3); - v(0,0)= s2; v(0,1)= a*s2; v(0,2)= b*s2;; - v(1,0)=a*s2; v(1,1)=a*a*s2 + GetSigmaY2(); v(1,2)=a*b*s2 + GetSigmaZY(); - v(2,0)=b*s2; v(2,1)=a*b*s2 + GetSigmaZY(); v(2,2)=b*b*s2 + GetSigmaZ2(); - - v(0,0)+=c->GetSigmaX2(); v(0,1)+=c->GetSigmaXY(); v(0,2)+=c->GetSigmaXZ(); - v(1,0)+=c->GetSigmaXY(); v(1,1)+=c->GetSigmaY2(); v(1,2)+=c->GetSigmaYZ(); - v(2,0)+=c->GetSigmaXZ(); v(2,1)+=c->GetSigmaYZ(); v(2,2)+=c->GetSigmaZ2(); - - v.Invert(); - if (!v.IsValid()) return kVeryBig; - - Double_t chi2=0.; - for (Int_t i = 0; i < 3; i++) - for (Int_t j = 0; j < 3; j++) chi2 += res[i]*res[j]*v(i,j); - - return chi2; +AliKalmanTrack& AliKalmanTrack::operator=(const AliKalmanTrack&o){ + if(this!=&o){ + AliExternalTrackParam::operator=(o); + fLab = o.fLab; + fFakeRatio = o.fFakeRatio; + fChi2 = o.fChi2; + fMass = o.fMass; + fN = o.fN; + fStartTimeIntegral = o.fStartTimeIntegral; + for(Int_t i = 0;iInitTrack(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; - -} -