fTracklets(0x0),
fTrackletsPostInput(0x0),
fZChannelTracklets(0x0),
+ fTrackArray(new TClonesArray("AliTRDtrackGTU", 50)),
fTracks(0x0),
fGtuParam(0x0),
fStack(-1),
delete [] fTracks[zch];
}
delete [] fTracks;
+ delete fTrackArray;
+
for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++) {
delete [] fZChannelTracklets[layer];
- // delete [] fTrackletsPostInput[layer];
+ delete fTrackletsPostInput[layer];
}
delete [] fZChannelTracklets;
- // delete [] fTrackletsPostInput;
+ delete [] fTrackletsPostInput;
for (Int_t iLink = 0; iLink < fGtuParam->GetNLinks(); iLink++) {
delete fTracklets[iLink];
}
}
+ fTrackArray->Delete();
+
// delete all added tracklets
for (Int_t iLink = 0; iLink < fGtuParam->GetNLinks(); iLink++) {
fTracklets[iLink]->Clear();
}
-Bool_t AliTRDgtuTMU::RunTMU(TList *ListOfTracks, AliESDEvent *esd)
+Bool_t AliTRDgtuTMU::RunTMU(TList *ListOfTracks, AliESDEvent *esd, Int_t outLabel)
{
// performs the analysis as in a TMU module of the GTU, i. e.
// track matching
// ----- Z-channel units -----
AliDebug(1,"--------- Running Z-channel units ----------");
for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++) {
- fZChannelTracklets[layer] = new TList[fGtuParam->GetNZChannels()];
if (!RunZChannelUnit(layer)) {
AliError(Form("Z-Channel unit in layer %i failed", layer));
return kFALSE;
// ----- label calculation and ESD storage -----
TIter next(ListOfTracks);
while (AliTRDtrackGTU *trk = (AliTRDtrackGTU*) next()) {
- trk->CookLabel();
+ if (outLabel == -1)
+ trk->CookLabel();
+ else
+ trk->SetLabel(outLabel);
if (esd) {
AliESDTrdTrack *trdtrack = trk->CreateTrdTrack();
esd->AddTrdTrack(trdtrack);
Int_t iTrkl0 = 0; // A-side tracklet
Int_t iTrkl1 = 0; // B-side tracklet
- while ((iTrkl0 < fTracklets[2*layer + 0]->GetEntriesFast()) || (iTrkl1 < fTracklets[2*layer + 1]->GetEntriesFast())) {
+ Int_t nTracklets = 0;
+ while ((!fGtuParam->GetLimitNoTracklets() ||
+ (nTracklets < fGtuParam->GetMaxNoTracklets())) &&
+ ((iTrkl0 < fTracklets[2*layer + 0]->GetEntriesFast()) ||
+ (iTrkl1 < fTracklets[2*layer + 1]->GetEntriesFast()))) {
if (iTrkl1 >= fTracklets[2*layer + 1]->GetEntriesFast()) {
fTrackletsPostInput[layer]->AddLast(fTracklets[2*layer + 0]->At(iTrkl0));
iTrkl0++;
}
}
}
+ ++nTracklets;
}
TIter next(fTrackletsPostInput[layer]);
if (nHits >= 4) {
// ----- track registration -----
- AliTRDtrackGTU *track = new AliTRDtrackGTU();
+ AliTRDtrackGTU *track = new ((*fTrackArray)[fTrackArray->GetEntriesFast()]) AliTRDtrackGTU();
track->SetSector(fSector);
track->SetStack(fStack);
for (Int_t layer = 0; layer < fGtuParam->GetNLayers(); layer++ ) {
TIter next(tracksZUniqueStage0);
while (AliTRDtrackGTU *trk = (AliTRDtrackGTU*) next()) {
- tracksZSplitted[(trk->GetZChannel() + 3 * (trk->GetZSubChannel() - 1)) % 2]->Add(trk);
+ if ((trk->GetZChannel() < 0) ||
+ (trk->GetZChannel() > 2) ||
+ (trk->GetZSubChannel() < 0) ||
+ (trk->GetZSubChannel() > 6)) {
+ AliError(Form("track with invalid z-channel information at %p: zch = %i, subchannel = %i",
+ trk, trk->GetZChannel(), trk->GetZSubChannel()));
+ trk->Dump();
+ }
+ Int_t idx = (trk->GetZChannel() + 3 * (trk->GetZSubChannel() - 1)) % 2;
+ if ((idx < 0) || (idx > 1)) {
+ AliError(Form("invalid index %i null", idx));
+ trk->Dump();
+ continue;
+ }
+ if (!tracksZSplitted[idx]) {
+ AliError(Form("array pointer %i null", idx));
+ continue;
+ }
+ tracksZSplitted[idx]->Add(trk);
}
for (Int_t i = 0; i < 2; i++) {
AliTRDtrackGTU *trkStage1 = 0x0;
do {
- trkStage0 = (AliTRDtrackGTU*) next();
+ trkStage0 = (AliTRDtrackGTU*) next();
Bool_t tracksEqual = kFALSE;
if (trkStage0 != 0 && trkStage1 != 0) {
}
if (tracksEqual) {
- if (trkStage0->GetNTracklets() >= trkStage1->GetNTracklets())
- trkStage1 = trkStage0;
+ if (trkStage0->GetNTracklets() >= trkStage1->GetNTracklets())
+ trkStage1 = trkStage0;
}
else {
if (trkStage1 != 0x0)