ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

// $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)
{
  /// default ctr
      AliDebug(5,Form("this=%p",this));
}
//__________________________________________________________________________
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
        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
  AliDebug(5,Form("this=%p",this));
  if (fCovariances) {
    delete fCovariances;
    fCovariances = 0x0;
  }
}

//__________________________________________________________________________
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)
{
///
/// 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
    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;
}
 AliMUONTriggerTrack.cxx:1
 AliMUONTriggerTrack.cxx:2
 AliMUONTriggerTrack.cxx:3
 AliMUONTriggerTrack.cxx:4
 AliMUONTriggerTrack.cxx:5
 AliMUONTriggerTrack.cxx:6
 AliMUONTriggerTrack.cxx:7
 AliMUONTriggerTrack.cxx:8
 AliMUONTriggerTrack.cxx:9
 AliMUONTriggerTrack.cxx:10
 AliMUONTriggerTrack.cxx:11
 AliMUONTriggerTrack.cxx:12
 AliMUONTriggerTrack.cxx:13
 AliMUONTriggerTrack.cxx:14
 AliMUONTriggerTrack.cxx:15
 AliMUONTriggerTrack.cxx:16
 AliMUONTriggerTrack.cxx:17
 AliMUONTriggerTrack.cxx:18
 AliMUONTriggerTrack.cxx:19
 AliMUONTriggerTrack.cxx:20
 AliMUONTriggerTrack.cxx:21
 AliMUONTriggerTrack.cxx:22
 AliMUONTriggerTrack.cxx:23
 AliMUONTriggerTrack.cxx:24
 AliMUONTriggerTrack.cxx:25
 AliMUONTriggerTrack.cxx:26
 AliMUONTriggerTrack.cxx:27
 AliMUONTriggerTrack.cxx:28
 AliMUONTriggerTrack.cxx:29
 AliMUONTriggerTrack.cxx:30
 AliMUONTriggerTrack.cxx:31
 AliMUONTriggerTrack.cxx:32
 AliMUONTriggerTrack.cxx:33
 AliMUONTriggerTrack.cxx:34
 AliMUONTriggerTrack.cxx:35
 AliMUONTriggerTrack.cxx:36
 AliMUONTriggerTrack.cxx:37
 AliMUONTriggerTrack.cxx:38
 AliMUONTriggerTrack.cxx:39
 AliMUONTriggerTrack.cxx:40
 AliMUONTriggerTrack.cxx:41
 AliMUONTriggerTrack.cxx:42
 AliMUONTriggerTrack.cxx:43
 AliMUONTriggerTrack.cxx:44
 AliMUONTriggerTrack.cxx:45
 AliMUONTriggerTrack.cxx:46
 AliMUONTriggerTrack.cxx:47
 AliMUONTriggerTrack.cxx:48
 AliMUONTriggerTrack.cxx:49
 AliMUONTriggerTrack.cxx:50
 AliMUONTriggerTrack.cxx:51
 AliMUONTriggerTrack.cxx:52
 AliMUONTriggerTrack.cxx:53
 AliMUONTriggerTrack.cxx:54
 AliMUONTriggerTrack.cxx:55
 AliMUONTriggerTrack.cxx:56
 AliMUONTriggerTrack.cxx:57
 AliMUONTriggerTrack.cxx:58
 AliMUONTriggerTrack.cxx:59
 AliMUONTriggerTrack.cxx:60
 AliMUONTriggerTrack.cxx:61
 AliMUONTriggerTrack.cxx:62
 AliMUONTriggerTrack.cxx:63
 AliMUONTriggerTrack.cxx:64
 AliMUONTriggerTrack.cxx:65
 AliMUONTriggerTrack.cxx:66
 AliMUONTriggerTrack.cxx:67
 AliMUONTriggerTrack.cxx:68
 AliMUONTriggerTrack.cxx:69
 AliMUONTriggerTrack.cxx:70
 AliMUONTriggerTrack.cxx:71
 AliMUONTriggerTrack.cxx:72
 AliMUONTriggerTrack.cxx:73
 AliMUONTriggerTrack.cxx:74
 AliMUONTriggerTrack.cxx:75
 AliMUONTriggerTrack.cxx:76
 AliMUONTriggerTrack.cxx:77
 AliMUONTriggerTrack.cxx:78
 AliMUONTriggerTrack.cxx:79
 AliMUONTriggerTrack.cxx:80
 AliMUONTriggerTrack.cxx:81
 AliMUONTriggerTrack.cxx:82
 AliMUONTriggerTrack.cxx:83
 AliMUONTriggerTrack.cxx:84
 AliMUONTriggerTrack.cxx:85
 AliMUONTriggerTrack.cxx:86
 AliMUONTriggerTrack.cxx:87
 AliMUONTriggerTrack.cxx:88
 AliMUONTriggerTrack.cxx:89
 AliMUONTriggerTrack.cxx:90
 AliMUONTriggerTrack.cxx:91
 AliMUONTriggerTrack.cxx:92
 AliMUONTriggerTrack.cxx:93
 AliMUONTriggerTrack.cxx:94
 AliMUONTriggerTrack.cxx:95
 AliMUONTriggerTrack.cxx:96
 AliMUONTriggerTrack.cxx:97
 AliMUONTriggerTrack.cxx:98
 AliMUONTriggerTrack.cxx:99
 AliMUONTriggerTrack.cxx:100
 AliMUONTriggerTrack.cxx:101
 AliMUONTriggerTrack.cxx:102
 AliMUONTriggerTrack.cxx:103
 AliMUONTriggerTrack.cxx:104
 AliMUONTriggerTrack.cxx:105
 AliMUONTriggerTrack.cxx:106
 AliMUONTriggerTrack.cxx:107
 AliMUONTriggerTrack.cxx:108
 AliMUONTriggerTrack.cxx:109
 AliMUONTriggerTrack.cxx:110
 AliMUONTriggerTrack.cxx:111
 AliMUONTriggerTrack.cxx:112
 AliMUONTriggerTrack.cxx:113
 AliMUONTriggerTrack.cxx:114
 AliMUONTriggerTrack.cxx:115
 AliMUONTriggerTrack.cxx:116
 AliMUONTriggerTrack.cxx:117
 AliMUONTriggerTrack.cxx:118
 AliMUONTriggerTrack.cxx:119
 AliMUONTriggerTrack.cxx:120
 AliMUONTriggerTrack.cxx:121
 AliMUONTriggerTrack.cxx:122
 AliMUONTriggerTrack.cxx:123
 AliMUONTriggerTrack.cxx:124
 AliMUONTriggerTrack.cxx:125
 AliMUONTriggerTrack.cxx:126
 AliMUONTriggerTrack.cxx:127
 AliMUONTriggerTrack.cxx:128
 AliMUONTriggerTrack.cxx:129
 AliMUONTriggerTrack.cxx:130
 AliMUONTriggerTrack.cxx:131
 AliMUONTriggerTrack.cxx:132
 AliMUONTriggerTrack.cxx:133
 AliMUONTriggerTrack.cxx:134
 AliMUONTriggerTrack.cxx:135
 AliMUONTriggerTrack.cxx:136
 AliMUONTriggerTrack.cxx:137
 AliMUONTriggerTrack.cxx:138
 AliMUONTriggerTrack.cxx:139
 AliMUONTriggerTrack.cxx:140
 AliMUONTriggerTrack.cxx:141
 AliMUONTriggerTrack.cxx:142
 AliMUONTriggerTrack.cxx:143
 AliMUONTriggerTrack.cxx:144
 AliMUONTriggerTrack.cxx:145
 AliMUONTriggerTrack.cxx:146
 AliMUONTriggerTrack.cxx:147
 AliMUONTriggerTrack.cxx:148
 AliMUONTriggerTrack.cxx:149
 AliMUONTriggerTrack.cxx:150
 AliMUONTriggerTrack.cxx:151
 AliMUONTriggerTrack.cxx:152
 AliMUONTriggerTrack.cxx:153
 AliMUONTriggerTrack.cxx:154
 AliMUONTriggerTrack.cxx:155
 AliMUONTriggerTrack.cxx:156
 AliMUONTriggerTrack.cxx:157
 AliMUONTriggerTrack.cxx:158
 AliMUONTriggerTrack.cxx:159
 AliMUONTriggerTrack.cxx:160
 AliMUONTriggerTrack.cxx:161
 AliMUONTriggerTrack.cxx:162
 AliMUONTriggerTrack.cxx:163
 AliMUONTriggerTrack.cxx:164
 AliMUONTriggerTrack.cxx:165
 AliMUONTriggerTrack.cxx:166
 AliMUONTriggerTrack.cxx:167
 AliMUONTriggerTrack.cxx:168
 AliMUONTriggerTrack.cxx:169
 AliMUONTriggerTrack.cxx:170
 AliMUONTriggerTrack.cxx:171
 AliMUONTriggerTrack.cxx:172
 AliMUONTriggerTrack.cxx:173
 AliMUONTriggerTrack.cxx:174
 AliMUONTriggerTrack.cxx:175
 AliMUONTriggerTrack.cxx:176
 AliMUONTriggerTrack.cxx:177
 AliMUONTriggerTrack.cxx:178
 AliMUONTriggerTrack.cxx:179
 AliMUONTriggerTrack.cxx:180
 AliMUONTriggerTrack.cxx:181
 AliMUONTriggerTrack.cxx:182
 AliMUONTriggerTrack.cxx:183
 AliMUONTriggerTrack.cxx:184
 AliMUONTriggerTrack.cxx:185
 AliMUONTriggerTrack.cxx:186
 AliMUONTriggerTrack.cxx:187
 AliMUONTriggerTrack.cxx:188
 AliMUONTriggerTrack.cxx:189
 AliMUONTriggerTrack.cxx:190
 AliMUONTriggerTrack.cxx:191
 AliMUONTriggerTrack.cxx:192
 AliMUONTriggerTrack.cxx:193
 AliMUONTriggerTrack.cxx:194
 AliMUONTriggerTrack.cxx:195
 AliMUONTriggerTrack.cxx:196
 AliMUONTriggerTrack.cxx:197
 AliMUONTriggerTrack.cxx:198
 AliMUONTriggerTrack.cxx:199
 AliMUONTriggerTrack.cxx:200
 AliMUONTriggerTrack.cxx:201
 AliMUONTriggerTrack.cxx:202
 AliMUONTriggerTrack.cxx:203
 AliMUONTriggerTrack.cxx:204
 AliMUONTriggerTrack.cxx:205
 AliMUONTriggerTrack.cxx:206
 AliMUONTriggerTrack.cxx:207
 AliMUONTriggerTrack.cxx:208
 AliMUONTriggerTrack.cxx:209
 AliMUONTriggerTrack.cxx:210
 AliMUONTriggerTrack.cxx:211
 AliMUONTriggerTrack.cxx:212
 AliMUONTriggerTrack.cxx:213
 AliMUONTriggerTrack.cxx:214
 AliMUONTriggerTrack.cxx:215
 AliMUONTriggerTrack.cxx:216
 AliMUONTriggerTrack.cxx:217
 AliMUONTriggerTrack.cxx:218
 AliMUONTriggerTrack.cxx:219
 AliMUONTriggerTrack.cxx:220
 AliMUONTriggerTrack.cxx:221
 AliMUONTriggerTrack.cxx:222
 AliMUONTriggerTrack.cxx:223
 AliMUONTriggerTrack.cxx:224
 AliMUONTriggerTrack.cxx:225
 AliMUONTriggerTrack.cxx:226
 AliMUONTriggerTrack.cxx:227
 AliMUONTriggerTrack.cxx:228
 AliMUONTriggerTrack.cxx:229
 AliMUONTriggerTrack.cxx:230
 AliMUONTriggerTrack.cxx:231
 AliMUONTriggerTrack.cxx:232
 AliMUONTriggerTrack.cxx:233
 AliMUONTriggerTrack.cxx:234
 AliMUONTriggerTrack.cxx:235
 AliMUONTriggerTrack.cxx:236
 AliMUONTriggerTrack.cxx:237
 AliMUONTriggerTrack.cxx:238
 AliMUONTriggerTrack.cxx:239
 AliMUONTriggerTrack.cxx:240
 AliMUONTriggerTrack.cxx:241
 AliMUONTriggerTrack.cxx:242
 AliMUONTriggerTrack.cxx:243
 AliMUONTriggerTrack.cxx:244
 AliMUONTriggerTrack.cxx:245
 AliMUONTriggerTrack.cxx:246
 AliMUONTriggerTrack.cxx:247
 AliMUONTriggerTrack.cxx:248
 AliMUONTriggerTrack.cxx:249
 AliMUONTriggerTrack.cxx:250
 AliMUONTriggerTrack.cxx:251
 AliMUONTriggerTrack.cxx:252
 AliMUONTriggerTrack.cxx:253
 AliMUONTriggerTrack.cxx:254
 AliMUONTriggerTrack.cxx:255
 AliMUONTriggerTrack.cxx:256
 AliMUONTriggerTrack.cxx:257
 AliMUONTriggerTrack.cxx:258