}
//__________________________________________________________________________
-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
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);
}
//__________________________________________________________________________
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;
}
// 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);
// 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);
// 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
// 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
}
//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.);
// 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