New option to discard mono-cathod clusters (by changing their resolution) and refit...
authorlaphecet <laphecet@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 14 Feb 2013 20:30:51 +0000 (20:30 +0000)
committerlaphecet <laphecet@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 14 Feb 2013 20:30:51 +0000 (20:30 +0000)
13 files changed:
MUON/AliMUONDigitizerV3.cxx
MUON/AliMUONESDInterface.cxx
MUON/AliMUONRecoParam.cxx
MUON/AliMUONRecoParam.h
MUON/AliMUONRefitter.cxx
MUON/AliMUONTrackReconstructor.cxx
MUON/AliMUONTrackReconstructor.h
MUON/AliMUONTrackReconstructorK.cxx
MUON/AliMUONTrackReconstructorK.h
MUON/AliMUONTracker.cxx
MUON/AliMUONTracker.h
MUON/AliMUONVTrackReconstructor.cxx
MUON/AliMUONVTrackReconstructor.h

index 748508b..91fb1e8 100644 (file)
@@ -118,7 +118,7 @@ fCalibrationData(0x0),
 fTriggerProcessor(0x0),
 fNoiseFunctionTrig(0x0),
 fGenerateNoisyDigits(generateNoisyDigits),
-fLogger(new AliMUONLogger(1000)),
+fLogger(new AliMUONLogger(4207)), /* 4207 = 25% of the 16828 MCH manus */
 fTriggerStore(new AliMUONTriggerStoreV1),
 fDigitStore(0x0),
 fOutputDigitStore(0x0),
index 1eb8700..504fa93 100644 (file)
@@ -471,7 +471,7 @@ void AliMUONESDInterface::ResetTracker(const AliMUONRecoParam* recoParam, Bool_t
   if (!TGeoGlobalMagField::Instance()->GetField() && !AliMUONCDB::LoadField())
     AliFatalClass("Magnetic field has not been set!");
   
-  fgTracker = AliMUONTracker::CreateTrackReconstructor(fgRecoParam,0x0);
+  fgTracker = AliMUONTracker::CreateTrackReconstructor(fgRecoParam,0x0,0x0);
   
 }
 
index 6893eab..fafb9b2 100644 (file)
@@ -85,7 +85,10 @@ AliMUONRecoParam::AliMUONRecoParam()
   fEventSizeSoftLimit(35.0),
   fEventSizeHardLimit(45.0),
   fTokenLostLimit(0.0),
-  fTryRecover(kFALSE)
+  fTryRecover(kFALSE),
+  fDiscardMonoCathodClusters(kFALSE),
+  fMonoCathodClNonBendingRes(0.),
+  fMonoCathodClBendingRes(0.)
 {  
   /// Constructor
   
@@ -216,6 +219,9 @@ void AliMUONRecoParam::SetLowFluxParam()
   fBypassSt45 = 0;
   fMaxTriggerTracks = 100;
   fMaxTrackCandidates = 10000;  
+  fDiscardMonoCathodClusters = kFALSE;
+  fMonoCathodClNonBendingRes = 10.;
+  fMonoCathodClBendingRes = 10.;
 }
 
 //_____________________________________________________________________________
@@ -258,6 +264,9 @@ void AliMUONRecoParam::SetHighFluxParam()
   fBypassSt45 = 0;
   fMaxTriggerTracks = 100;
   fMaxTrackCandidates = 10000;
+  fDiscardMonoCathodClusters = kFALSE;
+  fMonoCathodClNonBendingRes = 10.;
+  fMonoCathodClBendingRes = 10.;
 }
 
 //_____________________________________________________________________________
@@ -307,6 +316,9 @@ void AliMUONRecoParam::SetCosmicParam()
   fPadGoodnessMask = 0x400BE80; // Ped Mean is Zero | Ped Mean Too Low | Ped Mean Too High | Ped Sigma Too Low | Ped Sigma Too High | Ped is missing | HV is missing | manu occupancy too high
   fMaxTriggerTracks = 100;
   fMaxTrackCandidates = 10000;
+  fDiscardMonoCathodClusters = kFALSE;
+  fMonoCathodClNonBendingRes = 10.;
+  fMonoCathodClBendingRes = 10.;
   
   SetPedMeanLimits(20, 700);
   SetManuOccupancyLimits(-1.,0.01); // reject manu above occ=1%
@@ -532,6 +544,14 @@ void AliMUONRecoParam::Print(Option_t *option) const
                ClusterChargeCut(),ClusterChargeCut()*AverageNoisePadCharge()) << endl;
   cout << Form("Note that LowestPadCharge is then %7.2f fC",LowestPadCharge()) << endl;
   
+  if (strstr(option,"FULL")) {
+    cout<<"Try to improve the reconstructed tracks by changing the resolution of mono-cathod clusters: ";
+    if (fDiscardMonoCathodClusters) cout<<Form("ON (res = %6.3f, %6.3f)",fMonoCathodClNonBendingRes,fMonoCathodClBendingRes)<<endl;
+    else cout<<"OFF"<<endl;
+  } else if (fDiscardMonoCathodClusters)
+    cout<<Form("Try to improve the reconstructed tracks by changing the resolution of mono-cathod clusters (res = %6.3f, %6.3f)",
+              fMonoCathodClNonBendingRes,fMonoCathodClBendingRes)<<endl;
+  
   if (TryRecover())
   {
     cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
index bf19f52..4510c49 100644 (file)
@@ -319,6 +319,18 @@ class AliMUONRecoParam : public AliDetectorRecoParam
   /// Set the try recover corrupted raw data (use kTRUE only if you know what you are doing. Should be left to kFALSE by default)
   virtual void TryRecover(Bool_t flag) { fTryRecover = flag; }
 
+  /// Discard or not the mono-cathod clusters by assigning to them different resolutions (use default values)
+  void     DiscardMonoCathodClusters(Bool_t flag) { fDiscardMonoCathodClusters = flag; }
+  /// Discard or not the mono-cathod clusters by assigning to them different resolutions (use given values)
+  void     DiscardMonoCathodClusters(Bool_t flag, Double_t resNB, Double_t resB) { fDiscardMonoCathodClusters = flag;
+                                     fMonoCathodClNonBendingRes = resNB; fMonoCathodClBendingRes = resB; }
+  /// Check whether to discard or not the mono-cathod clusters
+  Bool_t   DiscardMonoCathodClusters() const { return fDiscardMonoCathodClusters; }
+  /// Get the non-bending resolution of mono-cathod clusters when the non-bending plane is missing
+  Double_t GetMonoCathodClNonBendingRes() const { return fMonoCathodClNonBendingRes; }
+  /// Get the bending resolution of mono-cathod clusters when the bending plane is missing
+  Double_t GetMonoCathodClBendingRes() const { return fMonoCathodClBendingRes; }
+  
   /// Create object ready to be put in OCDB
   static TObjArray* Create(const char* settings);
   
@@ -431,13 +443,17 @@ private:
 
   Double32_t fHVLimit[10]; // HV limit (below which we consider that chamber efficiency is to be considered zero)
   
+  Double32_t fDiscardMonoCathodClusters; // assign a different resolution to mono-cathod clusters in the direction of the missing plane
+  Double32_t fMonoCathodClNonBendingRes; // resolution of mono-cathod clusters in the non-bending direction when the non-bending plane is missing
+  Double32_t fMonoCathodClBendingRes; // resolution of mono-cathod clusters in the bending direction when the bending plane is missing
+  
   // functions
   void SetLowFluxParam();
   void SetHighFluxParam();
   void SetCosmicParam();
   void SetCalibrationParam();
   
-  ClassDef(AliMUONRecoParam,169) // MUON reco parameters
+  ClassDef(AliMUONRecoParam,170) // MUON reco parameters
   // we're at 167 not because we had that many versions, but because at some point (version 15->16)
   // 166 was committed by error, and we did not to go reverse afterwards...
 };
index 448769a..51848ed 100644 (file)
@@ -75,7 +75,7 @@ AliMUONRefitter::AliMUONRefitter(const AliMUONRecoParam* recoParam)
   /// Default constructor
   CreateGeometryTransformer();
   CreateClusterServer(*fGeometryTransformer);
-  if (fClusterServer) fTracker = AliMUONTracker::CreateTrackReconstructor(recoParam,fClusterServer);
+  if (fClusterServer) fTracker = AliMUONTracker::CreateTrackReconstructor(recoParam,fClusterServer,fGeometryTransformer);
   if (!fClusterServer || !fTracker) {
     AliFatal("refitter initialization failed");
     exit(-1);
index 018f7ba..8a41b4c 100644 (file)
@@ -36,6 +36,7 @@
 #include "AliMUONTrackParam.h"
 #include "AliMUONTrackExtrap.h"
 #include "AliMUONRecoParam.h"
+#include "AliMUONGeometryTransformer.h"
 
 #include "AliMpArea.h"
 
@@ -57,8 +58,9 @@ 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
 }
index 05b5f9a..d3c6215 100644 (file)
@@ -15,13 +15,15 @@ class AliMUONVCluster;
 class AliMUONVClusterStore;
 class AliMUONTrackParam;
 class AliMUONTrack;
+class AliMUONGeometryTransformer;
 
 class AliMUONTrackReconstructor : public AliMUONVTrackReconstructor 
 {
  
  public:
   
-  AliMUONTrackReconstructor(const AliMUONRecoParam* recoParam, AliMUONVClusterServer* clusterServer); // default Constructor
+  AliMUONTrackReconstructor(const AliMUONRecoParam* recoParam, AliMUONVClusterServer* clusterServer,
+                           const AliMUONGeometryTransformer* transformer); // default Constructor
   virtual ~AliMUONTrackReconstructor(); // Destructor
 
   virtual Bool_t RefitTrack(AliMUONTrack &track, Bool_t enableImprovement = kTRUE);
index 9788dc0..dfb9a97 100644 (file)
@@ -38,6 +38,7 @@
 #include "AliMUONTrackParam.h"
 #include "AliMUONTrackExtrap.h"
 #include "AliMUONRecoParam.h"
+#include "AliMUONGeometryTransformer.h"
 
 #include "AliMpArea.h"
 
@@ -55,8 +56,9 @@ ClassImp(AliMUONTrackReconstructorK) // Class implementation in ROOT context
 /// \endcond
 
   //__________________________________________________________________________
-AliMUONTrackReconstructorK::AliMUONTrackReconstructorK(const AliMUONRecoParam* recoParam, AliMUONVClusterServer* clusterServer)
-  : AliMUONVTrackReconstructor(recoParam, clusterServer)
+AliMUONTrackReconstructorK::AliMUONTrackReconstructorK(const AliMUONRecoParam* recoParam, AliMUONVClusterServer* clusterServer,
+                                                      const AliMUONGeometryTransformer* transformer)
+  : AliMUONVTrackReconstructor(recoParam, clusterServer, transformer)
 {
   /// Constructor
 }
index a970936..31e16ce 100644 (file)
 class AliMUONVClusterStore;
 class AliMUONTrack;
 class AliMUONTrackParam;
+class AliMUONGeometryTransformer;
 
 class AliMUONTrackReconstructorK : public AliMUONVTrackReconstructor 
 {
 
  public:
   
-  AliMUONTrackReconstructorK(const AliMUONRecoParam* recoParam, AliMUONVClusterServer* clusterServer); // default Constructor
+  AliMUONTrackReconstructorK(const AliMUONRecoParam* recoParam, AliMUONVClusterServer* clusterServer,
+                            const AliMUONGeometryTransformer* transformer); // default Constructor
   virtual ~AliMUONTrackReconstructorK(); // Destructor
   
   virtual Bool_t RefitTrack(AliMUONTrack &track, Bool_t enableImprovement = kTRUE);
index 7af6083..eccf372 100644 (file)
@@ -216,7 +216,7 @@ Int_t AliMUONTracker::Clusters2Tracks(AliESDEvent* esd)
   
   if (!fTrackReco) 
   {
-    fTrackReco = CreateTrackReconstructor(GetRecoParam(),fClusterServer);
+    fTrackReco = CreateTrackReconstructor(GetRecoParam(),fClusterServer,fkTransformer);
     fInternalTrackStore = new AliMUONTrackStoreV1;
   }
   
@@ -339,7 +339,9 @@ void AliMUONTracker::FillESD(const AliMUONVTrackStore& trackStore, AliESDEvent*
 }
 
 //_____________________________________________________________________________
-AliMUONVTrackReconstructor* AliMUONTracker::CreateTrackReconstructor(const AliMUONRecoParam* recoParam, AliMUONVClusterServer* clusterServer)
+AliMUONVTrackReconstructor* AliMUONTracker::CreateTrackReconstructor(const AliMUONRecoParam* recoParam,
+                                                                    AliMUONVClusterServer* clusterServer,
+                                                                    const AliMUONGeometryTransformer* transformer)
 {
   /// Create track reconstructor, depending on tracking mode set in RecoParam
   
@@ -350,11 +352,11 @@ AliMUONVTrackReconstructor* AliMUONTracker::CreateTrackReconstructor(const AliMU
   
   if (strstr(opt,"ORIGINAL"))
   {
-    trackReco = new AliMUONTrackReconstructor(recoParam,clusterServer);
+    trackReco = new AliMUONTrackReconstructor(recoParam,clusterServer,transformer);
   }
   else if (strstr(opt,"KALMAN"))
   {
-    trackReco = new AliMUONTrackReconstructorK(recoParam,clusterServer);
+    trackReco = new AliMUONTrackReconstructorK(recoParam,clusterServer,transformer);
   }
   else
   {
index bbb356c..855e7d7 100644 (file)
@@ -56,7 +56,9 @@ class AliMUONTracker : public AliTracker
   /// Dummy implementation
   virtual AliCluster *GetCluster(Int_t /*index*/) const {return 0;}
 
-  static AliMUONVTrackReconstructor* CreateTrackReconstructor(const AliMUONRecoParam* recoParam, AliMUONVClusterServer* clusterServer);
+  static AliMUONVTrackReconstructor* CreateTrackReconstructor(const AliMUONRecoParam* recoParam,
+                                                             AliMUONVClusterServer* clusterServer,
+                                                             const AliMUONGeometryTransformer* transformer);
   
 private:
   /// Not implemented
index fc4f0a0..114b73d 100644 (file)
@@ -74,6 +74,8 @@
 #include "AliMUONVTriggerStore.h"
 #include "AliMUONVTriggerTrackStore.h"
 #include "AliMUONRecoParam.h"
+#include "AliMUONGeometryTransformer.h"
+#include "AliMUONVDigit.h"
 
 #include "AliMpDEManager.h"
 #include "AliMpArea.h"
@@ -82,6 +84,8 @@
 #include "AliMpVSegmentation.h"
 #include "AliMpSegmentation.h"
 #include "AliMpPad.h"
+#include "AliMpDetElement.h"
+#include "AliMpCathodType.h"
 
 #include "AliLog.h"
 #include "AliCodeTimer.h"
@@ -102,12 +106,14 @@ ClassImp(AliMUONVTrackReconstructor) // Class implementation in ROOT context
 
   //__________________________________________________________________________
 AliMUONVTrackReconstructor::AliMUONVTrackReconstructor(const AliMUONRecoParam* recoParam,
-                                                       AliMUONVClusterServer* clusterServer)
+                                                       AliMUONVClusterServer* clusterServer,
+                                                      const AliMUONGeometryTransformer* transformer)
 : TObject(),
 fRecTracksPtr(0x0),
 fNRecTracks(0),
 fClusterServer(clusterServer),
 fkRecoParam(recoParam),
+fkTransformer(transformer),
 fMaxMCSAngle2(0x0)
 {
   /// Constructor for class AliMUONVTrackReconstructor
@@ -187,15 +193,20 @@ void AliMUONVTrackReconstructor::EventReconstruct(AliMUONVClusterStore& clusterS
   Finalize();
   if (!GetRecoParam()->RemoveConnectedTracksInSt12()) TagConnectedTracks(0, 1, kTRUE);
   
+  // Make sure there is no bad track left
+  RemoveBadTracks();
+  
+  // Refit the reconstructed tracks with a different resolution for mono-cathod clusters
+  if (GetRecoParam()->DiscardMonoCathodClusters()) DiscardMonoCathodClusters();
+  
   // Add tracks to MUON data container 
   for (Int_t i=0; i<fNRecTracks; ++i)
   {
     AliMUONTrack * track = (AliMUONTrack*) fRecTracksPtr->At(i);
-    if (track->GetGlobalChi2() < AliMUONTrack::MaxChi2()) {
-      track->SetUniqueID(i+1);
-      trackStore.Add(*track);
-    } else AliWarning("problem occur somewhere during track refitting --> discard track");
+    track->SetUniqueID(i+1);
+    trackStore.Add(*track);
   }
+  
 }
 
 //__________________________________________________________________________
@@ -539,6 +550,35 @@ void AliMUONVTrackReconstructor::RemoveDoubleTracks()
 }
 
   //__________________________________________________________________________
+void AliMUONVTrackReconstructor::RemoveBadTracks()
+{
+  /// Remove tracks for which a problem occured somewhere during the tracking
+  
+  AliMUONTrack *track, *nextTrack;
+  Bool_t trackRemoved = kFALSE;
+  
+  track = (AliMUONTrack*) fRecTracksPtr->First();
+  while (track) {
+    
+    nextTrack = (AliMUONTrack*) fRecTracksPtr->After(track);
+    
+    if (track->GetGlobalChi2() >= AliMUONTrack::MaxChi2()) {
+      AliWarning("problem occured somewhere during the tracking --> discard track");
+      fRecTracksPtr->Remove(track);
+      fNRecTracks--;
+      trackRemoved = kTRUE;
+    }
+    
+    track = nextTrack;
+    
+  }
+  
+  // compress array of tracks if needed
+  if (trackRemoved) fRecTracksPtr->Compress();
+  
+}
+
+  //__________________________________________________________________________
 void AliMUONVTrackReconstructor::RemoveConnectedTracks(Int_t stMin, Int_t stMax, Bool_t all)
 {
   /// Find and remove tracks sharing 1 cluster or more in station(s) [stMin, stMax].
@@ -1257,6 +1297,111 @@ void AliMUONVTrackReconstructor::Finalize()
 }
 
 //__________________________________________________________________________
+void AliMUONVTrackReconstructor::DiscardMonoCathodClusters()
+{
+  /// Assign a different resolution to the mono-cathod clusters
+  /// in the direction of the missing plane and refit the track
+  /// Remove the track in case of failure
+  
+  if (!fkTransformer) AliFatal("missing geometry transformer");
+  
+  AliMUONTrack *track, *nextTrack;
+  Bool_t trackRemoved = kFALSE;
+  
+  track = (AliMUONTrack*) fRecTracksPtr->First();
+  while (track) {
+    
+    nextTrack = (AliMUONTrack*) fRecTracksPtr->After(track);
+    
+    ChangeMonoCathodClusterRes(*track);
+    
+    if (!RefitTrack(*track) || (GetRecoParam()->ImproveTracks() && !track->IsImproved())) {
+      fRecTracksPtr->Remove(track);
+      fNRecTracks--;
+      trackRemoved = kTRUE;
+    }
+    
+    track = nextTrack;
+    
+  }
+  
+  // compress array of tracks if needed
+  if (trackRemoved) fRecTracksPtr->Compress();
+  
+}
+
+//__________________________________________________________________________
+void AliMUONVTrackReconstructor::ChangeMonoCathodClusterRes(AliMUONTrack &track)
+{
+  /// Assign a different resolution to the mono-cathod clusters
+  /// in the direction of the missing plane and refit the track
+  
+  // Loop over clusters
+  AliMUONVCluster *cluster;
+  Int_t nClusters = track.GetNClusters();
+  for (Int_t iCluster = 0; iCluster < nClusters; iCluster++) {
+    cluster = ((AliMUONTrackParam*) track.GetTrackParamAtCluster()->UncheckedAt(iCluster))->GetClusterPtr();
+    
+    // do it only for stations 3, 4 & 5
+    if (cluster->GetChamberId() < 4) continue;
+    
+    // get the cathod corresponding to the bending/non-bending plane
+    Int_t deId = cluster->GetDetElemId();
+    AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(deId, kFALSE);
+    if (!de) continue;
+    AliMp::CathodType cath1 = de->GetCathodType(AliMp::kBendingPlane); 
+    AliMp::CathodType cath2 = de->GetCathodType(AliMp::kNonBendingPlane); 
+    
+    // get the corresponding segmentation
+    const AliMpVSegmentation* seg1 = AliMpSegmentation::Instance()->GetMpSegmentation(deId, cath1);
+    const AliMpVSegmentation* seg2 = AliMpSegmentation::Instance()->GetMpSegmentation(deId, cath2);
+    if (!seg1 || !seg2) continue;
+    
+    // get local coordinate of the cluster
+    Double_t lX,lY,lZ;
+    Double_t gX = cluster->GetX();
+    Double_t gY = cluster->GetY();
+    Double_t gZ = cluster->GetZ();
+    fkTransformer->Global2Local(deId,gX,gY,gZ,lX,lY,lZ);
+    
+    // find pads below the cluster
+    AliMpPad pad1 = seg1->PadByPosition(lX, lY, kFALSE);
+    AliMpPad pad2 = seg2->PadByPosition(lX, lY, kFALSE);
+    
+    // build their ID if pads are valid
+    UInt_t padId1 = (pad1.IsValid()) ? AliMUONVDigit::BuildUniqueID(deId, pad1.GetManuId(), pad1.GetManuChannel(), cath1) : 0;
+    UInt_t padId2 = (pad2.IsValid()) ? AliMUONVDigit::BuildUniqueID(deId, pad2.GetManuId(), pad2.GetManuChannel(), cath2) : 0;
+    
+    // check if the cluster contains these pads 
+    Bool_t hasNonBending = kFALSE;
+    Bool_t hasBending = kFALSE;
+    for (Int_t iDigit = 0; iDigit < cluster->GetNDigits(); iDigit++) {
+      
+      UInt_t digitId = cluster->GetDigitId(iDigit);
+      
+      if (digitId == padId1) {
+       
+       hasBending = kTRUE;
+       if (hasNonBending) break;
+       
+      } else if (digitId == padId2) {
+       
+       hasNonBending = kTRUE;
+       if (hasBending) break;
+       
+      }
+      
+    }
+    
+    // modify the cluster resolution if needed
+    if (!hasNonBending) cluster->SetErrXY(GetRecoParam()->GetMonoCathodClNonBendingRes(), cluster->GetErrY());
+    if (!hasBending) cluster->SetErrXY(cluster->GetErrX(), GetRecoParam()->GetMonoCathodClBendingRes());
+    
+  }
+  
+}
+
+//__________________________________________________________________________
 void AliMUONVTrackReconstructor::ValidateTracksWithTrigger(AliMUONVTrackStore& trackStore,
                                                            const AliMUONVTriggerTrackStore& triggerTrackStore,
                                                            const AliMUONVTriggerStore& triggerStore,
index edc042f..f33b2b9 100644 (file)
@@ -33,7 +33,8 @@ class AliMUONLocalTrigger;
 class AliMUONVTrackReconstructor : public TObject {
 
  public:
-  AliMUONVTrackReconstructor(const AliMUONRecoParam* recoParam, AliMUONVClusterServer* clusterServer); // default Constructor
+  AliMUONVTrackReconstructor(const AliMUONRecoParam* recoParam, AliMUONVClusterServer* clusterServer,
+                            const AliMUONGeometryTransformer* transformer); // default Constructor
   virtual ~AliMUONVTrackReconstructor(); // Destructor
 
 
@@ -70,6 +71,7 @@ class AliMUONVTrackReconstructor : public TObject {
   AliMUONVClusterServer* fClusterServer; ///< reference to our cluster server
 
   const AliMUONRecoParam* fkRecoParam; ///< reference to reco parameters
+  const AliMUONGeometryTransformer* fkTransformer; //!< geometry transformer (not owner)
   
   Double_t* fMaxMCSAngle2; ///< maximum angle dispersion due to MCS
   
@@ -92,6 +94,9 @@ class AliMUONVTrackReconstructor : public TObject {
   /// Finalize the given track
   virtual Bool_t FinalizeTrack(AliMUONTrack &track) = 0;
   
+  void DiscardMonoCathodClusters();
+  void ChangeMonoCathodClusterRes(AliMUONTrack &track);
+  
   Bool_t IsAcceptable(AliMUONTrackParam &trackParam);
   
   TClonesArray* MakeSegmentsBetweenChambers(const AliMUONVClusterStore& clusterStore, Int_t ch1, Int_t ch2);
@@ -99,6 +104,7 @@ class AliMUONVTrackReconstructor : public TObject {
   void RemoveUsedSegments(TClonesArray& segments);
   void RemoveIdenticalTracks();
   void RemoveDoubleTracks();
+  void RemoveBadTracks();
   void RemoveConnectedTracks(Int_t stMin, Int_t stMax, Bool_t all);
   void TagConnectedTracks(Int_t stMin, Int_t stMax, Bool_t all);