]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDtrackGTU.cxx
Macros for Phi analysis in pPb (Ajay)
[u/mrichter/AliRoot.git] / TRD / AliTRDtrackGTU.cxx
index 90d32ad81207cbc98a6e0a08f11fd5b6566f3c1c..985b0c5a470070452af9f5e0d3e63c2c74ca4b88 100644 (file)
@@ -26,6 +26,7 @@
 #include "TObject.h"
 #include "TObjArray.h"
 #include "TClass.h"
+#include "TMath.h"
 #include "TH1F.h"
 
 #include "AliESDTrdTrack.h"
@@ -62,6 +63,80 @@ AliTRDtrackGTU::AliTRDtrackGTU() :
 //  fTracklets->BypassStreamer(kFALSE);
 }
 
+AliTRDtrackGTU::AliTRDtrackGTU(const AliTRDtrackGTU &rhs) :
+  TObject(),
+  fStack(rhs.fStack),
+  fSector(rhs.fSector),
+  fPID(rhs.fPID),
+  fTracklets(0x0),
+  fTrackletMask(rhs.fTrackletMask),
+  fNTracklets(rhs.fNTracklets),
+  fRefLayerIdx(rhs.fRefLayerIdx),
+  fZChannel(rhs.fZChannel),
+  fZSubChannel(rhs.fZSubChannel),
+  fA(rhs.fA),
+  fB(rhs.fB),
+  fC(rhs.fC),
+  fLabel(rhs.fLabel)
+{
+  fTracklets = new TClonesArray("AliTRDtrackletGTU", 6);
+  for (Int_t iTracklet = 0; iTracklet < 6; iTracklet++)
+    new ((*fTracklets)[iTracklet]) AliTRDtrackletGTU(*((AliTRDtrackletGTU*)(*(rhs.fTracklets))[iTracklet]));
+}
+
+AliTRDtrackGTU& AliTRDtrackGTU::operator=(const AliTRDtrackGTU &rhs)
+{
+  if (&rhs != this) {
+    TObject::operator=(rhs);
+    fStack         = rhs.fStack;
+    fSector        = rhs.fSector;
+    fPID           = rhs.fPID;
+    fTrackletMask  = rhs.fTrackletMask;
+    fNTracklets    = rhs.fNTracklets;
+    fRefLayerIdx   = rhs.fRefLayerIdx;
+    fZChannel      = rhs.fZChannel;
+    fZSubChannel   = rhs.fZSubChannel;
+    fA             = rhs.fA;
+    fB             = rhs.fB;
+    fC             = rhs.fC;
+    fLabel         = rhs.fLabel;
+    for (Int_t iTracklet = 0; iTracklet < 6; iTracklet++)
+      new ((*fTracklets)[iTracklet]) AliTRDtrackletGTU(*((AliTRDtrackletGTU*)(*(rhs.fTracklets))[iTracklet])); 
+  }
+
+  return *this;
+}
+
+AliTRDtrackGTU& AliTRDtrackGTU::operator=(const AliESDTrdTrack &rhs)
+{
+  if ((void*) &rhs != (void*) this) {
+    TObject::operator=(rhs);
+    fStack         = rhs.GetStack();
+    fSector        = rhs.GetSector();
+    fPID           = rhs.GetPID();
+    fTrackletMask  = rhs.GetLayerMask();
+    fNTracklets    = 0;
+    fRefLayerIdx   = -1;
+    fZChannel      = -1;
+    fZSubChannel   = -1;
+    fA             = rhs.GetA();
+    fB             = rhs.GetB();
+    fC             = rhs.GetC();
+    fLabel         = rhs.GetLabel();
+    for (Int_t iTracklet = 0; iTracklet < 6; iTracklet++) {
+      AliTRDtrackletGTU *trkl = new ((*fTracklets)[iTracklet]) AliTRDtrackletGTU();
+      if (fTrackletMask & (1 << iTracklet)) {
+       ++fNTracklets;
+       trkl->SetIndex(rhs.GetTrackletIndex(iTracklet));
+      }
+      else
+       trkl->SetIndex(-1);
+    }
+  }
+
+  return *this;
+}
+
 AliTRDtrackGTU::~AliTRDtrackGTU()
 {
 // dtor
@@ -125,10 +200,20 @@ Int_t AliTRDtrackGTU::GetZSubChannel()
 // returns the z-subchannel
 
   if (fZSubChannel < 0) {
-    for (Int_t layer = 0; layer < AliTRDgtuParam::GetNLayers(); layer++)
-    {
-      if (IsTrackletInLayer(layer))
-       fZSubChannel = ((AliTRDtrackletGTU*) (*fTracklets)[layer])->GetSubChannel(GetZChannel());
+    for (Int_t layer = 0; layer < AliTRDgtuParam::GetNLayers(); layer++) {
+      if (IsTrackletInLayer(layer)) {
+       AliTRDtrackletGTU *trkl = (AliTRDtrackletGTU*) (*fTracklets)[layer];
+       if (trkl) {
+         if ((fZSubChannel > -1) &&
+             (fZSubChannel != trkl->GetSubChannel(GetZChannel())))
+           AliError(Form("found inconsistent z-subchannels: track = %i/%i, trkl = %i",
+                         GetZChannel(), fZSubChannel, trkl->GetSubChannel(GetZChannel())));
+         fZSubChannel = trkl->GetSubChannel(GetZChannel());
+       }
+       else {
+         AliError("no tracklet where one should be according to layer mask");
+       }
+      }
     }
   }
   return fZSubChannel;
@@ -157,8 +242,7 @@ AliESDTrdTrack* AliTRDtrackGTU::CreateTrdTrack() const
   trk->SetB((Int_t) fB);
   trk->SetStack(fStack);
   trk->SetSector(fSector);
-  if (fLabel >= 0)
-    trk->SetLabel(fLabel);
+  trk->SetLabel(fLabel);
 
   for (Int_t iLayer = 0; iLayer < AliTRDgtuParam::GetNLayers(); iLayer++) {
     AliTRDtrackletGTU *trklGTU = GetTracklet(iLayer);
@@ -175,16 +259,37 @@ AliESDTrdTrack* AliTRDtrackGTU::CreateTrdTrack() const
 
 Bool_t AliTRDtrackGTU::CookLabel()
 {
-    TH1F *h = new TH1F("trkref", "trkref", 100000, 0, 100000);
-    for (Int_t iTracklet = 0; iTracklet < 6; iTracklet++) {
-      if (!IsTrackletInLayer(iTracklet))
-        continue;
-       h->Fill( ((AliTRDtrackletGTU*) (*fTracklets)[iTracklet])->GetLabel());
+  // assign label from tracklets according to frequency
+
+  Int_t nLabels = 0;
+  Int_t label[6] = { 0 };
+  Int_t count[6] = { 0 };
+
+  for (Int_t iTracklet = 0; iTracklet < 6; iTracklet++) {
+    if (!IsTrackletInLayer(iTracklet))
+      continue;
+
+    Int_t currLabel = GetTracklet(iTracklet)->GetLabel();
+
+    Bool_t assigned = kFALSE;
+    for (Int_t iLabel = 0; iLabel < nLabels; iLabel++) {
+      if (currLabel == label[iLabel]) {
+       count[iLabel]++;
+       assigned = kTRUE;
+       break;
+      }
+    }
+
+    if (!assigned) {
+      label[nLabels] = currLabel;
+      count[nLabels] = 1;
+      nLabels++;
     }
-    if (h->GetEntries() > 0)
-       fLabel = h->GetMaximumBin() - 1;
-    else
-       fLabel = -1;
-    delete h;
-    return (fLabel >= 0);
+  }
+
+  Int_t index[32];
+  TMath::Sort(6, count, index);
+  fLabel = label[index[0]];
+
+  return kTRUE;
 }