]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONTriggerTrack.cxx
macro title as filename
[u/mrichter/AliRoot.git] / MUON / AliMUONTriggerTrack.cxx
index ac0eae364512061c12c06669beecbc59196b6171..13bd46c8f1a85aa0c6b6c67836b6d036509bfe09 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-/* */
-
-///////////////////////////////////////////////////
-//
-// Reconstructed Trigger track
-// in
-// ALICE
-// dimuon
-// spectrometer
-// note: equivalent to AliMUONTriggerTrack for tracking,
-// no need for a AliMUONTriggerTrackParam
-///////////////////////////////////////////////////
-
-#include <Riostream.h> // for cout
-#include <stdlib.h> // for exit()
-
-#include <TClonesArray.h>
-#include <TMath.h>
-#include <TMatrixD.h>
-#include <TObjArray.h>
-
-#include "AliMUONEventReconstructor.h" 
+// $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),
+    fz11(0.),
+    fz21(0.),
+    fSlopeX(0),
+    fSlopeY(0),
+    floTrgNum(0),
+    fGTPattern(0),
+    fPtCutLevel(0),
+    fHitsPatternInTrigCh(0),
+    fCovariances(0x0)
 {
-    fEventReconstructor = 0;
-    fx11 = 0.;
-    fy11 = 0.;
-    fthetax = 0.;
-    fthetay = 0.;
-    fGTPattern = 0;
+  /// 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,  AliMUONEventReconstructor* EventReconstructor)
+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)
 {
-    fEventReconstructor = EventReconstructor; // link back to EventReconstructor
-    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& MUONTriggerTrack):TObject(MUONTriggerTrack)
+AliMUONTriggerTrack::AliMUONTriggerTrack (const AliMUONTriggerTrack& 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)
 {
-  fEventReconstructor = new AliMUONEventReconstructor(*MUONTriggerTrack.fEventReconstructor);
-  fx11 = MUONTriggerTrack.fx11;
-  fy11 = MUONTriggerTrack.fy11;
-  fthetax = MUONTriggerTrack.fthetax;
-  fthetay = MUONTriggerTrack.fthetay;
-  fGTPattern = MUONTriggerTrack.fGTPattern;
+///
+/// copy ctor
+///
+  if (theMUONTriggerTrack.fCovariances) fCovariances = new TMatrixD(*(theMUONTriggerTrack.fCovariances));
+  AliDebug(5,Form("this=%p copy ctor",this));
+
 }
       
 //__________________________________________________________________________
 AliMUONTriggerTrack & AliMUONTriggerTrack::operator=(const AliMUONTriggerTrack&
-MUONTriggerTrack)
+theMUONTriggerTrack)
 {
-    if (this == &MUONTriggerTrack)
+/// Assignment operator
+
+    // check assignement to self
+    if (this == &theMUONTriggerTrack)
        return *this;
     
-    fEventReconstructor = new AliMUONEventReconstructor(*MUONTriggerTrack.fEventReconstructor);
-    fx11 = MUONTriggerTrack.fx11;
-    fy11 = MUONTriggerTrack.fy11;
-    fthetax = MUONTriggerTrack.fthetax;
-    fthetay = MUONTriggerTrack.fthetay;
-    fGTPattern = MUONTriggerTrack.fGTPattern;
+    /// base class assignement
+    TObject::operator=(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;
+    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;
+}