]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDtrackletGTU.cxx
- add protection against invalid sector/stack information in on-line track matching
[u/mrichter/AliRoot.git] / TRD / AliTRDtrackletGTU.cxx
index 94cb4dde88e41992041bded00dd27f41566595cf..95522e33edd7b0d947b6ef3eee6cb0d174368884 100644 (file)
@@ -28,7 +28,6 @@
 
 #include "AliTRDtrackletGTU.h"
 #include "AliTRDtrackletWord.h"
-#include "AliTRDmcmTracklet.h"
 #include "AliTRDtrackletMCM.h"
 #include "AliLog.h"
 #include "AliTRDgtuParam.h"
 
 ClassImp(AliTRDtrackletGTU)
 
-AliTRDtrackletBase* AliTRDtrackletGTU::fgkDummyTracklet = new AliTRDtrackletWord(0);
+AliTRDtrackletBase* AliTRDtrackletGTU::fgkDummyTracklet = 0x0;
 
 AliTRDtrackletGTU::AliTRDtrackletGTU() :
   AliTRDtrackletBase(),
   fGtuParam(AliTRDgtuParam::Instance()),
-  fTracklet(0x0), //fgkDummyTracklet), 
-  fSubChannel(0x0),
+  fTracklet(0x0),
+  fTrackletESD(0x0),
+  fMCMtrackletIndex(-1),
   fAssignedZ(kFALSE),
   fAlpha(0),
   fYProj(0),
@@ -52,16 +52,20 @@ AliTRDtrackletGTU::AliTRDtrackletGTU() :
 {
   // ctor for any tracklet deriving from AliTRDtrackletBase
 
-  fSubChannel = new Int_t[fGtuParam->GetNZChannels()];
-  for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++) 
+  if (!fgkDummyTracklet)
+    fgkDummyTracklet = new AliTRDtrackletWord(0);
+  fTracklet = fgkDummyTracklet;
+
+  for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++)
     fSubChannel[zch] = 0;
 }
 
 AliTRDtrackletGTU::AliTRDtrackletGTU(AliTRDtrackletBase *tracklet) :
   AliTRDtrackletBase(*tracklet),
   fGtuParam(AliTRDgtuParam::Instance()),
-  fTracklet(0x0), 
-  fSubChannel(0x0),
+  fTracklet(0x0),
+  fTrackletESD(0x0),
+  fMCMtrackletIndex(-1),
   fAssignedZ(kFALSE),
   fAlpha(0),
   fYProj(0),
@@ -70,38 +74,65 @@ AliTRDtrackletGTU::AliTRDtrackletGTU(AliTRDtrackletBase *tracklet) :
 {
   // ctor for any tracklet deriving from AliTRDtrackletBase
 
-  fSubChannel = new Int_t[fGtuParam->GetNZChannels()];
-  for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++) 
+  if (!fgkDummyTracklet) fgkDummyTracklet = new AliTRDtrackletWord(0);
+  fTracklet = fgkDummyTracklet;
+
+  for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++)
     fSubChannel[zch] = 0;
   fTracklet = tracklet;
   if ( fTracklet->IsA() == TClass::GetClass("AliTRDtrackletMCM")) {
-      AliInfo(Form("label from mcm tracklet: %i", ((AliTRDtrackletMCM*) fTracklet)->GetLabel()));
+      AliDebug(5,Form("label from mcm tracklet: %i", ((AliTRDtrackletMCM*) fTracklet)->GetLabel()));
   }
 }
 
+AliTRDtrackletGTU::AliTRDtrackletGTU(AliESDTrdTracklet *tracklet) :
+  AliTRDtrackletBase(),
+  fGtuParam(AliTRDgtuParam::Instance()),
+  fTracklet(0x0),
+  fTrackletESD(tracklet),
+  fMCMtrackletIndex(-1),  // has to be set via SetMCMtrackletIndex() separately
+  fAssignedZ(kFALSE),
+  fAlpha(0),
+  fYProj(0),
+  fYPrime(0),
+  fIndex(0)
+{
+  // ctor for an AliESDTrdTracklet
+
+  if (!fgkDummyTracklet) fgkDummyTracklet = new AliTRDtrackletWord(0);
+  fTracklet = fgkDummyTracklet;
+
+  for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++)
+    fSubChannel[zch] = 0;
+}
+
 AliTRDtrackletGTU::AliTRDtrackletGTU(const AliTRDtrackletGTU& tracklet) :
   AliTRDtrackletBase(tracklet),
   fGtuParam(AliTRDgtuParam::Instance()),
-  fTracklet(tracklet.fTracklet), 
-  fSubChannel(0x0),
+  fTracklet(tracklet.fTracklet),
+  fTrackletESD(tracklet.fTrackletESD),
+  fMCMtrackletIndex(tracklet.fMCMtrackletIndex),
   fAssignedZ(tracklet.fAssignedZ),
   fAlpha(tracklet.fAlpha),
   fYProj(tracklet.fYProj),
-  fYPrime(tracklet.fYPrime), 
+  fYPrime(tracklet.fYPrime),
   fIndex(tracklet.fIndex)
 {
   // copy ctor
 
-  fSubChannel = new Int_t[fGtuParam->GetNZChannels()];
-  for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++) 
+  for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++)
     fSubChannel[zch] = tracklet.fSubChannel[zch];
 }
 
 AliTRDtrackletGTU& AliTRDtrackletGTU::operator=(const AliTRDtrackletGTU &rhs)
 {
+  // assignment operator
+
   if (&rhs != this) {
     fTracklet = rhs.fTracklet;
-    for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++) 
+    fTrackletESD = rhs.fTrackletESD;
+    fMCMtrackletIndex = rhs.fMCMtrackletIndex;
+    for (Int_t zch = 0; zch < fGtuParam->GetNZChannels(); zch++)
       fSubChannel[zch] = rhs.fSubChannel[zch];
     fIndex = rhs.fIndex;
     fYPrime = rhs.fYPrime;
@@ -109,70 +140,23 @@ AliTRDtrackletGTU& AliTRDtrackletGTU::operator=(const AliTRDtrackletGTU &rhs)
     fAlpha = rhs.fAlpha;
     fAssignedZ = rhs.fAssignedZ;
   }
-  
+
   return *this;
 }
 
-AliTRDtrackletGTU::~AliTRDtrackletGTU() 
+AliTRDtrackletGTU::~AliTRDtrackletGTU()
 {
   // dtor
-  if (fSubChannel)
-    delete [] fSubChannel; 
-  fTracklet = 0x0;
-}
-
-Int_t AliTRDtrackletGTU::Compare(const TObject *o) const {
-  // sorting w. r. t. Z, Y if no z-channel assigned (as needed in input unit)
-  // otherwise w. r. t. Z, Y_proj
-  // must be changed to Z-channel, Y_proj
-  // will be changed
-
-  if (!o) 
-    return 0;
-
-  if (!o->InheritsFrom("AliTRDtrackletGTU")) {
-      AliError("Cannot compare to object not deriving from AliTRDtrackletGTU");
-      return 0;
-  }
-
-  if (!fAssignedZ) {
-    if ( GetZbin() < ((AliTRDtrackletGTU*) o)->GetZbin()) 
-      return -1;
-    else if (GetZbin() > ((AliTRDtrackletGTU*) o)->GetZbin()) 
-      return 1;
-    else 
-      if (GetYbin() < ((AliTRDtrackletGTU*) o)->GetYbin())
-       return -1;
-      else if (GetYbin() > ((AliTRDtrackletGTU*) o)->GetYbin())
-       return 1;
-      else 
-       return 0;
-  }
-  else {
-    // sorting should be according to zsubindex, not to Z !!!
-    // therefore this depends on the zch
-    if (GetZbin() < ((AliTRDtrackletGTU*) o)->GetZbin()) 
-      return -1;
-    else if (GetZbin() > ((AliTRDtrackletGTU*) o)->GetZbin()) 
-      return 1;
-    else 
-      if (GetYProj() < ((AliTRDtrackletGTU*) o)->GetYProj())
-       return -1;
-      else if (GetYProj() > ((AliTRDtrackletGTU*) o)->GetYProj())
-       return 1;
-      else 
-       return 0;
-  }
 }
 
-void AliTRDtrackletGTU::SetSubChannel(Int_t zch, Int_t subch) 
+void AliTRDtrackletGTU::SetSubChannel(Int_t zch, Int_t subch)
 {
   // set the subchannel in the given z-channel
   fAssignedZ = kTRUE;
   fSubChannel[zch] = subch;
 }
 
-Int_t AliTRDtrackletGTU::GetSubChannel(Int_t zch) 
+Int_t AliTRDtrackletGTU::GetSubChannel(Int_t zch) const
 {
   // get the subchannel in the given z-channel
   return fSubChannel[zch];
@@ -180,31 +164,35 @@ Int_t AliTRDtrackletGTU::GetSubChannel(Int_t zch)
 
 Int_t AliTRDtrackletGTU::GetLabel() const
 {
-    if ( fTracklet->IsA() == TClass::GetClass("AliTRDtrackletMCM"))
-       return ((AliTRDtrackletMCM*) fTracklet)->GetLabel();
-    else
-       return -1;
+  // get the MC label for the tracklet, -1 if none
+
+  if (fTrackletESD)
+    return fTrackletESD->GetLabel();
+  else if ( fTracklet->IsA() == TClass::GetClass("AliTRDtrackletMCM"))
+    return ((AliTRDtrackletMCM*) fTracklet)->GetLabel();
+  else
+    return -1;
 }
 
 /*
-Float_t AliTRDtrackletGTU::GetPhysX(Int_t layer) 
+Float_t AliTRDtrackletGTU::GetPhysX(Int_t layer)
 {
   // get the x-position (in the local system) assuming the tracklet is in the given layer
   return fGtuParam->GetGeo()->GetTime0(layer);
 }
 
-Float_t AliTRDtrackletGTU::GetPhysY() 
+Float_t AliTRDtrackletGTU::GetPhysY()
 {
-  // 
-  return GetYbin() * 0.0160; 
+  //
+  return GetYbin() * 0.0160;
 }
 
-Float_t AliTRDtrackletGTU::GetPhysAlpha() 
+Float_t AliTRDtrackletGTU::GetPhysAlpha()
 {
   return GetAlpha() * 0.01; // wrong factor!
 }
 
-Float_t AliTRDtrackletGTU::GetPhysZ(Int_t stack, Int_t layer) 
+Float_t AliTRDtrackletGTU::GetPhysZ(Int_t stack, Int_t layer)
 {
   return fGtuParam->GetGeo()->GetPadPlane(layer, stack)->GetRowPos(GetZbin()); // not the middle of a pad!
 }