#include "AliMUONTrackParam.h"
#include "AliMUONTrackExtrap.h"
#include "AliMUONRecoParam.h"
+#include "AliMUONGeometryTransformer.h"
#include "AliMpArea.h"
#include <Riostream.h>
#include <TMath.h>
#include <TMatrixD.h>
+#include <TClonesArray.h>
// Functions to be minimized with Minuit
void TrackChi2(Int_t &nParam, Double_t *gradient, Double_t &chi2, Double_t *param, Int_t flag);
+using std::endl;
+using std::cout;
/// \cond CLASSIMP
ClassImp(AliMUONTrackReconstructor) // Class implementation in ROOT context
/// \endcond
//__________________________________________________________________________
-AliMUONTrackReconstructor::AliMUONTrackReconstructor(const AliMUONRecoParam* recoParam, AliMUONVClusterServer* clusterServer)
- : AliMUONVTrackReconstructor(recoParam,clusterServer)
+AliMUONTrackReconstructor::AliMUONTrackReconstructor(const AliMUONRecoParam* recoParam, AliMUONVClusterServer* clusterServer,
+ const AliMUONGeometryTransformer* transformer)
+ : AliMUONVTrackReconstructor(recoParam, clusterServer, transformer)
{
/// Constructor
}
fNRecTracks--;
} else if (fNRecTracks > GetRecoParam()->GetMaxTrackCandidates()) {
AliError(Form("Too many track candidates (%d tracks). Stop tracking.", fNRecTracks));
- delete segments;
return kFALSE;
}
} else {
if ((fNRecTracks + segments->GetEntriesFast() - iseg - 1) > GetRecoParam()->GetMaxTrackCandidates()) {
AliError(Form("Too many track candidates (%d tracks). Stop tracking.", fNRecTracks + segments->GetEntriesFast() - iseg - 1));
- delete segments;
return kFALSE;
}
}
}
- // delete the array of segments
- delete segments;
}
// Keep all different tracks or only the best ones as required
// abort tracking if there are too many candidates
if ((fNRecTracks + segments->GetEntriesFast() - iSegment - 1) > GetRecoParam()->GetMaxTrackCandidates()) {
AliError(Form("Too many track candidates (%d tracks). Stop tracking.", fNRecTracks + segments->GetEntriesFast() - iSegment - 1));
- delete segments;
return kFALSE;
}
}
- // delete the array of segments
- delete segments;
}
}
}
// Add MCS effect
- AliMUONTrackExtrap::AddMCSEffect(&extrapTrackParamAtCh,AliMUONConstants::ChamberThicknessInX0(),1.);
+ Int_t currentChamber = extrapTrackParamAtCh.GetClusterPtr()->GetChamberId();
+ AliMUONTrackExtrap::AddMCSEffect(&extrapTrackParamAtCh,AliMUONConstants::ChamberThicknessInX0(currentChamber),-1.);
// Add MCS in the missing chamber(s) if any
- Int_t currentChamber = extrapTrackParamAtCh.GetClusterPtr()->GetChamberId();
while (currentChamber > nextChamber + 1) {
// extrapolation to the missing chamber
currentChamber--;
if (!AliMUONTrackExtrap::ExtrapToZCov(&extrapTrackParamAtCh, AliMUONConstants::DefaultChamberZ(currentChamber))) return kFALSE;
// add MCS effect
- AliMUONTrackExtrap::AddMCSEffect(&extrapTrackParamAtCh,AliMUONConstants::ChamberThicknessInX0(),1.);
+ AliMUONTrackExtrap::AddMCSEffect(&extrapTrackParamAtCh,AliMUONConstants::ChamberThicknessInX0(currentChamber),-1.);
}
//Extrapolate trackCandidate to chamber
}
// Add MCS effect
- AliMUONTrackExtrap::AddMCSEffect(&extrapTrackParamAtCh,AliMUONConstants::ChamberThicknessInX0(),1.);
+ Int_t currentChamber = extrapTrackParamAtCh.GetClusterPtr()->GetChamberId();
+ AliMUONTrackExtrap::AddMCSEffect(&extrapTrackParamAtCh,AliMUONConstants::ChamberThicknessInX0(currentChamber),-1.);
// Add MCS in the missing chamber(s) if any
- Int_t currentChamber = extrapTrackParamAtCh.GetClusterPtr()->GetChamberId();
while (ch1 < ch2 && currentChamber > ch2 + 1) {
// extrapolation to the missing chamber
currentChamber--;
if (!AliMUONTrackExtrap::ExtrapToZCov(&extrapTrackParamAtCh, AliMUONConstants::DefaultChamberZ(currentChamber))) return kFALSE;
// add MCS effect
- AliMUONTrackExtrap::AddMCSEffect(&extrapTrackParamAtCh,AliMUONConstants::ChamberThicknessInX0(),1.);
+ AliMUONTrackExtrap::AddMCSEffect(&extrapTrackParamAtCh,AliMUONConstants::ChamberThicknessInX0(currentChamber),-1.);
}
//Extrapolate trackCandidate to chamber "ch2"
}
// add MCS effect for next step
- AliMUONTrackExtrap::AddMCSEffect(&extrapTrackParamAtCluster2,AliMUONConstants::ChamberThicknessInX0(),1.);
+ AliMUONTrackExtrap::AddMCSEffect(&extrapTrackParamAtCluster2,AliMUONConstants::ChamberThicknessInX0(ch2),-1.);
// copy new track parameters for next step
extrapTrackParam = extrapTrackParamAtCluster2;
if (GetRecoParam()->TrackAllTracks() || !foundTwoClusters) {
// add MCS effect for next step
- AliMUONTrackExtrap::AddMCSEffect(&extrapTrackParamAtCh,AliMUONConstants::ChamberThicknessInX0(),1.);
+ AliMUONTrackExtrap::AddMCSEffect(&extrapTrackParamAtCh,AliMUONConstants::ChamberThicknessInX0(ch2),-1.);
//Extrapolate trackCandidate to chamber "ch1"
Bool_t normalExtrap = AliMUONTrackExtrap::ExtrapToZCov(&extrapTrackParamAtCh, AliMUONConstants::DefaultChamberZ(ch1));
// copy track parameters at first cluster for jacobian calculation
AliMUONTrackParam trackParam(trackParamAtCluster1);
- // add MCS effect to the covariance matrix at first cluster
- AliMUONTrackExtrap::AddMCSEffect(&trackParam,AliMUONConstants::ChamberThicknessInX0(),1.);
-
// Get the pointer to the parameter covariance matrix at first cluster
const TMatrixD& kParamCov = trackParam.GetCovariances();
// Covariance matrix according to HESSE status
// If problem then keep only the diagonal terms (variances)
Double_t matrix[5][5];
+ for (Int_t i=0; i<5; i++) for (Int_t j=0; j<5; j++) matrix[i][j] = 0.;
gMinuit->mnemat(&matrix[0][0],5);
if (covStatus == 3) trackParam->SetCovariances(matrix);
else trackParam->SetVariances(matrix);