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.                  *
 **************************************************************************/

////////////////////////////////////////////////////////////////////////////
//                                                                        //
//  A GTU track                                                           //
//                                                                        //
//  Author: J. Klein (Jochen.Klein@cern.ch)                               //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

/* $Id: AliTRDtrackGTU.cxx 27566 2008-07-24 15:31:08Z cblume $ */

#include "TObject.h"
#include "TObjArray.h"
#include "TClass.h"
#include "TMath.h"
#include "TH1F.h"

#include "AliESDTrdTrack.h"
#include "AliLog.h"
#include "AliTRDgtuParam.h"
#include "AliTRDtrackGTU.h"
#include "AliTRDtrackletGTU.h"
#include "AliTRDtrackletMCM.h"
#include "AliESDTrdTrack.h"

ClassImp(AliTRDtrackGTU)

AliTRDtrackGTU::AliTRDtrackGTU() :
  TObject(),
  fStack(-1),
  fSector(-1),
  fPID(0),
  fTracklets(0x0),
  fTrackletMask(0),
  fNTracklets(0),
  fRefLayerIdx(-1),
  fZChannel(-1),
  fZSubChannel(-1),
  fA(0),
  fB(0),
  fC(0),
  fLabel(-1)
{
// default ctor

  fTracklets = new TClonesArray("AliTRDtrackletGTU", 6);
  for (Int_t iTracklet = 0; iTracklet < 6; iTracklet++)
      new ((*fTracklets)[iTracklet]) AliTRDtrackletGTU();
//  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

  fTracklets->Delete();
  delete fTracklets;
}

void AliTRDtrackGTU::AddTracklet(const AliTRDtrackletGTU * const tracklet, Int_t layer)
{
// add a tracklet to this track

  if ( (fTrackletMask & (1 << layer)) != 0 ) {
    AliError(Form("Only one tracklet per layer (%i) possible! Mask: 0x%02x", layer, fTrackletMask));
    return;
  }

  new ((*fTracklets)[layer]) AliTRDtrackletGTU(*tracklet);
  fNTracklets++;
  fTrackletMask |= (1 << layer);
}

AliTRDtrackletGTU* AliTRDtrackGTU::GetTracklet(Int_t layer) const
{
// get a pointer to the tracklet in the layer specified

  if (IsTrackletInLayer(layer))
    return ((AliTRDtrackletGTU*) (*fTracklets)[layer]);
  else
    return 0x0;
}

Int_t AliTRDtrackGTU::GetNTracklets() const
{
// returns the number of tracklets in this track

  return fNTracklets;
}

Bool_t AliTRDtrackGTU::IsTrackletInLayer(Int_t layer) const
{
// checks for a tracklet in the given layer

  if ( (GetTrackletMask() & (1 << layer)) != 0)
    return kTRUE;
  else
    return kFALSE;
}

void AliTRDtrackGTU::SetFitParams(Float_t a, Float_t b, Float_t c)
{
// set the fit parameters

  fA = a;
  fB = b;
  fC = c;
}

Int_t AliTRDtrackGTU::GetZSubChannel()
{
// returns the z-subchannel

  if (fZSubChannel < 0) {
    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;
}

Int_t AliTRDtrackGTU::GetYapprox()
{
  // returns an approximated y-position for the track
  // taken from the projected y-position of the tracklet in the reference layer
  // in which the track was found

  if ((fRefLayerIdx > -1) && (fRefLayerIdx < AliTRDgtuParam::GetNRefLayers()))
    return ((AliTRDtrackletGTU*) (*fTracklets)[AliTRDgtuParam::GetRefLayer(fRefLayerIdx)])->GetYProj();
  else
    return 0;
}

AliESDTrdTrack* AliTRDtrackGTU::CreateTrdTrack() const
{
  // creates an AliESDTrdTrack to be added to the ESD

  AliESDTrdTrack *trk = new AliESDTrdTrack();
  trk->SetA((Int_t) fA);
  trk->SetB(TMath::Nint(128. * fB));
  trk->SetC(TMath::Nint(256. * fC));
  trk->SetLayerMask(fTrackletMask);
  trk->SetPID(fPID);
  trk->SetStack(fStack);
  trk->SetSector(fSector);
  trk->SetLabel(fLabel);

  for (Int_t iLayer = 0; iLayer < AliTRDgtuParam::GetNLayers(); iLayer++) {
    AliTRDtrackletGTU *trklGTU = GetTracklet(iLayer);
    if (trklGTU) {
      trk->SetTrackletIndex(trklGTU->GetIndex(), iLayer);
      AliESDTrdTracklet *trkl = trklGTU->GetTrackletESD();
      if (trkl)
	trk->AddTrackletReference(trkl, iLayer);
    }
  }

  return trk;
}

Bool_t AliTRDtrackGTU::CookLabel()
{
  // 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++;
    }
  }

  Int_t index[32];
  TMath::Sort(6, count, index);
  fLabel = label[index[0]];

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