]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDgtuSim.cxx
updates for online PID (Uwe Westerhoff):
[u/mrichter/AliRoot.git] / TRD / AliTRDgtuSim.cxx
index 43038826c38e6742d0f45b1d25f8042c79eeedb9..94058d4e62a66062f00c27138dce964440a3e1d2 100644 (file)
 
 #include "TFile.h"
 #include "TROOT.h"
+#include "TObject.h"
 #include "TClonesArray.h"
 
+#include "AliRun.h"
+#include "AliRunLoader.h"
+#include "AliLoader.h"
+#include "AliTreeLoader.h"
+#include "AliLog.h"
+#include "AliESDTrdTrack.h"
+#include "AliESDTrdTracklet.h"
+
 #include "AliTRDgtuSim.h"
-#include "AliTRDmcmTracklet.h"
+#include "AliTRDfeeParam.h"
 #include "AliTRDgtuTMU.h"
 #include "AliTRDtrackGTU.h"
 #include "AliTRDtrackletWord.h"
 #include "AliTRDtrackletMCM.h"
 #include "AliESDEvent.h"
 
-#include "AliRun.h"
-#include "AliRunLoader.h"
-#include "AliLoader.h"
-#include "AliLog.h"
-
 ClassImp(AliTRDgtuSim)
 
-AliTRDgtuSim::AliTRDgtuSim(AliRunLoader *rl) 
+AliTRDgtuSim::AliTRDgtuSim(AliRunLoader *rl)
   : TObject(),
   fRunLoader(rl),
+  fFeeParam(AliTRDfeeParam::Instance()),
   fTMU(0x0),
-  fTrackletArray(0x0),
-  fTrackTree(0x0),
-  fTrackletTree(0x0)
+  fTrackletArray(0x0)
 {
-  fTrackletTree = new TTree("gtutracklets", "Tree with GTU tracklets");
+
 }
 
-AliTRDgtuSim::~AliTRDgtuSim() 
+AliTRDgtuSim::~AliTRDgtuSim()
 {
+  // destructor
+
   if (fTrackletArray)
-    fTrackletArray->Delete();
+    fTrackletArray->Clear();
   delete fTrackletArray;
-  delete fTrackletTree;
 }
 
-Bool_t AliTRDgtuSim::RunGTUFromTrackletFile(TString filename, Int_t event, Int_t noev) 
+Bool_t AliTRDgtuSim::RunGTUFromTrackletFile(TString filename, Int_t event, Int_t noev)
 {
-    AliInfo(Form("Running the GTU simulation on file: %s", filename.Data()));
-    ifstream input(filename.Data());
-    
-    std::string str;
-    TString string;
-    int lineno = 0;
-    
-    Int_t iEventPrev = -1;
-    Int_t iStackPrev = -1;
-    Int_t iSecPrev = -1;
-    Int_t iSec = -1;
-    Int_t iStack = -1;
-    Int_t iLink = -1;
-    Int_t iEvent = -1;
-    Int_t evcnt = -1;
-    
-    fTMU = 0x0;
-    
-    AliInfo("--------- Reading from file ----------");
-    while (getline(input, str)) {
-       lineno++;
-       string = str;
-       AliInfo(Form("Line %i : %s", lineno, string.Data()));
-       
-       TObjArray *tokens = string.Tokenize(" ");
-       if (tokens->GetEntriesFast() < 7) {
-           AliWarning(Form("Invalid input in line %i, too few parameters", lineno));
-           continue;
-       }
+  // run the GTU from a file of tracklets
+  // used for comparison to VHDL simulation
+
+  ifstream input(filename.Data());
+
+  std::string str;
+  TString string;
+  int lineno = 0;
+
+  Int_t iEventPrev = -1;
+  Int_t iStackPrev = -1;
+  Int_t iSecPrev = -1;
+  Int_t iSec = -1;
+  Int_t iStack = -1;
+  Int_t iLink = -1;
+  Int_t iEvent = -1;
+  Int_t evcnt = -1;
+
+  fTMU = 0x0;
+
+  TClonesArray trklArray("AliTRDtrackletWord", 100);
+  TClonesArray trklArrayGTU("AliTRDtrackletGTU", 100);
+
+  AliDebug(1, Form("--------- Reading from %s ----------", filename.Data()));
+  while (getline(input, str)) {
+    lineno++;
+    string = str;
+
+    TObjArray *tokens = string.Tokenize(" ");
+    if (tokens->GetEntriesFast() < 7) {
+      AliWarning(Form("Invalid input in line %i, too few parameters", lineno));
+      continue;
+    }
 
-       if ( ((TObjString*) tokens->At(0))->GetString().Atoi() < event) 
-           continue;
+    if ( ((TObjString*) tokens->At(0))->GetString().Atoi() < event)
+      continue;
 
-       iEvent = ((TObjString*) tokens->At(0))->GetString().Atoi();
-       iSec = ((TObjString*) tokens->At(1))->GetString().Atoi();
-       iStack = ((TObjString*) tokens->At(2))->GetString().Atoi();
-       iLink = 2 * ((TObjString*) tokens->At(3))->GetString().Atoi() + ((TObjString*) tokens->At(4))->GetString().Atoi();
+    iEvent = ((TObjString*) tokens->At(0))->GetString().Atoi();
+    iSec = ((TObjString*) tokens->At(1))->GetString().Atoi();
+    iStack = ((TObjString*) tokens->At(2))->GetString().Atoi();
+    iLink = 2 * ((TObjString*) tokens->At(3))->GetString().Atoi() + ((TObjString*) tokens->At(4))->GetString().Atoi();
 
-       if (iEvent != iEventPrev || iStack != iStackPrev || iSec != iSecPrev) {
-           if(fTMU) {
-               TList *ListOfTracks = new TList();
-               fTMU->SetStack(iStackPrev);
-               fTMU->SetSector(iSecPrev);
-               fTMU->RunTMU(ListOfTracks);
-               AliInfo(Form("--- There are %i tracks. Writing ...", ListOfTracks->GetEntries()));
-               WriteTracksToTree(ListOfTracks);
-               fTMU->WriteTrackletsToTree(fTrackletTree);
-               WriteTracksToDataFile(ListOfTracks, iEventPrev);
-               if (ListOfTracks->GetEntries() > 0) 
-                   AliInfo(Form("   %d GeV/c", ((AliTRDtrackGTU*) ListOfTracks->At(0))->GetPt() ));
-               delete fTMU;
-               fTMU = new AliTRDgtuTMU(); 
-               delete ListOfTracks;
-               ListOfTracks = 0x0;
-           } else {
-               fTMU = new AliTRDgtuTMU();
-           }
-           iStackPrev = iStack;
-           iSecPrev = iSec;
-           iEventPrev = iEvent;
-           evcnt++;
-           if (evcnt == noev)
-               break;
-       }
-       for (Int_t i = 5; i < tokens->GetEntriesFast(); i++) {
-           UInt_t trackletWord = 0;
-           sscanf(((TObjString*) tokens->At(i))->GetString().Data(), "%x", &trackletWord);
-           if (trackletWord == 0x10001000) 
-               break;
-           AliInfo(Form("%i. tracklet: %s -> 0x%08x", i-4, ((TObjString*) tokens->At(i))->GetString().Data(), trackletWord));
-           AliTRDtrackletWord *trkl = new AliTRDtrackletWord(trackletWord);
-           fTMU->AddTracklet(trkl, iLink);
-       }
-    }
-    
-    if (fTMU && evcnt < noev) {
-       TList *ListOfTracks = new TList();
+    if ((iEvent != iEventPrev) ||
+       (iStack != iStackPrev) ||
+       (iSec != iSecPrev)) {
+      if(fTMU) {
+       TList *listOfTracks = new TList();
        fTMU->SetStack(iStackPrev);
        fTMU->SetSector(iSecPrev);
-       fTMU->RunTMU(ListOfTracks);
-       WriteTracksToTree(ListOfTracks);
-       fTMU->WriteTrackletsToTree(fTrackletTree);
-       WriteTracksToDataFile(ListOfTracks, iEventPrev);
+       fTMU->RunTMU(listOfTracks);
+       AliDebug(1,Form("--- There are %i tracks. Writing ...", listOfTracks->GetEntries()));
+       WriteTracksToDataFile(listOfTracks, iEventPrev);
+       if (listOfTracks->GetEntries() > 0)
+         AliDebug(2,Form("   %4.1f GeV/c", ((AliTRDtrackGTU*) listOfTracks->At(0))->GetPt() ));
        delete fTMU;
-       delete ListOfTracks;
-       fTMU = 0x0;
+       fTMU = new AliTRDgtuTMU();
+       delete listOfTracks;
+       listOfTracks = 0x0;
+      } else {
+       fTMU = new AliTRDgtuTMU();
+      }
+      iStackPrev = iStack;
+      iSecPrev = iSec;
+      iEventPrev = iEvent;
+      evcnt++;
+      if (evcnt == noev)
+       break;
+    }
+    for (Int_t i = 5; i < tokens->GetEntriesFast(); i++) {
+      UInt_t trackletWord = 0;
+      sscanf(((TObjString*) tokens->At(i))->GetString().Data(), "%i", &trackletWord);
+      if (trackletWord == 0x10001000)
+       break;
+      AliDebug(2, Form("link: %2i trkl: %2i - %s -> 0x%08x",
+                      iLink, i-4, ((TObjString*) tokens->At(i))->GetString().Data(), trackletWord));
+      AliTRDtrackletWord *tracklet = new (trklArray[trklArray.GetEntriesFast()])       AliTRDtrackletWord(trackletWord);
+      AliTRDtrackletGTU   *trkl    = new (trklArrayGTU[trklArrayGTU.GetEntriesFast()]) AliTRDtrackletGTU(tracklet);
+      if (fTMU)
+       fTMU->AddTracklet(trkl, iLink);
     }
+  }
+
+  if (fTMU && evcnt < noev) {
+    TList *listOfTracks = new TList();
+    fTMU->SetStack(iStackPrev);
+    fTMU->SetSector(iSecPrev);
+    fTMU->RunTMU(listOfTracks);
+    WriteTracksToDataFile(listOfTracks, iEventPrev);
+    delete fTMU;
+    delete listOfTracks;
+    fTMU = 0x0;
+  }
 
-    AliInfo(Form("Analyzed %i events", evcnt));
-    return kTRUE; 
+  AliInfo(Form("Analyzed %i events", evcnt));
+  return kTRUE;
 }
 
-Bool_t AliTRDgtuSim::RunGTU(AliLoader *loader, AliESDEvent *esd) 
+Bool_t AliTRDgtuSim::RunGTU(AliLoader *loader, AliESDEvent *esd)
 {
+  // run the GTU on tracklets taken from the loader
+  // if specified the GTU tracks are written to the ESD event
+
+  if (!fFeeParam->GetTracklet())
+    return kFALSE;
+
+  if (fTrackletArray)
+    fTrackletArray->Clear();
+
+  if (loader) {
     if (!LoadTracklets(loader)) {
-       AliError("Could not load the tracklets. Aborting ...");
+       AliError("Could not load the tracklets. Nothing done ...");
        return kFALSE;
     }
+  }
+  else {
+    LoadTracklets(esd);
+  }
+
+    AliDebug(1, Form("running on %i tracklets", fTrackletArray->GetEntriesFast()));
 
     Int_t iStackPrev = -1;
     Int_t iSecPrev = -1;
@@ -176,56 +201,78 @@ Bool_t AliTRDgtuSim::RunGTU(AliLoader *loader, AliESDEvent *esd)
        delete fTMU;
        fTMU = 0x0;
     }
-    
-    TList *ListOfTracks = new TList();
-    
+
+    TList *listOfTracks = new TList();
+
     TIter next(fTrackletArray);
-    AliTRDtrackletBase *trkl;
 
-    while (trkl = (AliTRDtrackletBase*) next()) {
+    while (AliTRDtrackletGTU *trkl = (AliTRDtrackletGTU*) next()) {
        iSec = trkl->GetDetector() / 30;
        iStack = (trkl->GetDetector() % 30) / 6;
-       iLink = 2 * (trkl->GetDetector() % 6) + (trkl->GetYbin() < 0 ? 0 : 1);
+       iLink = trkl->GetHCId() % 12;
 
        if (iStack != iStackPrev || iSec != iSecPrev) {
            if(fTMU) {
                fTMU->SetStack(iStackPrev);
                fTMU->SetSector(iSecPrev);
-               fTMU->RunTMU(ListOfTracks);
-               WriteTracksToTree(ListOfTracks);
-               fTMU->WriteTrackletsToTree(fTrackletTree);
-               WriteTracksToESD(ListOfTracks, esd);
+               fTMU->RunTMU(listOfTracks);
+               WriteTracksToLoader(listOfTracks);
+               WriteTracksToESD(listOfTracks, esd);
                fTMU->Reset();
-               ListOfTracks->Delete();
+               listOfTracks->Delete();
            } else {
                fTMU = new AliTRDgtuTMU();
            }
            iStackPrev = iStack;
            iSecPrev = iSec;
+           AliDebug(1, Form("now in sec %i, stack %i", iSec, iStack));
+       }
+       AliDebug(1, Form("adding tracklet: 0x%08x in sec %i stack %i link %i",
+                        trkl->GetTrackletWord(), trkl->GetDetector() / 30, (trkl->GetDetector() % 30) / 6, trkl->GetHCId() % 12));
+       if (fTMU) {
+         fTMU->AddTracklet(trkl, iLink);
        }
-       fTMU->AddTracklet(trkl, iLink);
     }
-    
+
     if (fTMU) {
        fTMU->SetStack(iStackPrev);
        fTMU->SetSector(iSecPrev);
-       fTMU->RunTMU(ListOfTracks);
-       WriteTracksToTree(ListOfTracks);
-       fTMU->WriteTrackletsToTree(fTrackletTree);
-       WriteTracksToESD(ListOfTracks, esd);
+       fTMU->RunTMU(listOfTracks);
+       WriteTracksToLoader(listOfTracks);
+       WriteTracksToESD(listOfTracks, esd);
        delete fTMU;
        fTMU = 0x0;
-       ListOfTracks->Delete();
+       listOfTracks->Delete();
     }
 
-    delete ListOfTracks;
+    delete listOfTracks;
 
     return kTRUE;
 }
 
-Bool_t AliTRDgtuSim::LoadTracklets(AliLoader *loader) 
+Bool_t AliTRDgtuSim::LoadTracklets(const AliESDEvent *const esd)
+{
+  AliDebug(1,"Loading tracklets from ESD event ...");
+
+  if (!fTrackletArray)
+    fTrackletArray = new TClonesArray("AliTRDtrackletGTU", 1000);
+
+  for (Int_t iTracklet = 0; iTracklet < esd->GetNumberOfTrdTracklets(); iTracklet++) {
+    AliESDTrdTracklet *trkl = esd->GetTrdTracklet(iTracklet);
+    new ((*fTrackletArray)[fTrackletArray->GetEntries()]) AliTRDtrackletGTU(trkl);
+  }
+
+  return kTRUE;
+}
+
+Bool_t AliTRDgtuSim::LoadTracklets(AliLoader *const loader)
 {
-  AliInfo("Loading tracklets ...");
+  // load the tracklets using the given loader
+
+  AliDebug(1,"Loading tracklets ...");
+
+  if (!fFeeParam->GetTracklet())
+    return kFALSE;
 
   if (!loader) {
     AliError("No loader given!");
@@ -239,148 +286,160 @@ Bool_t AliTRDgtuSim::LoadTracklets(AliLoader *loader)
   }
 
   trackletLoader->Load();
-  
-  TTree *trackletTree = trackletLoader->Tree();
-  if (!trackletTree) {
-    AliError("No tracklet tree found");
-    return kFALSE;
-  }  
+  TTree *trackletTree = 0x0;
 
-
-  TBranch *trklbranch = trackletTree->GetBranch("mcmtrklbranch");
-  if (trklbranch) {
+  // simulated tracklets
+  trackletTree = trackletLoader->Tree();
+  if (trackletTree) {
+    TBranch *trklbranch = trackletTree->GetBranch("mcmtrklbranch");
+    if (trklbranch) {
       if (!fTrackletArray)
-         fTrackletArray = new TClonesArray("AliTRDtrackletMCM", 1000);
-      else if ((TClass::GetClass("AliTRDtrackletMCM"))->InheritsFrom(fTrackletArray->Class()))
-         fTrackletArray->Delete();
-      else {
-         fTrackletArray->Delete();
-         delete fTrackletArray;
-         fTrackletArray = new TClonesArray("AliTRDtrackletMCM", 1000);
-      }
+       fTrackletArray = new TClonesArray("AliTRDtrackletGTU", 1000);
 
-      AliTRDtrackletMCM *trkl = new AliTRDtrackletMCM; 
+      AliTRDtrackletMCM *trkl = 0x0;
       trklbranch->SetAddress(&trkl);
       for (Int_t iTracklet = 0; iTracklet < trklbranch->GetEntries(); iTracklet++) {
-         trklbranch->GetEntry(iTracklet);
-         new ((*fTrackletArray)[fTrackletArray->GetEntries()]) AliTRDtrackletMCM(*trkl);
+       trklbranch->GetEntry(iTracklet);
+       new ((*fTrackletArray)[fTrackletArray->GetEntries()]) AliTRDtrackletGTU(new AliTRDtrackletMCM(*trkl));
+       ((AliTRDtrackletGTU *)((*fTrackletArray)[fTrackletArray->GetEntries()-1]))->SetMCMtrackletIndex(iTracklet);
       }
       return kTRUE;
+    }
   }
 
-  trklbranch = trackletTree->GetBranch("trkbranch");
-
-  if (!trklbranch) {
-      AliError("Could not get trkbranch");
-      return kFALSE;
-  }
-  
-  if (!fTrackletArray)
-      fTrackletArray = new TClonesArray("AliTRDtrackletWord", 1000);
-  else if ((TClass::GetClass("AliTRDtrackletWord"))->InheritsFrom(fTrackletArray->Class()))
-      fTrackletArray->Delete();
-  else {
-      fTrackletArray->Delete();
-      delete fTrackletArray;
-      fTrackletArray = new TClonesArray("AliTRDtrackletWord", 1000);
-  }
-
-  Int_t notrkl = 0;
-  UInt_t *leaves = new UInt_t[258];
-  AliInfo(Form("No. of entries: %i", trklbranch->GetEntries()));
-  
-  for (Int_t iEntry = 0; iEntry < trklbranch->GetEntries(); iEntry++) {
-      trklbranch->SetAddress(leaves);
-      trklbranch->GetEntry(iEntry);
-      for (Int_t iTracklet = 0; iTracklet < 256; iTracklet++) {
-       if (leaves[2 + iTracklet] == 0)
-         break;
-       new((*fTrackletArray)[notrkl]) AliTRDtrackletWord(leaves[2 + iTracklet], leaves[0] + leaves[1]);
-       notrkl++;
+  // raw tracklets
+  AliTreeLoader *tl = (AliTreeLoader*) trackletLoader->GetBaseLoader("tracklets-raw");
+  trackletTree = tl ? tl->Load(), tl->Tree() : 0x0;
+
+  if (trackletTree) {
+    if (!fTrackletArray)
+      fTrackletArray = new TClonesArray("AliTRDtrackletGTU", 1000);
+
+    Int_t hc;
+    TClonesArray *ar = 0x0;
+    trackletTree->SetBranchAddress("hc", &hc);
+    trackletTree->SetBranchAddress("trkl", &ar);
+
+    for (Int_t iEntry = 0; iEntry < trackletTree->GetEntries(); iEntry++) {
+      trackletTree->GetEntry(iEntry);
+      AliDebug(2, Form("%i tracklets in HC %i", ar->GetEntriesFast(), hc));
+      for (Int_t iTracklet = 0; iTracklet < ar->GetEntriesFast(); iTracklet++) {
+       AliTRDtrackletWord *trklWord = (AliTRDtrackletWord*) (*ar)[iTracklet];
+       new((*fTrackletArray)[fTrackletArray->GetEntriesFast()]) AliTRDtrackletGTU(new AliTRDtrackletWord(trklWord->GetTrackletWord(), hc));
       }
-      AliInfo(Form("Entry: %3i: Det: %3i, side: %i, 1st tracklet: 0x%08x, no: %i", iEntry, leaves[0], leaves[1], leaves[2], notrkl));
+    }
+    return kTRUE;
   }
 
-  return kTRUE;
+  AliError("No raw tracklet tree found\n");
+
+  return kFALSE;
 }
 
-Bool_t AliTRDgtuSim::WriteTracksToDataFile(TList *ListOfTracks, Int_t event) 
+Bool_t AliTRDgtuSim::WriteTracksToDataFile(TList *listOfTracks, Int_t event)
 {
+  // write the found tracks to a data file
+  // used for comparison to VHDL simulation
+
     Int_t sm = 0;
     Int_t stack = 0;
 
     FILE *out;
     out = fopen("test.data", "a");
 
-    AliInfo(Form("%i tracks found in event %i", ListOfTracks->GetSize(), event));
-    fprintf(out, "0 %5i %2i %i  00000000\n", event, sm, stack);
-    for (Int_t i = 0; i < ListOfTracks->GetSize(); i++) {
-       AliTRDtrackGTU *trk = (AliTRDtrackGTU*) ListOfTracks->At(i);
+    AliDebug(1,Form("%i tracks found in event %i", listOfTracks->GetSize(), event));
+    // fprintf(out, "0 %5i %2i %i  00000000\n", event, sm, stack);
+    for (Int_t i = 0; i < listOfTracks->GetSize(); i++) {
+       AliTRDtrackGTU *trk = (AliTRDtrackGTU*) listOfTracks->At(i);
        sm = trk->GetSector();
        stack = trk->GetStack();
-       fprintf(out, "1 %5i %2i %2i %3i %3i %3i %3i %3i %3i %3i %4i %f\n", event, sm, stack, trk->GetTrackletMask(), 
-              trk->GetTrackletIndex(5), 
-              trk->GetTrackletIndex(4), 
-              trk->GetTrackletIndex(3), 
-              trk->GetTrackletIndex(2), 
-              trk->GetTrackletIndex(1), 
+
+       ULong64_t trackWord = 1;
+       AppendBits(trackWord,   1, 0);
+       AppendBits(trackWord,   6, trk->GetTrackletMask());
+       AppendBits(trackWord,  18, (Int_t) trk->GetA());
+       AppendBits(trackWord,  18, (Int_t) trk->GetB());
+       AppendBits(trackWord,  12, (Int_t) trk->GetC());
+       AppendBits(trackWord,   8, trk->GetPID());
+       fprintf(out, "ev. %i sec. %i stack %i - track word: 0x%016llx, ",
+               event, sm, stack, trackWord);
+
+       trackWord = 0;
+       AppendBits(trackWord, 11, 0); // flags
+       AppendBits(trackWord,  3, 0);
+       AppendBits(trackWord, 13, trk->GetYapprox());
+       AppendBits(trackWord,  6, trk->GetTrackletIndex(5));
+       AppendBits(trackWord,  6, trk->GetTrackletIndex(4));
+       AppendBits(trackWord,  6, trk->GetTrackletIndex(3));
+       AppendBits(trackWord,  6, trk->GetTrackletIndex(2));
+       AppendBits(trackWord,  6, trk->GetTrackletIndex(1));
+       AppendBits(trackWord,  6, trk->GetTrackletIndex(0));
+       fprintf(out, "extended track word: 0x%016llx\n", trackWord);
+
+       fprintf(out, "1 %5i %2i %2i %3i %3i %3i %3i %3i %3i %3i %4i %f\n", event, sm, stack, trk->GetTrackletMask(),
+              trk->GetTrackletIndex(5),
+              trk->GetTrackletIndex(4),
+              trk->GetTrackletIndex(3),
+              trk->GetTrackletIndex(2),
+              trk->GetTrackletIndex(1),
               trk->GetTrackletIndex(0),
-              trk->GetPtInt(), 
+              trk->GetPtInt(),
               trk->GetPt());
     }
     fclose(out);
     return kTRUE;
 }
 
-Bool_t AliTRDgtuSim::WriteTracksToTree(TList *ListOfTracks, Int_t /*event*/) 
+Bool_t AliTRDgtuSim::WriteTracksToESD(const TList * const listOfTracks, AliESDEvent *esd)
 {
-  AliInfo(Form("Writing %i tracks to the tree...", ListOfTracks->GetEntries()));
-
-  if (!ListOfTracks)
-    return kFALSE;
+  // fill the found tracks to the given ESD event
 
-  if (ListOfTracks->GetEntries() <= 0) 
+    if (esd) {
+       TIter next(listOfTracks);
+       while (AliTRDtrackGTU *trk = (AliTRDtrackGTU*) next()) {
+           AliESDTrdTrack *trdtrack = trk->CreateTrdTrack();
+           if (trdtrack->GetLabel() < 0)
+             trdtrack->SetLabel(-2);
+           esd->AddTrdTrack(trdtrack);
+           delete trdtrack;
+       }
+    }
     return kTRUE;
+}
 
-  if (!fTrackTree)
-    fTrackTree = new TTree("gtutracks", "GTU tracks");
+Bool_t AliTRDgtuSim::WriteTracksToLoader(const TList * const listOfTracks)
+{
+  // write the GTU tracks to the dedicated loader
+  // these tracks contain more information than the ones in the ESD
+
+  AliRunLoader *rl = AliRunLoader::Instance();
+  AliDataLoader *dl = 0x0;
+  if (rl)
+    dl = rl->GetLoader("TRDLoader")->GetDataLoader("gtutracks");
+  if (!dl) {
+    AliError("Could not get the GTU-track data loader!");
+    return kFALSE;
+  }
 
-  AliTRDtrackGTU *trk = 0x0;
-  TBranch *branch = fTrackTree->GetBranch("TRDgtuTrack");
-  if (!branch) {
-      branch = fTrackTree->Branch("TRDgtuTrack", "AliTRDtrackGTU", &trk, 32000, 99);
+  TTree *trackTree = dl->Tree();
+  if (!trackTree) {
+    dl->MakeTree();
+    trackTree = dl->Tree();
   }
 
-  TIter next(ListOfTracks);
-  while (trk = (AliTRDtrackGTU*) next()) {
-      branch->SetAddress(&trk);
-      fTrackTree->Fill();   
+  AliTRDtrackGTU *trk = 0x0;
+
+  if (!trackTree->GetBranch("TRDtrackGTU"))
+    trackTree->Branch("TRDtrackGTU", "AliTRDtrackGTU", &trk, 32000);
+
+  AliDebug(1, Form("Writing %i tracks to loader", listOfTracks->GetEntries()));
+  TIter next(listOfTracks);
+  while ((trk = (AliTRDtrackGTU*) next())) {
+    trackTree->SetBranchAddress("TRDtrackGTU", &trk);
+    trackTree->Fill();
   }
-  fTrackTree->ResetBranchAddress(branch);
 
-  return kTRUE; 
-}
+  dl->WriteData("OVERWRITE");
 
-Bool_t AliTRDgtuSim::WriteTreesToFile() {
-  TFile *f = TFile::Open("TRD.GtuTracking.root", "RECREATE");
-  f->cd();
-  if (fTrackTree)
-    f->WriteTObject(fTrackTree);
-  if (fTrackletTree)
-    f->WriteTObject(fTrackletTree);
-  f->Close();
   return kTRUE;
 }
-
-Bool_t AliTRDgtuSim::WriteTracksToESD(TList *ListOfTracks, AliESDEvent *esd) 
-{
-    if (esd) {
-       TIter next(ListOfTracks);
-       while (AliTRDtrackGTU *trk = (AliTRDtrackGTU*) next()) {
-           AliESDTrdTrack *trdtrack = trk->CreateTrdTrack();
-           esd->AddTrdTrack(trdtrack);
-           delete trdtrack;
-       }
-    }
-    return kTRUE;
-}