]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONTrack.cxx
Code revision:
[u/mrichter/AliRoot.git] / MUON / AliMUONTrack.cxx
index 700e2aa22428d429700840131ff965103be48cf2..54f370a9fff51732b293f73c780874a136b9fbe2 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-/*
-$Log$
-Revision 1.14  2001/08/30 09:52:12  hristov
-The operator[] is replaced by At() or AddAt() in case of TObjArray.
-
-Revision 1.13  2001/05/03 08:11:31  hristov
-stdlib.h included to define exit()
-
-Revision 1.12  2001/04/25 14:50:42  gosset
-Corrections to violations of coding conventions
-
-Revision 1.11  2001/04/23 12:33:17  hristov
-Arrays with variable size created by new and deleted at the end
-
-Revision 1.10  2001/04/09 12:25:09  gosset
-Inversion of covariance matrices with local copy of TMinuit::mnvert,
-for symmetric positive definite matrices, instead of TMatrixD::Invert
-
-Revision 1.9  2001/01/17 20:59:24  hristov
-chPrev initialised
-
-Revision 1.8  2001/01/08 11:01:02  gosset
-Modifications used for addendum to Dimuon TDR (JP Cussonneau):
-*. MaxBendingMomentum to make both a segment and a track (default 500)
-*. MaxChi2 per degree of freedom to make a track (default 100)
-*. MinBendingMomentum used also to make a track
-   and not only a segment (default 3)
-*. wider roads for track search in stations 1 to 3
-*. extrapolation to actual Z instead of Z(chamber) in FollowTracks
-*. in track fit:
-   - limits on parameters X and Y (+/-500)
-   - covariance matrices in double precision
-   - normalization of covariance matrices before inversion
-   - suppression of Minuit printouts
-*. correction against memory leak (delete extrapHit) in FollowTracks
-*. RMax to 10 degrees with Z(chamber) instead of fixed values;
-   RMin and Rmax cuts suppressed in NewHitForRecFromGEANT,
-   because useless with realistic geometry
-
-Revision 1.7  2000/09/19 15:50:46  gosset
-TrackChi2MCS function: covariance matrix better calculated,
-taking into account missing planes...
-
-Revision 1.6  2000/07/20 12:45:27  gosset
-New "EventReconstructor..." structure,
-       hopefully more adapted to tree/streamer.
-"AliMUONEventReconstructor::RemoveDoubleTracks"
-       to keep only one track among similar ones.
-
-Revision 1.5  2000/07/18 16:04:06  gosset
-AliMUONEventReconstructor package:
-* a few minor modifications and more comments
-* a few corrections
-  * right sign for Z of raw clusters
-  * right loop over chambers inside station
-  * symmetrized covariance matrix for measurements (TrackChi2MCS)
-  * right sign of charge in extrapolation (ExtrapToZ)
-  * right zEndAbsorber for Branson correction below 3 degrees
-* use of TVirtualFitter instead of TMinuit for AliMUONTrack::Fit
-* no parameter for AliMUONTrack::Fit() but more fit parameters in Track object
-
-Revision 1.4  2000/06/30 10:15:48  gosset
-Changes to EventReconstructor...:
-precision fit with multiple Coulomb scattering;
-extrapolation to vertex with Branson correction in absorber (JPC)
-
-Revision 1.3  2000/06/25 13:23:28  hristov
-stdlib.h needed for non-Linux compilation
-
-Revision 1.2  2000/06/15 07:58:48  morsch
-Code from MUON-dev joined
-
-Revision 1.1.2.3  2000/06/12 10:11:34  morsch
-Dummy copy constructor and assignment operator added
-
-Revision 1.1.2.2  2000/06/09 12:58:05  gosset
-Removed comment beginnings in Log sections of .cxx files
-Suppressed most violations of coding rules
-
-Revision 1.1.2.1  2000/06/07 14:44:53  gosset
-Addition of files for track reconstruction in C++
-*/
+/* $Id$ */
 
 ///////////////////////////////////////////////////
 //
@@ -106,10 +25,9 @@ Addition of files for track reconstruction in C++
 //
 ///////////////////////////////////////////////////
 
-#include <Riostream.h> // for cout
 #include <stdlib.h> // for exit()
 
-#include <TClonesArray.h>
+#include <Riostream.h> // for cout
 #include <TMath.h>
 #include <TMatrixD.h>
 #include <TObjArray.h>
@@ -120,6 +38,8 @@ Addition of files for track reconstruction in C++
 #include "AliMUONSegment.h" 
 #include "AliMUONTrack.h"
 #include "AliMUONTrackHit.h"
+#include "AliMUONTriggerTrack.h"
+#include "AliMUONConstants.h"
 
 // Functions to be minimized with Minuit
 void TrackChi2(Int_t &NParam, Double_t *Gradient, Double_t &Chi2, Double_t *Param, Int_t Flag);
@@ -133,8 +53,20 @@ ClassImp(AliMUONTrack) // Class implementation in ROOT context
 
 TVirtualFitter* AliMUONTrack::fgFitter = NULL; 
 
+  //__________________________________________________________________________
+AliMUONTrack::AliMUONTrack()
+  : TObject() 
+{
+  // Default constructor
+  fgFitter = 0;
+  fEventReconstructor = 0;
+  fTrackHitsPtr = 0;
+  fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);  
+}
+
   //__________________________________________________________________________
 AliMUONTrack::AliMUONTrack(AliMUONSegment* BegSegment, AliMUONSegment* EndSegment, AliMUONEventReconstructor* EventReconstructor)
+  : TObject()
 {
   // Constructor from two Segment's
   fEventReconstructor = EventReconstructor; // link back to EventReconstructor
@@ -145,16 +77,20 @@ AliMUONTrack::AliMUONTrack(AliMUONSegment* BegSegment, AliMUONSegment* EndSegmen
   AddSegment(EndSegment); // add hits from EndSegment
   fTrackHitsPtr->Sort(); // sort TrackHits according to increasing Z
   SetTrackParamAtVertex(); // set track parameters at vertex
+  fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);
   // set fit conditions...
   fFitMCS = 0;
   fFitNParam = 3;
   fFitStart = 1;
   fFitFMin = -1.0;
+  fMatchTrigger = kFALSE;
+  fChi2MatchTrigger = 0;
   return;
 }
 
   //__________________________________________________________________________
 AliMUONTrack::AliMUONTrack(AliMUONSegment* Segment, AliMUONHitForRec* HitForRec, AliMUONEventReconstructor* EventReconstructor)
+  : TObject()
 {
   // Constructor from one Segment and one HitForRec
   fEventReconstructor = EventReconstructor; // link back to EventReconstructor
@@ -165,11 +101,14 @@ AliMUONTrack::AliMUONTrack(AliMUONSegment* Segment, AliMUONHitForRec* HitForRec,
   AddHitForRec(HitForRec); // add HitForRec
   fTrackHitsPtr->Sort(); // sort TrackHits according to increasing Z
   SetTrackParamAtVertex(); // set track parameters at vertex
+  fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);
   // set fit conditions...
   fFitMCS = 0;
   fFitNParam = 3;
   fFitStart = 1;
   fFitFMin = -1.0;
+  fMatchTrigger = kFALSE;
+  fChi2MatchTrigger = 0;
   return;
 }
 
@@ -181,19 +120,61 @@ AliMUONTrack::~AliMUONTrack()
     delete fTrackHitsPtr; // delete the TObjArray of pointers to TrackHit's
     fTrackHitsPtr = NULL;
   }
+  
+  if (fTrackParamAtHit) {
+    // delete the TClonesArray of pointers to TrackParam
+    delete fTrackParamAtHit;
+    fTrackParamAtHit = NULL;
+  }
 }
 
   //__________________________________________________________________________
-AliMUONTrack::AliMUONTrack (const AliMUONTrack& MUONTrack)
+AliMUONTrack::AliMUONTrack (const AliMUONTrack& theMUONTrack)
+  :  TObject(theMUONTrack)
 {
-// Dummy copy constructor
+  //fEventReconstructor = new AliMUONEventReconstructor(*MUONTrack.fEventReconstructor);
+                               // is it right ?
+                              // NO, because it would use dummy copy constructor
+                              // and AliMUONTrack is not the owner of its EventReconstructor 
+  fEventReconstructor = theMUONTrack.fEventReconstructor;
+  fTrackParamAtVertex = theMUONTrack.fTrackParamAtVertex;
+  fTrackHitsPtr     =  new TObjArray(*theMUONTrack.fTrackHitsPtr);  // is it right ?
+  fTrackParamAtHit  =  new TClonesArray(*theMUONTrack.fTrackParamAtHit);
+  fNTrackHits       =  theMUONTrack.fNTrackHits;
+  fFitMCS           =  theMUONTrack.fFitMCS;
+  fFitNParam        =  theMUONTrack.fFitNParam;
+  fFitFMin          =  theMUONTrack.fFitFMin;
+  fFitStart         =  theMUONTrack.fFitStart;
+  fMatchTrigger     =  theMUONTrack.fMatchTrigger;
+  fChi2MatchTrigger =  theMUONTrack.fChi2MatchTrigger;
 }
 
   //__________________________________________________________________________
-AliMUONTrack & AliMUONTrack::operator=(const AliMUONTrack& MUONTrack)
+AliMUONTrack & AliMUONTrack::operator=(const AliMUONTrack& theMUONTrack)
 {
-// Dummy assignment operator
+
+  // check assignement to self
+  if (this == &theMUONTrack)
     return *this;
+
+  // base class assignement
+  TObject::operator=(theMUONTrack);
+
+  // fEventReconstructor =  new AliMUONEventReconstructor(*MUONTrack.fEventReconstructor); // is it right ?
+                               // is it right ? NO because it would use dummy copy constructor
+  fEventReconstructor =  theMUONTrack.fEventReconstructor;
+  fTrackParamAtVertex =  theMUONTrack.fTrackParamAtVertex;
+  fTrackHitsPtr       =  new TObjArray(*theMUONTrack.fTrackHitsPtr); // is it right ?
+  fTrackParamAtHit    =  new TClonesArray(*theMUONTrack.fTrackParamAtHit);
+  fNTrackHits         =  theMUONTrack.fNTrackHits;
+  fFitMCS             =  theMUONTrack.fFitMCS;
+  fFitNParam          =  theMUONTrack.fFitNParam;
+  fFitFMin            =  theMUONTrack.fFitFMin;
+  fFitStart           =  theMUONTrack.fFitStart;
+  fMatchTrigger       =  theMUONTrack.fMatchTrigger;
+  fChi2MatchTrigger   =  theMUONTrack.fChi2MatchTrigger;
+
+  return *this;
 }
 
   //__________________________________________________________________________
@@ -301,7 +282,7 @@ void AliMUONTrack::RecursiveDump(void) const
 }
 
   //__________________________________________________________________________
-Int_t AliMUONTrack::HitsInCommon(AliMUONTrack* Track)
+Int_t AliMUONTrack::HitsInCommon(AliMUONTrack* Track) const
 {
   // Returns the number of hits in common
   // between the current track ("this")
@@ -324,6 +305,47 @@ Int_t AliMUONTrack::HitsInCommon(AliMUONTrack* Track)
   return hitsInCommon;
 }
 
+  //__________________________________________________________________________
+void AliMUONTrack::MatchTriggerTrack(TClonesArray *triggerTrackArray)
+{
+  // Match this track with one trigger track if possible
+  AliMUONTrackParam *trackParam; 
+  AliMUONTriggerTrack *triggerTrack;
+  Double_t xTrack, yTrack, ySlopeTrack, dTrigTrackMin2, dTrigTrack2;
+  Double_t nSigmaCut2;
+
+  Double_t distSigma[3]={1,1,0.02}; // sigma of distributions (trigger-track) X,Y,slopeY
+  Double_t distTriggerTrack[3] = {0,0,0};
+
+  fMatchTrigger = kFALSE;
+  fChi2MatchTrigger = 0;
+
+  trackParam = (AliMUONTrackParam*) fTrackParamAtHit->Last(); 
+  trackParam->ExtrapToZ(AliMUONConstants::DefaultChamberZ(10)); // extrap to 1st trigger chamber
+
+  nSigmaCut2 =  fEventReconstructor->GetMaxSigma2Distance(); // nb of sigma**2 for cut
+  xTrack = trackParam->GetNonBendingCoor();
+  yTrack = trackParam->GetBendingCoor();
+  ySlopeTrack = trackParam->GetBendingSlope();
+  dTrigTrackMin2 = 999;
+  
+  triggerTrack = (AliMUONTriggerTrack*) triggerTrackArray->First();
+  while(triggerTrack){
+    distTriggerTrack[0] = (triggerTrack->GetX11()-xTrack)/distSigma[0];
+    distTriggerTrack[1] = (triggerTrack->GetY11()-yTrack)/distSigma[1];
+    distTriggerTrack[2] = (TMath::Tan(triggerTrack->GetThetay())-ySlopeTrack)/distSigma[2];
+    dTrigTrack2 = 0;
+    for (Int_t iVar = 0; iVar < 3; iVar++)
+      dTrigTrack2 += distTriggerTrack[iVar]*distTriggerTrack[iVar];
+    if (dTrigTrack2 < dTrigTrackMin2 && dTrigTrack2 < nSigmaCut2) {
+      dTrigTrackMin2 = dTrigTrack2;
+      fMatchTrigger = kTRUE;
+      fChi2MatchTrigger =  dTrigTrack2/3.; // Normalized Chi2, 3 variables (X,Y,slopeY)
+    }
+    triggerTrack = (AliMUONTriggerTrack*) triggerTrackArray->After(triggerTrack);
+  }
+
+}
   //__________________________________________________________________________
 void AliMUONTrack::Fit()
 {
@@ -347,8 +369,11 @@ void AliMUONTrack::Fit()
   // choice of function to be minimized according to fFitMCS
   if (fFitMCS == 0) fgFitter->SetFCN(TrackChi2);
   else fgFitter->SetFCN(TrackChi2MCS);
+  // Switch off printout
   arg[0] = -1;
   fgFitter->ExecuteCommand("SET PRINT", arg, 1); // More printing !!!!
+  // No warnings
+  fgFitter->ExecuteCommand("SET NOW", arg, 0);
   // Parameters according to "fFitStart"
   // (should be a function to be used at every place where needed ????)
   if (fFitStart == 0) trackParam = &fTrackParamAtVertex;
@@ -380,7 +405,7 @@ void AliMUONTrack::Fit()
   // minimization
   fgFitter->ExecuteCommand("MINIMIZE", arg, 0);
   // exit from Minuit
-  fgFitter->ExecuteCommand("EXIT", arg, 0); // necessary ????
+  //  fgFitter->ExecuteCommand("EXIT", arg, 0); // necessary ????
   // get results into "invBenP", "benC", "nonBenC" ("x", "y")
   fgFitter->GetParameter(0, parName, invBenP, errorParam, lower, upper);
   fgFitter->GetParameter(1, parName, benC, errorParam, lower, upper);
@@ -482,7 +507,7 @@ void AliMUONTrack::SetTrackParamAtVertex()
 }
 
   //__________________________________________________________________________
-void TrackChi2(Int_t &NParam, Double_t *Gradient, Double_t &Chi2, Double_t *Param, Int_t Flag)
+void TrackChi2(Int_t &NParam, Double_t * /*Gradient*/, Double_t &Chi2, Double_t *Param, Int_t /*Flag*/)
 {
   // Return the "Chi2" to be minimized with Minuit for track fitting,
   // with "NParam" parameters
@@ -533,7 +558,7 @@ void TrackChi2(Int_t &NParam, Double_t *Gradient, Double_t &Chi2, Double_t *Para
 }
 
   //__________________________________________________________________________
-void TrackChi2MCS(Int_t &NParam, Double_t *Gradient, Double_t &Chi2, Double_t *Param, Int_t Flag)
+void TrackChi2MCS(Int_t &NParam, Double_t * /*Gradient*/, Double_t &Chi2, Double_t *Param, Int_t /*Flag*/)
 {
   // Return the "Chi2" to be minimized with Minuit for track fitting,
   // with "NParam" parameters