]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONTrack.cxx
Additional protection in case of negative indexes. More investigation is needed
[u/mrichter/AliRoot.git] / MUON / AliMUONTrack.cxx
index e6a34af93c1fa4401c00f3ffe5958fce81f4179c..527ac5a232fde5d0cd8aef9a5fb8841773a00127 100644 (file)
 //
 ///////////////////////////////////////////////////
 
-#include <stdlib.h> // for exit()
+#include "AliMUONTrack.h"
+
+#include "AliMUONTrackReconstructor.h" 
+#include "AliMUONHitForRec.h" 
+#include "AliMUONSegment.h" 
+#include "AliMUONTrackHit.h"
+#include "AliMUONTriggerTrack.h"
+#include "AliMUONConstants.h"
+
+#include "AliLog.h"
 
 #include <Riostream.h> // for cout
 #include <TMath.h>
 #include <TObjArray.h>
 #include <TVirtualFitter.h>
 
-#include "AliMUONEventReconstructor.h" 
-#include "AliMUONHitForRec.h" 
-#include "AliMUONSegment.h" 
-#include "AliMUONTrack.h"
-#include "AliMUONTrackHit.h"
-#include "AliMUONTriggerTrack.h"
-#include "AliMUONConstants.h"
+#include <stdlib.h> // for exit()
 
 // Functions to be minimized with Minuit
 void TrackChi2(Int_t &NParam, Double_t *Gradient, Double_t &Chi2, Double_t *Param, Int_t Flag);
@@ -49,17 +52,17 @@ void mnvertLocal(Double_t* a, Int_t l, Int_t m, Int_t n, Int_t& ifail);
 
 Double_t MultipleScatteringAngle2(AliMUONTrackHit *TrackHit);
 
-ClassImp(AliMUONTrack) // Class implementation in ROOT context
-
 TVirtualFitter* AliMUONTrack::fgFitter = NULL; 
 
-  //__________________________________________________________________________
+ClassImp(AliMUONTrack) // Class implementation in ROOT context
+
+//__________________________________________________________________________
 AliMUONTrack::AliMUONTrack()
   : TObject() 
 {
   // Default constructor
   fgFitter = 0;
-  fEventReconstructor = 0;
+  fTrackReconstructor = 0;
   fTrackHitsPtr = new TObjArray(10);
   fTrackParamAtHit = new TClonesArray("AliMUONTrackParam",10);  
   fHitForRecAtHit = new TClonesArray("AliMUONHitForRec",10); 
@@ -67,18 +70,20 @@ AliMUONTrack::AliMUONTrack()
 }
 
   //__________________________________________________________________________
-AliMUONTrack::AliMUONTrack(AliMUONSegment* BegSegment, AliMUONSegment* EndSegment, AliMUONEventReconstructor* EventReconstructor)
+AliMUONTrack::AliMUONTrack(AliMUONSegment* BegSegment, AliMUONSegment* EndSegment, AliMUONTrackReconstructor* TrackReconstructor)
   : TObject()
 {
   // Constructor from two Segment's
-  fEventReconstructor = EventReconstructor; // link back to EventReconstructor
+  fTrackReconstructor = TrackReconstructor; // link back to TrackReconstructor
   // memory allocation for the TObjArray of pointers to reconstructed TrackHit's
   fTrackHitsPtr = new TObjArray(10);
   fNTrackHits = 0;
-  AddSegment(BegSegment); // add hits from BegSegment
-  AddSegment(EndSegment); // add hits from EndSegment
-  fTrackHitsPtr->Sort(); // sort TrackHits according to increasing Z
-  SetTrackParamAtVertex(); // set track parameters at vertex
+  if (BegSegment) { //AZ
+    AddSegment(BegSegment); // add hits from BegSegment
+    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);
   fHitForRecAtHit = new TClonesArray("AliMUONHitForRec",10);
   // set fit conditions...
@@ -93,11 +98,11 @@ AliMUONTrack::AliMUONTrack(AliMUONSegment* BegSegment, AliMUONSegment* EndSegmen
 }
 
   //__________________________________________________________________________
-AliMUONTrack::AliMUONTrack(AliMUONSegment* Segment, AliMUONHitForRec* HitForRec, AliMUONEventReconstructor* EventReconstructor)
+AliMUONTrack::AliMUONTrack(AliMUONSegment* Segment, AliMUONHitForRec* HitForRec, AliMUONTrackReconstructor* TrackReconstructor)
   : TObject()
 {
   // Constructor from one Segment and one HitForRec
-  fEventReconstructor = EventReconstructor; // link back to EventReconstructor
+  fTrackReconstructor = TrackReconstructor; // link back to TrackReconstructor
   // memory allocation for the TObjArray of pointers to reconstructed TrackHit's
   fTrackHitsPtr = new TObjArray(10);
   fNTrackHits = 0;
@@ -123,7 +128,8 @@ AliMUONTrack::~AliMUONTrack()
 {
   // Destructor
   if (fTrackHitsPtr) {
-    delete fTrackHitsPtr; // delete the TObjArray of pointers to TrackHit's
+    // delete the TObjArray of pointers to TrackHit's   
+    delete fTrackHitsPtr; 
     fTrackHitsPtr = NULL;
   }
   
@@ -144,11 +150,11 @@ AliMUONTrack::~AliMUONTrack()
 AliMUONTrack::AliMUONTrack (const AliMUONTrack& theMUONTrack)
   :  TObject(theMUONTrack)
 {
-  //fEventReconstructor = new AliMUONEventReconstructor(*MUONTrack.fEventReconstructor);
+  //fTrackReconstructor = new AliMUONTrackReconstructor(*MUONTrack.fTrackReconstructor);
                                // is it right ?
                               // NO, because it would use dummy copy constructor
-                              // and AliMUONTrack is not the owner of its EventReconstructor 
-  fEventReconstructor = theMUONTrack.fEventReconstructor;
+                              // and AliMUONTrack is not the owner of its TrackReconstructor 
+  fTrackReconstructor = theMUONTrack.fTrackReconstructor;
   fTrackParamAtVertex = theMUONTrack.fTrackParamAtVertex;
 
  // necessary to make a copy of the objects and not only the pointers in TObjArray.
@@ -157,6 +163,7 @@ AliMUONTrack::AliMUONTrack (const AliMUONTrack& theMUONTrack)
     AliMUONTrackHit *trackHit = new AliMUONTrackHit(*(AliMUONTrackHit*)(theMUONTrack.fTrackHitsPtr)->At(index));
     fTrackHitsPtr->Add(trackHit);
   }
+  fTrackHitsPtr->SetOwner(); // nedeed for deleting TClonesArray
 
   // necessary to make a copy of the objects and not only the pointers in TClonesArray.
   fTrackParamAtHit  =  new TClonesArray("AliMUONTrackParam",10);
@@ -193,9 +200,10 @@ AliMUONTrack & AliMUONTrack::operator=(const AliMUONTrack& theMUONTrack)
   // 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;
+  // fTrackReconstructor =  new AliMUONTrackReconstructor(*MUONTrack.fTrackReconstructor); 
+  // is it right ?
+  // is it right ? NO because it would use dummy copy constructor
+  fTrackReconstructor =  theMUONTrack.fTrackReconstructor;
   fTrackParamAtVertex =  theMUONTrack.fTrackParamAtVertex;
 
  // necessary to make a copy of the objects and not only the pointers in TObjArray.
@@ -204,6 +212,7 @@ AliMUONTrack & AliMUONTrack::operator=(const AliMUONTrack& theMUONTrack)
     AliMUONTrackHit *trackHit = new AliMUONTrackHit(*(AliMUONTrackHit*)(theMUONTrack.fTrackHitsPtr)->At(index));
     fTrackHitsPtr->Add(trackHit);
   }
+  fTrackHitsPtr->SetOwner();  // nedeed for deleting TClonesArray
 
   // necessary to make a copy of the objects and not only the pointers in TClonesArray.
   fTrackParamAtHit  =  new TClonesArray("AliMUONTrackParam",10);
@@ -238,7 +247,7 @@ void AliMUONTrack::Remove()
   // and corresponding track hits from array of track hits.
   // Compress the TClonesArray it belongs to.
   AliMUONTrackHit *nextTrackHit;
-  AliMUONEventReconstructor *eventRec = this->fEventReconstructor;
+  AliMUONTrackReconstructor *eventRec = this->fTrackReconstructor;
   TClonesArray *trackHitsPtr = eventRec->GetRecTrackHitsPtr();
   // Loop over all track hits of track
   AliMUONTrackHit *trackHit = (AliMUONTrackHit*) fTrackHitsPtr->First();
@@ -416,7 +425,7 @@ void AliMUONTrack::MatchTriggerTrack(TClonesArray *triggerTrackArray)
   trackParam = *((AliMUONTrackParam*) fTrackParamAtHit->Last()); 
   trackParam.ExtrapToZ(AliMUONConstants::DefaultChamberZ(10)); // extrap to 1st trigger chamber
 
-  nSigmaCut2 =  fEventReconstructor->GetMaxSigma2Distance(); // nb of sigma**2 for cut
+  nSigmaCut2 =  fTrackReconstructor->GetMaxSigma2Distance(); // nb of sigma**2 for cut
   xTrack = trackParam.GetNonBendingCoor();
   yTrack = trackParam.GetBendingCoor();
   ySlopeTrack = trackParam.GetBendingSlope();
@@ -535,13 +544,14 @@ void AliMUONTrack::AddHitForRec(AliMUONHitForRec* HitForRec)
   // Add HitForRec to the track:
   // actual TrackHit into TClonesArray of TrackHit's for the event;
   // pointer to actual TrackHit in TObjArray of pointers to TrackHit's for the track
-  TClonesArray *recTrackHitsPtr = this->fEventReconstructor->GetRecTrackHitsPtr();
-  Int_t eventTrackHits = this->fEventReconstructor->GetNRecTrackHits();
+  TClonesArray *recTrackHitsPtr = this->fTrackReconstructor->GetRecTrackHitsPtr();
+  Int_t eventTrackHits = this->fTrackReconstructor->GetNRecTrackHits();
   // event
   AliMUONTrackHit* trackHit =
     new ((*recTrackHitsPtr)[eventTrackHits]) AliMUONTrackHit(HitForRec);
-  this->fEventReconstructor->SetNRecTrackHits(eventTrackHits + 1);
+  this->fTrackReconstructor->SetNRecTrackHits(eventTrackHits + 1);
   // track
+  if (fTrackHitsPtr->IsOwner()) AliFatal("fTrackHitsPtr is owner");
   fTrackHitsPtr->Add(trackHit);
   fNTrackHits++;
 }
@@ -583,12 +593,12 @@ void AliMUONTrack::SetTrackParamAtVertex()
     firstHit->GetBendingCoor() - bendingSlope * firstHit->GetZ(); // same if from firstHit and  lastHit ????
   // signed bending momentum
   Double_t signedBendingMomentum =
-    fEventReconstructor->GetBendingMomentumFromImpactParam(impactParam);
+    fTrackReconstructor->GetBendingMomentumFromImpactParam(impactParam);
   trackParam->SetInverseBendingMomentum(1.0 / signedBendingMomentum);
   // bending slope at vertex
   trackParam->
     SetBendingSlope(bendingSlope +
-                   impactParam / fEventReconstructor->GetSimpleBPosition());
+                   impactParam / fTrackReconstructor->GetSimpleBPosition());
   // non bending slope
   Double_t nonBendingSlope =
     (firstHit->GetNonBendingCoor() - lastHit->GetNonBendingCoor()) / deltaZ;
@@ -825,7 +835,7 @@ Double_t MultipleScatteringAngle2(AliMUONTrackHit *TrackHit)
   // thickness in radiation length for the current track,
   // taking local angle into account
   radiationLength =
-    trackBeingFitted->GetEventReconstructor()->GetChamberThicknessInX0() *
+    trackBeingFitted->GetTrackReconstructor()->GetChamberThicknessInX0() *
     TMath::Sqrt(1.0 +
                slopeBending * slopeBending + slopeNonBending * slopeNonBending);
   inverseBendingMomentum2 =