Main changes:
authorhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 2 Apr 2009 09:28:03 +0000 (09:28 +0000)
committerhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 2 Apr 2009 09:28:03 +0000 (09:28 +0000)
 - Add trigger chamber hit pattern to trigger tracks.
 - Initialize some kinematic information for ghosts.
 - Add methods to decode hit pattern information in AliESDMuonTrack.
 - Propagate changes to AliAnalysisTaskTrigChEff and add some functionalities to handle ghosts

Diego

MUON/AliMUONESDInterface.cxx
MUON/AliMUONESDInterface.h
MUON/AliMUONTrackHitPattern.cxx
MUON/AliMUONTrackHitPattern.h
MUON/AliMUONTracker.cxx
MUON/AliMUONTriggerTrack.cxx
MUON/AliMUONTriggerTrack.h
STEER/AliESDMuonTrack.cxx
STEER/AliESDMuonTrack.h

index 8f03df6..3a674b0 100644 (file)
@@ -23,6 +23,7 @@
 #include "AliMUONVDigit.h"
 #include "AliMUONVDigitStore.h"
 #include "AliMUONLocalTrigger.h"
+#include "AliMUONTriggerTrack.h"
 #include "AliMUONVTriggerStore.h"
 #include "AliMUON2DMapIterator.h"
 #include "AliMUONTrackParam.h"
@@ -817,7 +818,7 @@ void AliMUONESDInterface::MUONToESD(const AliMUONTrack& track, AliESDMuonTrack&
   
   // empty MUON track -> produce a ghost ESDMuon track if trigger info are available otherwise produce an empty track
   if (track.GetNClusters() == 0) {
-    if (locTrg) MUONToESD(*locTrg, esdTrack, track.GetUniqueID(), track.GetHitsPatternInTrigCh());
+    if (locTrg) MUONToESD(*locTrg, esdTrack, track.GetUniqueID());
     else {
       cout<<"W-AliMUONESDInterface::MUONToESD: will produce an empty ESDMuon track"<<endl;
       esdTrack.Reset();
@@ -886,7 +887,8 @@ void AliMUONESDInterface::MUONToESD(const AliMUONTrack& track, AliESDMuonTrack&
 }
 
 //_____________________________________________________________________________
-void AliMUONESDInterface::MUONToESD(const AliMUONLocalTrigger& locTrg, AliESDMuonTrack& esdTrack, UInt_t trackId, UShort_t hitPattern)
+void AliMUONESDInterface::MUONToESD(const AliMUONLocalTrigger& locTrg, AliESDMuonTrack& esdTrack,
+                                   UInt_t trackId, const AliMUONTriggerTrack* triggerTrack)
 {
   /// Build ghost ESDMuon track containing only informations about trigger track
   
@@ -903,7 +905,6 @@ void AliMUONESDInterface::MUONToESD(const AliMUONLocalTrigger& locTrg, AliESDMuo
                            locTrg.LoHpt());
   esdTrack.SetLocalTrigger(muonTrack.GetLocalTrigger());
   esdTrack.SetChi2MatchTrigger(0.);
-  esdTrack.SetHitsPatternInTrigCh(hitPattern);
   esdTrack.SetTriggerX1Pattern(locTrg.GetX1Pattern());
   esdTrack.SetTriggerY1Pattern(locTrg.GetY1Pattern());
   esdTrack.SetTriggerX2Pattern(locTrg.GetX2Pattern());
@@ -912,7 +913,15 @@ void AliMUONESDInterface::MUONToESD(const AliMUONLocalTrigger& locTrg, AliESDMuo
   esdTrack.SetTriggerY3Pattern(locTrg.GetY3Pattern());
   esdTrack.SetTriggerX4Pattern(locTrg.GetX4Pattern());
   esdTrack.SetTriggerY4Pattern(locTrg.GetY4Pattern());
-  
+  UShort_t hitPattern = 0;
+  if(triggerTrack){
+    hitPattern = triggerTrack->GetHitsPatternInTrigCh();
+    esdTrack.SetHitsPatternInTrigCh(hitPattern);
+    esdTrack.SetThetaXUncorrected(triggerTrack->GetThetax());
+    esdTrack.SetThetaYUncorrected(triggerTrack->GetThetay());
+    esdTrack.SetNonBendingCoorUncorrected(triggerTrack->GetX11());
+    esdTrack.SetBendingCoorUncorrected(triggerTrack->GetY11());
+  }
 }
 
 //_____________________________________________________________________________
index 4ced1d6..180b0b7 100644 (file)
@@ -24,6 +24,7 @@ class AliMUONVClusterStore;
 class AliMUONVDigit;
 class AliMUONVDigitStore;
 class AliMUONLocalTrigger;
+class AliMUONTriggerTrack;
 class AliMUONVTriggerStore;
 class AliMUONTrackParam;
 class AliMUONVTrackReconstructor;
@@ -121,7 +122,8 @@ public: // static methods
   // MUON objects --> ESDMuon objects conversion
   static void MUONToESD(const AliMUONTrack& track, AliESDMuonTrack& esdTrack, const Double_t vertex[3],
                        const AliMUONVDigitStore* digits = 0x0, const AliMUONLocalTrigger* locTrg = 0x0);
-  static void MUONToESD(const AliMUONLocalTrigger& locTrg, AliESDMuonTrack& esdTrack, UInt_t trackId, UShort_t hitPattern);
+  static void MUONToESD(const AliMUONLocalTrigger& locTrg, AliESDMuonTrack& esdTrack, UInt_t trackId,
+                       const AliMUONTriggerTrack* triggerTrack = 0x0);
   static void MUONToESD(const AliMUONVCluster& cluster, AliESDMuonCluster& esdCluster, const AliMUONVDigitStore* digits = 0x0);
   static void MUONToESD(const AliMUONVDigit& digit, AliESDMuonPad& esdPad);
   
index 3484bd7..d886eb7 100644 (file)
 /// searching for matching trigger tracks and fired strips.
 ///
 /// To each track, a hit pattern for trigger chambers is set.
-/// The hit pattern is a UShort_t with 8 bits used:
-///                                                                      <pre>
-///            1  1  0  1    1  1  0  1
-///           |           |            |
-///            ----------- ------------
-/// chamber:  11 12 13 14 | 11 12 13 14
-/// cathode:    bending   | non-bending
-///                                                                      </pre>
+/// 
 /// The main method is:
 /// * ExecuteValidation
 ///
@@ -65,6 +58,7 @@
 
 #include "AliLog.h"
 #include "AliTracker.h"
+#include "AliESDMuonTrack.h"
 
 #include <Riostream.h>
 #include <TArrayS.h>
@@ -158,7 +152,18 @@ void AliMUONTrackHitPattern::ExecuteValidation(const AliMUONVTrackStore& trackSt
   AliMUONDigitStoreV1 digitStore;
   fkDigitMaker.TriggerToDigitsStore(triggerStore,digitStore);
 
+  // Get the hit pattern for all trigger tracks
+  AliMUONTriggerTrack* triggerTrack;
+  TIter itTriggerTrack(triggerTrackStore.CreateIterator());
+  while ( ( triggerTrack = static_cast<AliMUONTriggerTrack*>(itTriggerTrack() ) ) ){
+    UShort_t pattern = GetHitPattern(triggerTrack, digitStore);
+    triggerTrack->SetHitsPatternInTrigCh(pattern);
+    AliDebug(1, Form("Hit pattern: hits 0x%x  slat %2i  board %3i  effFlag %i",
+                    pattern & 0xFF, AliESDMuonTrack::GetSlatOrInfo(pattern),
+                    triggerTrack->GetLoTrgNum(), AliESDMuonTrack::GetEffFlag(pattern)));
+  }
 
+  // Match tracker tracks with trigger tracks.
   TIter itTrack(trackStore.CreateIterator());
   AliMUONTrack* track;
 
@@ -173,7 +178,13 @@ void AliMUONTrackHitPattern::ExecuteValidation(const AliMUONVTrackStore& trackSt
 
     AliMUONTriggerTrack *matchedTriggerTrack = MatchTriggerTrack(track, trackParam, triggerTrackStore, triggerStore);
 
-    UShort_t pattern = GetHitPattern(matchedTriggerTrack, digitStore, &trackParam);
+    // Copy trigger tracks hit pattern if there is matching,
+    // otherwise calculate the hit pattern directly from tracker track:
+    // the obtained pattern is good for check, but not good for efficiency determination.
+    UShort_t pattern = matchedTriggerTrack ?
+      matchedTriggerTrack->GetHitsPatternInTrigCh() : 
+      GetHitPattern(&trackParam, digitStore);
+
     track->SetHitsPatternInTrigCh(pattern);
   }
 }
@@ -321,31 +332,27 @@ AliMUONTrackHitPattern::MatchTriggerTrack(AliMUONTrack* track,
 
 //______________________________________________________________________________
 UShort_t AliMUONTrackHitPattern::GetHitPattern(AliMUONTriggerTrack* matchedTriggerTrack,
-                                              AliMUONVDigitStore& digitStore,
-                                              AliMUONTrackParam* trackParam) const
+                                              AliMUONVDigitStore& digitStore) const
 {
   //
-  /// Get hit pattern on trigger chambers for the current track
+  /// Get hit pattern on trigger chambers for the current trigger track
   //
   UShort_t pattern = 0;
-  Bool_t isMatch[2];
-  const Int_t kNTrackingCh = AliMUONConstants::NTrackingCh();
-
-  Bool_t patternFromTrigTrack = kFALSE;
-
-
-  // Calculate hit pattern from trigger track
-  if(matchedTriggerTrack){
-    patternFromTrigTrack = PerformTrigTrackMatch(pattern, matchedTriggerTrack, digitStore);
-  }
-
-  if(patternFromTrigTrack) return pattern;
-
+  PerformTrigTrackMatch(pattern, matchedTriggerTrack, digitStore);
+  return pattern;
+}
 
-  // Calculate hit pattern from tracker track propagation
-  // if hit pattern from trigger track failed and track parameters are provided
 
-  if(!trackParam) return 0;
+//______________________________________________________________________________
+UShort_t AliMUONTrackHitPattern::GetHitPattern(AliMUONTrackParam* trackParam,
+                                              AliMUONVDigitStore& digitStore) const
+{
+  //
+  /// Get hit pattern on trigger chambers for the current tracker track
+  //
+  UShort_t pattern = 0;
+  Bool_t isMatch[2];
+  const Int_t kNTrackingCh = AliMUONConstants::NTrackingCh();
 
   for(Int_t ch=0; ch<4; ++ch)
   {
@@ -354,36 +361,17 @@ UShort_t AliMUONTrackHitPattern::GetHitPattern(AliMUONTriggerTrack* matchedTrigg
     FindPadMatchingTrack(digitStore, *trackParam, isMatch, iChamber);
     for(Int_t cath=0; cath<2; ++cath)
     {
-      if(isMatch[cath]) SetBit(pattern, cath, ch);
+      if(isMatch[cath]) AliESDMuonTrack::SetFiredChamber(pattern, cath, ch);
     }
   }
-  return pattern;
-}
-
-
-//______________________________________________________________________________
-void AliMUONTrackHitPattern::SetBit(UShort_t& pattern, Int_t cathode, Int_t chamber) const
-{
-  //
-  /// Set hits pattern
-  //
-  const Int_t kMask[2][4]= {{0x80, 0x40, 0x20, 0x10},
-                           {0x08, 0x04, 0x02, 0x01}};
-  pattern |= kMask[cathode][chamber];
-}
 
+  // pattern obtained by propagation of tracker track
+  // when it does not match the trigger.
+  AliESDMuonTrack::AddEffInfo(pattern, AliESDMuonTrack::kTrackerTrackPattern);
 
-//______________________________________________________________________________
-void AliMUONTrackHitPattern::AddEffInfo(UShort_t& pattern, Int_t slat, Int_t effType) const
-{
-  //
-  /// Set info on efficiency calculation
-  //
-  pattern += effType << 8;
-  pattern += slat << 10;
+  return pattern;
 }
 
-
 //______________________________________________________________________________
 void 
 AliMUONTrackHitPattern::ApplyMCSCorrections(AliMUONTrackParam& trackParam) const
@@ -568,18 +556,21 @@ Int_t AliMUONTrackHitPattern::FindPadMatchingTrig(const AliMUONVDigitStore& digi
        }
     }
 
-    for(Int_t cath=0; cath<fgkNcathodes; cath++){
-       if(padsInCheckArea[cath]>2) {
-         AliDebug(1, Form("padsInCheckArea[%i] = %i\n",cath,padsInCheckArea[cath]));
-           return -500;
-       }
-    }
-
     if(isMatch[kBending] || isMatch[kNonBending]){
        detElemId = foundDetElemId;
        zRealMatch[ch] = foundZmatch;
        coor[1] = yCoorAtPadZ;
     }
+
+    // If track matches many pads, it is not good for effciency determination.
+    // However we still want to calculate the hit pattern.
+    for(Int_t cath=0; cath<fgkNcathodes; cath++){
+      if(padsInCheckArea[cath]>2) {
+       AliDebug(1, Form("padsInCheckArea[%i] = %i\n",cath,padsInCheckArea[cath]));
+       return -500;
+      }
+    }
+
     return trigDigitBendPlane;
 }
 
@@ -788,22 +779,28 @@ Bool_t AliMUONTrackHitPattern::PerformTrigTrackMatch(UShort_t &pattern,
     Int_t detElemIdFromTrack = DetElemIdFromPos(trackIntersectCh[currCh][0], trackIntersectCh[currCh][1], 11+currCh, 0);
     if(detElemIdFromTrack<0) {
       AliDebug(1, "Warning: trigger track outside trigger chamber\n");
+      isClearEvent = kFALSE;
+
+      // track is rejected since the extrapolated track
+      // does not match a slat (border effects)
+      AliESDMuonTrack::AddEffInfo(pattern, AliESDMuonTrack::kTrackOutsideGeometry);
       continue;
     }
                
     triggeredDigits[currCh] = FindPadMatchingTrig(digitStore, detElemIdFromTrack, trackIntersectCh[currCh], isMatch, nboard, zRealMatch, y11);
 
     // if FindPadMatchingTrig = -500 => too many digits matching pad =>
-    //                               => Event not clear => Reject track
+    //                               => Event not clear => Do not use for efficiency calculation
     if(triggeredDigits[currCh]<-100){
       isClearEvent = kFALSE;
+      // track is rejected since it matches many pads
+      AliESDMuonTrack::AddEffInfo(pattern, AliESDMuonTrack::kTrackMatchesManyPads);
       AliDebug(1, Form("Warning: track = %p (%i) matches many pads. Rejected!\n",(void *)matchedTrigTrack, detElemIdFromTrack));
-      break;
     }
 
     for(Int_t cath=0; cath<fgkNcathodes; cath++){
       if(!isMatch[cath]) continue;
-      SetBit(pattern, cath, currCh);
+      AliESDMuonTrack::SetFiredChamber(pattern, cath, currCh);
       digitPerTrack[cath]++;
       trigScheme[cath][currCh]++;
       slatThatTriggered[cath][currCh] = detElemIdFromTrack;
@@ -814,13 +811,18 @@ Bool_t AliMUONTrackHitPattern::PerformTrigTrackMatch(UShort_t &pattern,
   } // end chamber loop
 
   for(Int_t cath=0; cath<fgkNcathodes; cath++){
-    if(digitPerTrack[cath]<3) isClearEvent = kFALSE;
-    if(!isClearEvent) AliDebug(1, Form("Warning: found %i digits for trigger track cathode %i.\nRejecting event\n", digitPerTrack[cath],cath));
+    if(digitPerTrack[cath]<3) {
+      isClearEvent = kFALSE;
+      // track is rejected since the number of associated
+      // digits found is less than 3.
+      AliESDMuonTrack::AddEffInfo(pattern, AliESDMuonTrack::kTrackMatchesFewPads);
+      AliDebug(1, Form("Warning: found %i digits for trigger track cathode %i.\nRejecting event\n", digitPerTrack[cath],cath));
+    }
   }
 
   if(!isClearEvent) return kFALSE;
 
-  Int_t goodForEff = kBoardEff;
+  AliESDMuonTrack::EAliTriggerChPatternFlag goodForEff = AliESDMuonTrack::kBoardEff;
 
   Int_t ineffSlat = -1;
   Int_t ineffDetElId = -1;
@@ -838,7 +840,9 @@ Bool_t AliMUONTrackHitPattern::PerformTrigTrackMatch(UShort_t &pattern,
       isCurrChIneff = kTRUE;
     }
     if(currSlat!=firstSlat) {
-      AddEffInfo(pattern, 20, kChEff);
+      AliESDMuonTrack::AddEffInfo(pattern,
+                                 AliESDMuonTrack::kCrossDifferentSlats,
+                                 AliESDMuonTrack::kChEff); // track crosses different slats
       return kTRUE;
     }
     Bool_t atLeastOneLoc=kFALSE;
@@ -851,9 +855,9 @@ Bool_t AliMUONTrackHitPattern::PerformTrigTrackMatch(UShort_t &pattern,
        break;
       }
     }
-    if(!atLeastOneLoc) goodForEff = kSlatEff;
+    if(!atLeastOneLoc) goodForEff = AliESDMuonTrack::kSlatEff;
   } // end chamber loop
   
-  AddEffInfo(pattern, firstSlat, goodForEff);
+  AliESDMuonTrack::AddEffInfo(pattern, firstSlat, goodForEff);
   return kTRUE;
 }
index ebd5bff..f6b6102 100644 (file)
@@ -44,21 +44,18 @@ public:
                                         AliMUONTrackParam& trackParam,
                                         const AliMUONVTriggerTrackStore& triggerTrackStore,
                                         const AliMUONVTriggerStore& triggerStore) const;
-    
+
   UShort_t GetHitPattern(AliMUONTriggerTrack* matchedTriggerTrack,
-                        AliMUONVDigitStore& digitStore,
-                        AliMUONTrackParam* trackParam=0x0) const;
+                        AliMUONVDigitStore& digitStore) const;
+  
+  UShort_t GetHitPattern(AliMUONTrackParam* trackParam,
+                        AliMUONVDigitStore& digitStore) const;
 
 protected:
   void ApplyMCSCorrections(AliMUONTrackParam& trackParam) const;
   
   void InitMembers();
   
-  void SetBit(UShort_t& pattern, Int_t cathode, Int_t chamber) const;
-  
-  void AddEffInfo(UShort_t& pattern, Int_t slat, Int_t effType) const;
-  
-
   // Methods for hit pattern from tracker track
   void FindPadMatchingTrack(const AliMUONVDigitStore& digitStore,
                            const AliMUONTrackParam& trackParam,
@@ -109,13 +106,6 @@ private:
   static const Int_t fgkNchambers=4; //!<Number of chambers
   static const Int_t fgkNplanes=8;   //!<Number of planes
   static const Int_t fgkNlocations=4; //!<Number of locations
-
-  enum {
-    kNoEff,
-    kChEff,
-    kSlatEff,
-    kBoardEff
-  };
   
   ClassDef(AliMUONTrackHitPattern, 0) // MUON track hit pattern
 };
index b2f635c..1acb43f 100644 (file)
@@ -53,7 +53,6 @@
 #include "AliMUONLocalTrigger.h"
 #include "AliMUONVClusterServer.h"
 #include "AliMUONVDigitStore.h"
-#include "AliMUONDigitStoreV1.h"
 #include "AliMUONVTriggerStore.h"
 #include "AliMUONDigitMaker.h"
 #include <Riostream.h>
@@ -304,11 +303,6 @@ void AliMUONTracker::FillESD(const AliMUONVTrackStore& trackStore, AliESDEvent*
   UInt_t ghostId = 0xFFFFFFFF - 1;
   Bool_t matched = kFALSE;
   AliMUONTriggerTrack *triggerTrack;
-
-  // Needed to calculate the hit pattern for ghosts
-  AliMUONDigitStoreV1 digitStore;
-  fkDigitMaker->TriggerToDigitsStore(*fTriggerStore,digitStore);
-
   TIter itTriggerTrack(fTriggerTrackStore->CreateIterator());
   while ( ( triggerTrack = static_cast<AliMUONTriggerTrack*>(itTriggerTrack()) ) ) {
     
@@ -321,10 +315,8 @@ void AliMUONTracker::FillESD(const AliMUONVTrackStore& trackStore, AliESDEvent*
       if (matched) break;
     }
     if (matched) continue;
-    
-    UShort_t pattern = fTrackHitPatternMaker->GetHitPattern(triggerTrack, digitStore);
 
-    AliMUONESDInterface::MUONToESD(*locTrg, esdTrack, ghostId, pattern);
+    AliMUONESDInterface::MUONToESD(*locTrg, esdTrack, ghostId, triggerTrack);
     
     esd->AddMuonTrack(&esdTrack);
     ghostId -= 1;
index da7b85b..1efc889 100644 (file)
@@ -41,25 +41,27 @@ AliMUONTriggerTrack::AliMUONTriggerTrack()
     fthetax(0),
     fthetay(0),
     floTrgNum(0),
-    fGTPattern(0)
+    fGTPattern(0),
+    fHitsPatternInTrigCh(0)
 
 {
   /// default ctr
       AliDebug(1,Form("this=%p",this));
 }
 //__________________________________________________________________________
-AliMUONTriggerTrack::AliMUONTriggerTrack(Float_t x11, Float_t y11, Float_t thetax, Float_t thetay, Int_t loTrgNum, Long_t theGTPattern)
+AliMUONTriggerTrack::AliMUONTriggerTrack(Float_t x11, Float_t y11, Float_t thetax, Float_t thetay, Int_t loTrgNum, Long_t theGTPattern, UShort_t hitsPatternInTrigCh)
     : TObject(),
       fx11(x11),
       fy11(y11),
       fthetax(thetax),
       fthetay(thetay),
       floTrgNum(loTrgNum),
-      fGTPattern(theGTPattern)
+      fGTPattern(theGTPattern),
+      fHitsPatternInTrigCh(fHitsPatternInTrigCh)
 {
 /// ctor from local trigger output
-        AliDebug(1,Form("this=%p x11=%f y11=%f thetax=%f thetay=%f loTrgNum=%d GTPattern=%ld",
-                        this,x11,y11,thetax,thetay,loTrgNum,theGTPattern));
+        AliDebug(1,Form("this=%p x11=%f y11=%f thetax=%f thetay=%f loTrgNum=%d GTPattern=%ld HitsPatternInTrigCh %i",
+                        this,x11,y11,thetax,thetay,loTrgNum,theGTPattern,fHitsPatternInTrigCh));
 
 }
 
@@ -78,7 +80,8 @@ AliMUONTriggerTrack::AliMUONTriggerTrack (const AliMUONTriggerTrack& theMUONTrig
       fthetax(theMUONTriggerTrack.fthetax),
       fthetay(theMUONTriggerTrack.fthetay),
       floTrgNum(theMUONTriggerTrack.floTrgNum),
-      fGTPattern(theMUONTriggerTrack.fGTPattern)    
+      fGTPattern(theMUONTriggerTrack.fGTPattern),
+      fHitsPatternInTrigCh(theMUONTriggerTrack.fHitsPatternInTrigCh)  
 {
 ///
 /// copy ctor
@@ -106,6 +109,7 @@ theMUONTriggerTrack)
     fthetay = theMUONTriggerTrack.fthetay;
     floTrgNum = theMUONTriggerTrack.floTrgNum;
     fGTPattern = theMUONTriggerTrack.fGTPattern;
+    fHitsPatternInTrigCh = theMUONTriggerTrack.fHitsPatternInTrigCh;
 
     return *this;
 }
@@ -116,6 +120,6 @@ AliMUONTriggerTrack::Print(Option_t*) const
 {
 /// Printing
 
-  cout << Form("(X,Y)11=(%7.2f,%7.2f) Theta(X,Y)=(%7.2f,%7.2f) LocalBoard #%3d GlobalTriggerPattern %x",
-               fx11,fy11,fthetax,fthetay,floTrgNum,fGTPattern) << endl;
+  cout << Form("(X,Y)11=(%7.2f,%7.2f) Theta(X,Y)=(%7.2f,%7.2f) LocalBoard #%3d GlobalTriggerPattern %x HitsPatternInTrigCh %x",
+               fx11,fy11,fthetax,fthetay,floTrgNum,fGTPattern,fHitsPatternInTrigCh) << endl;
 }
index 38bd037..4623532 100644 (file)
@@ -22,7 +22,8 @@ class AliMUONTriggerTrack : public TObject
     virtual ~AliMUONTriggerTrack(); // Destructor
     AliMUONTriggerTrack (const AliMUONTriggerTrack& AliMUONTriggerTrack); // copy constructor
     AliMUONTriggerTrack& operator=(const AliMUONTriggerTrack& AliMUONTriggerTrack); // assignment operator
-    AliMUONTriggerTrack(Float_t x11, Float_t y11, Float_t thetax, Float_t thetay, Int_t iloTrg, Long_t theGTPattern); 
+    AliMUONTriggerTrack(Float_t x11, Float_t y11, Float_t thetax, Float_t thetay,
+                       Int_t iloTrg, Long_t theGTPattern, UShort_t hitsPatternInTrigCh=0); 
     
     // getters
     
@@ -53,7 +54,12 @@ class AliMUONTriggerTrack : public TObject
     /// Set Global trigger pattern  (do not work with static statement) 
     void SetGTPattern(UChar_t pat) {fGTPattern = pat;}    
     /// Return Global trigger pattern  (do not work with static statement) 
-    UChar_t GetGTPattern() const {return fGTPattern;}    
+    UChar_t GetGTPattern() const {return fGTPattern;}
+
+    /// set word telling which trigger chambers where hit by track
+    UShort_t GetHitsPatternInTrigCh() const {return fHitsPatternInTrigCh;}
+    /// set word telling which trigger chambers where hit by track
+    void     SetHitsPatternInTrigCh(UShort_t hitsPatternInTrigCh) {fHitsPatternInTrigCh = hitsPatternInTrigCh;}
     
     virtual void Print(Option_t* opt="") const;
     
@@ -64,9 +70,10 @@ protected:
   Float_t fthetax; ///< track theta angle in X   
   Float_t fthetay; ///< track theta angle in Y
   Int_t   floTrgNum; ///< local trigger number
-  UChar_t fGTPattern; ///< Global trigger pattern  (do not work with static statement) 
+  UChar_t fGTPattern; ///< Global trigger pattern  (do not work with static statement)
+  UShort_t fHitsPatternInTrigCh; ///< Word containing info on the hits left in trigger chambers
 
-  ClassDef(AliMUONTriggerTrack, 4) // Reconstructed trigger track in ALICE dimuon spectrometer
+  ClassDef(AliMUONTriggerTrack, 5) // Reconstructed trigger track in ALICE dimuon spectrometer
     };
        
 #endif
index 6947905..3d54f63 100644 (file)
 
 ///////////////////////////////////////////////////////////////////////////////
 //
-//  Class to describe the MUON tracks
-//  in the Event Summary Data class
-//  This is where the results of reconstruction
-//  are stored for the muons
-//  Author: G.Martinez
+/// \class AliESDMuonTrack
+///  Class to describe the MUON tracks in the Event Summary Data class
+///  This is where the results of reconstruction are stored for the muons
+///
+/// \author G.Martinez
 //
 ///////////////////////////////////////////////////////////////////////////////
 
@@ -72,7 +72,7 @@ AliESDMuonTrack::AliESDMuonTrack ():
   fLabel(-1)
 {
   //
-  // Default constructor
+  /// Default constructor
   //
   for (Int_t i = 0; i < 15; i++) fCovariances[i] = 0;
 }
@@ -116,8 +116,8 @@ AliESDMuonTrack::AliESDMuonTrack (const AliESDMuonTrack& muonTrack):
   fLabel(muonTrack.fLabel)
 {
   //
-  // Copy constructor
-  // Deep copy implemented
+  /// Copy constructor
+  /// Deep copy implemented
   //
   for (Int_t i = 0; i < 15; i++) fCovariances[i] = muonTrack.fCovariances[i];
   
@@ -136,7 +136,7 @@ AliESDMuonTrack::AliESDMuonTrack (const AliESDMuonTrack& muonTrack):
 AliESDMuonTrack& AliESDMuonTrack::operator=(const AliESDMuonTrack& muonTrack)
 {
   // 
-  // Equal operator for a deep copy
+  /// Equal operator for a deep copy
   //
   if (this == &muonTrack)
     return *this;
@@ -201,9 +201,9 @@ AliESDMuonTrack& AliESDMuonTrack::operator=(const AliESDMuonTrack& muonTrack)
 
 void AliESDMuonTrack::Copy(TObject &obj) const {
   
-  // this overwrites the virtual TOBject::Copy()
-  // to allow run time copying without casting
-  // in AliESDEvent
+  /// This overwrites the virtual TOBject::Copy()
+  /// to allow run time copying without casting
+  /// in AliESDEvent
 
   if(this==&obj)return;
   AliESDMuonTrack *robj = dynamic_cast<AliESDMuonTrack*>(&obj);
@@ -271,7 +271,7 @@ void AliESDMuonTrack::Reset()
 //_____________________________________________________________________________
 void AliESDMuonTrack::GetCovariances(TMatrixD& cov) const
 {
-  // return covariance matrix of uncorrected parameters
+  /// return covariance matrix of uncorrected parameters
   cov.ResizeTo(5,5);
   for (Int_t i = 0; i < 5; i++)
     for (Int_t j = 0; j <= i; j++)
@@ -281,7 +281,7 @@ void AliESDMuonTrack::GetCovariances(TMatrixD& cov) const
 //_____________________________________________________________________________
 void AliESDMuonTrack::SetCovariances(const TMatrixD& cov)
 {
-  // set reduced covariance matrix of uncorrected parameters
+  /// set reduced covariance matrix of uncorrected parameters
   for (Int_t i = 0; i < 5; i++)
     for (Int_t j = 0; j <= i; j++)
       fCovariances[i*(i+1)/2 + j] = cov(i,j);
@@ -291,16 +291,16 @@ void AliESDMuonTrack::SetCovariances(const TMatrixD& cov)
 //_____________________________________________________________________________
 void AliESDMuonTrack::GetCovarianceXYZPxPyPz(Double_t cov[21]) const
 {
-  // return reduced covariance matrix of uncorrected parameters in (X,Y,Z,Px,Py,Pz) coordinate system
-  // 
-  // Cov(x,x) ... :   cov[0]
-  // Cov(y,x) ... :   cov[1]  cov[2]
-  // Cov(z,x) ... :   cov[3]  cov[4]  cov[5]
-  // Cov(px,x)... :   cov[6]  cov[7]  cov[8]  cov[9]
-  // Cov(py,x)... :   cov[10] cov[11] cov[12] cov[13] cov[14]
-  // Cov(pz,x)... :   cov[15] cov[16] cov[17] cov[18] cov[19] cov[20]
-  //
-  // Get ESD covariance matrix into a TMatrixD
+  /// return reduced covariance matrix of uncorrected parameters in (X,Y,Z,Px,Py,Pz) coordinate system
+  /// 
+  /// - Cov(x,x) ... :   cov[0]
+  /// - Cov(y,x) ... :   cov[1]  cov[2]
+  /// - Cov(z,x) ... :   cov[3]  cov[4]  cov[5]
+  /// - Cov(px,x)... :   cov[6]  cov[7]  cov[8]  cov[9]
+  /// - Cov(py,x)... :   cov[10] cov[11] cov[12] cov[13] cov[14]
+  /// - Cov(pz,x)... :   cov[15] cov[16] cov[17] cov[18] cov[19] cov[20]
+  ///
+  /// Get ESD covariance matrix into a TMatrixD
   TMatrixD covESD(5,5);
   GetCovariances(covESD);
 
@@ -340,7 +340,7 @@ void AliESDMuonTrack::GetCovarianceXYZPxPyPz(Double_t cov[21]) const
 //_____________________________________________________________________________
 Double_t AliESDMuonTrack::Px() const
 {
-  // return p_x from track parameters
+  /// return p_x from track parameters
   Double_t nonBendingSlope = TMath::Tan(fThetaX);
   Double_t bendingSlope    = TMath::Tan(fThetaY);
   Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
@@ -351,7 +351,7 @@ Double_t AliESDMuonTrack::Px() const
 //_____________________________________________________________________________
 Double_t AliESDMuonTrack::Py() const
 {
-  // return p_y from track parameters
+  /// return p_y from track parameters
   Double_t bendingSlope = TMath::Tan(fThetaY);
   Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
   Double_t pZ  = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope);  // spectro. (z<0)
@@ -361,7 +361,7 @@ Double_t AliESDMuonTrack::Py() const
 //_____________________________________________________________________________
 Double_t AliESDMuonTrack::Pz() const
 {
-  // return p_z from track parameters
+  /// return p_z from track parameters
   Double_t bendingSlope = TMath::Tan(fThetaY);
   Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
   return -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope);  // spectro. (z<0)
@@ -370,7 +370,7 @@ Double_t AliESDMuonTrack::Pz() const
 //_____________________________________________________________________________
 Double_t AliESDMuonTrack::P() const
 {
-  // return p from track parameters
+  /// return p from track parameters
   Double_t nonBendingSlope = TMath::Tan(fThetaX);
   Double_t bendingSlope    = TMath::Tan(fThetaY);
   Double_t pYZ = (fInverseBendingMomentum != 0.) ? TMath::Abs(1. / fInverseBendingMomentum) : - FLT_MAX;
@@ -381,7 +381,7 @@ Double_t AliESDMuonTrack::P() const
 //_____________________________________________________________________________
 void AliESDMuonTrack::LorentzP(TLorentzVector& vP) const
 {
-  // return Lorentz momentum vector from track parameters
+  /// return Lorentz momentum vector from track parameters
   Double_t muonMass = M();
   Double_t nonBendingSlope = TMath::Tan(fThetaX);
   Double_t bendingSlope    = TMath::Tan(fThetaY);
@@ -396,7 +396,7 @@ void AliESDMuonTrack::LorentzP(TLorentzVector& vP) const
 //_____________________________________________________________________________
 Double_t AliESDMuonTrack::PxAtDCA() const
 {
-  // return p_x from track parameters
+  /// return p_x from track parameters
   Double_t nonBendingSlope = TMath::Tan(fThetaXAtDCA);
   Double_t bendingSlope    = TMath::Tan(fThetaYAtDCA);
   Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
@@ -407,7 +407,7 @@ Double_t AliESDMuonTrack::PxAtDCA() const
 //_____________________________________________________________________________
 Double_t AliESDMuonTrack::PyAtDCA() const
 {
-  // return p_y from track parameters
+  /// return p_y from track parameters
   Double_t bendingSlope = TMath::Tan(fThetaYAtDCA);
   Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
   Double_t pZ  = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope);  // spectro. (z<0)
@@ -417,7 +417,7 @@ Double_t AliESDMuonTrack::PyAtDCA() const
 //_____________________________________________________________________________
 Double_t AliESDMuonTrack::PzAtDCA() const
 {
-  // return p_z from track parameters
+  /// return p_z from track parameters
   Double_t bendingSlope = TMath::Tan(fThetaYAtDCA);
   Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
   return -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope);  // spectro. (z<0)
@@ -426,7 +426,7 @@ Double_t AliESDMuonTrack::PzAtDCA() const
 //_____________________________________________________________________________
 Double_t AliESDMuonTrack::PAtDCA() const
 {
-  // return p from track parameters
+  /// return p from track parameters
   Double_t nonBendingSlope = TMath::Tan(fThetaXAtDCA);
   Double_t bendingSlope    = TMath::Tan(fThetaYAtDCA);
   Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : - FLT_MAX;
@@ -437,7 +437,7 @@ Double_t AliESDMuonTrack::PAtDCA() const
 //_____________________________________________________________________________
 void AliESDMuonTrack::LorentzPAtDCA(TLorentzVector& vP) const
 {
-  // return Lorentz momentum vector from track parameters
+  /// return Lorentz momentum vector from track parameters
   Double_t muonMass = M();
   Double_t nonBendingSlope = TMath::Tan(fThetaXAtDCA);
   Double_t bendingSlope    = TMath::Tan(fThetaYAtDCA);
@@ -452,7 +452,7 @@ void AliESDMuonTrack::LorentzPAtDCA(TLorentzVector& vP) const
 //_____________________________________________________________________________
 Double_t AliESDMuonTrack::PxUncorrected() const
 {
-  // return p_x from track parameters
+  /// return p_x from track parameters
   Double_t nonBendingSlope = TMath::Tan(fThetaXUncorrected);
   Double_t bendingSlope    = TMath::Tan(fThetaYUncorrected);
   Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
@@ -463,7 +463,7 @@ Double_t AliESDMuonTrack::PxUncorrected() const
 //_____________________________________________________________________________
 Double_t AliESDMuonTrack::PyUncorrected() const
 {
-  // return p_y from track parameters
+  /// return p_y from track parameters
   Double_t bendingSlope = TMath::Tan(fThetaYUncorrected);
   Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
   Double_t pZ  = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope);  // spectro. (z<0)
@@ -473,7 +473,7 @@ Double_t AliESDMuonTrack::PyUncorrected() const
 //_____________________________________________________________________________
 Double_t AliESDMuonTrack::PzUncorrected() const
 {
-  // return p_z from track parameters
+  /// return p_z from track parameters
   Double_t bendingSlope = TMath::Tan(fThetaYUncorrected);
   Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
   return -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope);  // spectro. (z<0)
@@ -482,7 +482,7 @@ Double_t AliESDMuonTrack::PzUncorrected() const
 //_____________________________________________________________________________
 Double_t AliESDMuonTrack::PUncorrected() const
 {
-  // return p from track parameters
+  /// return p from track parameters
   Double_t nonBendingSlope = TMath::Tan(fThetaXUncorrected);
   Double_t bendingSlope    = TMath::Tan(fThetaYUncorrected);
   Double_t pYZ = (fInverseBendingMomentumUncorrected != 0.) ? TMath::Abs(1. / fInverseBendingMomentumUncorrected) : - FLT_MAX;
@@ -493,7 +493,7 @@ Double_t AliESDMuonTrack::PUncorrected() const
 //_____________________________________________________________________________
 void AliESDMuonTrack::LorentzPUncorrected(TLorentzVector& vP) const
 {
-  // return Lorentz momentum vector from track parameters
+  /// return Lorentz momentum vector from track parameters
   Double_t muonMass = M();
   Double_t nonBendingSlope = TMath::Tan(fThetaXUncorrected);
   Double_t bendingSlope    = TMath::Tan(fThetaYUncorrected);
@@ -508,11 +508,11 @@ void AliESDMuonTrack::LorentzPUncorrected(TLorentzVector& vP) const
 //_____________________________________________________________________________
 Int_t AliESDMuonTrack::GetMatchTrigger() const
 {
-  //  backward compatibility after replacing fMatchTrigger by fLocalTrigger
-  //  0 track does not match trigger
-  //  1 track match but does not pass pt cut
-  //  2 track match Low pt cut
-  //  3 track match High pt cut
+  ///  backward compatibility after replacing fMatchTrigger by fLocalTrigger
+  ///  - 0 track does not match trigger
+  ///  - 1 track match but does not pass pt cut
+  ///  - 2 track match Low pt cut
+  ///  - 3 track match High pt cut
 
   if (!LoCircuit()) {
     return 0;
@@ -529,7 +529,7 @@ Int_t AliESDMuonTrack::GetMatchTrigger() const
 //_____________________________________________________________________________
 Int_t AliESDMuonTrack::GetNClusters() const
 {
-  // return the number of clusters associated to the track
+  /// return the number of clusters associated to the track
   if (!fClusters) return 0;
   
   return fClusters->GetEntriesFast();
@@ -538,7 +538,7 @@ Int_t AliESDMuonTrack::GetNClusters() const
 //_____________________________________________________________________________
 TClonesArray& AliESDMuonTrack::GetClusters() const
 {
-  // return the array of clusters associated to the track
+  /// return the array of clusters associated to the track
   if (!fClusters) fClusters = new TClonesArray("AliESDMuonCluster",10);
   
   return *fClusters;
@@ -547,7 +547,7 @@ TClonesArray& AliESDMuonTrack::GetClusters() const
 //_____________________________________________________________________________
 void AliESDMuonTrack::AddCluster(const AliESDMuonCluster &cluster)
 {
-  // add a cluster to the TClonesArray of clusters associated to the track
+  /// add a cluster to the TClonesArray of clusters associated to the track
   if (!fClusters) fClusters = new TClonesArray("AliESDMuonCluster",10);
   
   new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(cluster);
@@ -556,9 +556,44 @@ void AliESDMuonTrack::AddCluster(const AliESDMuonCluster &cluster)
 //_____________________________________________________________________________
 Bool_t AliESDMuonTrack::ClustersStored() const
 {
-  // return kTRUE if the clusters associated to the track are registered
+  /// return kTRUE if the clusters associated to the track are registered
   if (GetNClusters() == 0) return kFALSE;
   
   return kTRUE;
 }
 
+//_____________________________________________________________________________
+void AliESDMuonTrack::SetFiredChamber(UShort_t& pattern, Int_t cathode, Int_t chamber)
+{
+  /// Turn on the bit corresponding to fired chameber
+  pattern |= (0x1 << ( 7 - ( 4*cathode + chamber )));
+}
+
+//_____________________________________________________________________________
+void AliESDMuonTrack::AddEffInfo(UShort_t& pattern, Int_t slatOrInfo, EAliTriggerChPatternFlag effType)
+{
+  /// Add efficiency flag and crossed RPC or info on rejected track
+  pattern |= effType << 8;
+  pattern |= slatOrInfo << 10;
+}
+
+//_____________________________________________________________________________
+Bool_t AliESDMuonTrack::IsChamberHit(UShort_t pattern, Int_t cathode, Int_t chamber)
+{ 
+  /// Check if chamber was was hit
+  return (pattern >> (7 - ( 4*cathode + chamber ))) & 0x1;
+}
+
+//_____________________________________________________________________________
+Int_t AliESDMuonTrack::GetEffFlag(UShort_t pattern)
+{
+  /// Get Efficiency flag
+  return (pattern >> 8) & 0x03;
+}
+
+//_____________________________________________________________________________
+Int_t AliESDMuonTrack::GetSlatOrInfo(UShort_t pattern) 
+{
+  /// Getting crossed slat or info
+  return (pattern >> 10) & 0x1F;
+}
index 35a7e12..d2c0580 100644 (file)
@@ -6,8 +6,8 @@
 
 /* $Id$ */
 
-//  Class to describe the MUON tracks
-//  in the Event Summary Data class
+/// \class AliESDMuonTrack
+/// \brief Class to describe the MUON tracks in the Event Summary Data class
 //  Author: G.Martinez
 
 
@@ -107,7 +107,7 @@ public:
   Int_t    LoDev(void)    const  { return fLocalTrigger >> 17 & 0x1F; }
   Int_t    LoLpt(void)    const  { return fLocalTrigger >> 22 & 0x03; }
   Int_t    LoHpt(void)    const  { return fLocalTrigger >> 24 & 0x03; }
-  
+
   // Get and Set methods for the hit strips pattern in the trigger chambers
   UShort_t GetTriggerX1Pattern() const { return fX1Pattern; }
   UShort_t GetTriggerY1Pattern() const { return fY1Pattern; }
@@ -178,6 +178,41 @@ public:
   void  SetLabel(Int_t label) {fLabel = label;}
   /// Return the corresponding MC track number
   Int_t GetLabel() const {return fLabel;}
+
+  /// Additional methods to decode hit pattern
+  /// The hit pattern is a UShort_t with:
+  /// <pre>
+  ///   0    |   1 0 0 0 1  |  1 1  |   1  1  0  1  |   1  1  0  1   
+  ///        |              |       |               | 
+  /// unused |  RPC (0-17)  |  flag |  Bend plane   | Non-bend plane
+  ///        |      or      |       | Match chamber | Match chamber
+  ///        | further info |       |  11 12 13 14  |  11 12 13 14
+  ///        |    (20-24)   |       |               |
+  /// </pre>
+  enum EAliTriggerChPatternFlag {
+    kNoEff,    ///< Track is not good for chamber efficiency evaluation
+    kChEff,    ///< Track crosses different RPCs
+    kSlatEff,  ///< Track crosses the same RPC in all planes
+    kBoardEff  ///< Track crosses the same board in all planes
+  };
+  enum EAliTriggerChPatternInfo {
+    kCrossDifferentSlats  = 20, ///< The RPC cannot be univoquely determined
+    kTrackMatchesManyPads = 21, ///< Track not good for effciency calculation since it matches many pads
+    kTrackMatchesFewPads  = 22, ///< Track not good for effciency calculation since it matches pads in less than 3/4 chambers
+    kTrackOutsideGeometry = 23, ///< Problems in pattern determination since track extrapolation is outside trigger chambers
+    kTrackerTrackPattern  = 24  ///< The pattern was calculated from a tracker track not matching trigger track
+  };
+  /// Set hits pattern
+  static void SetFiredChamber(UShort_t& pattern, Int_t cathode, Int_t chamber);
+  /// Add efficiency flag and crossed RPC or info on rejected track
+  static void AddEffInfo(UShort_t& pattern, Int_t slatOrInfo, EAliTriggerChPatternFlag effType = kNoEff);
+  /// Chamber was hit
+  static Bool_t IsChamberHit(UShort_t pattern, Int_t cathode, Int_t chamber);
+  /// Get Efficiency flag
+  static Int_t GetEffFlag(UShort_t pattern);
+  /// Getting crossed slat or info
+  static Int_t GetSlatOrInfo(UShort_t pattern);
+
   
 protected:
   // parameters at vertex