- 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
#include "AliMUONVDigit.h"
#include "AliMUONVDigitStore.h"
#include "AliMUONLocalTrigger.h"
+#include "AliMUONTriggerTrack.h"
#include "AliMUONVTriggerStore.h"
#include "AliMUON2DMapIterator.h"
#include "AliMUONTrackParam.h"
// 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();
}
//_____________________________________________________________________________
-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
locTrg.LoHpt());
esdTrack.SetLocalTrigger(muonTrack.GetLocalTrigger());
esdTrack.SetChi2MatchTrigger(0.);
- esdTrack.SetHitsPatternInTrigCh(hitPattern);
esdTrack.SetTriggerX1Pattern(locTrg.GetX1Pattern());
esdTrack.SetTriggerY1Pattern(locTrg.GetY1Pattern());
esdTrack.SetTriggerX2Pattern(locTrg.GetX2Pattern());
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());
+ }
}
//_____________________________________________________________________________
class AliMUONVDigit;
class AliMUONVDigitStore;
class AliMUONLocalTrigger;
+class AliMUONTriggerTrack;
class AliMUONVTriggerStore;
class AliMUONTrackParam;
class AliMUONVTrackReconstructor;
// 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);
/// 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
///
#include "AliLog.h"
#include "AliTracker.h"
+#include "AliESDMuonTrack.h"
#include <Riostream.h>
#include <TArrayS.h>
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;
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);
}
}
//______________________________________________________________________________
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)
{
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
}
}
- 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;
}
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;
} // 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;
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;
break;
}
}
- if(!atLeastOneLoc) goodForEff = kSlatEff;
+ if(!atLeastOneLoc) goodForEff = AliESDMuonTrack::kSlatEff;
} // end chamber loop
- AddEffInfo(pattern, firstSlat, goodForEff);
+ AliESDMuonTrack::AddEffInfo(pattern, firstSlat, goodForEff);
return kTRUE;
}
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,
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
};
#include "AliMUONLocalTrigger.h"
#include "AliMUONVClusterServer.h"
#include "AliMUONVDigitStore.h"
-#include "AliMUONDigitStoreV1.h"
#include "AliMUONVTriggerStore.h"
#include "AliMUONDigitMaker.h"
#include <Riostream.h>
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()) ) ) {
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;
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));
}
fthetax(theMUONTriggerTrack.fthetax),
fthetay(theMUONTriggerTrack.fthetay),
floTrgNum(theMUONTriggerTrack.floTrgNum),
- fGTPattern(theMUONTriggerTrack.fGTPattern)
+ fGTPattern(theMUONTriggerTrack.fGTPattern),
+ fHitsPatternInTrigCh(theMUONTriggerTrack.fHitsPatternInTrigCh)
{
///
/// copy ctor
fthetay = theMUONTriggerTrack.fthetay;
floTrgNum = theMUONTriggerTrack.floTrgNum;
fGTPattern = theMUONTriggerTrack.fGTPattern;
+ fHitsPatternInTrigCh = theMUONTriggerTrack.fHitsPatternInTrigCh;
return *this;
}
{
/// 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;
}
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
/// 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;
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
///////////////////////////////////////////////////////////////////////////////
//
-// 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
//
///////////////////////////////////////////////////////////////////////////////
fLabel(-1)
{
//
- // Default constructor
+ /// Default constructor
//
for (Int_t i = 0; i < 15; i++) fCovariances[i] = 0;
}
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];
AliESDMuonTrack& AliESDMuonTrack::operator=(const AliESDMuonTrack& muonTrack)
{
//
- // Equal operator for a deep copy
+ /// Equal operator for a deep copy
//
if (this == &muonTrack)
return *this;
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);
//_____________________________________________________________________________
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++)
//_____________________________________________________________________________
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);
//_____________________________________________________________________________
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);
//_____________________________________________________________________________
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;
//_____________________________________________________________________________
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)
//_____________________________________________________________________________
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)
//_____________________________________________________________________________
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;
//_____________________________________________________________________________
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);
//_____________________________________________________________________________
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;
//_____________________________________________________________________________
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)
//_____________________________________________________________________________
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)
//_____________________________________________________________________________
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;
//_____________________________________________________________________________
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);
//_____________________________________________________________________________
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;
//_____________________________________________________________________________
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)
//_____________________________________________________________________________
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)
//_____________________________________________________________________________
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;
//_____________________________________________________________________________
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);
//_____________________________________________________________________________
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;
//_____________________________________________________________________________
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();
//_____________________________________________________________________________
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;
//_____________________________________________________________________________
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);
//_____________________________________________________________________________
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;
+}
/* $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
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; }
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