#include "TObject.h"
#include "TObjArray.h"
+#include "TClass.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),
- fPt(0),
fPID(0),
fTracklets(0x0),
fTrackletMask(0),
fZSubChannel(-1),
fA(0),
fB(0),
- fC(0)
+ fC(0),
+ fLabel(-1)
{
+// default ctor
+
fTracklets = new TClonesArray("AliTRDtrackletGTU", 6);
for (Int_t iTracklet = 0; iTracklet < 6; iTracklet++)
new ((*fTracklets)[iTracklet]) AliTRDtrackletGTU();
AliTRDtrackGTU::~AliTRDtrackGTU()
{
+// dtor
+
fTracklets->Delete();
delete fTracklets;
}
-void AliTRDtrackGTU::AddTracklet(AliTRDtrackletGTU *tracklet, Int_t layer)
+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;
fTrackletMask |= (1 << layer);
}
-AliTRDtrackletGTU* AliTRDtrackGTU::GetTracklet(Int_t layer)
+AliTRDtrackletGTU* AliTRDtrackGTU::GetTracklet(Int_t layer) const
{
- return ((AliTRDtrackletGTU*) (*fTracklets)[layer]);
+// 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
+Bool_t AliTRDtrackGTU::IsTrackletInLayer(Int_t layer) const
{
+// checks for a tracklet in the given layer
+
if ( (GetTrackletMask() & (1 << layer)) != 0)
return kTRUE;
- else
+ else
return kFALSE;
}
-void AliTRDtrackGTU::SetFitParams(Float_t a, Float_t b, Float_t c)
+void AliTRDtrackGTU::SetFitParams(Float_t a, Float_t b, Float_t c)
{
- fA = a;
+// set the fit parameters
+
+ fA = a;
fB = b;
fC = c;
}
-Int_t AliTRDtrackGTU::GetZSubChannel()
+Int_t AliTRDtrackGTU::GetZSubChannel()
{
+// returns the z-subchannel
+
if (fZSubChannel < 0) {
for (Int_t layer = 0; layer < AliTRDgtuParam::GetNLayers(); layer++)
{
return fZSubChannel;
}
-Int_t AliTRDtrackGTU::GetYapprox()
+Int_t AliTRDtrackGTU::GetYapprox()
{
- for (Int_t layer = 0; layer < AliTRDgtuParam::GetNLayers(); layer++)
- {
- if (IsTrackletInLayer(layer))
- return ((AliTRDtrackletGTU*) (*fTracklets)[layer])->GetYProj();
- }
- return 0;
+ // 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
{
- AliESDTrdTrack *trk = new AliESDTrdTrack();
- trk->SetPt(1./128. * fPt);
- trk->SetPID(fPID);
- trk->SetDetector(fSector * 30 + fStack * 6);
- return trk;
+ // creates an AliESDTrdTrack to be added to the ESD
+
+ AliESDTrdTrack *trk = new AliESDTrdTrack();
+ trk->SetA((Int_t) fA);
+ trk->SetLayerMask(fTrackletMask);
+ trk->SetPID(fPID);
+ trk->SetB((Int_t) fB);
+ trk->SetStack(fStack);
+ trk->SetSector(fSector);
+ if (fLabel >= 0)
+ 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()
+{
+ 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());
+ }
+ if (h->GetEntries() > 0)
+ fLabel = h->GetMaximumBin() - 1;
+ else
+ fLabel = -1;
+ delete h;
+ return (fLabel >= 0);
}