In AliMUONTrackExtrap:
authorivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 3 Jun 2009 12:06:50 +0000 (12:06 +0000)
committerivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 3 Jun 2009 12:06:50 +0000 (12:06 +0000)
- Modify LinearExtrapToZ(...): propagate only the track parameters
- Add LinearExtrapToZCov(...): propagate the track parameters and the full
  covariance matrix
(Philippe P.)

MUON/AliMUONTrackExtrap.cxx
MUON/AliMUONTrackExtrap.h
MUON/AliMUONVTrackReconstructor.cxx

index 7b8d462..944d556 100644 (file)
@@ -102,9 +102,9 @@ AliMUONTrackExtrap::GetBendingMomentumFromImpactParam(Double_t impactParam)
 }
 
 //__________________________________________________________________________
-void AliMUONTrackExtrap::LinearExtrapToZ(AliMUONTrackParam* trackParam, Double_t zEnd, Bool_t updatePropagator)
+void AliMUONTrackExtrap::LinearExtrapToZ(AliMUONTrackParam* trackParam, Double_t zEnd)
 {
-  /// Track parameters (and their covariances if any) linearly extrapolated to the plane at "zEnd".
+  /// Track parameters linearly extrapolated to the plane at "zEnd".
   /// On return, results from the extrapolation are updated in trackParam.
   
   if (trackParam->GetZ() == zEnd) return; // nothing to be done if same z
@@ -114,29 +114,43 @@ void AliMUONTrackExtrap::LinearExtrapToZ(AliMUONTrackParam* trackParam, Double_t
   trackParam->SetNonBendingCoor(trackParam->GetNonBendingCoor() + trackParam->GetNonBendingSlope() * dZ);
   trackParam->SetBendingCoor(trackParam->GetBendingCoor() + trackParam->GetBendingSlope() * dZ);
   trackParam->SetZ(zEnd);
+}
+
+//__________________________________________________________________________
+void AliMUONTrackExtrap::LinearExtrapToZCov(AliMUONTrackParam* trackParam, Double_t zEnd, Bool_t updatePropagator)
+{
+  /// Track parameters and their covariances linearly extrapolated to the plane at "zEnd".
+  /// On return, results from the extrapolation are updated in trackParam.
   
-  // Update track parameters covariances if any
-  if (trackParam->CovariancesExist()) {
-    TMatrixD paramCov(trackParam->GetCovariances());
-    paramCov(0,0) += dZ * dZ * paramCov(1,1) + 2. * dZ * paramCov(0,1);
-    paramCov(0,1) += dZ * paramCov(1,1);
-    paramCov(1,0) = paramCov(0,1);
-    paramCov(2,2) += dZ * dZ * paramCov(3,3) + 2. * dZ * paramCov(2,3);
-    paramCov(2,3) += dZ * paramCov(3,3);
-    paramCov(3,2) = paramCov(2,3);
-    trackParam->SetCovariances(paramCov);
-    
-    // Update the propagator if required
-    if (updatePropagator) {
-      TMatrixD jacob(5,5);
-      jacob.UnitMatrix();
-      jacob(0,1) = dZ;
-      jacob(2,3) = dZ;
-      trackParam->UpdatePropagator(jacob);
-    }
-    
+  if (trackParam->GetZ() == zEnd) return; // nothing to be done if same z
+  
+  // No need to propagate the covariance matrix if it does not exist
+  if (!trackParam->CovariancesExist()) {
+    cout<<"W-AliMUONTrackExtrap::LinearExtrapToZCov: Covariance matrix does not exist"<<endl;
+    // Extrapolate linearly track parameters to "zEnd"
+    LinearExtrapToZ(trackParam,zEnd);
+    return;
   }
   
+  // Compute track parameters
+  Double_t dZ = zEnd - trackParam->GetZ();
+  trackParam->SetNonBendingCoor(trackParam->GetNonBendingCoor() + trackParam->GetNonBendingSlope() * dZ);
+  trackParam->SetBendingCoor(trackParam->GetBendingCoor() + trackParam->GetBendingSlope() * dZ);
+  trackParam->SetZ(zEnd);
+  
+  // Calculate the jacobian related to the track parameters linear extrapolation to "zEnd"
+  TMatrixD jacob(5,5);
+  jacob.UnitMatrix();
+  jacob(0,1) = dZ;
+  jacob(2,3) = dZ;
+  
+  // Extrapolate track parameter covariances to "zEnd"
+  TMatrixD tmp(trackParam->GetCovariances(),TMatrixD::kMultTranspose,jacob);
+  TMatrixD tmp2(jacob,TMatrixD::kMult,tmp);
+  trackParam->SetCovariances(tmp2);
+  
+  // Update the propagator if required
+  if (updatePropagator) trackParam->UpdatePropagator(jacob);
 }
 
 //__________________________________________________________________________
@@ -287,7 +301,7 @@ void AliMUONTrackExtrap::ExtrapToZCov(AliMUONTrackParam* trackParam, Double_t zE
   if (trackParam->GetZ() == zEnd) return; // nothing to be done if same z
   
   if (!fgFieldON) { // linear extrapolation if no magnetic field
-    AliMUONTrackExtrap::LinearExtrapToZ(trackParam,zEnd,updatePropagator);
+    AliMUONTrackExtrap::LinearExtrapToZCov(trackParam,zEnd,updatePropagator);
     return;
   }
   
@@ -412,7 +426,7 @@ void AliMUONTrackExtrap::CorrectMCSEffectInAbsorber(AliMUONTrackParam* param,
   
   // Get track parameters and covariances in the Branson plane corrected for magnetic field effect
   ExtrapToZCov(param,zVtx);
-  LinearExtrapToZ(param,zB);
+  LinearExtrapToZCov(param,zB);
   
   // compute track parameters at vertex
   TMatrixD newParam(5,1);
index 5276dca..85a7042 100644 (file)
@@ -36,8 +36,11 @@ class AliMUONTrackExtrap : public TObject
   static Double_t GetImpactParamFromBendingMomentum(Double_t bendingMomentum);
   static Double_t GetBendingMomentumFromImpactParam(Double_t impactParam);
   
+  // Linearly extrapolate track parameters
+  static void LinearExtrapToZ(AliMUONTrackParam* trackParam, Double_t zEnd);
+  
   // Linearly extrapolate track parameters and covariances
-  static void LinearExtrapToZ(AliMUONTrackParam* trackParam, Double_t zEnd, Bool_t updatePropagator = kFALSE);
+  static void LinearExtrapToZCov(AliMUONTrackParam* trackParam, Double_t zEnd, Bool_t updatePropagator = kFALSE);
   
   // Extrapolate track parameters in magnetic field
   static void ExtrapToZ(AliMUONTrackParam *trackParam, Double_t zEnd);
index 797c704..4367aa9 100644 (file)
@@ -676,7 +676,7 @@ Double_t AliMUONVTrackReconstructor::TryTwoClustersFast(const AliMUONTrackParam
   
   // extrapolate linearly track parameters and covariances at the z position of the second cluster
   trackParamAtCluster2 = trackParamAtCluster1;
-  AliMUONTrackExtrap::LinearExtrapToZ(&trackParamAtCluster2, cluster2->GetZ());
+  AliMUONTrackExtrap::LinearExtrapToZCov(&trackParamAtCluster2, cluster2->GetZ());
   
   // set pointer to cluster2 into trackParamAtCluster2
   trackParamAtCluster2.SetClusterPtr(cluster2);
@@ -762,7 +762,7 @@ Bool_t AliMUONVTrackReconstructor::FollowLinearTrackInChamber(AliMUONTrack &trac
     
     // try to add the current cluster accuratly
     extrapTrackParamAtCluster = trackParam;
-    AliMUONTrackExtrap::LinearExtrapToZ(&extrapTrackParamAtCluster, cluster->GetZ());
+    AliMUONTrackExtrap::LinearExtrapToZCov(&extrapTrackParamAtCluster, cluster->GetZ());
     chi2WithOneCluster = TryOneCluster(extrapTrackParamAtCluster, cluster, extrapTrackParamAtCluster);
     
     // if good chi2 then consider to add cluster
@@ -910,7 +910,7 @@ Bool_t AliMUONVTrackReconstructor::FollowLinearTrackInStation(AliMUONTrack &trac
     
     // try to add the current cluster accuratly
     extrapTrackParamAtCluster2 = trackParam;
-    AliMUONTrackExtrap::LinearExtrapToZ(&extrapTrackParamAtCluster2, clusterCh2->GetZ());
+    AliMUONTrackExtrap::LinearExtrapToZCov(&extrapTrackParamAtCluster2, clusterCh2->GetZ());
     chi2WithOneCluster = TryOneCluster(extrapTrackParamAtCluster2, clusterCh2, extrapTrackParamAtCluster2);
     
     // if good chi2 then try to attach a cluster in the other chamber too
@@ -1026,7 +1026,7 @@ Bool_t AliMUONVTrackReconstructor::FollowLinearTrackInStation(AliMUONTrack &trac
     }
     
     //Extrapolate trackCandidate to chamber "ch2"
-    AliMUONTrackExtrap::LinearExtrapToZ(&trackParam, AliMUONConstants::DefaultChamberZ(ch2));
+    AliMUONTrackExtrap::LinearExtrapToZCov(&trackParam, AliMUONConstants::DefaultChamberZ(ch2));
     
     // add MCS effect for next step
     AliMUONTrackExtrap::AddMCSEffect(&trackParam,AliMUONConstants::ChamberThicknessInX0(),1.);
@@ -1046,7 +1046,7 @@ Bool_t AliMUONVTrackReconstructor::FollowLinearTrackInStation(AliMUONTrack &trac
       
       // try to add the current cluster accuratly
       extrapTrackParamAtCluster1 = trackParam;
-      AliMUONTrackExtrap::LinearExtrapToZ(&extrapTrackParamAtCluster1, clusterCh1->GetZ());
+      AliMUONTrackExtrap::LinearExtrapToZCov(&extrapTrackParamAtCluster1, clusterCh1->GetZ());
       chi2WithOneCluster = TryOneCluster(extrapTrackParamAtCluster1, clusterCh1, extrapTrackParamAtCluster1);
       
       // if good chi2 then consider to add clusterCh1