]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
AliMUONRecoParam:
authorivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 27 Feb 2008 14:46:14 +0000 (14:46 +0000)
committerivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 27 Feb 2008 14:46:14 +0000 (14:46 +0000)
  - normalized text format

AliMUONVDigit, AliMUONRealDigit:
  - clean up the code

AliMUONxDMap[Iterator], AliMpExMap
  - add or correct clear methods when needed to prevent memory leaks
  - add protections against potential breaks
  - AliMUON1DMapIterator: Use same (faster) iteration method as for 2DMap

In Stores:
  clusterStore:
  - methods add(...) return the added object
  trackStore:
  - methods add(...) return the added object
  - implemented method delete(...)
  digitStore:
  - add protection against ba class name

In Tracking:
  TrackReconstructors:
  - correct potential bugs during track improvement
  - make it more modular
  AliMUONTrack:
  - modify clear() method, prevent memory leaks
  AliMUONTrackParam:
  - correct potential memory leak

(Philippe P.)

37 files changed:
MUON/AliMUON1DMap.cxx
MUON/AliMUON1DMap.h
MUON/AliMUON1DMapIterator.cxx
MUON/AliMUON1DMapIterator.h
MUON/AliMUON2DMap.cxx
MUON/AliMUON2DMap.h
MUON/AliMUON2DMapIterator.cxx
MUON/AliMUON2DMapIterator.h
MUON/AliMUON2DMapIteratorByI.cxx
MUON/AliMUON2DMapIteratorByI.h
MUON/AliMUONClusterStoreV1.cxx
MUON/AliMUONClusterStoreV1.h
MUON/AliMUONClusterStoreV2.cxx
MUON/AliMUONClusterStoreV2.h
MUON/AliMUONGainSubprocessor.h
MUON/AliMUONRealDigit.h
MUON/AliMUONRecoParam.h
MUON/AliMUONTrack.cxx
MUON/AliMUONTrack.h
MUON/AliMUONTrackParam.cxx
MUON/AliMUONTrackParam.h
MUON/AliMUONTrackReconstructor.cxx
MUON/AliMUONTrackReconstructor.h
MUON/AliMUONTrackReconstructorK.cxx
MUON/AliMUONTrackReconstructorK.h
MUON/AliMUONTrackStoreV1.cxx
MUON/AliMUONTrackStoreV1.h
MUON/AliMUONTrackerIO.h
MUON/AliMUONVClusterStore.cxx
MUON/AliMUONVClusterStore.h
MUON/AliMUONVDigit.cxx
MUON/AliMUONVDigitStore.cxx
MUON/AliMUONVTrackReconstructor.cxx
MUON/AliMUONVTrackReconstructor.h
MUON/AliMUONVTrackStore.h
MUON/mapping/AliMpExMap.cxx
MUON/mapping/AliMpExMap.h

index 2a81282ef7fef156c2625c5db7e7a87e75b71281..07599e620b2e16011628c311dfe69ad4c07de93d 100644 (file)
 // $Id$
 
 #include "AliMUON1DMap.h"
+#include "AliMUON1DMapIterator.h"
+#include "AliMpExMap.h"
 
 #include "AliLog.h"
-#include "AliMpExMap.h"
-#include "AliMUON1DMapIterator.h"
 
 //-----------------------------------------------------------------------------
 /// \class AliMUON1DMap
@@ -37,7 +37,7 @@ ClassImp(AliMUON1DMap)
 //_____________________________________________________________________________
 AliMUON1DMap::AliMUON1DMap(Int_t theSize)
 : AliMUONVStore(),
-  fMap(new AliMpExMap(true))
+  fMap(new AliMpExMap(kTRUE))
 {
 /// Default ctor
 
@@ -51,11 +51,9 @@ AliMUON1DMap::AliMUON1DMap(Int_t theSize)
 //_____________________________________________________________________________
 AliMUON1DMap::AliMUON1DMap(const AliMUON1DMap& other)
 : AliMUONVStore(),
-  fMap(0x0)
+  fMap(new AliMpExMap(*other.fMap))
 {
 /// Copy constructor
-
-  other.CopyTo(*this);
 }
 
 //_____________________________________________________________________________
@@ -63,16 +61,14 @@ AliMUON1DMap&
 AliMUON1DMap::operator=(const AliMUON1DMap& other)
 {
 /// Assignment operator
-
-  other.CopyTo(*this);
+  *fMap = *other.fMap;
   return *this;
 }
 
 //_____________________________________________________________________________
 AliMUON1DMap::~AliMUON1DMap()
 {
-/// dtor, we're the owner of our internal map.
-
+/// destructor
   delete fMap;
 }
 
@@ -82,8 +78,7 @@ AliMUON1DMap::Add(TObject* object)
 {
   /// Add an object to this, using uniqueID as the key
   if (!object) return kFALSE;
-  Set(object->GetUniqueID(),object,kFALSE);
-  return kTRUE;
+  return Set(object->GetUniqueID(),object);
 }
 
 //_____________________________________________________________________________
@@ -91,18 +86,7 @@ void
 AliMUON1DMap::Clear(Option_t*)
 {
   /// Reset
-  delete fMap;
-  fMap = 0x0;
-}
-
-//_____________________________________________________________________________
-void
-AliMUON1DMap::CopyTo(AliMUON1DMap& dest) const
-{
-/// Make a deep copy
-
-  delete dest.fMap;
-  dest.fMap = fMap;
+  fMap->Clear();
 }
 
 //_____________________________________________________________________________
@@ -118,7 +102,6 @@ TObject*
 AliMUON1DMap::FindObject(UInt_t i) const
 {
 /// Get the object located at index i, if it exists, and if i is correct.
-
   return fMap->GetValue(i);
 }
 
@@ -126,13 +109,9 @@ AliMUON1DMap::FindObject(UInt_t i) const
 TIterator*
 AliMUON1DMap::CreateIterator() const
 {
-  // Create and return an iterator on this map
-  // Returned iterator must be deleted by user.
-  if ( fMap ) 
-  {
-    return new AliMUON1DMapIterator(*fMap);
-  }
-  return 0x0;
+  /// Create and return an iterator on this map
+  /// Returned iterator must be deleted by user.
+  return new AliMUON1DMapIterator(*fMap);
 }
 
 //_____________________________________________________________________________
@@ -145,25 +124,19 @@ AliMUON1DMap::GetSize() const
 
 //_____________________________________________________________________________
 Bool_t 
-AliMUON1DMap::Set(Int_t i, TObject* object, Bool_t replace)
+AliMUON1DMap::Set(Int_t i, TObject* object)
 {
 /// Set the object located at i
-/// If replace=kFALSE and there's already an object at location i,
+/// If there's already an object at location i,
 /// this method fails and returns kFALSE, otherwise it returns kTRUE
-
+  
   TObject* o = FindObject(i);
-  if ( o && !replace )
+  if ( o )
   {
     AliError(Form("Object %p is already there for i=%d",o,i));
     return kFALSE;
   }
-  if ( replace ) 
-  {
-    delete o;
-  }
   fMap->Add(i,object);
   return kTRUE;
 }
 
-
-
index 52e66135e6f733937065d43a46ef2b4196404843..39c1f7a420cbdd04bec5560998e4610183e79e82 100644 (file)
@@ -45,11 +45,7 @@ public:
   virtual Int_t GetSize() const;
   
 private:
-   void CopyTo(AliMUON1DMap& to) const;
-  /** Set the object stored at i.
-    if replace=false and there's already an object there, returns kFALSE
-    */
-  virtual Bool_t Set(Int_t i, TObject* object, Bool_t replace);
+  virtual Bool_t Set(Int_t i, TObject* object);
   
 private:  
     
index 8b09ff960ed5463a2b547b4a21ab5ef67b4665ff..bfa784b61dff3b690a4ea71a5c66ba8528ff0e73 100644 (file)
 /// \class AliMUON1DMapIterator
 /// Implementation of TIterator for 1Dmaps
 /// 
-/// A simple implementation of VDataIterator for 1Dmaps.
+/// A simple implementation of iterator for 1Dmaps.
 ///
 /// \author Laurent Aphecetche
 //-----------------------------------------------------------------------------
 
 #include "AliMUON1DMapIterator.h"
 #include "AliMpExMap.h"
-#include "AliLog.h"
-#include "AliMpIntPair.h"
-#include "AliMpExMap.h"
 
 /// \cond CLASSIMP
 ClassImp(AliMUON1DMapIterator)
 /// \endcond
 
 //_____________________________________________________________________________
-AliMUON1DMapIterator::AliMUON1DMapIterator(AliMpExMap& theMap)
+AliMUON1DMapIterator::AliMUON1DMapIterator(const AliMpExMap& theMap)
 : TIterator(), 
-fIter(theMap.GetIterator()),
-fCurrentI(-1)
+  fkMap(&theMap),
+  fCurrentI(-1)
 {
   /// default ctor
-  Reset();
 }
 
 //_____________________________________________________________________________
 AliMUON1DMapIterator::AliMUON1DMapIterator(const AliMUON1DMapIterator& rhs)
 : TIterator(rhs),
-  fIter(rhs.fIter),
+  fkMap(rhs.fkMap),
   fCurrentI(rhs.fCurrentI)        
 {
     /// copy ctor
@@ -60,7 +56,7 @@ AliMUON1DMapIterator::operator=(const AliMUON1DMapIterator& rhs)
   /// assignment operator
   if ( this != &rhs )
   {
-    fIter = rhs.fIter;
+    fkMap = rhs.fkMap;
     fCurrentI = rhs.fCurrentI;
   }
   return *this;
@@ -75,7 +71,7 @@ AliMUON1DMapIterator::operator=(const TIterator& rhs)
   if ( this != &rhs && rhs.IsA() == AliMUON1DMapIterator::Class() )
   {
     const AliMUON1DMapIterator& rhs1 = static_cast<const AliMUON1DMapIterator&>(rhs);
-    fIter = rhs1.fIter;
+    fkMap = rhs1.fkMap;
     fCurrentI = rhs1.fCurrentI;
   }
   return *this;
@@ -93,11 +89,7 @@ TObject*
 AliMUON1DMapIterator::Next()
 {
   /// Return next object in iteration
-
-  Long_t key, value;
-  Bool_t ok = fIter.Next(key,value);
-  if (!ok) return 0x0;
-  return reinterpret_cast<TObject*>(value);
+  return (++fCurrentI < fkMap->GetSize()) ? fkMap->GetObjectFast(fCurrentI) : 0x0;
 }
 
 //_____________________________________________________________________________
@@ -105,5 +97,5 @@ void
 AliMUON1DMapIterator::Reset()
 {
   /// rewind the iterator
-  fIter.Reset();
+  fCurrentI = -1;
 }
index 5e5a5b5f373fef964e14b1e46e90c09250da3872..304b387f46e847553b62ebc2447bd087711e2eba 100644 (file)
@@ -28,7 +28,7 @@ class AliMpExMap;
 class AliMUON1DMapIterator : public TIterator
 {
 public:
-  AliMUON1DMapIterator(AliMpExMap& theMap);
+  AliMUON1DMapIterator(const AliMpExMap& theMap);
   AliMUON1DMapIterator(const AliMUON1DMapIterator&);
   AliMUON1DMapIterator& operator=(const AliMUON1DMapIterator& rhs);
   TIterator& operator=(const TIterator& iterator);  
@@ -43,8 +43,8 @@ public:
   virtual const TCollection* GetCollection() const { return 0x0; }
   
 private:
-  TExMapIter fIter; //!< iterator
-  Int_t fCurrentI; //!< current index in direction i 
+  const AliMpExMap* fkMap; ///< Top map we iterate upon
+  Int_t fCurrentI;         ///< Current position in fMap
   
   ClassDef(AliMUON1DMapIterator,0) // VDataIterator for 1D maps
 };
index bfb129c2cb0face84273948b944a84e553413184..fc3a4771c9ee961ace0bdce9af7fda7f65f957eb 100644 (file)
@@ -35,6 +35,8 @@
 ClassImp(AliMUON2DMap)
 /// \endcond
 
+const Int_t AliMUON2DMap::fgkOptimalSizeForDEManu = 228;
+
 namespace
 {
   //___________________________________________________________________________
@@ -53,22 +55,23 @@ namespace
 //_____________________________________________________________________________
 AliMUON2DMap::AliMUON2DMap(Bool_t optimizeForDEManu) 
 : AliMUONVStore(), 
-  fMap(0x0),
+  fMap(new AliMpExMap(kTRUE)),
   fOptimizeForDEManu(optimizeForDEManu)
 {
   /// Default constructor.
-    Clear();
+  // hard-coded constant in order not to depend on mapping
+  // if this number ever change, it will not break the code, simply the
+  // automatic resizing will give a warning...
+  if ( fOptimizeForDEManu ) fMap->SetSize(fgkOptimalSizeForDEManu); 
 }
 
 //_____________________________________________________________________________
 AliMUON2DMap::AliMUON2DMap(const AliMUON2DMap& other)
 : AliMUONVStore(),
-fMap(0x0),
-fOptimizeForDEManu(kFALSE)
+  fMap(new AliMpExMap(*other.fMap)),
+  fOptimizeForDEManu(other.fOptimizeForDEManu)
 {
  /// Copy constructor.
-
- other.CopyTo(*this);
 }
 
 //_____________________________________________________________________________
@@ -76,8 +79,8 @@ AliMUON2DMap&
 AliMUON2DMap::operator=(const AliMUON2DMap& other)
 {
 /// Assignment operator
-
-  other.CopyTo(*this);
+  *fMap = *other.fMap;
+  fOptimizeForDEManu = other.fOptimizeForDEManu;
   return *this;
 }
 
@@ -86,7 +89,6 @@ AliMUON2DMap::~AliMUON2DMap()
 {
 /// Destructor. 
 /// We delete the map, which will delete the objects, as we're owner.
-
   delete fMap;
 }
 
@@ -98,22 +100,12 @@ AliMUON2DMap::Create() const
   return new AliMUON2DMap(fOptimizeForDEManu);
 }
 
-//_____________________________________________________________________________
-void
-AliMUON2DMap::CopyTo(AliMUON2DMap& dest) const
-{
-  /// Copy this into dest.
-
-  delete dest.fMap;
-  dest.fMap = new AliMpExMap(*fMap);
-  dest.fOptimizeForDEManu = fOptimizeForDEManu;
-}
-
 //_____________________________________________________________________________
 Bool_t
 AliMUON2DMap::Add(TObject* object)
 {
   /// Add object, using the decoding of uniqueID into two ints as the key
+  if (!object) return kFALSE;
   UInt_t uniqueID = object->GetUniqueID();
   Int_t j = ( uniqueID & 0xFFFF0000 ) >> 16;
   Int_t i = ( uniqueID & 0xFFFF);
@@ -125,10 +117,8 @@ TObject*
 AliMUON2DMap::FindObject(Int_t i, Int_t j) const
 {
   /// Return the value at position (i,j).
-
   AliMpExMap* m = static_cast<AliMpExMap*>(fMap->GetValue(i));
-  if (m) return m->GetValue(j);
-  return 0x0;
+  return m ? m->GetValue(j) : 0x0;
 }
 
 //_____________________________________________________________________________
@@ -137,11 +127,7 @@ AliMUON2DMap::CreateIterator() const
 {
   // Create and return an iterator on this map
   // Returned iterator must be deleted by user.
-  if ( fMap ) 
-  {
-    return new AliMUON2DMapIterator(fMap);
-  }
-  return 0x0;
+  return new AliMUON2DMapIterator(*fMap);
 }
 
 //_____________________________________________________________________________
@@ -150,28 +136,15 @@ AliMUON2DMap::CreateIterator(Int_t firstI, Int_t lastI) const
 {
   // Create and return an iterator on this map
   // Returned iterator must be deleted by user.
-  if ( fMap ) 
-  {
-    return new AliMUON2DMapIteratorByI(*fMap,firstI,lastI);
-  }
-  return 0x0;
+  return new AliMUON2DMapIteratorByI(*fMap,firstI,lastI);
 }
 
 //_____________________________________________________________________________
 void 
 AliMUON2DMap::Clear(Option_t*)
 {
-  /// Reset
-  delete fMap;
-
-  fMap = new AliMpExMap(kTRUE);
-
-  if ( fOptimizeForDEManu )
-  {
-    fMap->SetSize(228); // hard-coded constant in order not to depend on mapping
-    // if this number ever change, it will not break the code, simply the
-    // automatic resizing will give a warning...
-  }
+  /// Clear memory
+  fMap->Clear();
 }  
 
 //_____________________________________________________________________________
@@ -196,11 +169,7 @@ AliMUON2DMap::GetSize(Int_t i) const
 {
   /// Return the number of objects we hold
   AliMpExMap* m = static_cast<AliMpExMap*>(fMap->GetValue(i));
-  if (m)
-  {
-    return m->GetSize();
-  }
-  return 0;
+  return m ? m->GetSize() : 0;
 }
 
 //_____________________________________________________________________________
@@ -248,7 +217,3 @@ AliMUON2DMap::Set(Int_t i, Int_t j, TObject* object, Bool_t replace)
   return kTRUE;
 }
 
-
-
-
-
index 12a3580ece5e44a545524047a6d5f5d0ceed2eff..ddbbc6795671a7a994d594bedd99af07dffecd79 100644 (file)
@@ -53,10 +53,11 @@ public:
   virtual Int_t GetSize(Int_t i) const;
 
 private:
-  void CopyTo(AliMUON2DMap& destination) const;
   Bool_t Set(Int_t i, Int_t j, TObject* object, Bool_t replace);
 
 private:
+  static const Int_t fgkOptimalSizeForDEManu; ///< Optimal size for DEManu
+
   AliMpExMap* fMap; ///< Our internal map (an AliMpExMap of AliMpExMaps)
   Bool_t fOptimizeForDEManu; ///< whether (i,j) pair is supposed to be (DetElemId,ManuId) (allow us to allocate right amount of memory, that's all it does.
   
index b6b3fc333df4f0d1482c7299b4edf11fdc4feef9..f4f69ad0d5d8a73f12adcf4c46d22bc6d3c3f899 100644 (file)
@@ -33,9 +33,9 @@ ClassImp(AliMUON2DMapIterator)
 /// \endcond
 
 //_____________________________________________________________________________
-AliMUON2DMapIterator::AliMUON2DMapIterator(AliMpExMap* theMap)
-: TIterator(), 
-fMap(theMap),
+AliMUON2DMapIterator::AliMUON2DMapIterator(const AliMpExMap& theMap)
+: TIterator(),
+fkMap(&theMap),
 fCurrentMap(0x0),
 fI(-1),
 fJ(-1)
@@ -47,7 +47,7 @@ fJ(-1)
 //_____________________________________________________________________________
 AliMUON2DMapIterator::AliMUON2DMapIterator(const AliMUON2DMapIterator& rhs)
 : TIterator(rhs),
-fMap(rhs.fMap),
+fkMap(rhs.fkMap),
 fCurrentMap(rhs.fCurrentMap),
 fI(rhs.fI),
 fJ(rhs.fI)
@@ -62,7 +62,7 @@ AliMUON2DMapIterator::operator=(const AliMUON2DMapIterator& rhs)
   /// assignment operator
   if ( this != &rhs ) 
   {
-    fMap = rhs.fMap;
+    fkMap = rhs.fkMap;
     fCurrentMap = rhs.fCurrentMap;
     fI = rhs.fI;
     fJ = rhs.fJ;
@@ -79,7 +79,7 @@ AliMUON2DMapIterator::operator=(const TIterator& rhs)
   if ( this != &rhs && rhs.IsA() == AliMUON2DMapIterator::Class() ) 
   {
     const AliMUON2DMapIterator& rhs1 = static_cast<const AliMUON2DMapIterator&>(rhs);
-    fMap = rhs1.fMap;
+    fkMap = rhs1.fkMap;
     fCurrentMap = rhs1.fCurrentMap;
     fI = rhs1.fI;
     fJ = rhs1.fJ;
@@ -106,7 +106,7 @@ AliMpExMap*
 AliMUON2DMapIterator::Map(Int_t i) const
 {
   /// Get the map at a given index
-  return static_cast<AliMpExMap*>(fMap->GetObjectFast(i));
+  return static_cast<AliMpExMap*>(fkMap->GetObjectFast(i));
 }
 
 //_____________________________________________________________________________
@@ -126,7 +126,7 @@ AliMUON2DMapIterator::Next()
   else
   {
     ++fI;
-    if ( fI < fMap->GetSize() )
+    if ( fI < fkMap->GetSize() )
     {
       fCurrentMap = Map(fI);
       fJ = -1;
@@ -145,7 +145,7 @@ AliMUON2DMapIterator::Reset()
   fJ = -1;
   fCurrentMap = 0x0;
   
-  if ( fMap->GetSize() > 0 )
+  if ( fkMap->GetSize() > 0 )
   {
     fI = 0;
     fCurrentMap = Map(fI);
index b96e595bc37c70a8723b9d50ea1b80591dae251d..2c2d7d8669ed0e9751b766c2613e8fdfe1b1b4b6 100644 (file)
@@ -22,7 +22,7 @@ class AliMpExMap;
 class AliMUON2DMapIterator : public TIterator
 {
 public:
-  AliMUON2DMapIterator(AliMpExMap* theMap);
+  AliMUON2DMapIterator(const AliMpExMap& theMap);
   AliMUON2DMapIterator(const AliMUON2DMapIterator& rhs);
   AliMUON2DMapIterator& operator=(const AliMUON2DMapIterator& rhs);
   TIterator& operator=(const TIterator& rhs);
@@ -41,7 +41,7 @@ private:
   AliMpExMap* Map(Int_t i) const;
   
 private:
-  AliMpExMap* fMap;        ///< Top map we iterate upon
+  const AliMpExMap* fkMap; ///< Top map we iterate upon
   AliMpExMap* fCurrentMap; ///< Current map (inside top map) we are iterating upon
   Int_t fI;                ///< Map(fI) is fCurrentMap  
   Int_t fJ;                ///< Current position in fCurrentMap
index 5ddf3f49b45988b90508bacdde8fc4de50ce01fe..b4084075a0e37b668c82fa77c4517c92a9b9c664 100644 (file)
@@ -40,7 +40,7 @@ AliMUON2DMapIteratorByI::AliMUON2DMapIteratorByI(const AliMpExMap& theMap,
                                                  Int_t firstI,
                                                  Int_t lastI)
 : TIterator(),
-fMap(&theMap),
+fkMap(&theMap),
 fIter2(0x0),
 fCurrentI(-1),
 fCurrentJ(-1),
@@ -54,7 +54,7 @@ fLastI(lastI)
 //_____________________________________________________________________________
 AliMUON2DMapIteratorByI::AliMUON2DMapIteratorByI(const AliMUON2DMapIteratorByI& rhs)
 :TIterator(rhs),
-fMap(rhs.fMap),
+fkMap(rhs.fkMap),
 fIter2(0x0),
 fCurrentI(rhs.fCurrentI),
 fCurrentJ(rhs.fCurrentJ),
@@ -72,7 +72,7 @@ AliMUON2DMapIteratorByI::operator=(const AliMUON2DMapIteratorByI& rhs)
   /// assignment operator
   if ( this != &rhs ) 
   {
-    fMap = rhs.fMap;
+    fkMap = rhs.fkMap;
     fIter2 = 0x0;
     if ( rhs.fIter2 ) fIter2 = new TExMapIter(*(rhs.fIter2));
     fCurrentI = rhs.fCurrentI;
@@ -88,10 +88,10 @@ TIterator&
 AliMUON2DMapIteratorByI::operator=(const TIterator& rhs)
 {
   /// overriden assigment operator (imposed by Root's declaration of TIterator ?)
-  if ( this != &rhs ) 
+  if ( this != &rhs && rhs.IsA() == AliMUON2DMapIteratorByI::Class() 
   {
     const AliMUON2DMapIteratorByI& rhs1 = static_cast<const AliMUON2DMapIteratorByI&>(rhs);
-    fMap = rhs1.fMap;
+    fkMap = rhs1.fkMap;
     fIter2 = 0x0;
     if ( rhs1.fIter2 ) fIter2 = new TExMapIter(*(rhs1.fIter2));
     fCurrentI = rhs1.fCurrentI;
@@ -150,7 +150,7 @@ AliMUON2DMapIteratorByI::Next()
     while ( !m && fCurrentI < fLastI ) 
     {
       ++fCurrentI;
-      m = static_cast<AliMpExMap*>(fMap->GetValue(fCurrentI));
+      m = static_cast<AliMpExMap*>(fkMap->GetValue(fCurrentI));
     }
     if (!m) return 0x0; // we are done
     fIter2 = new TExMapIter(m->GetIterator());
@@ -170,7 +170,7 @@ AliMUON2DMapIteratorByI::Reset()
   fCurrentI = fFirstI;
   AliMpExMap* m;
   
-  while ( !(  m = static_cast<AliMpExMap*>(fMap->GetValue(fCurrentI) ) ) && 
+  while ( !(  m = static_cast<AliMpExMap*>(fkMap->GetValue(fCurrentI) ) ) && 
           fCurrentI < fLastI )
   {
     ++fCurrentI;
index 841301a82617cce5671ba86fe5e7ea9afc85b50a..b85b60f8e8130b994a40c954786b39e087ff2875 100644 (file)
@@ -45,7 +45,7 @@ private:
   TObject* GetValue(TExMapIter& iter, Int_t& key) const;
   
 private:
-  const AliMpExMap* fMap; //!< map to iterate upon
+  const AliMpExMap* fkMap; //!< map to iterate upon
   TExMapIter* fIter2; //!< second iterator
   Int_t fCurrentI; //!< current index in direction i 
   Int_t fCurrentJ; //!< current index in direction j
index 00cb479127c6ecab604a19ac757fb0a81fc6cc96..95b6e96ad019e61235cccbf2d4aec25c4553bd2c 100644 (file)
@@ -54,7 +54,6 @@ fClusters(new TObjArray(AliMpConstants::NofChambers()))
   for ( Int_t i = 0; i < fClusters->GetSize(); ++i )
   {
     TClonesArray* tca = new TClonesArray("AliMUONRawCluster",100);
-    tca->SetOwner(kTRUE);
     fClusters->AddAt(tca,i);
   }
   AliDebug(1,"");
@@ -96,7 +95,7 @@ AliMUONVCluster* AliMUONClusterStoreV1::CreateCluster(Int_t /*chamberId*/, Int_t
 }
 
 //_____________________________________________________________________________
-Bool_t 
+AliMUONVCluster* 
 AliMUONClusterStoreV1::Add(const AliMUONVCluster& vCluster)
 {
   /// Add a cluster to this store
@@ -113,10 +112,10 @@ AliMUONClusterStoreV1::Add(const AliMUONVCluster& vCluster)
   TClonesArray* array = ChamberClusters(iChamber);
   if (!array) 
   {
-    return kFALSE;
+    return 0x0;
   }
-  new((*array)[array->GetLast()+1]) AliMUONRawCluster(*cluster);
-  return kTRUE;
+  
+  return new((*array)[array->GetLast()+1]) AliMUONRawCluster(*cluster);
 }
 
 //_____________________________________________________________________________
index 64624168fc9fdfe15ddedcac47b2f399a5db4c7c..2b9c547964cc2131fc8c6c150ba95fdaf91e5522 100644 (file)
@@ -33,7 +33,7 @@ public:
   
   using AliMUONVClusterStore::Add;
   
-  virtual Bool_t Add(const AliMUONVCluster& Cluster);
+  virtual AliMUONVCluster* Add(const AliMUONVCluster& Cluster);
   virtual AliMUONVCluster* Add(Int_t chamberId, Int_t detElemId, Int_t /*clusterIndex*/);
 
   /// Whether the Connect(TTree&) method is implemented
index 13e63ff0cdc1655abd01453d06145e8fbb777c80..9774a3eb51b9df1d6039b70c7fd711a53379f495 100644 (file)
@@ -124,7 +124,7 @@ AliMUONVCluster* AliMUONClusterStoreV2::CreateCluster(Int_t chamberId, Int_t det
 }
 
 //_____________________________________________________________________________
-Bool_t AliMUONClusterStoreV2::Add(const AliMUONVCluster& vCluster)
+AliMUONVCluster* AliMUONClusterStoreV2::Add(const AliMUONVCluster& vCluster)
 {
   /// Add a cluster to this store
   const AliMUONRawClusterV2* cluster = dynamic_cast<const AliMUONRawClusterV2*>(&vCluster);
@@ -132,7 +132,7 @@ Bool_t AliMUONClusterStoreV2::Add(const AliMUONVCluster& vCluster)
   if (!cluster) {
     AliError(Form("Cluster is not of the expected type (%s vs AliMUONRawClusterV2)",
                   vCluster.ClassName()));
-    return kFALSE;
+    return 0x0;
   }
   
   // check chamberId
@@ -143,17 +143,19 @@ Bool_t AliMUONClusterStoreV2::Add(const AliMUONVCluster& vCluster)
   }
   
   // check that there is no cluster with the same Id
-  if (FindObject(cluster->GetUniqueID())) {
-    AliError("cluster store already contains a cluster with the same ID --> add() aborted");
-    return kFALSE;
+  AliMUONVCluster *c = FindObject(cluster->GetUniqueID());
+  if (c) {
+    AliError("cluster store already contains a cluster with the same ID --> add() aborted:");
+    c->Print("FULL");
+    return 0x0;
   }
   
   // add new cluster
-  AliMUONVCluster *c = new((*fClusters)[fClusters->GetLast()+1]) AliMUONRawClusterV2(*cluster);
+  c = new((*fClusters)[fClusters->GetLast()+1]) AliMUONRawClusterV2(*cluster);
   
   if (c) UpdateMap(*c);
   
-  return kTRUE;
+  return c;
 }
 
 //_____________________________________________________________________________
index 471e42ed5e78b688469cbf9cec404d75fcdfc493..df931c6d72752a61ad0db6a21b7c7ae3a4fbadab 100644 (file)
@@ -42,7 +42,7 @@ public:
   
   using AliMUONVClusterStore::Add;
   
-  virtual Bool_t Add(const AliMUONVCluster& Cluster);
+  virtual AliMUONVCluster* Add(const AliMUONVCluster& Cluster);
   virtual AliMUONVCluster* Add(Int_t chamberId, Int_t detElemId, Int_t clusterIndex);
 
   virtual AliMUONVCluster* Remove(AliMUONVCluster& cluster);
index 11b5bb7a9ad9da5abc7f69ce0f6d73b4b7c0ed43..b144fdea53d8f3b594e6b7de8e91578537f78640 100644 (file)
@@ -43,7 +43,7 @@ private:
 private:
   AliMUONVStore* fGains; //!< Gains for the MUON TRK
   Bool_t fSkip; //!< whether we should skip this run (because it's dummy)
-  TString fComment; //<! comment for OCDB entry
+  TString fComment; //!< comment for OCDB entry
   
   ClassDef(AliMUONGainSubprocessor,2) // A shuttle preprocessor for MUON TRK gains
 };
index 6090f0a6c4cae364bb59180d0732a2d21b3543cf..d6c30fb8443a858176117ee5c34d4e1f37816859 100644 (file)
@@ -67,11 +67,6 @@ public:
   /// Set the status map value
   virtual void SetStatusMap(UInt_t statusMap) { fStatusMap = statusMap; }
   
-  /// Whether this digit is real or virtual (a clustering detail...)
-  virtual Bool_t IsVirtual() const { return TestBit(kVirtual); }
-  /// Set the virtual status
-  virtual void SetVirtual(Bool_t value) { SetBit(kVirtual,value); }
-
   /// Set the ADC value (should be between 0 and 4095)
   virtual void SetADC(Int_t adc) { fADC = adc; }
   virtual void SetPadXY(Int_t padx, Int_t pady);
@@ -94,8 +89,7 @@ private:
   {
     kSaturated = BIT(20),  ///< to indicate that manas amplifier has saturated 
     kUsed = BIT(21),       ///< whether the digit is used (e.g. in a cluster)
-    kCalibrated = BIT(22), ///< whether the digit has been calibrated or not 
-    kVirtual = BIT(23)     ///< whether the digit is virtual or not (see AZ) 
+    kCalibrated = BIT(22)  ///< whether the digit has been calibrated or not 
   };
   
   ClassDef(AliMUONRealDigit,1) // Implementation of AliMUONVDigit
index ceefea71f56a8cd59a88cfd34e368edb6a13d6ac..ad6d058c4324e06950781a4268053f1b64debd87 100644 (file)
@@ -22,17 +22,17 @@ class AliMUONRecoParam : public AliDetectorRecoParam
   static AliMUONRecoParam *GetHighFluxParam();
   
   /// set the calibration mode
-  void SetCalibrationMode(Option_t* mode) { fCalibrationMode = mode; }
+  void SetCalibrationMode(Option_t* mode) { fCalibrationMode = mode; fCalibrationMode.ToUpper();}
   /// get the calibration mode
   Option_t* GetCalibrationMode() const { return fCalibrationMode.Data(); }
-    
+  
   /// set the clustering (pre-clustering) mode
-  void      SetClusteringMode(Option_t* mode) {fClusteringMode = mode;}
+  void      SetClusteringMode(Option_t* mode) {fClusteringMode = mode; fClusteringMode.ToUpper();}
   /// get the clustering (pre-clustering) mode
   Option_t* GetClusteringMode() const {return fClusteringMode.Data();}
   
   /// set the tracking mode
-  void      SetTrackingMode(Option_t* mode) {fTrackingMode = mode;}
+  void      SetTrackingMode(Option_t* mode) {fTrackingMode = mode; fTrackingMode.ToUpper();}
   /// get the tracking mode
   Option_t* GetTrackingMode() const {return fTrackingMode.Data();}
   
index b3b729e1bfca974962bca79afa6edb2a656eb65e..87ff85aeba580c070631e6506400d54c45543e32 100644 (file)
 
 #include "AliMUONTrack.h"
 
-#include "AliMUONTrackParam.h" 
 #include "AliMUONRawClusterV2.h" 
-#include "AliMUONObjectPair.h" 
+#include "AliMUONObjectPair.h"
 #include "AliMUONConstants.h"
-#include "AliMUONTrackExtrap.h" 
+#include "AliMUONTrackExtrap.h"
 
 #include "AliLog.h"
 #include "AliESDMuonTrack.h"
@@ -45,7 +44,7 @@ ClassImp(AliMUONTrack) // Class implementation in ROOT context
 //__________________________________________________________________________
 AliMUONTrack::AliMUONTrack()
   : TObject(),
-    fTrackParamAtCluster(new TClonesArray("AliMUONTrackParam",10)),
+    fTrackParamAtCluster(0x0),
     fFitWithVertex(kFALSE),
     fVertexErrXY2(),
     fFitWithMCS(kFALSE),
@@ -62,7 +61,6 @@ AliMUONTrack::AliMUONTrack()
     fLocalTrigger(0)
 {
   /// Default constructor
-  fTrackParamAtCluster->SetOwner(kTRUE);
   fVertexErrXY2[0] = 0.;
   fVertexErrXY2[1] = 0.;
 }
@@ -87,7 +85,6 @@ AliMUONTrack::AliMUONTrack(AliMUONObjectPair *segment)
     fLocalTrigger(0)
 {
   /// Constructor from two clusters
-  fTrackParamAtCluster->SetOwner(kTRUE);
   
   fVertexErrXY2[0] = 0.;
   fVertexErrXY2[1] = 0.;
@@ -103,9 +100,10 @@ AliMUONTrack::AliMUONTrack(AliMUONObjectPair *segment)
   }
   
   // order the clusters into the track according to the station the segment belong to
-  //(the cluster first attached is the one from which we will start the tracking procedure)
+  // to anticipate the direction of propagation in the first tracking step
+  // (go backward if the segment is on the last station / go forward otherwise)
   AliMUONVCluster *firstCluster, *lastCluster;
-  if (cluster1->GetChamberId() == 8) {
+  if (cluster1->GetChamberId() == 8) { // last station
     firstCluster = cluster1;
     lastCluster = cluster2;
   } else {
@@ -130,7 +128,7 @@ AliMUONTrack::AliMUONTrack(AliMUONObjectPair *segment)
   Double_t inverseBendingMomentum = 1. / AliMUONTrackExtrap::GetBendingMomentumFromImpactParam(bendingImpact);
   
   
-  // Set track parameters at first cluster
+  // Set track parameters at first cluster (needed by any tracking algorithm)
   AliMUONTrackParam trackParamAtFirstCluster;
   trackParamAtFirstCluster.SetZ(z1);
   trackParamAtFirstCluster.SetNonBendingCoor(nonBendingCoor1);
@@ -140,7 +138,7 @@ AliMUONTrack::AliMUONTrack(AliMUONObjectPair *segment)
   trackParamAtFirstCluster.SetInverseBendingMomentum(inverseBendingMomentum);
   
   
-  // Set track parameters at last cluster
+  // Set track parameters at last cluster (used by Kalman only)
   AliMUONTrackParam trackParamAtLastCluster;
   trackParamAtLastCluster.SetZ(z2);
   trackParamAtLastCluster.SetNonBendingCoor(nonBendingCoor2);
@@ -150,7 +148,7 @@ AliMUONTrack::AliMUONTrack(AliMUONObjectPair *segment)
   trackParamAtLastCluster.SetInverseBendingMomentum(inverseBendingMomentum);
   
   
-  // Compute and set track parameters covariances at first cluster
+  // Compute and set track parameters covariances at first cluster (needed by any tracking algorithm)
   TMatrixD paramCov1(5,5);
   paramCov1.Zero();
   // Non bending plane
@@ -169,7 +167,7 @@ AliMUONTrack::AliMUONTrack(AliMUONObjectPair *segment)
   trackParamAtFirstCluster.SetCovariances(paramCov1);
   
   
-  // Compute and set track parameters covariances at last cluster (as if the first cluster did not exist)
+  // Compute and set track parameters covariances at last cluster as if the first cluster did not exist (used by Kalman only)
   TMatrixD paramCov2(5,5);
   paramCov2.Zero();
   // Non bending plane
@@ -296,7 +294,7 @@ AliMUONTrack::AliMUONTrack(AliESDMuonTrack &esdTrack)
 //__________________________________________________________________________
 AliMUONTrack::AliMUONTrack(const AliMUONTrack& track)
   : TObject(track),
-    fTrackParamAtCluster(new TClonesArray("AliMUONTrackParam",10)),
+    fTrackParamAtCluster(0x0),
     fFitWithVertex(track.fFitWithVertex),
     fVertexErrXY2(),
     fFitWithMCS(track.fFitWithMCS),
@@ -315,10 +313,13 @@ AliMUONTrack::AliMUONTrack(const AliMUONTrack& track)
   ///copy constructor
   
   // necessary to make a copy of the objects and not only the pointers in TClonesArray.
-  AliMUONTrackParam *trackParamAtCluster = (AliMUONTrackParam*) track.fTrackParamAtCluster->First();
-  while (trackParamAtCluster) {
-    new ((*fTrackParamAtCluster)[GetNClusters()]) AliMUONTrackParam(*trackParamAtCluster);
-    trackParamAtCluster = (AliMUONTrackParam*) track.fTrackParamAtCluster->After(trackParamAtCluster);
+  if (track.fTrackParamAtCluster) {
+    fTrackParamAtCluster = new TClonesArray("AliMUONTrackParam",10);
+    AliMUONTrackParam *trackParamAtCluster = (AliMUONTrackParam*) track.fTrackParamAtCluster->First();
+    while (trackParamAtCluster) {
+      new ((*fTrackParamAtCluster)[GetNClusters()]) AliMUONTrackParam(*trackParamAtCluster);
+      trackParamAtCluster = (AliMUONTrackParam*) track.fTrackParamAtCluster->After(trackParamAtCluster);
+    }
   }
   
   // copy vertex resolution square used during the tracking procedure
@@ -344,13 +345,18 @@ AliMUONTrack & AliMUONTrack::operator=(const AliMUONTrack& track)
 
   // base class assignement
   TObject::operator=(track);
-
-  // necessary to make a copy of the objects and not only the pointers in TClonesArray.
-  fTrackParamAtCluster = new TClonesArray("AliMUONTrackParam",10);
-  AliMUONTrackParam *trackParamAtCluster = (AliMUONTrackParam*) track.fTrackParamAtCluster->First();
-  while (trackParamAtCluster) {
-    new ((*fTrackParamAtCluster)[GetNClusters()]) AliMUONTrackParam(*trackParamAtCluster);
-    trackParamAtCluster = (AliMUONTrackParam*) track.fTrackParamAtCluster->After(trackParamAtCluster);
+  
+  // clear memory
+  Clear();
+  
+  // necessary to make a copy of the objects and not only the pointers in TClonesArray
+  if (track.fTrackParamAtCluster) {
+    fTrackParamAtCluster = new TClonesArray("AliMUONTrackParam",10);
+    AliMUONTrackParam *trackParamAtCluster = (AliMUONTrackParam*) track.fTrackParamAtCluster->First();
+    while (trackParamAtCluster) {
+      new ((*fTrackParamAtCluster)[GetNClusters()]) AliMUONTrackParam(*trackParamAtCluster);
+      trackParamAtCluster = (AliMUONTrackParam*) track.fTrackParamAtCluster->After(trackParamAtCluster);
+    }
   }
   
   // copy cluster weights matrix if any
@@ -359,9 +365,6 @@ AliMUONTrack & AliMUONTrack::operator=(const AliMUONTrack& track)
       fClusterWeightsNonBending->ResizeTo(*(track.fClusterWeightsNonBending));
       *fClusterWeightsNonBending = *(track.fClusterWeightsNonBending);
     } else fClusterWeightsNonBending = new TMatrixD(*(track.fClusterWeightsNonBending));
-  } else if (fClusterWeightsNonBending) {
-    delete fClusterWeightsNonBending;
-    fClusterWeightsNonBending = 0x0;
   }
   
   // copy cluster weights matrix if any
@@ -370,18 +373,12 @@ AliMUONTrack & AliMUONTrack::operator=(const AliMUONTrack& track)
       fClusterWeightsBending->ResizeTo(*(track.fClusterWeightsBending));
       *fClusterWeightsBending = *(track.fClusterWeightsBending);
     } else fClusterWeightsBending = new TMatrixD(*(track.fClusterWeightsBending));
-  } else if (fClusterWeightsBending) {
-    delete fClusterWeightsBending;
-    fClusterWeightsBending = 0x0;
   }
   
   // copy track parameters at vertex if any
   if (track.fTrackParamAtVertex) {
     if (fTrackParamAtVertex) *fTrackParamAtVertex = *(track.fTrackParamAtVertex);
     else fTrackParamAtVertex = new AliMUONTrackParam(*(track.fTrackParamAtVertex));
-  } else if (fTrackParamAtVertex) {
-    delete fTrackParamAtVertex;
-    fTrackParamAtVertex = 0x0;
   }
   
   fFitWithVertex      =  track.fFitWithVertex;
@@ -414,12 +411,24 @@ AliMUONTrack::~AliMUONTrack()
 void AliMUONTrack::Clear(Option_t* opt)
 {
   /// Clear arrays
-  fTrackParamAtCluster->Clear(opt);
+  if (opt && opt[0] == 'C' && fTrackParamAtCluster) fTrackParamAtCluster->Clear("C");
+  else {
+    delete fTrackParamAtCluster;
+    fTrackParamAtCluster = 0x0;
+  }
   delete fClusterWeightsNonBending; fClusterWeightsNonBending = 0x0;
   delete fClusterWeightsBending; fClusterWeightsBending = 0x0;
   delete fTrackParamAtVertex; fTrackParamAtVertex = 0x0;
 }
 
+  //__________________________________________________________________________
+TClonesArray* AliMUONTrack::GetTrackParamAtCluster() const
+{
+  /// return array of track parameters at cluster (create it if needed)
+  if (!fTrackParamAtCluster) fTrackParamAtCluster = new TClonesArray("AliMUONTrackParam",10);
+  return fTrackParamAtCluster;
+}
+
   //__________________________________________________________________________
 void AliMUONTrack::AddTrackParamAtCluster(const AliMUONTrackParam &trackParam, AliMUONVCluster &cluster, Bool_t copy)
 {
@@ -441,6 +450,7 @@ void AliMUONTrack::AddTrackParamAtCluster(const AliMUONTrackParam &trackParam, A
   }
   
   // add parameters to the array of track parameters
+  if (!fTrackParamAtCluster) fTrackParamAtCluster = new TClonesArray("AliMUONTrackParam",10);
   AliMUONTrackParam* trackParamAtCluster = new ((*fTrackParamAtCluster)[GetNClusters()]) AliMUONTrackParam(trackParam);
   
   // link parameters with the associated cluster or its copy
@@ -448,13 +458,16 @@ void AliMUONTrack::AddTrackParamAtCluster(const AliMUONTrackParam &trackParam, A
     AliMUONVCluster *clusterCopy = static_cast<AliMUONVCluster*>(cluster.Clone());
     trackParamAtCluster->SetClusterPtr(clusterCopy, kTRUE);
   } else trackParamAtCluster->SetClusterPtr(&cluster);
+  
+  // sort the array of track parameters
+  fTrackParamAtCluster->Sort();
 }
 
   //__________________________________________________________________________
 void AliMUONTrack::RemoveTrackParamAtCluster(AliMUONTrackParam *trackParam)
 {
   /// Remove trackParam from the array of TrackParamAtCluster
-  if (!fTrackParamAtCluster->Remove(trackParam)) {
+  if (!fTrackParamAtCluster || !fTrackParamAtCluster->Remove(trackParam)) {
     AliWarning("object to remove does not exist in array fTrackParamAtCluster");
     return;
   }
@@ -534,6 +547,72 @@ void AliMUONTrack::UpdateCovTrackParamAtCluster()
     trackParamAtCluster = (AliMUONTrackParam*) (fTrackParamAtCluster->After(trackParamAtCluster));
   }
   
+}
+
+  //__________________________________________________________________________
+Bool_t AliMUONTrack::IsValid()
+{
+  /// check the validity of the current track (at least one cluster per station)
+  
+  Int_t nClusters = GetNClusters();
+  AliMUONTrackParam *trackParam;
+  Int_t currentStation = 0, expectedStation = 0;
+  
+  for (Int_t i = 0; i < nClusters; i++) {
+    trackParam = (AliMUONTrackParam*) fTrackParamAtCluster->UncheckedAt(i);
+    
+    currentStation = trackParam->GetClusterPtr()->GetChamberId()/2;
+    
+    // missing station
+    if (currentStation > expectedStation) return kFALSE;
+    
+    // found station --> look for next one
+    if (currentStation == expectedStation) expectedStation++;
+    
+  }
+  
+  return currentStation == AliMUONConstants::NTrackingSt() - 1;
+  
+}
+
+  //__________________________________________________________________________
+void AliMUONTrack::TagRemovableClusters() {
+  /// Identify clusters that can be removed from the track,
+  /// with the only requirement to have at least 1 cluster per station
+  
+  Int_t nClusters = GetNClusters();
+  AliMUONTrackParam *trackParam, *nextTrackParam;
+  Int_t currentCh, nextCh;
+  
+  // reset flags to default
+  for (Int_t i = 0; i < nClusters; i++) {
+    trackParam = (AliMUONTrackParam*) fTrackParamAtCluster->UncheckedAt(i);
+    trackParam->SetRemovable(kFALSE);
+  }
+  
+  // loop over track parameters
+  for (Int_t i = 0; i < nClusters; i++) {
+    trackParam = (AliMUONTrackParam*) fTrackParamAtCluster->UncheckedAt(i);
+    
+    currentCh = trackParam->GetClusterPtr()->GetChamberId();
+    
+    // loop over next track parameters
+    for (Int_t j = i+1; j < nClusters; j++) {
+      nextTrackParam = (AliMUONTrackParam*) fTrackParamAtCluster->UncheckedAt(j);
+      
+      nextCh = nextTrackParam->GetClusterPtr()->GetChamberId();
+      
+      // check if the 2 clusters are on the same station
+      if (nextCh/2 != currentCh/2) break;
+      
+      // set clusters in the same station as being removable
+      trackParam->SetRemovable(kTRUE);
+      nextTrackParam->SetRemovable(kTRUE);
+      
+    }
+    
+  }
+    
 }
 
   //__________________________________________________________________________
@@ -544,6 +623,12 @@ Bool_t AliMUONTrack::ComputeLocalChi2(Bool_t accountForMCS)
   /// - Also recompute the weight matrices of the attached clusters if accountForMCS=kTRUE
   /// - Assume that track parameters at each cluster are corrects
   /// - Return kFALSE if computation failed
+  AliDebug(1,"Enter ComputeLocalChi2");
+  
+  if (!fTrackParamAtCluster) {
+    AliWarning("no cluster attached to this track");
+    return kFALSE;
+  }
   
   if (accountForMCS) { // Compute local chi2 taking into account multiple scattering effects
       
@@ -660,6 +745,12 @@ Double_t AliMUONTrack::ComputeGlobalChi2(Bool_t accountForMCS)
   /// - Assume that track parameters at each cluster are corrects
   /// - Assume the cluster weights matrices are corrects
   /// - Return negative value if chi2 computation failed
+  AliDebug(1,"Enter ComputeGlobalChi2");
+  
+  if (!fTrackParamAtCluster) {
+    AliWarning("no cluster attached to this track");
+    return 1.e10;
+  }
   
   Double_t chi2 = 0.;
   
@@ -724,6 +815,12 @@ Bool_t AliMUONTrack::ComputeClusterWeights(TMatrixD* mcsCovariances)
   /// - Use the provided MCS covariance matrix if any (otherwise build it temporarily)
   /// - Assume that track parameters at each cluster are corrects
   /// - Return kFALSE if computation failed
+  AliDebug(1,"Enter ComputeClusterWeights1");
+  
+  if (!fTrackParamAtCluster) {
+    AliWarning("no cluster attached to this track");
+    return kFALSE;
+  }
   
   // Alocate memory
   Int_t nClusters = GetNClusters();
@@ -746,6 +843,7 @@ Bool_t AliMUONTrack::ComputeClusterWeights(TMatrixD& clusterWeightsNB, TMatrixD&
   /// accounting for multiple scattering correlations and cluster resolution
   /// - Use the provided MCS covariance matrix if any (otherwise build it temporarily)
   /// - Return kFALSE if computation failed
+  AliDebug(1,"Enter ComputeClusterWeights2");
   
   // Check MCS covariance matrix and recompute it if need
   Int_t nClusters = GetNClusters();
@@ -835,6 +933,7 @@ void AliMUONTrack::ComputeMCSCovariances(TMatrixD& mcsCovariances) const
 {
   /// Compute the multiple scattering covariance matrix
   /// (assume that track parameters at each cluster are corrects)
+  AliDebug(1,"Enter ComputeMCSCovariances");
   
   // Reset the size of the covariance matrix if needed
   Int_t nClusters = GetNClusters();
@@ -923,6 +1022,7 @@ Int_t AliMUONTrack::ClustersInCommon(AliMUONTrack* track) const
 {
   /// Returns the number of clusters in common between the current track ("this")
   /// and the track pointed to by "track".
+  if (!fTrackParamAtCluster || !this->fTrackParamAtCluster) return 0;
   Int_t clustersInCommon = 0;
   AliMUONTrackParam *trackParamAtCluster1, *trackParamAtCluster2;
   // Loop over clusters of first track
@@ -966,6 +1066,8 @@ Bool_t* AliMUONTrack::CompatibleTrack(AliMUONTrack *track, Double_t sigmaCut) co
   Bool_t *compatibleCluster = new Bool_t[AliMUONConstants::NTrackingCh()]; 
   for ( Int_t ch = 0; ch < AliMUONConstants::NTrackingCh(); ch++) compatibleCluster[ch] = kFALSE;
 
+  if (!fTrackParamAtCluster || !this->fTrackParamAtCluster) return compatibleCluster;
+  
   // Loop over clusters of first track
   trackParamAtCluster1 = (AliMUONTrackParam*) this->fTrackParamAtCluster->First();
   while (trackParamAtCluster1) {
@@ -1046,7 +1148,7 @@ void AliMUONTrack::Print(Option_t*) const
       ", LoTrgNum=" << setw(3) << GetLoTrgNum()  << 
     ", Chi2-tracking-trigger=" << setw(8) << setprecision(5) <<  GetChi2MatchTrigger();
   cout << Form(" HitTriggerPattern %x",fHitsPatternInTrigCh) << endl;
-  fTrackParamAtCluster->First()->Print("FULL");
+  if (fTrackParamAtCluster) fTrackParamAtCluster->First()->Print("FULL");
 }
 
 //__________________________________________________________________________
index 72b00870f1e4a353a77ab95c89cc5eee141f56c0..e0ee7d4eddffe3f651f6e268e878143e83ebe4f2 100644 (file)
@@ -31,16 +31,18 @@ class AliMUONTrack : public TObject
   AliMUONTrack (const AliMUONTrack& track); // copy constructor
   AliMUONTrack& operator=(const AliMUONTrack& track); // assignment operator
 
-
-  /// return array of track parameters at cluster
-  TClonesArray* GetTrackParamAtCluster() const {return fTrackParamAtCluster;}
+  TClonesArray* GetTrackParamAtCluster() const;
   void          AddTrackParamAtCluster(const AliMUONTrackParam &trackParam, AliMUONVCluster &cluster, Bool_t copy = kFALSE); 
   void          RemoveTrackParamAtCluster(AliMUONTrackParam *trackParam);
   void          UpdateTrackParamAtCluster();
   void          UpdateCovTrackParamAtCluster();
   
+  Bool_t IsValid();
+  
+  void TagRemovableClusters();
+  
   /// return the number of clusters attached to the track
-  Int_t GetNClusters() const {return fTrackParamAtCluster->GetEntriesFast();}
+  Int_t GetNClusters() const {return fTrackParamAtCluster ? fTrackParamAtCluster->GetEntriesFast() : 0;}
 
   /// return kTrue if the vertex must be used to constrain the fit, kFalse if not
   Bool_t FitWithVertex() const {return fFitWithVertex;}
@@ -131,7 +133,7 @@ class AliMUONTrack : public TObject
 
  private:
  
-  TClonesArray* fTrackParamAtCluster; ///< Track parameters at cluster
+  mutable TClonesArray* fTrackParamAtCluster; ///< Track parameters at cluster
   
   Bool_t   fFitWithVertex;   //!< kTRUE if using the vertex to constrain the fit, kFALSE if not
   Double_t fVertexErrXY2[2]; //!< Vertex resolution square used during the tracking procedure if required
index d0395a6a1b1fb8077b7be482f13d316a1deedf06..139aeb1e3163ed25c417b0aac0fa102351f4886d 100644 (file)
@@ -49,7 +49,6 @@ AliMUONTrackParam::AliMUONTrackParam()
     fClusterPtr(0x0),
     fOwnCluster(kFALSE),
     fRemovable(kFALSE),
-    fAloneInChamber(kTRUE),
     fTrackChi2(0.),
     fLocalChi2(0.)
 {
@@ -70,7 +69,6 @@ AliMUONTrackParam::AliMUONTrackParam(const AliMUONTrackParam& theMUONTrackParam)
     fClusterPtr(0x0),
     fOwnCluster(theMUONTrackParam.fOwnCluster),
     fRemovable(theMUONTrackParam.fRemovable),
-    fAloneInChamber(theMUONTrackParam.fAloneInChamber),
     fTrackChi2(theMUONTrackParam.fTrackChi2),
     fLocalChi2(theMUONTrackParam.fLocalChi2)
 {
@@ -148,14 +146,13 @@ AliMUONTrackParam& AliMUONTrackParam::operator=(const AliMUONTrackParam& theMUON
     fSmoothCovariances = 0x0;
   }
   
+  if (fOwnCluster) delete fClusterPtr;
   fOwnCluster = theMUONTrackParam.fOwnCluster;
   if(fOwnCluster) fClusterPtr = static_cast<AliMUONVCluster*>(theMUONTrackParam.fClusterPtr->Clone());
   else fClusterPtr = theMUONTrackParam.fClusterPtr;
   
   fRemovable = theMUONTrackParam.fRemovable;
   
-  fAloneInChamber = theMUONTrackParam.fAloneInChamber;
-  
   fTrackChi2 = theMUONTrackParam.fTrackChi2;
   fLocalChi2 = theMUONTrackParam.fLocalChi2;
   
index 66075b46a49deabef2ce936cb77b9da0efedb46f..753d2eac8baa0d6e6f73fd861283f401cc325acc 100644 (file)
@@ -115,11 +115,6 @@ class AliMUONTrackParam : public TObject
        /// set the flag telling whether the associated cluster can be removed from the track it belongs to or not
   void   SetRemovable(Bool_t removable) {fRemovable = removable;}
   
-       /// return kTRUE if the associated cluster alone in its chamber
-  Bool_t IsAloneInChamber() const {return fAloneInChamber;}
-       /// set the flag telling whether the associated hi alone in its chamber or not
-  void   SetAloneInChamber(Bool_t aloneInChamber) {fAloneInChamber = aloneInChamber;}
-  
   /// return the chi2 of the track when the associated cluster was attached
   Double_t GetTrackChi2() const {return fTrackChi2;}
        /// set the chi2 of the track when the associated cluster was attached
@@ -171,8 +166,6 @@ class AliMUONTrackParam : public TObject
   
   Bool_t fRemovable; //!< kTRUE if the associated cluster can be removed from the track it belongs to
   
-  Bool_t fAloneInChamber; //!< kTRUE if the associated cluster is alone in its chamber
-
   Double_t fTrackChi2; //!< Chi2 of the track when the associated cluster was attached
   Double_t fLocalChi2; //!< Local chi2 of the associated cluster with respect to the track
   
index 12d46af3b8d5a0c001b3c714e2be891eb3d846a5..4b030119f6500268f393bf7e465dda49666b7db7 100644 (file)
@@ -354,6 +354,7 @@ Bool_t AliMUONTrackReconstructor::FollowTrackInStation(AliMUONTrack &trackCandid
   AliMUONTrack *newTrack = 0x0;
   AliMUONVCluster *clusterCh1, *clusterCh2;
   AliMUONTrackParam extrapTrackParam;
+  AliMUONTrackParam extrapTrackParamAtCh;
   AliMUONTrackParam extrapTrackParamAtCluster1;
   AliMUONTrackParam extrapTrackParamAtCluster2;
   AliMUONTrackParam bestTrackParamAtCluster1;
@@ -364,8 +365,9 @@ Bool_t AliMUONTrackReconstructor::FollowTrackInStation(AliMUONTrack &trackCandid
   for (Int_t i = 0; i < nClusters; i++) clusterCh1Used[i] = kFALSE;
   Int_t iCluster1;
   
-  // Get track parameters
-  AliMUONTrackParam extrapTrackParamAtCh(*(AliMUONTrackParam*)trackCandidate.GetTrackParamAtCluster()->First());
+  // Get track parameters according to the propagation direction
+  if (nextStation==4) extrapTrackParamAtCh = *(AliMUONTrackParam*)trackCandidate.GetTrackParamAtCluster()->Last();
+  else extrapTrackParamAtCh = *(AliMUONTrackParam*)trackCandidate.GetTrackParamAtCluster()->First();
   
   // Add MCS effect
   AliMUONTrackExtrap::AddMCSEffect(&extrapTrackParamAtCh,AliMUONConstants::ChamberThicknessInX0(),1.);
@@ -743,7 +745,6 @@ void AliMUONTrackReconstructor::UpdateTrack(AliMUONTrack &track, AliMUONTrackPar
   
   // Update TrackParamAtCluster
   track.AddTrackParamAtCluster(trackParamAtCluster,*cluster);
-  track.GetTrackParamAtCluster()->Sort();
   
 }
 
@@ -781,7 +782,6 @@ void AliMUONTrackReconstructor::UpdateTrack(AliMUONTrack &track, AliMUONTrackPar
   // Update TrackParamAtCluster
   track.AddTrackParamAtCluster(trackParamAtCluster1,*cluster1);
   track.AddTrackParamAtCluster(trackParamAtCluster2,*cluster2);
-  track.GetTrackParamAtCluster()->Sort();
   
 }
 
@@ -863,6 +863,7 @@ void AliMUONTrackReconstructor::Fit(AliMUONTrack &track, Bool_t includeMCS, Bool
   /// w/wo multiple Coulomb scattering according to "includeMCS".
   /// w/wo constraining the vertex according to "fitWithVertex".
   /// calculating or not the covariance matrix according to "calcCov".
+  AliDebug(1,"Enter Fit");
   
   Double_t benC, errorParam, invBenP, nonBenC, x, y;
   AliMUONTrackParam *trackParam;
@@ -917,7 +918,7 @@ void AliMUONTrackReconstructor::Fit(AliMUONTrack &track, Bool_t includeMCS, Bool
   // mandatory limits in Bending to avoid NaN values of parameters
   gMinuit->mnparm(2, "Y", trackParam->GetBendingCoor(), 0.10, -500.0, 500.0, status);
   gMinuit->mnparm(3, "BenS", trackParam->GetBendingSlope(), 0.001, -0.5, 0.5, status);
-  gMinuit->mnparm(4, "InvBenP", trackParam->GetInverseBendingMomentum(), 0.003, -0.4, 0.4, status);
+  gMinuit->mnparm(4, "InvBenP", trackParam->GetInverseBendingMomentum(), 0.003, -0.5, 0.5, status);
   
   // minimization
   gMinuit->mnexcm("MIGRAD", arg, 0, status);
@@ -1058,9 +1059,9 @@ void AliMUONTrackReconstructor::ComplementTracks(const AliMUONVClusterStore& clu
       
       // add new cluster if any
       if (foundOneCluster) {
-       UpdateTrack(*track,bestTrackParamAtCluster);
-       bestTrackParamAtCluster.SetAloneInChamber(kFALSE);
-       trackParam->SetAloneInChamber(kFALSE);
+       trackParam->SetRemovable(kTRUE);
+       bestTrackParamAtCluster.SetRemovable(kTRUE);
+       track->AddTrackParamAtCluster(bestTrackParamAtCluster,*(bestTrackParamAtCluster.GetClusterPtr()));
        trackModified = kTRUE;
       }
       
@@ -1076,152 +1077,82 @@ void AliMUONTrackReconstructor::ComplementTracks(const AliMUONVClusterStore& clu
 }
 
   //__________________________________________________________________________
-void AliMUONTrackReconstructor::ImproveTracks()
+void AliMUONTrackReconstructor::ImproveTrack(AliMUONTrack &track)
 {
-  /// Improve tracks by removing clusters with local chi2 highter than the defined cut
+  /// Improve the given track by removing clusters with local chi2 highter than the defined cut
   /// Recompute track parameters and covariances at the remaining clusters
-  AliDebug(1,"Enter ImproveTracks");
+  AliDebug(1,"Enter ImproveTrack");
   
   Double_t localChi2, worstLocalChi2;
-  Int_t worstChamber, previousChamber;
-  AliMUONTrack *track, *nextTrack;
-  AliMUONTrackParam *trackParamAtCluster, *worstTrackParamAtCluster, *previousTrackParam, *nextTrackParam;
+  AliMUONTrackParam *trackParamAtCluster, *worstTrackParamAtCluster;
   Double_t sigmaCut2 = AliMUONReconstructor::GetRecoParam()->GetSigmaCutForImprovement() *
                       AliMUONReconstructor::GetRecoParam()->GetSigmaCutForImprovement();
   
-  // Remove double track to improve only "good" tracks
-  RemoveDoubleTracks();
-  
-  track = (AliMUONTrack*) fRecTracksPtr->First();
-  while (track) {
+  while (!track.IsImproved()) {
     
-    // prepare next track in case the actual track is suppressed
-    nextTrack = (AliMUONTrack*) fRecTracksPtr->After(track);
+    // identify removable clusters
+    track.TagRemovableClusters();
     
-    while (!track->IsImproved()) {
-      
-      // Update track parameters and covariances
-      track->UpdateCovTrackParamAtCluster();
-      
-      // Compute local chi2 of each clusters
-      track->ComputeLocalChi2(kTRUE);
-      
-      // Look for the cluster to remove
-      worstTrackParamAtCluster = NULL;
-      worstLocalChi2 = 0.;
-      trackParamAtCluster = (AliMUONTrackParam*) track->GetTrackParamAtCluster()->First();
-      while (trackParamAtCluster) {
-        
-        // Pick up cluster with the worst chi2
-        localChi2 = trackParamAtCluster->GetLocalChi2();
-        if (localChi2 > worstLocalChi2) {
-          worstLocalChi2 = localChi2;
-          worstTrackParamAtCluster = trackParamAtCluster;
-        }
-        
-      trackParamAtCluster = (AliMUONTrackParam*) track->GetTrackParamAtCluster()->After(trackParamAtCluster);
-      }
-      
-      // Check if bad cluster found
-      if (!worstTrackParamAtCluster) {
-        track->SetImproved(kTRUE);
-        break;
-      }
-      
-      // Check whether the worst chi2 is under requirement or not
-      if (worstLocalChi2 < 2. * sigmaCut2) { // 2 because 2 quantities in chi2
-        track->SetImproved(kTRUE);
-        break;
-      }
-      
-      // if the worst cluster is not removable then remove the entire track
-      if (!worstTrackParamAtCluster->IsRemovable() && worstTrackParamAtCluster->IsAloneInChamber()) {
-       fRecTracksPtr->Remove(track);
-       fNRecTracks--;
-        break;
-      }
-      
-      // Reset the second cluster in the same station as being not removable
-      // or reset the second cluster in the same chamber as being alone
-      worstChamber = worstTrackParamAtCluster->GetClusterPtr()->GetChamberId();
-      previousTrackParam = (AliMUONTrackParam*) track->GetTrackParamAtCluster()->Before(worstTrackParamAtCluster);
-      nextTrackParam = (AliMUONTrackParam*) track->GetTrackParamAtCluster()->After(worstTrackParamAtCluster);
-      if (worstTrackParamAtCluster->IsAloneInChamber()) { // Worst cluster removable and alone in chamber
-       
-       if (worstChamber%2 == 0) { // Modify flags in next chamber
-         
-         nextTrackParam->SetRemovable(kFALSE);
-         if (!nextTrackParam->IsAloneInChamber()) // Make sure both clusters in second chamber are not removable anymore
-           ((AliMUONTrackParam*) track->GetTrackParamAtCluster()->After(nextTrackParam))->SetRemovable(kFALSE);
-         
-       } else { // Modify flags in previous chamber
-         
-         previousTrackParam->SetRemovable(kFALSE);
-         if (!previousTrackParam->IsAloneInChamber()) // Make sure both clusters in second chamber are not removable anymore
-           ((AliMUONTrackParam*) track->GetTrackParamAtCluster()->Before(previousTrackParam))->SetRemovable(kFALSE);
-         
-       }
-       
-      } else { // Worst cluster not alone in its chamber
-        
-       if (previousTrackParam) previousChamber = previousTrackParam->GetClusterPtr()->GetChamberId();
-       else previousChamber = -1;
-       
-       if (previousChamber == worstChamber) { // the second cluster on the same chamber is the previous one
-         
-         previousTrackParam->SetAloneInChamber(kTRUE);
-         // transfert the removability to the second cluster
-         if (worstTrackParamAtCluster->IsRemovable()) previousTrackParam->SetRemovable(kTRUE);
-         
-       } else { // the second cluster on the same chamber is the next one
-         
-         nextTrackParam->SetAloneInChamber(kTRUE);
-         // transfert the removability to the second cluster
-         if (worstTrackParamAtCluster->IsRemovable()) nextTrackParam->SetRemovable(kTRUE);
-         
-       }
-       
-      }
-      
-      // Remove the worst cluster
-      track->RemoveTrackParamAtCluster(worstTrackParamAtCluster);
-      
-      // Re-fit the track:
-      // Take into account the multiple scattering
-      // Calculate the track parameter covariance matrix
-      Fit(*track, kTRUE, kFALSE, kTRUE);
+    // Update track parameters and covariances
+    track.UpdateCovTrackParamAtCluster();
+    
+    // Compute local chi2 of each clusters
+    track.ComputeLocalChi2(kTRUE);
+    
+    // Look for the cluster to remove
+    worstTrackParamAtCluster = NULL;
+    worstLocalChi2 = 0.;
+    trackParamAtCluster = (AliMUONTrackParam*) track.GetTrackParamAtCluster()->First();
+    while (trackParamAtCluster) {
       
-      // Printout for debuging
-      if ((AliLog::GetDebugLevel("MUON","AliMUONTrackReconstructor") >= 1) || (AliLog::GetGlobalDebugLevel() >= 1)) {
-        cout << "ImproveTracks: track " << fRecTracksPtr->IndexOf(track)+1 << " improved " << endl;
+      // Pick up cluster with the worst chi2
+      localChi2 = trackParamAtCluster->GetLocalChi2();
+      if (localChi2 > worstLocalChi2) {
+       worstLocalChi2 = localChi2;
+       worstTrackParamAtCluster = trackParamAtCluster;
       }
       
+    trackParamAtCluster = (AliMUONTrackParam*) track.GetTrackParamAtCluster()->After(trackParamAtCluster);
+    }
+    
+    // Check if worst cluster found
+    if (!worstTrackParamAtCluster) {
+      AliWarning("Bad local chi2 values?");
+      break;
+    }
+    
+    // Check whether the worst chi2 is under requirement or not
+    if (worstLocalChi2 < 2. * sigmaCut2) { // 2 because 2 quantities in chi2
+      track.SetImproved(kTRUE);
+      break;
+    }
+    
+    // if the worst cluster is not removable then stop improvement
+    if (!worstTrackParamAtCluster->IsRemovable()) break;
+    
+    // Remove the worst cluster
+    track.RemoveTrackParamAtCluster(worstTrackParamAtCluster);
+    
+    // Re-fit the track:
+    // Take into account the multiple scattering
+    // Calculate the track parameter covariance matrix
+    Fit(track, kTRUE, kFALSE, kTRUE);
+    
+    // Printout for debuging
+    if ((AliLog::GetDebugLevel("MUON","AliMUONTrackReconstructor") >= 1) || (AliLog::GetGlobalDebugLevel() >= 1)) {
+      cout << "ImproveTracks: track " << fRecTracksPtr->IndexOf(&track)+1 << " improved " << endl;
     }
     
-    track = nextTrack;
   }
   
-  // compress the array in case of some tracks have been removed
-  fRecTracksPtr->Compress();
-  
 }
 
   //__________________________________________________________________________
-void AliMUONTrackReconstructor::Finalize()
+void AliMUONTrackReconstructor::FinalizeTrack(AliMUONTrack &track)
 {
-  /// Recompute track parameters and covariances at each attached cluster from those at the first one
-  
-  AliMUONTrack *track;
-  
-  track = (AliMUONTrack*) fRecTracksPtr->First();
-  while (track) {
-    
-    // update track parameters if not already done
-    if (!track->IsImproved()) track->UpdateCovTrackParamAtCluster();
-    
-    track = (AliMUONTrack*) fRecTracksPtr->After(track);
-    
-  }
-  
+  /// Recompute track parameters and covariances at each attached cluster
+  /// from those at the first one, if not already done
+  AliDebug(1,"Enter FinalizeTrack");
+  if (!track.IsImproved()) track.UpdateCovTrackParamAtCluster();
 }
 
index 9a1f83eb7c41473a4c8051e5b913b89112678108..beece1ccebddd786573aae2085880104fea56df9 100644 (file)
@@ -31,8 +31,8 @@ class AliMUONTrackReconstructor : public AliMUONVTrackReconstructor
   virtual void MakeTrackCandidates(AliMUONVClusterStore& clusterStore);
   virtual void FollowTracks(AliMUONVClusterStore& clusterStore);
   virtual void ComplementTracks(const AliMUONVClusterStore& clusterStore);
-  virtual void ImproveTracks();
-  virtual void Finalize();
+  virtual void ImproveTrack(AliMUONTrack &track);
+  virtual void FinalizeTrack(AliMUONTrack &track);
   
 
  private:
index cd3b877261999529bde9857fb29a44c820d1a2f1..ef2fd440d6039201b172c9cd3baa3bed13f6a8c0 100644 (file)
@@ -173,36 +173,54 @@ void AliMUONTrackReconstructorK::RetraceTrack(AliMUONTrack &trackCandidate, Bool
   /// Re-run the kalman filter from the most downstream cluster to the most uptream one
   AliDebug(1,"Enter RetraceTrack");
   
-  AliMUONTrackParam* startingTrackParam = (AliMUONTrackParam*) trackCandidate.GetTrackParamAtCluster()->Last();
+  AliMUONTrackParam* lastTrackParam = (AliMUONTrackParam*) trackCandidate.GetTrackParamAtCluster()->Last();
   
   // Reset the "seed" (= track parameters and their covariances at last cluster) if required
   if (resetSeed) {
-    // => Shift track parameters at the position of the last cluster
-    AliMUONVCluster* cluster = startingTrackParam->GetClusterPtr();
-    startingTrackParam->SetNonBendingCoor(cluster->GetX());
-    startingTrackParam->SetBendingCoor(cluster->GetY());
-    
-    // => Re-compute and reset track parameters covariances at last cluster (as if the other clusters did not exist)
-    const TMatrixD& kParamCov = startingTrackParam->GetCovariances();
-    TMatrixD newParamCov(5,5);
-    newParamCov.Zero();
+    
+    // parameters at last cluster
+    AliMUONVCluster* cluster2 = lastTrackParam->GetClusterPtr();
+    Double_t x2 = cluster2->GetX();
+    Double_t y2 = cluster2->GetY();
+    Double_t z2 = cluster2->GetZ();
+    
+    // parameters at last but one cluster
+    AliMUONTrackParam* previousTrackParam = (AliMUONTrackParam*) trackCandidate.GetTrackParamAtCluster()->Before(lastTrackParam);
+    AliMUONVCluster* cluster1 = previousTrackParam->GetClusterPtr();
+    Double_t x1 = cluster1->GetX();
+    Double_t y1 = cluster1->GetY();
+    Double_t z1 = cluster1->GetZ();
+    
+    // reset track parameters
+    Double_t dZ = z1 - z2;
+    lastTrackParam->SetNonBendingCoor(x2);
+    lastTrackParam->SetBendingCoor(y2);
+    lastTrackParam->SetZ(z2);
+    lastTrackParam->SetNonBendingSlope((x1 - x2) / dZ);
+    lastTrackParam->SetBendingSlope((y1 - y2) / dZ);
+    Double_t bendingImpact = y2 - z2 * lastTrackParam->GetBendingSlope();
+    lastTrackParam->SetInverseBendingMomentum(1. / AliMUONTrackExtrap::GetBendingMomentumFromImpactParam(bendingImpact));
+    
+    // => Reset track parameter covariances at last cluster (as if the other clusters did not exist)
+    TMatrixD lastParamCov(5,5);
+    lastParamCov.Zero();
     // Non bending plane
-    newParamCov(0,0) = cluster->GetErrX2();
-    newParamCov(1,1) = 100.*kParamCov(1,1);
+    lastParamCov(0,0) = cluster2->GetErrX2();
+    lastParamCov(1,1) = 100. * ( cluster1->GetErrX2() + cluster2->GetErrX2() ) / dZ / dZ;
     // Bending plane
-    newParamCov(2,2) = cluster->GetErrY2();
-    newParamCov(3,3) = 100.*kParamCov(3,3);
-    // Inverse bending momentum
-    newParamCov(4,4) = 0.5*startingTrackParam->GetInverseBendingMomentum() * 0.5*startingTrackParam->GetInverseBendingMomentum();
-    startingTrackParam->SetCovariances(newParamCov);
+    lastParamCov(2,2) = cluster2->GetErrY2();
+    lastParamCov(3,3) = 100. * ( cluster1->GetErrY2() + cluster2->GetErrY2() ) / dZ / dZ;
+    // Inverse bending momentum (50% error)
+    lastParamCov(4,4) = 0.5*lastTrackParam->GetInverseBendingMomentum() * 0.5*lastTrackParam->GetInverseBendingMomentum();
+    lastTrackParam->SetCovariances(lastParamCov);
     
     // Reset the track chi2
-    startingTrackParam->SetTrackChi2(0.);
+    lastTrackParam->SetTrackChi2(0.);
   
   }
   
   // Redo the tracking
-  RetracePartialTrack(trackCandidate, startingTrackParam);
+  RetracePartialTrack(trackCandidate, lastTrackParam);
   
 }
 
@@ -369,6 +387,7 @@ Bool_t AliMUONTrackReconstructorK::FollowTrackInStation(AliMUONTrack &trackCandi
   AliMUONTrack *newTrack = 0x0;
   AliMUONVCluster *clusterCh1, *clusterCh2;
   AliMUONTrackParam extrapTrackParam;
+  AliMUONTrackParam extrapTrackParamAtCh;
   AliMUONTrackParam extrapTrackParamAtCluster1;
   AliMUONTrackParam extrapTrackParamAtCluster2;
   AliMUONTrackParam bestTrackParamAtCluster1;
@@ -379,8 +398,10 @@ Bool_t AliMUONTrackReconstructorK::FollowTrackInStation(AliMUONTrack &trackCandi
   for (Int_t i = 0; i < nClusters; i++) clusterCh1Used[i] = kFALSE;
   Int_t iCluster1;
   
-  // Get track parameters
-  AliMUONTrackParam extrapTrackParamAtCh(*(AliMUONTrackParam*)trackCandidate.GetTrackParamAtCluster()->First());
+  // Get track parameters according to the propagation direction
+  
+  if (nextStation==4) extrapTrackParamAtCh = *(AliMUONTrackParam*)trackCandidate.GetTrackParamAtCluster()->Last();
+  else extrapTrackParamAtCh = *(AliMUONTrackParam*)trackCandidate.GetTrackParamAtCluster()->First();
   
   // Add MCS effect
   AliMUONTrackExtrap::AddMCSEffect(&extrapTrackParamAtCh,AliMUONConstants::ChamberThicknessInX0(),1.);
@@ -782,7 +803,6 @@ void AliMUONTrackReconstructorK::UpdateTrack(AliMUONTrack &track, AliMUONTrackPa
   
   // Update array of TrackParamAtCluster
   track.AddTrackParamAtCluster(trackParamAtCluster,*(trackParamAtCluster.GetClusterPtr()));
-  track.GetTrackParamAtCluster()->Sort();
   
 }
 
@@ -829,7 +849,6 @@ void AliMUONTrackReconstructorK::UpdateTrack(AliMUONTrack &track, AliMUONTrackPa
   // Update array of trackParamAtCluster
   track.AddTrackParamAtCluster(trackParamAtCluster1,*cluster1);
   track.AddTrackParamAtCluster(trackParamAtCluster2,*cluster2);
-  track.GetTrackParamAtCluster()->Sort();
   
 }
 
@@ -1042,9 +1061,9 @@ void AliMUONTrackReconstructorK::ComplementTracks(const AliMUONVClusterStore& cl
       
       // add new cluster if any
       if (foundOneCluster) {
-       UpdateTrack(*track,bestTrackParamAtCluster,bestAddChi2TrackAtCluster);
-       bestTrackParamAtCluster.SetAloneInChamber(kFALSE);
-       trackParam->SetAloneInChamber(kFALSE);
+       trackParam->SetRemovable(kTRUE);
+       bestTrackParamAtCluster.SetRemovable(kTRUE);
+       track->AddTrackParamAtCluster(bestTrackParamAtCluster,*(bestTrackParamAtCluster.GetClusterPtr()));
        trackModified = kTRUE;
       }
       
@@ -1061,188 +1080,126 @@ void AliMUONTrackReconstructorK::ComplementTracks(const AliMUONVClusterStore& cl
 }
 
 //__________________________________________________________________________
-void AliMUONTrackReconstructorK::ImproveTracks()
+void AliMUONTrackReconstructorK::ImproveTrack(AliMUONTrack &track)
 {
-  /// Improve tracks by removing clusters with local chi2 highter than the defined cut
+  /// Improve the given track by removing removable clusters with local chi2 highter than the defined cut
+  /// Removable clusters are identified by the method AliMUONTrack::TagRemovableClusters()
   /// Recompute track parameters and covariances at the remaining clusters
-  AliDebug(1,"Enter ImproveTracks");
+  AliDebug(1,"Enter ImproveTrack");
   
   Double_t localChi2, worstLocalChi2;
-  Int_t worstChamber, previousChamber;
-  AliMUONTrack *track, *nextTrack;
-  AliMUONTrackParam *trackParamAtCluster, *worstTrackParamAtCluster, *previousTrackParam, *nextTrackParam;
+  AliMUONTrackParam *trackParamAtCluster, *worstTrackParamAtCluster, *nextTrackParam;
   Bool_t smoothed;
   Double_t sigmaCut2 = AliMUONReconstructor::GetRecoParam()->GetSigmaCutForImprovement() *
                        AliMUONReconstructor::GetRecoParam()->GetSigmaCutForImprovement();
   
-  // Remove double track to improve only "good" tracks
-  RemoveDoubleTracks();
-  
-  track = (AliMUONTrack*) fRecTracksPtr->First();
-  while (track) {
+  while (!track.IsImproved()) {
     
-    // prepare next track in case the actual track is suppressed
-    nextTrack = (AliMUONTrack*) fRecTracksPtr->After(track);
+    // identify removable clusters
+    track.TagRemovableClusters();
     
-    while (!track->IsImproved()) {
+    // Run smoother if required
+    smoothed = kFALSE;
+    if (AliMUONReconstructor::GetRecoParam()->UseSmoother()) smoothed = RunSmoother(track);
+    
+    // Use standard procedure to compute local chi2 if smoother not required or not working
+    if (!smoothed) {
       
-      // Run smoother if required
-      smoothed = kFALSE;
-      if (AliMUONReconstructor::GetRecoParam()->UseSmoother()) smoothed = RunSmoother(*track);
+      // Update track parameters and covariances
+      track.UpdateCovTrackParamAtCluster();
       
-      // Use standard procedure to compute local chi2 if smoother not required or not working
-      if (!smoothed) {
-        
-        // Update track parameters and covariances
-        track->UpdateCovTrackParamAtCluster();
-        
-        // Compute local chi2 of each clusters
-        track->ComputeLocalChi2(kTRUE);
-      }
-      
-      // Look for the cluster to remove
-      worstTrackParamAtCluster = NULL;
-      worstLocalChi2 = 0.;
-      trackParamAtCluster = (AliMUONTrackParam*)track->GetTrackParamAtCluster()->First();
-      while (trackParamAtCluster) {
-        
-       // save parameters into smooth parameters in case of smoother did not work properly
-       if (AliMUONReconstructor::GetRecoParam()->UseSmoother() && !smoothed) {
-         trackParamAtCluster->SetSmoothParameters(trackParamAtCluster->GetParameters());
-         trackParamAtCluster->SetSmoothCovariances(trackParamAtCluster->GetCovariances());
-        }
-       
-       // Pick up cluster with the worst chi2
-        localChi2 = trackParamAtCluster->GetLocalChi2();
-        if (localChi2 > worstLocalChi2) {
-          worstLocalChi2 = localChi2;
-          worstTrackParamAtCluster = trackParamAtCluster;
-        }
-        
-       trackParamAtCluster = (AliMUONTrackParam*)track->GetTrackParamAtCluster()->After(trackParamAtCluster);
-      }
+      // Compute local chi2 of each clusters
+      track.ComputeLocalChi2(kTRUE);
+    }
+    
+    // Look for the cluster to remove
+    worstTrackParamAtCluster = 0x0;
+    worstLocalChi2 = 0.;
+    trackParamAtCluster = (AliMUONTrackParam*)track.GetTrackParamAtCluster()->First();
+    while (trackParamAtCluster) {
       
-      // Check if bad removable cluster found
-      if (!worstTrackParamAtCluster) {
-        track->SetImproved(kTRUE);
-        break;
+      // save parameters into smooth parameters in case of smoother did not work properly
+      if (AliMUONReconstructor::GetRecoParam()->UseSmoother() && !smoothed) {
+       trackParamAtCluster->SetSmoothParameters(trackParamAtCluster->GetParameters());
+       trackParamAtCluster->SetSmoothCovariances(trackParamAtCluster->GetCovariances());
       }
       
-      // Check whether the worst chi2 is under requirement or not
-      if (worstLocalChi2 < 2. * sigmaCut2) { // 2 because 2 quantities in chi2
-        track->SetImproved(kTRUE);
-        break;
-      }
-      
-      // if the worst cluster is not removable then remove the entire track
-      if (!worstTrackParamAtCluster->IsRemovable() && worstTrackParamAtCluster->IsAloneInChamber()) {
-       fRecTracksPtr->Remove(track);
-       fNRecTracks--;
-        break;
-      }
-      
-      // Reset the second cluster in the same station as being not removable
-      // or reset the second cluster in the same chamber as being alone
-      worstChamber = worstTrackParamAtCluster->GetClusterPtr()->GetChamberId();
-      previousTrackParam = (AliMUONTrackParam*) track->GetTrackParamAtCluster()->Before(worstTrackParamAtCluster);
-      nextTrackParam = (AliMUONTrackParam*) track->GetTrackParamAtCluster()->After(worstTrackParamAtCluster);
-      if (worstTrackParamAtCluster->IsAloneInChamber()) { // Worst cluster removable and alone in chamber
-       
-       if (worstChamber%2 == 0) { // Modify flags in next chamber
-         
-         nextTrackParam->SetRemovable(kFALSE);
-         if (!nextTrackParam->IsAloneInChamber()) // Make sure both clusters in second chamber are not removable anymore
-           ((AliMUONTrackParam*) track->GetTrackParamAtCluster()->After(nextTrackParam))->SetRemovable(kFALSE);
-         
-       } else { // Modify flags in previous chamber
-         
-         previousTrackParam->SetRemovable(kFALSE);
-         if (!previousTrackParam->IsAloneInChamber()) // Make sure both clusters in second chamber are not removable anymore
-           ((AliMUONTrackParam*) track->GetTrackParamAtCluster()->Before(previousTrackParam))->SetRemovable(kFALSE);
-         
-       }
-       
-      } else { // Worst cluster not alone in its chamber
-        
-       if (previousTrackParam) previousChamber = previousTrackParam->GetClusterPtr()->GetChamberId();
-       else previousChamber = -1;
-       
-       if (previousChamber == worstChamber) { // the second cluster on the same chamber is the previous one
-         
-         previousTrackParam->SetAloneInChamber(kTRUE);
-         // transfert the removability to the second cluster
-         if (worstTrackParamAtCluster->IsRemovable()) previousTrackParam->SetRemovable(kTRUE);
-         
-       } else { // the second cluster on the same chamber is the next one
-         
-         nextTrackParam->SetAloneInChamber(kTRUE);
-         // transfert the removability to the second cluster
-         if (worstTrackParamAtCluster->IsRemovable()) nextTrackParam->SetRemovable(kTRUE);
-         
-       }
-       
-      }
-      
-      // Remove the worst cluster
-      track->RemoveTrackParamAtCluster(worstTrackParamAtCluster);
-      
-      // Re-calculate track parameters
-      // - from the cluster immediately downstream the one suppressed
-      // - or from the begining - if parameters have been re-computed using the standard method (kalman parameters have been lost)
-      //                       - or if the removed cluster was the last one
-      if (smoothed && nextTrackParam) RetracePartialTrack(*track,nextTrackParam);
-      else RetraceTrack(*track,kTRUE);
-      
-      // Printout for debuging
-      if ((AliLog::GetDebugLevel("MUON","AliMUONTrackReconstructorK") >= 1) || (AliLog::GetGlobalDebugLevel() >= 1)) {
-        cout << "ImproveTracks: track " << fRecTracksPtr->IndexOf(track)+1 << " improved " << endl;
+      // Pick up cluster with the worst chi2
+      localChi2 = trackParamAtCluster->GetLocalChi2();
+      if (localChi2 > worstLocalChi2) {
+       worstLocalChi2 = localChi2;
+       worstTrackParamAtCluster = trackParamAtCluster;
       }
       
+      trackParamAtCluster = (AliMUONTrackParam*)track.GetTrackParamAtCluster()->After(trackParamAtCluster);
+    }
+    
+    // Check if worst cluster found
+    if (!worstTrackParamAtCluster) {
+      AliWarning("Bad local chi2 values?");
+      break;
+    }
+    
+    // Check whether the worst chi2 is under requirement or not
+    if (worstLocalChi2 < 2. * sigmaCut2) { // 2 because 2 quantities in chi2
+      track.SetImproved(kTRUE);
+      break;
+    }
+    
+    // if the worst cluster is not removable then stop improvement
+    if (!worstTrackParamAtCluster->IsRemovable()) break;
+    
+    // get track parameters at cluster next to the one to be removed
+    nextTrackParam = (AliMUONTrackParam*) track.GetTrackParamAtCluster()->After(worstTrackParamAtCluster);
+    
+    // Remove the worst cluster
+    track.RemoveTrackParamAtCluster(worstTrackParamAtCluster);
+    
+    // Re-calculate track parameters
+    // - from the cluster immediately downstream the one suppressed
+    // - or from the begining - if parameters have been re-computed using the standard method (kalman parameters have been lost)
+    //                 - or if the removed cluster was the last one
+    if (smoothed && nextTrackParam) RetracePartialTrack(track,nextTrackParam);
+    else RetraceTrack(track,kTRUE);
+    
+    // Printout for debuging
+    if ((AliLog::GetDebugLevel("MUON","AliMUONTrackReconstructorK") >= 1) || (AliLog::GetGlobalDebugLevel() >= 1)) {
+      cout << "ImproveTracks: track " << fRecTracksPtr->IndexOf(&track)+1 << " improved " << endl;
     }
     
-    track = nextTrack;
   }
   
-  // compress the array in case of some tracks have been removed
-  fRecTracksPtr->Compress();
-  
 }
 
-  //__________________________________________________________________________
-void AliMUONTrackReconstructorK::Finalize()
+//__________________________________________________________________________
+void AliMUONTrackReconstructorK::FinalizeTrack(AliMUONTrack &track)
 {
   /// Update track parameters and covariances at each attached cluster
+  /// using smoother if required, if not already done
   
-  AliMUONTrack *track;
   AliMUONTrackParam *trackParamAtCluster;
   Bool_t smoothed = kFALSE;
   
-  track = (AliMUONTrack*) fRecTracksPtr->First();
-  while (track) {
-    
-    // update track parameters (using smoother if required) if not already done
-    if (!track->IsImproved()) {
-      smoothed = kFALSE;
-      if (AliMUONReconstructor::GetRecoParam()->UseSmoother()) smoothed = RunSmoother(*track);
-      if (!smoothed) track->UpdateCovTrackParamAtCluster();
-    } else smoothed = AliMUONReconstructor::GetRecoParam()->UseSmoother();
+  // update track parameters (using smoother if required) if not already done
+  if (!track.IsImproved()) {
+    smoothed = kFALSE;
+    if (AliMUONReconstructor::GetRecoParam()->UseSmoother()) smoothed = RunSmoother(track);
+    if (!smoothed) track.UpdateCovTrackParamAtCluster();
+  } else smoothed = AliMUONReconstructor::GetRecoParam()->UseSmoother();
+  
+  // copy smoothed parameters and covariances if any
+  if (smoothed) {
     
-    // copy smoothed parameters and covariances if any
-    if (smoothed) {
+    trackParamAtCluster = (AliMUONTrackParam*) (track.GetTrackParamAtCluster()->First());
+    while (trackParamAtCluster) {
       
-      trackParamAtCluster = (AliMUONTrackParam*) (track->GetTrackParamAtCluster()->First());
-      while (trackParamAtCluster) {
-       
-       trackParamAtCluster->SetParameters(trackParamAtCluster->GetSmoothParameters());
-       trackParamAtCluster->SetCovariances(trackParamAtCluster->GetSmoothCovariances());
-       
-       trackParamAtCluster = (AliMUONTrackParam*) (track->GetTrackParamAtCluster()->After(trackParamAtCluster));
-      }
+      trackParamAtCluster->SetParameters(trackParamAtCluster->GetSmoothParameters());
+      trackParamAtCluster->SetCovariances(trackParamAtCluster->GetSmoothCovariances());
       
+      trackParamAtCluster = (AliMUONTrackParam*) (track.GetTrackParamAtCluster()->After(trackParamAtCluster));
     }
     
-    track = (AliMUONTrack*) fRecTracksPtr->After(track);
   }
-    
+  
 }
 
index c93fe5f844ba3b84008e3ffbdfb6776ef6c2ebac..de8b4eeb0fd4bfa45b56a03ed92507b4b300f901 100644 (file)
@@ -30,8 +30,8 @@ class AliMUONTrackReconstructorK : public AliMUONVTrackReconstructor
   virtual void MakeTrackCandidates(AliMUONVClusterStore& clusterStore);
   virtual void FollowTracks(AliMUONVClusterStore& clusterStore);
   virtual void ComplementTracks(const AliMUONVClusterStore& clusterStore);
-  virtual void ImproveTracks();
-  virtual void Finalize();
+  virtual void ImproveTrack(AliMUONTrack &track);
+  virtual void FinalizeTrack(AliMUONTrack &track);
   
 
  private:
index ce9dcea4afc72e9d53bf87a5164e5ec1405d6a49..1d6dee6590734e872751961b4fc35b88370b9fd4 100644 (file)
@@ -40,7 +40,6 @@ AliMUONTrackStoreV1::AliMUONTrackStoreV1() : AliMUONVTrackStore(),
  fTracks(new TClonesArray("AliMUONTrack",10))
 {
    /// Ctor
-   fTracks->SetOwner(kTRUE);
 }
 
 //_____________________________________________________________________________
@@ -51,11 +50,21 @@ AliMUONTrackStoreV1::~AliMUONTrackStoreV1()
 }
 
 //_____________________________________________________________________________
-void 
+AliMUONTrack* 
 AliMUONTrackStoreV1::Add(const AliMUONTrack& track)
 {
   /// Add a track
-  new((*fTracks)[fTracks->GetLast()+1]) AliMUONTrack(track);
+  return new((*fTracks)[fTracks->GetLast()+1]) AliMUONTrack(track);
+}
+
+//_____________________________________________________________________________
+AliMUONTrack*
+AliMUONTrackStoreV1::Remove(AliMUONTrack& track)
+{
+  /// Remove a track from the store
+  AliMUONTrack* t = static_cast<AliMUONTrack*>(fTracks->Remove(&track));
+  if (t) fTracks->Compress();
+  return t;
 }
 
 //_____________________________________________________________________________
index ec6389bbc989be6edefb031df15dc37f55e69a1d..21d798a55632b52f80f9d228ab5c0487259f39c4 100644 (file)
@@ -26,8 +26,10 @@ public:
   
   using AliMUONVTrackStore::Add;
   
-  virtual void Add(const AliMUONTrack& track);
+  virtual AliMUONTrack* Add(const AliMUONTrack& track);
 
+  virtual AliMUONTrack* Remove(AliMUONTrack& track);
+  
   /// Whether the Connect(TTree&) method is implemented
   virtual Bool_t CanConnect() const { return kTRUE; }
   
index c545bd3579764cce3ca8b9b4b48369b4e0cf4b34..dcd778abc1933481498461705e41d2fee08bb0e6 100644 (file)
@@ -31,6 +31,7 @@ public:
   
   static Int_t ReadCapacitances(const char* filename, AliMUONVStore& capaStore);
   
+  /// Error code constants
   enum ErrorCode
   {
     kCannotOpenFile = -1, /// cannot open given file
index e8320acdee82f64a29533ab44b908b3595bfe2bf..3f9d15a97e59d5e13c711c199deebae8b66ae672 100644 (file)
@@ -52,8 +52,7 @@ AliMUONVClusterStore::Add(TObject* object)
   AliMUONVCluster* cluster = dynamic_cast<AliMUONVCluster*>(object);
   if (cluster)
   {
-    Add(*cluster);
-    return kTRUE;
+    return (Add(*cluster)) ? kTRUE : kFALSE;
   }
   return kFALSE;
 }
index 1e37d178ad7dfb8b954ee21e3b56ee8791a795e6..27c7992bc4ceb9418c3344c63887a6054466982f 100644 (file)
@@ -31,7 +31,7 @@ public:
   virtual Bool_t Add(TObject* object);
 
   /// Add a cluster object to the store
-  virtual Bool_t Add(const AliMUONVCluster& Cluster) = 0;
+  virtual AliMUONVCluster* Add(const AliMUONVCluster& Cluster) = 0;
   /// Create a new cluster with an unique ID and add it to the store
   virtual AliMUONVCluster* Add(Int_t chamberId, Int_t detElemId, Int_t clusterIndex) = 0;
 
index dd9c8001e8b244ce7de2bd604d3b445700403054..8d8107e8a28c47cee6d6b10ed25dd5736373e94e 100644 (file)
@@ -61,6 +61,7 @@ AliMUONVDigit::AliMUONVDigit(Int_t detElemId, Int_t eCardId,
 
 //_____________________________________________________________________________
 AliMUONVDigit::AliMUONVDigit()
+: TObject() 
 {
   /// Default ctor
 }
index 412060d203e20f9ac116ce7da275e1bb0a291f17..72f0f9f62ea5b56b04181b1d140652d64db13a22 100644 (file)
@@ -100,7 +100,7 @@ AliMUONVDigitStore::Create(const char* digitstoreclassname)
   /// Create a concrete digitStore, given its classname
   
   TClass* classPtr = TClass::GetClass(digitstoreclassname);
-  if (!classPtr)
+  if (!classPtr || !classPtr->InheritsFrom("AliMUONVDigitStore"))
   {
     return 0x0;
   }
index 3fcdf1fc79942ae47f2f6f90038fa9b1e4b0fc90..4b0e24ea2f84c6a7f9565827ee3612fb6bc41130 100644 (file)
@@ -161,6 +161,7 @@ void AliMUONVTrackReconstructor::EventReconstruct(AliMUONVClusterStore& clusterS
   for (Int_t i=0; i<fNRecTracks; ++i) 
   {
     AliMUONTrack * track = (AliMUONTrack*) fRecTracksPtr->At(i);
+    track->SetUniqueID(i+1);
     trackStore.Add(*track);
   }
 }
@@ -185,7 +186,6 @@ TClonesArray* AliMUONVTrackReconstructor::MakeSegmentsInStation(const AliMUONVCl
   
   // list of segments
   TClonesArray *segments = new TClonesArray("AliMUONObjectPair", 100);
-  segments->SetOwner(kTRUE);
   
   // Loop over clusters in the first chamber of the station
   while ( ( cluster1 = static_cast<AliMUONVCluster*>(nextInCh1()) ) ) {
@@ -360,8 +360,6 @@ void AliMUONVTrackReconstructor::AskForNewClustersInStation(const AliMUONTrackPa
   
   // build the searching area
   position.Set(extrapTrackParam.GetNonBendingCoor(), extrapTrackParam.GetBendingCoor());
-//  dimensions.Set(AliMUONReconstructor::GetRecoParam()->GetMaxNonBendingDistanceToTrack() + kgMaxShift,
-//              AliMUONReconstructor::GetRecoParam()->GetMaxBendingDistanceToTrack() + kgMaxShift);
   AliMpArea area1(position, dimensions);
   
   // ask to cluterize in the given area of the given chamber
@@ -495,6 +493,7 @@ Bool_t AliMUONVTrackReconstructor::FollowLinearTrackInStation(AliMUONTrack &trac
   Bool_t foundTwoClusters = kFALSE;
   AliMUONTrack *newTrack = 0x0;
   AliMUONVCluster *clusterCh1, *clusterCh2;
+  AliMUONTrackParam trackParam;
   AliMUONTrackParam extrapTrackParamAtCluster1;
   AliMUONTrackParam extrapTrackParamAtCluster2;
   AliMUONTrackParam bestTrackParamAtCluster1;
@@ -505,8 +504,9 @@ Bool_t AliMUONVTrackReconstructor::FollowLinearTrackInStation(AliMUONTrack &trac
   for (Int_t i = 0; i < nClusters; i++) clusterCh1Used[i] = kFALSE;
   Int_t iCluster1;
   
-  // Get track parameters
-  AliMUONTrackParam trackParam(*(AliMUONTrackParam*)trackCandidate.GetTrackParamAtCluster()->First());
+  // Get track parameters according to the propagation direction
+  if (nextStation==4) trackParam = *(AliMUONTrackParam*)trackCandidate.GetTrackParamAtCluster()->Last();
+  else trackParam = *(AliMUONTrackParam*)trackCandidate.GetTrackParamAtCluster()->First();
   
   // Add MCS effect
   AliMUONTrackExtrap::AddMCSEffect(&trackParam,AliMUONConstants::ChamberThicknessInX0(),1.);
@@ -577,7 +577,6 @@ Bool_t AliMUONVTrackReconstructor::FollowLinearTrackInStation(AliMUONTrack &trac
            newTrack->AddTrackParamAtCluster(extrapTrackParamAtCluster1,*clusterCh1);
            extrapTrackParamAtCluster2.SetRemovable(kTRUE);
            newTrack->AddTrackParamAtCluster(extrapTrackParamAtCluster2,*clusterCh2);
-           newTrack->GetTrackParamAtCluster()->Sort();
            fNRecTracks++;
            
            // Tag clusterCh1 as used
@@ -609,7 +608,6 @@ Bool_t AliMUONVTrackReconstructor::FollowLinearTrackInStation(AliMUONTrack &trac
           newTrack = new ((*fRecTracksPtr)[fRecTracksPtr->GetLast()+1]) AliMUONTrack(trackCandidate);
          extrapTrackParamAtCluster2.SetRemovable(kFALSE);
          newTrack->AddTrackParamAtCluster(extrapTrackParamAtCluster2,*clusterCh2);
-         newTrack->GetTrackParamAtCluster()->Sort();
          fNRecTracks++;
          
          // Printout for debuging
@@ -679,7 +677,6 @@ Bool_t AliMUONVTrackReconstructor::FollowLinearTrackInStation(AliMUONTrack &trac
          newTrack = new ((*fRecTracksPtr)[fRecTracksPtr->GetLast()+1]) AliMUONTrack(trackCandidate);
          extrapTrackParamAtCluster1.SetRemovable(kFALSE);
          newTrack->AddTrackParamAtCluster(extrapTrackParamAtCluster1,*clusterCh1);
-         newTrack->GetTrackParamAtCluster()->Sort();
          fNRecTracks++;
          
          // Printout for debuging
@@ -707,7 +704,6 @@ Bool_t AliMUONVTrackReconstructor::FollowLinearTrackInStation(AliMUONTrack &trac
       trackCandidate.AddTrackParamAtCluster(bestTrackParamAtCluster1,*(bestTrackParamAtCluster1.GetClusterPtr()));
       bestTrackParamAtCluster2.SetRemovable(kTRUE);
       trackCandidate.AddTrackParamAtCluster(bestTrackParamAtCluster2,*(bestTrackParamAtCluster2.GetClusterPtr()));
-      trackCandidate.GetTrackParamAtCluster()->Sort();
       
       // Printout for debuging
       if ((AliLog::GetDebugLevel("MUON","AliMUONVTrackReconstructor") >= 1) || (AliLog::GetGlobalDebugLevel() >= 1)) {
@@ -718,7 +714,6 @@ Bool_t AliMUONVTrackReconstructor::FollowLinearTrackInStation(AliMUONTrack &trac
     } else if (foundOneCluster) {
       bestTrackParamAtCluster1.SetRemovable(kFALSE);
       trackCandidate.AddTrackParamAtCluster(bestTrackParamAtCluster1,*(bestTrackParamAtCluster1.GetClusterPtr()));
-      trackCandidate.GetTrackParamAtCluster()->Sort();
       
       // Printout for debuging
       if ((AliLog::GetDebugLevel("MUON","AliMUONVTrackReconstructor") >= 1) || (AliLog::GetGlobalDebugLevel() >= 1)) {
@@ -747,7 +742,59 @@ Bool_t AliMUONVTrackReconstructor::FollowLinearTrackInStation(AliMUONTrack &trac
   
 }
 
-  //__________________________________________________________________________
+//__________________________________________________________________________
+void AliMUONVTrackReconstructor::ImproveTracks()
+{
+  /// Improve tracks by removing clusters with local chi2 highter than the defined cut
+  /// Recompute track parameters and covariances at the remaining clusters
+  AliDebug(1,"Enter ImproveTracks");
+  
+  AliMUONTrack *track, *nextTrack;
+  
+  // Remove double track to improve only "good" tracks
+  RemoveDoubleTracks();
+  
+  track = (AliMUONTrack*) fRecTracksPtr->First();
+  while (track) {
+    
+    // prepare next track in case the actual track is suppressed
+    nextTrack = (AliMUONTrack*) fRecTracksPtr->After(track);
+    
+    ImproveTrack(*track);
+    
+    // remove track if improvement failed
+    if (!track->IsImproved()) {
+      fRecTracksPtr->Remove(track);
+      fNRecTracks--;
+    }
+    
+    track = nextTrack;
+  }
+  
+  // compress the array in case of some tracks have been removed
+  fRecTracksPtr->Compress();
+  
+}
+
+//__________________________________________________________________________
+void AliMUONVTrackReconstructor::Finalize()
+{
+  /// Recompute track parameters and covariances at each attached cluster from those at the first one
+  
+  AliMUONTrack *track;
+  
+  track = (AliMUONTrack*) fRecTracksPtr->First();
+  while (track) {
+    
+    FinalizeTrack(*track);
+    
+    track = (AliMUONTrack*) fRecTracksPtr->After(track);
+    
+  }
+  
+}
+
+//__________________________________________________________________________
 void AliMUONVTrackReconstructor::ValidateTracksWithTrigger(AliMUONVTrackStore& trackStore,
                                                            const AliMUONVTriggerTrackStore& triggerTrackStore,
                                                            const AliMUONVTriggerStore& triggerStore,
index a97f6307922d309fc583038d54ee7cb0067aaf76..e2fad856a3f0b70dc27d1ebf988b72e588083c40 100644 (file)
@@ -37,15 +37,6 @@ class AliMUONVTrackReconstructor : public TObject {
   AliMUONVTrackReconstructor(AliMUONVClusterServer& clusterServer); // default Constructor
   virtual ~AliMUONVTrackReconstructor(); // Destructor
 
-  // Reconstructed tracks
-           /// Return number of reconstructed tracks
-  Int_t GetNRecTracks() const {return fNRecTracks;} // Number
-           /// Set number of reconstructed tracks
-  void SetNRecTracks(Int_t NRecTracks) {fNRecTracks = NRecTracks;}
-           /// Return array of reconstructed tracks
-  TClonesArray* GetRecTracksPtr() const {return fRecTracksPtr;} // Array
-  // Functions
   void EventReconstruct(AliMUONVClusterStore& clusterStore,
                         AliMUONVTrackStore& trackStore);
   
@@ -76,10 +67,12 @@ class AliMUONVTrackReconstructor : public TObject {
   virtual void FollowTracks(AliMUONVClusterStore& clusterStore) = 0;
   /// Complement the reconstructed tracks
   virtual void ComplementTracks(const AliMUONVClusterStore& clusterStore) = 0;
-  /// Improve the reconstructed tracks
-  virtual void ImproveTracks() = 0;
-  /// Finalize the tracking results
-  virtual void Finalize() = 0;
+  void ImproveTracks();
+  /// Improve the given reconstructed track
+  virtual void ImproveTrack(AliMUONTrack &track) = 0;
+  void Finalize();
+  /// Finalize the given track
+  virtual void FinalizeTrack(AliMUONTrack &track) = 0;
   
   TClonesArray* MakeSegmentsInStation(const AliMUONVClusterStore& clusterStore, Int_t station);
 
index b8cb7c828e416be5e0788471ab9eff9b07d0571d..46da467a241489bfa71930485a13d3ef9c2565e3 100644 (file)
@@ -28,7 +28,10 @@ public:
   virtual Bool_t Add(TObject* object);
   
   /// Add a track
-  virtual void Add(const AliMUONTrack& track) = 0;
+  virtual AliMUONTrack* Add(const AliMUONTrack& track) = 0;
+  
+  /// Remove a track from the store
+  virtual AliMUONTrack* Remove(AliMUONTrack& track) = 0;
   
   using AliMUONVStore::Create;
   
index fa97db46ef8ee23d153526d34a32c216a21ca72b..fe4914cd18e6830ef7a58930a4ac5f53fedb39ec 100644 (file)
@@ -174,7 +174,7 @@ AliMpExMap::Copy(TObject& dest) const
   AliMpExMap& m = static_cast<AliMpExMap&>(dest);
   m.fKeys = fKeys;
   m.fMap.Delete();
-  m.fObjects.Delete();
+  m.fObjects.Clear();
   
   for ( Int_t i = 0; i <= fObjects.GetLast(); ++i ) 
   {
@@ -226,6 +226,16 @@ void AliMpExMap::AddKey(Long_t key)
 // public methods
 //
 
+//_____________________________________________________________________________
+void AliMpExMap::Clear(Option_t* /*option*/)
+{
+/// Clear memory
+
+  fMap.Delete();
+  fObjects.Clear();
+  fKeys.Reset();
+}
+
 //_____________________________________________________________________________
 void AliMpExMap::Add(const AliMpIntPair& key, TObject* object)
 {
index 44965522f36ed461bcb19dae2c979ed492d831e7..dcefbc876b03d0233bcfca71875a8e01196fb4c8 100644 (file)
@@ -34,6 +34,7 @@ class AliMpExMap : public TObject
     AliMpExMap& operator=(const AliMpExMap& rhs);
     virtual ~AliMpExMap();
     
+    
     // static methods
     // conversion between varius keys and Long_t
     //
@@ -42,6 +43,9 @@ class AliMpExMap : public TObject
     static AliMpIntPair  GetPair(Long_t index);
     static TString       GetString(Long_t index);
 
+    // methods from base class
+    virtual void Clear(Option_t* opt="");
+
     // set methods
     void Add(const AliMpIntPair& key, TObject* object);
     void Add(const TString& key, TObject* object);