The description of changes:
authorhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 14 Jan 2010 14:56:36 +0000 (14:56 +0000)
committerhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 14 Jan 2010 14:56:36 +0000 (14:56 +0000)
In MUON reconstruction:
At the end of the reconstruction, when 2 tracks share one cluster or more, the worst one is removed (assuming it is a fake). Now:
- The selection is sequential: we start comparing tracks on stations 4&5, then on station 3 and finally, if required in the reconstruction parameters, on stations 1&2.
- All the combinations of tracks are considered before starting to remove them.
- When the selection is not performed on station 1&2, the connected tracks on these stations are flagged.
- This flag is propagated to the ESD and the AOD and accessible via the method "IsConnected()".
(Philippe P.)

MUON/AliMUONESDInterface.cxx
MUON/AliMUONRecoParam.cxx
MUON/AliMUONTrack.cxx
MUON/AliMUONTrack.h
MUON/AliMUONVTrackReconstructor.cxx
MUON/AliMUONVTrackReconstructor.h
PWG3/muon/AliAnalysisTaskESDMuonFilter.cxx
STEER/AliAODTrack.h
STEER/AliESDMuonTrack.h

index 2a4c5ce..15e3844 100644 (file)
@@ -684,6 +684,7 @@ void AliMUONESDInterface::ESDToMUON(const AliESDMuonTrack& esdTrack, AliMUONTrac
   track.SetLocalTrigger(esdTrack.LoCircuit(), esdTrack.LoStripX(), esdTrack.LoStripY(),
                        esdTrack.LoDev(), esdTrack.LoLpt(), esdTrack.LoHpt(),
                        esdTrack.GetTriggerWithoutChamber());
+  track.Connected(esdTrack.IsConnected());
   
   // track parameters at vertex
   AliMUONTrackParam paramAtVertex;
@@ -887,6 +888,9 @@ void AliMUONESDInterface::MUONToESD(const AliMUONTrack& track, AliESDMuonTrack&
     trackParam = static_cast<AliMUONTrackParam*>(track.GetTrackParamAtCluster()->After(trackParam));
   }
   
+  // set connected flag
+  esdTrack.Connected(track.IsConnected());
+  
   // set trigger info
   esdTrack.SetLocalTrigger(track.GetLocalTrigger());
   esdTrack.SetChi2MatchTrigger(track.GetChi2MatchTrigger());
index 60205fe..c98d54d 100644 (file)
@@ -194,7 +194,7 @@ void AliMUONRecoParam::SetLowFluxParam()
   fMakeMoreTrackCandidates = kFALSE;
   fComplementTracks = kTRUE;
   fImproveTracks = kTRUE;
-  fRemoveConnectedTracksInSt12 = kTRUE;
+  fRemoveConnectedTracksInSt12 = kFALSE;
   fUseSmoother = kTRUE;
   for (Int_t iCh = 0; iCh < 10; iCh++) {
     fUseChamber[iCh] = kTRUE;
index f1e32e0..3b98ce7 100644 (file)
@@ -61,7 +61,8 @@ AliMUONTrack::AliMUONTrack()
     fTrackID(-1),
     fTrackParamAtVertex(0x0),
     fHitsPatternInTrigCh(0),
-    fLocalTrigger(0)
+    fLocalTrigger(0),
+    fConnected(kFALSE)
 {
   /// Default constructor
   fVertexErrXY2[0] = 0.;
@@ -84,7 +85,8 @@ AliMUONTrack::AliMUONTrack(AliMUONObjectPair *segment, Double_t bendingVertexDis
     fTrackID(-1),
     fTrackParamAtVertex(0x0),
     fHitsPatternInTrigCh(0),
-    fLocalTrigger(0)
+    fLocalTrigger(0),
+    fConnected(kFALSE)
 {
   /// Constructor from two clusters
   
@@ -192,7 +194,8 @@ AliMUONTrack::AliMUONTrack(const AliMUONTrack& track)
     fTrackID(track.fTrackID),
     fTrackParamAtVertex(0x0),
     fHitsPatternInTrigCh(track.fHitsPatternInTrigCh),
-    fLocalTrigger(track.fLocalTrigger)
+    fLocalTrigger(track.fLocalTrigger),
+    fConnected(track.fConnected)
 {
   ///copy constructor
   
@@ -276,6 +279,7 @@ AliMUONTrack & AliMUONTrack::operator=(const AliMUONTrack& track)
   fTrackID            =  track.fTrackID; 
   fHitsPatternInTrigCh = track.fHitsPatternInTrigCh;
   fLocalTrigger        = track.fLocalTrigger;
+  fConnected          =  track.fConnected;
 
   return *this;
 }
@@ -320,6 +324,7 @@ void AliMUONTrack::Reset()
   fTrackID = -1;
   fHitsPatternInTrigCh = 0;
   fLocalTrigger = 0;
+  fConnected = kFALSE;
   delete fTrackParamAtCluster; fTrackParamAtCluster = 0x0;
   delete fClusterWeightsNonBending; fClusterWeightsNonBending = 0x0;
   delete fClusterWeightsBending; fClusterWeightsBending = 0x0;
@@ -1003,56 +1008,43 @@ void AliMUONTrack::ComputeMCSCovariances(TMatrixD& mcsCovariances) const
 }
 
   //__________________________________________________________________________
-Int_t AliMUONTrack::ClustersInCommon(AliMUONTrack* track) const
+Int_t AliMUONTrack::ClustersInCommon(AliMUONTrack* track, Int_t stMin, Int_t stMax) 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 nCluster1 = this->GetNClusters();
-  Int_t nCluster2 = track->GetNClusters();
-  Int_t clustersInCommon = 0;
-  AliMUONTrackParam *trackParamAtCluster1, *trackParamAtCluster2;
-  // Loop over clusters of first track
-  for(Int_t iCluster1 = 0; iCluster1 < nCluster1; iCluster1++) {
-    trackParamAtCluster1 = (AliMUONTrackParam*) this->fTrackParamAtCluster->UncheckedAt(iCluster1);
-    // Loop over clusters of second track
-    for(Int_t iCluster2 = 0; iCluster2 < nCluster2; iCluster2++) {
-      trackParamAtCluster2 = (AliMUONTrackParam*) track->fTrackParamAtCluster->UncheckedAt(iCluster2);
-      // Increment "clustersInCommon" if both trackParamAtCluster1 & 2 point to the same cluster
-      if ((trackParamAtCluster1->GetClusterPtr()) == (trackParamAtCluster2->GetClusterPtr())) {
-       clustersInCommon++;
-       break;
-      }
-    }
-  }
-  return clustersInCommon;
-}
-
-  //__________________________________________________________________________
-Int_t AliMUONTrack::ClustersInCommonInSt345(AliMUONTrack* track) const
-{
-  /// Returns the number of clusters in common on stations 3, 4 and 5
+  /// Returns the number of clusters in common in stations [stMin, stMax]
   /// between the current track ("this") and the track pointed to by "track".
+  
   if (!fTrackParamAtCluster || !this->fTrackParamAtCluster) return 0;
-  Int_t nCluster1 = this->GetNClusters();
-  Int_t nCluster2 = track->GetNClusters();
+  
+  Int_t chMin = 2 * stMin;
+  Int_t chMax = 2 * stMax + 1;
   Int_t clustersInCommon = 0;
-  AliMUONTrackParam *trackParamAtCluster1, *trackParamAtCluster2;
+  
   // Loop over clusters of first track
-  for(Int_t iCluster1 = 0; iCluster1 < nCluster1; iCluster1++) {
-    trackParamAtCluster1 = (AliMUONTrackParam*) this->fTrackParamAtCluster->UncheckedAt(iCluster1);
-    if (trackParamAtCluster1->GetClusterPtr()->GetChamberId() < 4) continue;
+  Int_t nCl1 = this->GetNClusters();
+  for(Int_t iCl1 = 0; iCl1 < nCl1; iCl1++) {
+    AliMUONVCluster* cl1 = ((AliMUONTrackParam*) this->fTrackParamAtCluster->UncheckedAt(iCl1))->GetClusterPtr();
+    
+    Int_t chCl1 = cl1->GetChamberId();
+    if (chCl1 < chMin || chCl1 > chMax) continue;
+    
     // Loop over clusters of second track
-    for(Int_t iCluster2 = 0; iCluster2 < nCluster2; iCluster2++) {
-      trackParamAtCluster2 = (AliMUONTrackParam*) track->fTrackParamAtCluster->UncheckedAt(iCluster2);
-      if (trackParamAtCluster2->GetClusterPtr()->GetChamberId() < 4) continue;
-      // Increment "clustersInCommon" if both trackParamAtCluster1 & 2 point to the same cluster
-      if ((trackParamAtCluster1->GetClusterPtr()) == (trackParamAtCluster2->GetClusterPtr())) {
+    Int_t nCl2 = track->GetNClusters();
+    for(Int_t iCl2 = 0; iCl2 < nCl2; iCl2++) {
+      AliMUONVCluster* cl2 = ((AliMUONTrackParam*) track->fTrackParamAtCluster->UncheckedAt(iCl2))->GetClusterPtr();
+      
+      Int_t chCl2 = cl2->GetChamberId();
+      if (chCl2 < chMin || chCl2 > chMax) continue;
+      
+      // Increment "clustersInCommon" if both clusters have the same ID
+      if (cl1->GetUniqueID() == cl2->GetUniqueID()) {
        clustersInCommon++;
        break;
       }
+      
     }
+    
   }
+  
   return clustersInCommon;
 }
 
index 3b176d0..af4285f 100644 (file)
@@ -86,8 +86,7 @@ class AliMUONTrack : public TObject
   /// set the chi2 of trigger/track matching 
   void     SetChi2MatchTrigger(Double_t chi2MatchTrigger) {fChi2MatchTrigger = chi2MatchTrigger;}
 
-  Int_t ClustersInCommon(AliMUONTrack* track) const;
-  Int_t ClustersInCommonInSt345(AliMUONTrack* track) const;
+  Int_t ClustersInCommon(AliMUONTrack* track, Int_t stMin = 0, Int_t stMax = 4) const;
 
   Int_t    GetNDF() const;
   Double_t GetNormalizedChi2() const;
@@ -139,6 +138,9 @@ class AliMUONTrack : public TObject
   
   /// return the maximum chi2 above which the track can be considered as abnormal (due to extrapolation failure, ...)
   static Double_t MaxChi2() {return fgkMaxChi2;}
+  
+  void   Connected(Bool_t flag = kTRUE) {fConnected = flag;}
+  Bool_t IsConnected() const {return fConnected;}
 
 
  private:
@@ -175,6 +177,7 @@ class AliMUONTrack : public TObject
 
   Int_t fLocalTrigger;    ///< packed local trigger information
   
+  Bool_t fConnected; ///< kTRUE if that track shares cluster(s) with another
   
   // methods
   Bool_t ComputeClusterWeights(TMatrixD& clusterWeightsNB, TMatrixD& clusterWeightsB,
index 2f7bc46..fac2dea 100644 (file)
@@ -177,14 +177,16 @@ void AliMUONVTrackReconstructor::EventReconstruct(AliMUONVClusterStore& clusterS
   if (GetRecoParam()->ImproveTracks()) ImproveTracks();
   
   // Remove connected tracks
-  if (GetRecoParam()->RemoveConnectedTracksInSt12()) RemoveConnectedTracks(kFALSE);
-  else RemoveConnectedTracks(kTRUE);
+  RemoveConnectedTracks(3, 4, kFALSE);
+  RemoveConnectedTracks(2, 2, kFALSE);
+  if (GetRecoParam()->RemoveConnectedTracksInSt12()) RemoveConnectedTracks(0, 1, kFALSE);
   
   // Fill AliMUONTrack data members
   Finalize();
+  if (!GetRecoParam()->RemoveConnectedTracksInSt12()) TagConnectedTracks(0, 1, kTRUE);
   
   // Add tracks to MUON data container 
-  for (Int_t i=0; i<fNRecTracks; ++i) 
+  for (Int_t i=0; i<fNRecTracks; ++i)
   {
     AliMUONTrack * track = (AliMUONTrack*) fRecTracksPtr->At(i);
     if (track->GetGlobalChi2() < AliMUONTrack::MaxChi2()) {
@@ -535,54 +537,80 @@ void AliMUONVTrackReconstructor::RemoveDoubleTracks()
 }
 
   //__________________________________________________________________________
-void AliMUONVTrackReconstructor::RemoveConnectedTracks(Bool_t inSt345)
+void AliMUONVTrackReconstructor::RemoveConnectedTracks(Int_t stMin, Int_t stMax, Bool_t all)
 {
-  /// To remove double tracks:
-  /// Tracks are considered identical if they share 1 cluster or more.
-  /// If inSt345=kTRUE only stations 3, 4 and 5 are considered.
-  /// Among two identical tracks, one keeps the track with the larger number of clusters
-  /// or, if these numbers are equal, the track with the minimum chi2.
-  AliMUONTrack *track1, *track2, *trackToRemove;
-  Int_t clustersInCommon, nClusters1, nClusters2;
-  Bool_t removedTrack1;
+  /// Find and remove tracks sharing 1 cluster or more in station(s) [stMin, stMax].
+  /// For each couple of connected tracks, one removes the one with the smallest
+  /// number of clusters or with the highest chi2 value in case of equality.
+  /// If all=kTRUE: both tracks are removed.
+  
+  // tag the tracks to be removed
+  TagConnectedTracks(stMin, stMax, all);
+  
+  // remove them
+  Int_t nTracks = fRecTracksPtr->GetEntriesFast();
+  for (Int_t i = 0; i < nTracks; i++) {
+    if (((AliMUONTrack*) fRecTracksPtr->UncheckedAt(i))->IsConnected()) {
+      fRecTracksPtr->RemoveAt(i);
+      fNRecTracks--;
+    }
+  }
+  
+  // remove holes in the array if any
+  fRecTracksPtr->Compress();
+}
+
+  //__________________________________________________________________________
+void AliMUONVTrackReconstructor::TagConnectedTracks(Int_t stMin, Int_t stMax, Bool_t all)
+{
+  /// Find and tag tracks sharing 1 cluster or more in station(s) [stMin, stMax].
+  /// For each couple of connected tracks, one tags the one with the smallest
+  /// number of clusters or with the highest chi2 value in case of equality.
+  /// If all=kTRUE: both tracks are tagged.
+  
+  AliMUONTrack *track1, *track2;
+  Int_t nClusters1, nClusters2;
+  Int_t nTracks = fRecTracksPtr->GetEntriesFast();
+  
+  // reset the tags
+  for (Int_t i = 0; i < nTracks; i++) ((AliMUONTrack*) fRecTracksPtr->UncheckedAt(i))->Connected(kFALSE);
+    
   // Loop over first track of the pair
-  track1 = (AliMUONTrack*) fRecTracksPtr->First();
-  while (track1) {
-    removedTrack1 = kFALSE;
-    nClusters1 = track1->GetNClusters();
+  for (Int_t iTrack1 = 0; iTrack1 < nTracks; iTrack1++) {
+    track1 = (AliMUONTrack*) fRecTracksPtr->UncheckedAt(iTrack1);
+    
     // Loop over second track of the pair
-    track2 = (AliMUONTrack*) fRecTracksPtr->After(track1);
-    while (track2) {
-      nClusters2 = track2->GetNClusters();
-      // number of clusters in common between two tracks
-      if (inSt345) clustersInCommon = track1->ClustersInCommonInSt345(track2);
-      else clustersInCommon = track1->ClustersInCommon(track2);
-      // check for identical tracks
-      if (clustersInCommon > 0) {
-        // decide which track to remove
-        if ((nClusters1 > nClusters2) || ((nClusters1 == nClusters2) && (track1->GetGlobalChi2() <= track2->GetGlobalChi2()))) {
-         // remove track2 and continue the second loop with the track next to track2
-         trackToRemove = track2;
-         track2 = (AliMUONTrack*) fRecTracksPtr->After(track2);
-         fRecTracksPtr->Remove(trackToRemove);
-         fRecTracksPtr->Compress(); // this is essential to retrieve the TClonesArray afterwards
-         fNRecTracks--;
-        } else {
-         // else remove track1 and continue the first loop with the track next to track1
-         trackToRemove = track1;
-         track1 = (AliMUONTrack*) fRecTracksPtr->After(track1);
-          fRecTracksPtr->Remove(trackToRemove);
-         fRecTracksPtr->Compress(); // this is essential to retrieve the TClonesArray afterwards
-         fNRecTracks--;
-         removedTrack1 = kTRUE;
-         break;
-        }
-      } else track2 = (AliMUONTrack*) fRecTracksPtr->After(track2);
-    } // track2
-    if (removedTrack1) continue;
-    track1 = (AliMUONTrack*) fRecTracksPtr->After(track1);
-  } // track1
-  return;
+    for (Int_t iTrack2 = iTrack1+1; iTrack2 < nTracks; iTrack2++) {
+      track2 = (AliMUONTrack*) fRecTracksPtr->UncheckedAt(iTrack2);
+      
+      // check for connected tracks and tag them
+      if (track1->ClustersInCommon(track2, stMin, stMax) > 0) {
+        
+       if (all) {
+         
+         // tag both tracks
+         track1->Connected();
+         track2->Connected();
+         
+       } else {
+         
+         // tag only the worst track
+         nClusters1 = track1->GetNClusters();
+         nClusters2 = track2->GetNClusters();
+         if ((nClusters1 > nClusters2) || ((nClusters1 == nClusters2) && (track1->GetGlobalChi2() <= track2->GetGlobalChi2()))) {
+           track2->Connected();
+         } else {
+           track1->Connected();
+         }
+         
+       }
+       
+      }
+      
+    }
+    
+  }
+  
 }
 
   //__________________________________________________________________________
@@ -1198,7 +1226,7 @@ void AliMUONVTrackReconstructor::ImproveTracks()
 //__________________________________________________________________________
 void AliMUONVTrackReconstructor::Finalize()
 {
-  /// Recompute track parameters and covariances at each attached cluster from those at the first one
+  /// Recompute track parameters and covariances at each attached cluster
   /// Set the label pointing to the corresponding MC track
   /// Remove the track if finalization failed
   
index 8e0b127..2a1da70 100644 (file)
@@ -92,7 +92,8 @@ class AliMUONVTrackReconstructor : public TObject {
   void RemoveUsedSegments(TClonesArray& segments);
   void RemoveIdenticalTracks();
   void RemoveDoubleTracks();
-  void RemoveConnectedTracks(Bool_t inSt345 = kFALSE);
+  void RemoveConnectedTracks(Int_t stMin, Int_t stMax, Bool_t all);
+  void TagConnectedTracks(Int_t stMin, Int_t stMax, Bool_t all);
 
   void AskForNewClustersInStation(const AliMUONTrackParam &trackParam,
                                  AliMUONVClusterStore& clusterStore, Int_t station);
index 20d1571..339f08f 100644 (file)
@@ -176,6 +176,7 @@ void AliAnalysisTaskESDMuonFilter::ConvertESDtoAOD()
     aodTrack->SetHitsPatternInTrigCh(esdMuTrack->GetHitsPatternInTrigCh());
     aodTrack->SetMuonClusterMap(esdMuTrack->GetMuonClusterMap());
     aodTrack->SetMatchTrigger(esdMuTrack->GetMatchTrigger());
+    aodTrack->Connected(esdMuTrack->IsConnected());
     
     primary->AddDaughter(aodTrack);
     
index 3f70891..f9e69f4 100644 (file)
@@ -252,6 +252,9 @@ class AliAODTrack : public AliVTrack {
   Int_t    HitsMT(Int_t istation, Int_t iplane, Option_t *cathode=0);  // Check if track hits Muon chambers
   Int_t    HitsMuonChamber(Int_t MuonChamber);  // Check if track hits Muon chambers
   Bool_t   IsMuonTrack() const { return (GetMUONClusterMap()>0) ? kTRUE : kFALSE; }
+  
+  void     Connected(Bool_t flag) {flag ? SETBIT(fITSMuonClusterMap,26) : CLRBIT(fITSMuonClusterMap,26);}
+  Bool_t   IsConnected() const {return TESTBIT(fITSMuonClusterMap,26);}
 
   void     SetProdVertex(TObject *vertex) { fProdVertex = vertex; }
   void     SetType(AODTrk_t ttype) { fType=ttype; }
index 0dfe3b4..f86a451 100644 (file)
@@ -134,6 +134,10 @@ public:
   void     AddInMuonClusterMap(Int_t chamber) {fMuonClusterMap |= BIT(chamber);}
   Bool_t   IsInMuonClusterMap(Int_t chamber) const {return (Bool_t) ((fMuonClusterMap & BIT(chamber)) != 0);}
   
+  // Identify the tracks sharing cluster(s) with another (use the last bit of fMuonClusterMap)
+  void     Connected(Bool_t flag = kTRUE) {flag ? SETBIT(fMuonClusterMap,31) : CLRBIT(fMuonClusterMap,31);}
+  Bool_t   IsConnected() const {return TESTBIT(fMuonClusterMap,31);}
+  
   // Methods to get, fill and check the array of associated clusters
   Int_t         GetNClusters() const;
   TClonesArray& GetClusters() const;