* provided "as is" without express or implied warranty. *
**************************************************************************/
-/* $Id$*/
-
-///////////////////////////////////////////////////
-//
-// Reconstructed Trigger track
-// in
-// ALICE
-// dimuon
-// spectrometer
-// note: equivalent to AliMUONTriggerTrack for tracking,
-// no need for a AliMUONTriggerTrackParam
-///////////////////////////////////////////////////
+// $Id$
+
+//-----------------------------------------------------------------------------
+// Class AliMUONTriggerTrack
+//---------------------------
+// Reconstructed Trigger track in ALICE dimuon spectrometer
+// Note: equivalent to AliMUONTriggerTrack for tracking,
+// No need for a AliMUONTriggerTrackParam
+// Author: Philippe Crochet
+//-----------------------------------------------------------------------------
#include "AliMUONTriggerTrack.h"
#include "AliMUONTrackReconstructor.h"
+#include "TString.h"
+#include <Riostream.h>
+#include "AliLog.h"
+using std::endl;
+using std::cout;
+/// \cond CLASSIMP
+ClassImp(AliMUONTriggerTrack)
+/// \endcond
//__________________________________________________________________________
AliMUONTriggerTrack::AliMUONTriggerTrack()
: TObject(),
fx11(0),
fy11(0),
- fthetax(0),
- fthetay(0),
- fGTPattern(0)
-
+ fz11(0.),
+ fz21(0.),
+ fSlopeX(0),
+ fSlopeY(0),
+ floTrgNum(0),
+ fGTPattern(0),
+ fPtCutLevel(0),
+ fHitsPatternInTrigCh(0),
+ fCovariances(0x0)
{
- // default ctr
+ /// default ctr
+ AliDebug(5,Form("this=%p",this));
}
//__________________________________________________________________________
-AliMUONTriggerTrack::AliMUONTriggerTrack(Float_t x11, Float_t y11, Float_t thetax, Float_t thetay, Long_t theGTPattern)
- : TObject()
+AliMUONTriggerTrack::AliMUONTriggerTrack(Float_t x11, Float_t y11, Float_t z11, Float_t z21, Float_t slopeX, Float_t slopeY, Int_t loTrgNum, Long_t theGTPattern, Int_t ptCutLevel)
+ : TObject(),
+ fx11(x11),
+ fy11(y11),
+ fz11(z11),
+ fz21(z21),
+ fSlopeX(slopeX),
+ fSlopeY(slopeY),
+ floTrgNum(loTrgNum),
+ fGTPattern(theGTPattern),
+ fPtCutLevel(ptCutLevel),
+ fHitsPatternInTrigCh(0),
+ fCovariances(0x0)
{
-// ctor from local trigger output
- fx11 = x11;
- fy11 = y11;
- fthetax = thetax;
- fthetay = thetay;
- fGTPattern = theGTPattern;
+/// ctor from local trigger output
+ AliDebug(5,Form("this=%p x11=%f y11=%f z11=%f z21=%f slopeX=%f slopeY=%f loTrgNum=%d GTPattern=%ld HitsPatternInTrigCh %i",
+ this,x11,y11,z11,z21,slopeX,slopeY,loTrgNum,theGTPattern,fHitsPatternInTrigCh));
}
//__________________________________________________________________________
AliMUONTriggerTrack::~AliMUONTriggerTrack()
{
- // Destructor
- ;
-
+ /// Destructor
+ AliDebug(5,Form("this=%p",this));
+ if (fCovariances) {
+ delete fCovariances;
+ fCovariances = 0x0;
+ }
}
//__________________________________________________________________________
AliMUONTriggerTrack::AliMUONTriggerTrack (const AliMUONTriggerTrack& theMUONTriggerTrack)
- : TObject(theMUONTriggerTrack)
+ : TObject(theMUONTriggerTrack),
+ fx11(theMUONTriggerTrack.fx11),
+ fy11(theMUONTriggerTrack.fy11),
+ fz11(theMUONTriggerTrack.fz11),
+ fz21(theMUONTriggerTrack.fz21),
+ fSlopeX(theMUONTriggerTrack.fSlopeX),
+ fSlopeY(theMUONTriggerTrack.fSlopeY),
+ floTrgNum(theMUONTriggerTrack.floTrgNum),
+ fGTPattern(theMUONTriggerTrack.fGTPattern),
+ fPtCutLevel(theMUONTriggerTrack.fPtCutLevel),
+ fHitsPatternInTrigCh(theMUONTriggerTrack.fHitsPatternInTrigCh),
+ fCovariances(0x0)
{
- fx11 = theMUONTriggerTrack.fx11;
- fy11 = theMUONTriggerTrack.fy11;
- fthetax = theMUONTriggerTrack.fthetax;
- fthetay = theMUONTriggerTrack.fthetay;
- fGTPattern = theMUONTriggerTrack.fGTPattern;
+///
+/// copy ctor
+///
+ if (theMUONTriggerTrack.fCovariances) fCovariances = new TMatrixD(*(theMUONTriggerTrack.fCovariances));
+ AliDebug(5,Form("this=%p copy ctor",this));
+
}
//__________________________________________________________________________
AliMUONTriggerTrack & AliMUONTriggerTrack::operator=(const AliMUONTriggerTrack&
theMUONTriggerTrack)
{
+/// Assignment operator
+
// check assignement to self
if (this == &theMUONTriggerTrack)
return *this;
- // base class assignement
+ /// base class assignement
TObject::operator=(theMUONTriggerTrack);
fx11 = theMUONTriggerTrack.fx11;
fy11 = theMUONTriggerTrack.fy11;
- fthetax = theMUONTriggerTrack.fthetax;
- fthetay = theMUONTriggerTrack.fthetay;
+ fz11 = theMUONTriggerTrack.fz11;
+ fz21 = theMUONTriggerTrack.fz21;
+ fSlopeX = theMUONTriggerTrack.fSlopeX;
+ fSlopeY = theMUONTriggerTrack.fSlopeY;
+ floTrgNum = theMUONTriggerTrack.floTrgNum;
fGTPattern = theMUONTriggerTrack.fGTPattern;
+ fHitsPatternInTrigCh = theMUONTriggerTrack.fHitsPatternInTrigCh;
+
+ if (theMUONTriggerTrack.fCovariances) {
+ if (fCovariances) *fCovariances = *(theMUONTriggerTrack.fCovariances);
+ else fCovariances = new TMatrixD(*(theMUONTriggerTrack.fCovariances));
+ } else {
+ delete fCovariances;
+ fCovariances = 0x0;
+ }
return *this;
}
+
+//__________________________________________________________________________
+void AliMUONTriggerTrack::Clear(Option_t* /*opt*/)
+{
+ /// Clean memory
+ delete fCovariances;
+ fCovariances = 0x0;
+}
+
+//__________________________________________________________________________
+void
+AliMUONTriggerTrack::Print(Option_t* opt) const
+{
+/// Printing
+ TString optString(opt);
+ optString.ToUpper();
+ if ( optString.Contains("FULL") ) optString = "PARAM COV";
+
+ if ( optString.Contains("PARAM"))
+ cout << Form("(X,Y,Z)11=(%7.2f,%7.2f,%7.2f) Z21=%7.2f Slope(X,Y)=(%7.2f,%7.2f) LocalBoard #%3d GlobalTriggerPattern %x HitsPatternInTrigCh %x",
+ fx11,fy11,fz11,fz21,fSlopeX,fSlopeY,floTrgNum,fGTPattern,fHitsPatternInTrigCh) << endl;
+
+ if ( optString.Contains("COV") ){
+ if ( ! fCovariances ) cout << "Covariances not initialized " << endl;
+ else fCovariances->Print();
+ }
+}
+
+//__________________________________________________________________________
+void AliMUONTriggerTrack::SetCovariances(const TMatrixD& covariances)
+{
+ /// Set the covariance matrix
+ if (fCovariances) *fCovariances = covariances;
+ else fCovariances = new TMatrixD(covariances);
+}
+
+//__________________________________________________________________________
+void AliMUONTriggerTrack::SetCovariances(const Double_t matrix[3][3])
+{
+ /// Set the covariance matrix
+ if (fCovariances) fCovariances->SetMatrixArray(&(matrix[0][0]));
+ else fCovariances = new TMatrixD(3,3,&(matrix[0][0]));
+}
+
+//__________________________________________________________________________
+const TMatrixD& AliMUONTriggerTrack::GetCovariances() const
+{
+ /// Return the covariance matrix (create it before if needed)
+ if (!fCovariances) {
+ fCovariances = new TMatrixD(3,3);
+ fCovariances->Zero();
+ }
+ return *fCovariances;
+}
+
+//__________________________________________________________________________
+Bool_t AliMUONTriggerTrack::Match(AliMUONTriggerTrack &track,
+ Double_t sigmaCut) const
+{
+ /// Try to match this track with the given track. Matching conditions:
+ /// - x, y position and y slope within sigmaCut
+
+ // Find the track with the covariances correctly set
+ // Extrapolate to the z of the other track
+ Bool_t hasCov1 = ( GetCovariances().NonZeros() != 0 );
+ Bool_t hasCov2 = ( track.GetCovariances().NonZeros() != 0 );
+
+ const AliMUONTriggerTrack* trackToExtrap = ( hasCov2 ) ? &track : this;
+ const AliMUONTriggerTrack* fixedTrack = ( hasCov2 ) ? this : &track;
+
+ TMatrixD paramDiff(3,1);
+ Double_t deltaZ = fixedTrack->GetZ11() - trackToExtrap->GetZ11();
+ paramDiff(0,0) = fixedTrack->GetX11() - trackToExtrap->GetX11();
+ paramDiff(1,0) = fixedTrack->GetY11() - ( trackToExtrap->GetY11() + trackToExtrap->GetSlopeY() * deltaZ );
+ paramDiff(2,0) = fixedTrack->GetSlopeY() - trackToExtrap->GetSlopeY();
+ Double_t chi2 = 0.;
+
+ TMatrixD cov1(fixedTrack->GetCovariances());
+ TMatrixD cov2(trackToExtrap->GetCovariances());
+
+ // Extrapolate covariances to z
+ if ( deltaZ != 0 ) {
+ if ( hasCov1 || hasCov2 ){
+ TMatrixD jacob(3,3);
+ jacob.UnitMatrix();
+ jacob(1,2) = deltaZ;
+ TMatrixD tmp(trackToExtrap->GetCovariances(),TMatrixD::kMultTranspose,jacob);
+ TMatrixD tmp2(jacob,TMatrixD::kMult,tmp);
+ cov2 = tmp2;
+ }
+ }
+
+ AliDebug(3, Form("track1 Y11 %f track2 Y11: %f (Z11 %f) -> %f (Z11 %f)", fixedTrack->GetY11(), trackToExtrap->GetY11(), trackToExtrap->GetZ11(), trackToExtrap->GetY11() + trackToExtrap->GetSlopeY() * deltaZ, fixedTrack->GetZ11()));
+
+ TMatrixD sumCov(cov1,TMatrixD::kPlus,cov2);
+ if (sumCov.Determinant() != 0) {
+ sumCov.Invert();
+ TMatrixD tmp(sumCov,TMatrixD::kMult,paramDiff);
+ TMatrixD chi2M(paramDiff,TMatrixD::kTransposeMult,tmp);
+ chi2 = chi2M(0,0);
+ } else {
+ AliWarning(" Determinant = 0");
+ Double_t sigma2 = 0.;
+ for (Int_t iVar = 0; iVar < 3; iVar++) {
+ sigma2 = cov1(iVar,iVar) + cov2(iVar,iVar);
+ chi2 += paramDiff(iVar,0) * paramDiff(iVar,0) / sigma2;
+ }
+ }
+
+ if ( chi2/3 > sigmaCut * sigmaCut )
+ return kFALSE;
+
+ return kTRUE;
+}