: AliDetectorRecoParam(),
fClusteringMode("MLEM"),
fTrackingMode("KALMAN"),
+ fMostProbBendingMomentum(0.),
fMinBendingMomentum(0.),
fMaxBendingMomentum(0.),
fMaxNonBendingSlope(0.),
return param;
}
+//_____________________________________________________________________________
+AliMUONRecoParam *AliMUONRecoParam::GetCosmicParam()
+{
+ /// Return default reconstruction parameters for high flux environment
+
+ AliMUONRecoParam *param = new AliMUONRecoParam();
+ param->SetCosmicParam();
+
+ return param;
+}
+
//_____________________________________________________________________________
void AliMUONRecoParam::SetLowFluxParam()
{
/// Set reconstruction parameters for low flux environment
+ fMostProbBendingMomentum = 2.;
fMinBendingMomentum = 1.;
fMaxBendingMomentum = 3000.;
fMaxNonBendingSlope = 0.3;
{
/// Set reconstruction parameters for high flux environment
+ fMostProbBendingMomentum = 2.;
fMinBendingMomentum = 1.;
fMaxBendingMomentum = 3000.;
fMaxNonBendingSlope = 0.3;
}
+//_____________________________________________________________________________
+void AliMUONRecoParam::SetCosmicParam()
+{
+ /// Set reconstruction parameters for high flux environment
+
+ fMostProbBendingMomentum = 2.;
+ fMinBendingMomentum = 1.;
+ fMaxBendingMomentum = 10000000.;
+ fMaxNonBendingSlope = 0.3;
+ fNonBendingVertexDispersion = 10.;
+ fBendingVertexDispersion = 10.;
+ fMaxNonBendingDistanceToTrack = 10.;
+ fMaxBendingDistanceToTrack = 10.;
+ fSigmaCutForTracking = 20.;
+ fSigmaCutForImprovement = 20.;
+ fSigmaCutForTrigger = 8.;
+ fMaxNormChi2MatchTrigger = 16.;
+ fPercentOfFullClusterInESD = 100.;
+ fCombinedClusterTrackReco = kFALSE;
+ fTrackAllTracks = kTRUE;
+ fRecoverTracks = kTRUE;
+ fMakeTrackCandidatesFast = kFALSE;
+ fMakeMoreTrackCandidates = kFALSE;
+ fComplementTracks = kTRUE;
+ fImproveTracks = kTRUE;
+ fUseSmoother = kTRUE;
+ fSaveFullClusterInESD = kTRUE;
+ for (Int_t iCh = 0; iCh < 10; iCh++) fUseChamber[iCh] = kTRUE;
+ for (Int_t iSt = 0; iSt < 5; iSt++) fRequestStation[iSt] = kTRUE;
+ fBypassSt45 = kFALSE;
+
+}
+
//_____________________________________________________________________________
void AliMUONRecoParam::Print(Option_t *option) const
{
if (fSaveFullClusterInESD) cout<<Form("Save all cluster info in ESD for %5.2f %% of events",fPercentOfFullClusterInESD)<<endl;
else cout<<"Save partial cluster info in ESD"<<endl;
+ cout<<Form("Most probable bending momentum (used only if B=0) = %5.2f",fMostProbBendingMomentum)<<endl;
+
cout<<Form("Bending momentum range = [%5.2f,%5.2f]",fMinBendingMomentum,fMaxBendingMomentum)<<endl;
cout<<Form("Maximum non bending slope = %5.2f",fMaxNonBendingSlope)<<endl;
} while (++st < 5);
if (discardedSt) cout<<endl;
- if (strstr(option,"FULL")) {
- cout<<"Bypass stations 4 and 5 (use trigger tracks as primary track candidates): ";
- if (fBypassSt45) cout<<"ON"<<endl;
- else cout<<"OFF"<<endl;
- } else if (fBypassSt45)
- cout<<"Bypass stations 4 and 5 (use trigger tracks as primary track candidates)"<<endl;
-
-
cout<<"\t-------------------------------------"<<endl<<endl;
}
static AliMUONRecoParam *GetLowFluxParam();
static AliMUONRecoParam *GetHighFluxParam();
+ static AliMUONRecoParam *GetCosmicParam();
/// set the calibration mode (see GetCalibrationMode() for possible modes)
void SetCalibrationMode(Option_t* mode) { fCalibrationMode = mode; fCalibrationMode.ToUpper();}
/// return the percentage of events for which all cluster info are stored in ESD
Double_t GetPercentOfFullClusterInESD() const {return fPercentOfFullClusterInESD;}
+ /// set the most probable value (GeV/c) of momentum in bending plane
+ /// needed to get some "reasonable" corrections for MCS and E loss even if B = 0
+ void SetMostProbBendingMomentum(Double_t val) {fMostProbBendingMomentum = val;}
+ /// return the most probable value (GeV/c) of momentum in bending plane
+ Double_t GetMostProbBendingMomentum() const {return fMostProbBendingMomentum;}
+
/// set the minimum value (GeV/c) of momentum in bending plane
void SetMinBendingMomentum(Double_t val) {fMinBendingMomentum = val;}
/// return the minimum value (GeV/c) of momentum in bending plane
/// tracking mode: ORIGINAL, KALMAN
TString fTrackingMode; ///< \brief name of the tracking mode
+ Double32_t fMostProbBendingMomentum; ///< most probable value (GeV/c) of muon momentum in bending plane (used when B = 0)
+
Double32_t fMinBendingMomentum; ///< minimum value (GeV/c) of momentum in bending plane
Double32_t fMaxBendingMomentum; ///< maximum value (GeV/c) of momentum in bending plane
Double32_t fMaxNonBendingSlope; ///< maximum value of the non bending slope
// functions
void SetLowFluxParam();
void SetHighFluxParam();
+ void SetCosmicParam();
- ClassDef(AliMUONRecoParam,3) // MUON reco parameters
+ ClassDef(AliMUONRecoParam,4) // MUON reco parameters
};
#endif
#include "AliMUONTrackExtrap.h"
#include "AliMUONTrackParam.h"
#include "AliMUONConstants.h"
+#include "AliMUONReconstructor.h"
+#include "AliMUONRecoParam.h"
#include "AliMagF.h"
}
Double_t simpleBValue = (Double_t) b[0];
- return kCorrectionFactor * (-0.0003 * simpleBValue * simpleBLength * simpleBPosition / impactParam);
+ if (TMath::Abs(simpleBValue) > 0.01) return kCorrectionFactor * (-0.0003 * simpleBValue * simpleBLength * simpleBPosition / impactParam);
+ else return AliMUONReconstructor::GetRecoParam()->GetMostProbBendingMomentum();
}
//__________________________________________________________________________
Double_t AliMUONTrackParam::Px() const
{
/// return p_x from track parameters
- Double_t pYZ, pZ, pX;
- pYZ = 0;
- if ( TMath::Abs(fParameters(4,0)) > 0 )
- pYZ = TMath::Abs(1.0 / fParameters(4,0));
- pZ = -pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0)
- pX = pZ * fParameters(1,0);
- return pX;
+ Double_t pZ;
+ if (TMath::Abs(fParameters(4,0)) > 0) {
+ Double_t pYZ = (TMath::Abs(fParameters(4,0)) > 0) ? TMath::Abs(1.0 / fParameters(4,0)) : FLT_MAX;
+ pZ = - pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0)
+ } else {
+ pZ = - FLT_MAX / TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0) + fParameters(1,0) * fParameters(1,0));
+ }
+ return pZ * fParameters(1,0);
}
//__________________________________________________________________________
Double_t AliMUONTrackParam::Py() const
{
/// return p_y from track parameters
- Double_t pYZ, pZ, pY;
- pYZ = 0;
- if ( TMath::Abs(fParameters(4,0)) > 0 )
- pYZ = TMath::Abs(1.0 / fParameters(4,0));
- pZ = -pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0)
- pY = pZ * fParameters(3,0);
- return pY;
+ Double_t pZ;
+ if (TMath::Abs(fParameters(4,0)) > 0) {
+ Double_t pYZ = (TMath::Abs(fParameters(4,0)) > 0) ? TMath::Abs(1.0 / fParameters(4,0)) : FLT_MAX;
+ pZ = - pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0)
+ } else {
+ pZ = - FLT_MAX / TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0) + fParameters(1,0) * fParameters(1,0));
+ }
+ return pZ * fParameters(3,0);
}
//__________________________________________________________________________
Double_t AliMUONTrackParam::Pz() const
{
/// return p_z from track parameters
- Double_t pYZ, pZ;
- pYZ = 0;
- if ( TMath::Abs(fParameters(4,0)) > 0 )
- pYZ = TMath::Abs(1.0 / fParameters(4,0));
- pZ = -pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0)
- return pZ;
+ if (TMath::Abs(fParameters(4,0)) > 0) {
+ Double_t pYZ = TMath::Abs(1.0 / fParameters(4,0));
+ return - pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0)
+ } else return - FLT_MAX / TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0) + fParameters(1,0) * fParameters(1,0));
}
//__________________________________________________________________________
Double_t AliMUONTrackParam::P() const
{
/// return p from track parameters
- Double_t pYZ, pZ, p;
- pYZ = 0;
- if ( TMath::Abs(fParameters(4,0)) > 0 )
- pYZ = TMath::Abs(1.0 / fParameters(4,0));
- pZ = -pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0)
- p = TMath::Abs(pZ) *
- TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0) + fParameters(1,0) * fParameters(1,0));
- return p;
-
+ if (TMath::Abs(fParameters(4,0)) > 0) {
+ Double_t pYZ = TMath::Abs(1.0 / fParameters(4,0));
+ Double_t pZ = - pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0)
+ return TMath::Abs(pZ) * TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0) + fParameters(1,0) * fParameters(1,0));
+ } else return FLT_MAX;
}
//__________________________________________________________________________
AliMUONVCluster* cluster;
AliMUONTrackParam *trackParam, *nextTrackParam, copyOfTrackParam, trackParamAtCluster, bestTrackParamAtCluster;
- // Remove double track to complete only "good" tracks
- RemoveDoubleTracks();
-
AliMUONTrack *track = (AliMUONTrack*) fRecTracksPtr->First();
while (track) {
trackModified = kFALSE;
// add new cluster if any
if (foundOneCluster) {
+
+ // Printout for debuging
+ if ((AliLog::GetDebugLevel("MUON","AliMUONTrackReconstructor") >= 1) || (AliLog::GetGlobalDebugLevel() >= 1)) {
+ cout << "ComplementTracks: found one cluster in chamber(1..): " << chamberId+1 << endl;
+ bestTrackParamAtCluster.GetClusterPtr()->Print();
+ cout<<endl<<"Track parameters and covariances at cluster:"<<endl;
+ bestTrackParamAtCluster.GetParameters().Print();
+ bestTrackParamAtCluster.GetCovariances().Print();
+ }
+
trackParam->SetRemovable(kTRUE);
bestTrackParamAtCluster.SetRemovable(kTRUE);
track->AddTrackParamAtCluster(bestTrackParamAtCluster,*(bestTrackParamAtCluster.GetClusterPtr()));
// parameters at last but one cluster
AliMUONTrackParam* previousTrackParam = (AliMUONTrackParam*) trackCandidate.GetTrackParamAtCluster()->Before(lastTrackParam);
AliMUONVCluster* cluster1 = previousTrackParam->GetClusterPtr();
+ // make sure it is on the previous chamber (can have 2 clusters in the same chamber after "ComplementTrack")
+ if (cluster2->GetChamberId() == cluster1->GetChamberId()) {
+ previousTrackParam = (AliMUONTrackParam*) trackCandidate.GetTrackParamAtCluster()->Before(previousTrackParam);
+ cluster1 = previousTrackParam->GetClusterPtr();
+ }
Double_t x1 = cluster1->GetX();
Double_t y1 = cluster1->GetY();
Double_t z1 = cluster1->GetZ();
AliMUONVCluster *cluster;
AliMUONTrackParam *trackParam, *previousTrackParam, *nextTrackParam, trackParamAtCluster, bestTrackParamAtCluster;
- // Remove double track to complete only "good" tracks
- RemoveDoubleTracks();
-
AliMUONTrack *track = (AliMUONTrack*) fRecTracksPtr->First();
while (track) {
trackModified = kFALSE;
// add new cluster if any
if (foundOneCluster) {
+
+ // Printout for debuging
+ if ((AliLog::GetDebugLevel("MUON","AliMUONTrackReconstructorK") >= 1) || (AliLog::GetGlobalDebugLevel() >= 1)) {
+ cout << "ComplementTracks: found one cluster in chamber(1..): " << chamberId+1 << endl;
+ bestTrackParamAtCluster.GetClusterPtr()->Print();
+ cout<<endl<<"Track parameters and covariances at cluster:"<<endl;
+ bestTrackParamAtCluster.GetParameters().Print();
+ bestTrackParamAtCluster.GetCovariances().Print();
+ }
+
trackParam->SetRemovable(kTRUE);
bestTrackParamAtCluster.SetRemovable(kTRUE);
track->AddTrackParamAtCluster(bestTrackParamAtCluster,*(bestTrackParamAtCluster.GetClusterPtr()));
AliMUONTrack *track, *nextTrack;
- // Remove double track to improve only "good" tracks
- RemoveDoubleTracks();
-
track = (AliMUONTrack*) fRecTracksPtr->First();
while (track) {
#endif
// Data file, OCDB on Grid
-TString input="alien:///alice/data/2008/LHC08a/000021931/raw/08000021931001.50.root";
+TString input="alien:///alice/data/2008/LHC08a/000024841/raw/08000024841010.10.root";
+//TString input="alien:///alice/data/2008/LHC08a/000021931/raw/08000021931001.50.root";
TString ocdbPath = "alien://folder=/alice/data/2008/LHC08a/OCDB";
// Data file, OCDB locally
void runDataReconstruction(Int_t calib = 1)
{
TGrid::Connect("alien://");
-
+
AliCDBManager* man = AliCDBManager::Instance();
man->SetDefaultStorage(ocdbPath.Data());
//man->SetSpecificStorage("MUON/Calib/Mapping","local://$ALICE_ROOT");
//man->SetSpecificStorage("MUON/Calib/DDLStore","local://$ALICE_ROOT");
//man->SetSpecificStorage("MUON/Calib/Gains","local://$ALICE_ROOT");
-
+
gRandom->SetSeed(seed);
- AliMagFMaps* field = new AliMagFMaps("Maps","Maps", 1, 1., 10., AliMagFMaps::k5kG);
+ // no magnetic field --> factor (4th parameter) = 0
+ AliMagFMaps* field = new AliMagFMaps("Maps","Maps", 1, 0., 10., AliMagFMaps::k5kG);
AliTracker::SetFieldMap(field, kFALSE);
AliReconstruction *MuonRec = new AliReconstruction();
-
-
+
+
MuonRec->SetInput(input.Data());
MuonRec->SetRunVertexFinder(kFALSE);
MuonRec->SetRunLocalReconstruction("MUON");
// MuonRec->SetEventRange(319,319);
MuonRec->SetWriteAOD();
//MuonRec.SetEventRange(0,100);
- AliMUONRecoParam *muonRecoParam = AliMUONRecoParam::GetLowFluxParam();
- muonRecoParam->CombineClusterTrackReco(kFALSE);
+ AliMUONRecoParam *muonRecoParam = AliMUONRecoParam::GetCosmicParam();
+ muonRecoParam->BypassSt45(kTRUE);
+ muonRecoParam->RequestStation(2,kFALSE);
TString caliboption = caliboption1;
if ( calib == 2 ) caliboption = caliboption2;
muonRecoParam->SetCalibrationMode(caliboption.Data());