X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TRD%2FAliTRDtrackGTU.cxx;h=da37be03ee70383cb53ac167ee372b9cc3b563b0;hb=45a24a6cb64641a2df0420e50ea937128b59b010;hp=6ffebc2f59155493c5208994a26a4c6778ca4298;hpb=dd09a2e20e7938972f6bee1b408080faed072519;p=u%2Fmrichter%2FAliRoot.git diff --git a/TRD/AliTRDtrackGTU.cxx b/TRD/AliTRDtrackGTU.cxx index 6ffebc2f591..da37be03ee7 100644 --- a/TRD/AliTRDtrackGTU.cxx +++ b/TRD/AliTRDtrackGTU.cxx @@ -26,6 +26,7 @@ #include "TObject.h" #include "TObjArray.h" #include "TClass.h" +#include "TMath.h" #include "TH1F.h" #include "AliESDTrdTrack.h" @@ -106,6 +107,36 @@ AliTRDtrackGTU& AliTRDtrackGTU::operator=(const AliTRDtrackGTU &rhs) 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 @@ -169,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; @@ -196,13 +237,13 @@ AliESDTrdTrack* AliTRDtrackGTU::CreateTrdTrack() const 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->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); @@ -219,16 +260,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 (h->GetEntries() > 0) - fLabel = h->GetMaximumBin() - 1; - else - fLabel = -1; - delete h; - return (fLabel >= 0); + + if (!assigned) { + label[nLabels] = currLabel; + count[nLabels] = 1; + nLabels++; + } + } + + Int_t index[32]; + TMath::Sort(6, count, index); + fLabel = label[index[0]]; + + return kTRUE; }