LCOV - code coverage report
Current view: top level - TRD/TRDbase - AliTRDgtuSim.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 92 244 37.7 %
Date: 2016-06-14 17:26:59 Functions: 10 13 76.9 %

          Line data    Source code
       1             : /**************************************************************************
       2             :  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
       3             :  *                                                                        *
       4             :  * Author: The ALICE Off-line Project.                                    *
       5             :  * Contributors are mentioned in the code where appropriate.              *
       6             :  *                                                                        *
       7             :  * Permission to use, copy, modify and distribute this software and its   *
       8             :  * documentation strictly for non-commercial purposes is hereby granted   *
       9             :  * without fee, provided that the above copyright notice appears in all   *
      10             :  * copies and that both the copyright notice and this permission notice   *
      11             :  * appear in the supporting documentation. The authors make no claims     *
      12             :  * about the suitability of this software for any purpose. It is          *
      13             :  * provided "as is" without express or implied warranty.                  *
      14             :  **************************************************************************/
      15             : 
      16             : /* $Id: AliTRDgtuSim.cxx 28397 2008-09-02 09:33:00Z cblume $ */
      17             : 
      18             : ////////////////////////////////////////////////////////////////////////////
      19             : //                                                                        //
      20             : //  GTU simulation                                                        //
      21             : //                                                                        //
      22             : //  Authors: J. Klein (Jochen.Klein@cern.ch)                              //
      23             : //                                                                        //
      24             : ////////////////////////////////////////////////////////////////////////////
      25             : 
      26             : #include <stdio.h>
      27             : #include <fstream>
      28             : #include <string>
      29             : 
      30             : #include "TFile.h"
      31             : #include "TROOT.h"
      32             : #include "TObject.h"
      33             : #include "TClonesArray.h"
      34             : 
      35             : #include "AliRun.h"
      36             : #include "AliRunLoader.h"
      37             : #include "AliLoader.h"
      38             : #include "AliTreeLoader.h"
      39             : #include "AliLog.h"
      40             : #include "AliESDTrdTrack.h"
      41             : #include "AliESDTrdTracklet.h"
      42             : 
      43             : #include "AliTRDgtuSim.h"
      44             : #include "AliTRDfeeParam.h"
      45             : #include "AliTRDgtuTMU.h"
      46             : #include "AliTRDtrackGTU.h"
      47             : #include "AliTRDtrackletWord.h"
      48             : #include "AliTRDtrackletMCM.h"
      49             : #include "AliESDEvent.h"
      50             : 
      51             : using std::ifstream;
      52          48 : ClassImp(AliTRDgtuSim)
      53             : 
      54             : AliTRDgtuSim::AliTRDgtuSim(AliRunLoader *rl)
      55           4 :   : TObject(),
      56           4 :   fRunLoader(rl),
      57           8 :   fFeeParam(AliTRDfeeParam::Instance()),
      58          12 :   fTMU(new AliTRDgtuTMU()),
      59           4 :   fTrackletArray(0x0)
      60          20 : {
      61             : 
      62           8 : }
      63             : 
      64             : AliTRDgtuSim::~AliTRDgtuSim()
      65          24 : {
      66             :   // destructor
      67             : 
      68           4 :   if (fTrackletArray)
      69           4 :     fTrackletArray->Clear();
      70           8 :   delete fTrackletArray;
      71           8 :   delete fTMU;
      72          12 : }
      73             : 
      74             : Bool_t AliTRDgtuSim::RunGTUFromTrackletFile(TString filename, Int_t event, Int_t noev)
      75             : {
      76             :   // run the GTU from a file of tracklets
      77             :   // used for comparison to VHDL simulation
      78             : 
      79           0 :   ifstream input(filename.Data());
      80             : 
      81           0 :   std::string str;
      82           0 :   TString string;
      83             :   int lineno = 0;
      84             : 
      85             :   Int_t iEventPrev = -1;
      86             :   Int_t iStackPrev = -1;
      87             :   Int_t iSecPrev = -1;
      88             :   Int_t iSec = -1;
      89             :   Int_t iStack = -1;
      90             :   Int_t iLink = -1;
      91             :   Int_t iEvent = -1;
      92             :   Int_t evcnt = -1;
      93             : 
      94           0 :   fTMU->Reset();
      95             :   Bool_t pendingTracklets = kFALSE;;
      96             : 
      97           0 :   TClonesArray trklArray("AliTRDtrackletWord", 100);
      98           0 :   TClonesArray trklArrayGTU("AliTRDtrackletGTU", 100);
      99             : 
     100           0 :   AliDebug(1, Form("--------- Reading from %s ----------", filename.Data()));
     101           0 :   while (getline(input, str)) {
     102           0 :     lineno++;
     103           0 :     string = str;
     104             : 
     105           0 :     TObjArray *tokens = string.Tokenize(" ");
     106           0 :     if (tokens->GetEntriesFast() < 7) {
     107           0 :       AliWarning(Form("Invalid input in line %i, too few parameters", lineno));
     108           0 :       delete tokens;
     109           0 :       continue;
     110             :     }
     111             : 
     112           0 :     if ( ((TObjString*) tokens->At(0))->GetString().Atoi() < event) {
     113           0 :       delete tokens;
     114           0 :       continue;
     115             :     }
     116           0 :     iEvent = ((TObjString*) tokens->At(0))->GetString().Atoi();
     117           0 :     iSec = ((TObjString*) tokens->At(1))->GetString().Atoi();
     118           0 :     iStack = ((TObjString*) tokens->At(2))->GetString().Atoi();
     119           0 :     iLink = 2 * ((TObjString*) tokens->At(3))->GetString().Atoi() + ((TObjString*) tokens->At(4))->GetString().Atoi();
     120             : 
     121           0 :     if ((iEvent != iEventPrev) ||
     122           0 :         (iStack != iStackPrev) ||
     123           0 :         (iSec != iSecPrev)) {
     124           0 :       if(pendingTracklets) {
     125           0 :         TList *listOfTracks = new TList();
     126           0 :         fTMU->SetStack(iStackPrev);
     127           0 :         fTMU->SetSector(iSecPrev);
     128           0 :         fTMU->RunTMU(listOfTracks);
     129           0 :         AliDebug(1,Form("--- There are %i tracks. Writing ...", listOfTracks->GetEntries()));
     130           0 :         WriteTracksToDataFile(listOfTracks, iEventPrev);
     131           0 :         if (listOfTracks->GetEntries() > 0)
     132           0 :           AliDebug(2,Form("   %4.1f GeV/c", ((AliTRDtrackGTU*) listOfTracks->At(0))->GetPt() ));
     133           0 :         fTMU->Reset();
     134           0 :         delete listOfTracks;
     135           0 :       } else {
     136             :         pendingTracklets = kTRUE;
     137             :       }
     138             :       iStackPrev = iStack;
     139             :       iSecPrev = iSec;
     140             :       iEventPrev = iEvent;
     141           0 :       evcnt++;
     142           0 :       if (evcnt == noev)
     143           0 :         break;
     144             :     }
     145           0 :     for (Int_t i = 5; i < tokens->GetEntriesFast(); i++) {
     146           0 :       UInt_t trackletWord = 0;
     147           0 :       sscanf(((TObjString*) tokens->At(i))->GetString().Data(), "%i", &trackletWord);
     148           0 :       if (trackletWord == 0x10001000)
     149           0 :         break;
     150           0 :       AliDebug(2, Form("link: %2i trkl: %2i - %s -> 0x%08x",
     151             :                        iLink, i-4, ((TObjString*) tokens->At(i))->GetString().Data(), trackletWord));
     152           0 :       AliTRDtrackletWord *tracklet = new (trklArray[trklArray.GetEntriesFast()])       AliTRDtrackletWord(trackletWord);
     153           0 :       AliTRDtrackletGTU   *trkl    = new (trklArrayGTU[trklArrayGTU.GetEntriesFast()]) AliTRDtrackletGTU(tracklet);
     154           0 :       fTMU->AddTracklet(trkl, iLink);
     155           0 :     }
     156             :     //
     157           0 :     delete tokens;
     158           0 :   }
     159             : 
     160           0 :   if (pendingTracklets && evcnt < noev) {
     161           0 :     TList *listOfTracks = new TList();
     162           0 :     fTMU->SetStack(iStackPrev);
     163           0 :     fTMU->SetSector(iSecPrev);
     164           0 :     fTMU->RunTMU(listOfTracks);
     165           0 :     WriteTracksToDataFile(listOfTracks, iEventPrev);
     166           0 :     delete listOfTracks;
     167           0 :     fTMU->Reset();
     168           0 :   }
     169             : 
     170           0 :   AliInfo(Form("Analyzed %i events", evcnt));
     171             :   return kTRUE;
     172           0 : }
     173             : 
     174             : Bool_t AliTRDgtuSim::RunGTU(AliLoader *loader, AliESDEvent *esd, Int_t label, Int_t outLabel)
     175             : {
     176             :   // run the GTU on tracklets taken from the loader
     177             :   // if specified the GTU tracks are written to the ESD event
     178             : 
     179           8 :   if (!fFeeParam->GetTracklet())
     180           0 :     return kFALSE;
     181             : 
     182           4 :   if (fTrackletArray)
     183           0 :     fTrackletArray->Clear();
     184             : 
     185           4 :   if (loader) {
     186           4 :     if (!LoadTracklets(loader)) {
     187           0 :         AliError("Could not load the tracklets. Nothing done ...");
     188           0 :         return kFALSE;
     189             :     }
     190             :   }
     191             :   else {
     192           0 :     LoadTracklets(esd, label);
     193             :   }
     194             : 
     195          12 :     AliDebug(1, Form("running on %i tracklets", fTrackletArray->GetEntriesFast()));
     196             : 
     197             :     Int_t iStackPrev = -1;
     198             :     Int_t iSecPrev = -1;
     199             :     Int_t iSec = -1;
     200             :     Int_t iStack = -1;
     201             :     Int_t iLink = -1;
     202             : 
     203           4 :     fTMU->Reset();
     204             :     Bool_t pendingTracklets = kFALSE;
     205           4 :     TList *listOfTracks = new TList();
     206             : 
     207           4 :     TIter next(fTrackletArray);
     208         736 :     while (AliTRDtrackletGTU *trkl = (AliTRDtrackletGTU*) next()) {
     209         720 :         iSec = trkl->GetDetector() / 30;
     210         720 :         iStack = (trkl->GetDetector() % 30) / 6;
     211         720 :         iLink = trkl->GetHCId() % 12;
     212             : 
     213         689 :         if (iStack != iStackPrev || iSec != iSecPrev) {
     214          39 :             if(pendingTracklets) {
     215          35 :                 fTMU->SetStack(iStackPrev);
     216          35 :                 fTMU->SetSector(iSecPrev);
     217          35 :                 fTMU->RunTMU(listOfTracks, 0x0, outLabel);
     218          35 :                 if (loader)
     219          35 :                   WriteTracksToLoader(listOfTracks);
     220          35 :                 WriteTracksToESD(listOfTracks, esd);
     221          35 :                 listOfTracks->Clear();
     222          35 :                 fTMU->Reset();
     223             :             } else {
     224             :               pendingTracklets = kTRUE;
     225             :             }
     226             :             iStackPrev = iStack;
     227             :             iSecPrev = iSec;
     228         195 :             AliDebug(1, Form("now in sec %i, stack %i", iSec, iStack));
     229             :         }
     230        1800 :         AliDebug(1, Form("adding tracklet: 0x%08x in sec %i stack %i link %i",
     231             :                          trkl->GetTrackletWord(), trkl->GetDetector() / 30, (trkl->GetDetector() % 30) / 6, trkl->GetHCId() % 12));
     232         360 :         fTMU->AddTracklet(trkl, iLink);
     233         360 :     }
     234             : 
     235           4 :     if (pendingTracklets) {
     236           4 :         fTMU->SetStack(iStackPrev);
     237           4 :         fTMU->SetSector(iSecPrev);
     238           4 :         fTMU->RunTMU(listOfTracks, 0x0, outLabel);
     239           4 :         if (loader)
     240           4 :           WriteTracksToLoader(listOfTracks);
     241           4 :         WriteTracksToESD(listOfTracks, esd);
     242           4 :         listOfTracks->Clear();
     243           4 :         fTMU->Reset();
     244             :     }
     245             : 
     246           8 :     delete listOfTracks;
     247             : 
     248             :     return kTRUE;
     249           8 : }
     250             : 
     251             : Bool_t AliTRDgtuSim::LoadTracklets(const AliESDEvent *const esd, Int_t label)
     252             : {
     253           0 :   AliDebug(1,"Loading tracklets from ESD event ...");
     254             : 
     255           0 :   if (!fTrackletArray)
     256           0 :     fTrackletArray = new TClonesArray("AliTRDtrackletGTU", 1000);
     257             : 
     258           0 :   for (Int_t iTracklet = 0; iTracklet < esd->GetNumberOfTrdTracklets(); iTracklet++) {
     259           0 :     AliESDTrdTracklet *trkl = esd->GetTrdTracklet(iTracklet);
     260           0 :     if (label < -1) {
     261           0 :       if (trkl->GetLabel() == label)
     262           0 :         new ((*fTrackletArray)[fTrackletArray->GetEntries()]) AliTRDtrackletGTU(trkl);
     263             :     }
     264             :     else
     265           0 :       if (trkl->GetLabel() >= -1)
     266           0 :         new ((*fTrackletArray)[fTrackletArray->GetEntries()]) AliTRDtrackletGTU(trkl);
     267             :   }
     268             : 
     269           0 :   return kTRUE;
     270           0 : }
     271             : 
     272             : Bool_t AliTRDgtuSim::LoadTracklets(AliLoader *const loader)
     273             : {
     274             :   // load the tracklets using the given loader
     275             : 
     276          16 :   AliDebug(1,"Loading tracklets ...");
     277             : 
     278           4 :   if (!fFeeParam->GetTracklet())
     279           0 :     return kFALSE;
     280             : 
     281           4 :   if (!loader) {
     282           0 :     AliError("No loader given!");
     283           0 :     return kFALSE;
     284             :   }
     285             : 
     286           4 :   AliDataLoader *trackletLoader = loader->GetDataLoader("tracklets");
     287           4 :   if (!trackletLoader) {
     288           0 :       AliError("No tracklet loader found!");
     289           0 :       return kFALSE;
     290             :   }
     291             : 
     292           4 :   trackletLoader->Load();
     293             :   TTree *trackletTree = 0x0;
     294             : 
     295             :   // simulated tracklets
     296           4 :   trackletTree = trackletLoader->Tree();
     297           4 :   if (trackletTree) {
     298           4 :     TBranch *trklbranch = trackletTree->GetBranch("mcmtrklbranch");
     299           4 :     if (trklbranch) {
     300           4 :       if (!fTrackletArray)
     301           8 :         fTrackletArray = new TClonesArray("AliTRDtrackletGTU", 1000);
     302             : 
     303           4 :       AliTRDtrackletMCM *trkl = 0x0;
     304           4 :       trklbranch->SetAddress(&trkl);
     305         728 :       for (Int_t iTracklet = 0; iTracklet < trklbranch->GetEntries(); iTracklet++) {
     306         360 :         trklbranch->GetEntry(iTracklet);
     307        1080 :         new ((*fTrackletArray)[fTrackletArray->GetEntries()]) AliTRDtrackletGTU(new AliTRDtrackletMCM(*trkl));
     308         360 :         ((AliTRDtrackletGTU *)((*fTrackletArray)[fTrackletArray->GetEntries()-1]))->SetMCMtrackletIndex(iTracklet);
     309             :       }
     310             :       return kTRUE;
     311           4 :     }
     312           0 :   }
     313             : 
     314             :   // raw tracklets
     315           0 :   AliTreeLoader *tl = (AliTreeLoader*) trackletLoader->GetBaseLoader("tracklets-raw");
     316           0 :   trackletTree = tl ? tl->Load(), tl->Tree() : 0x0;
     317             : 
     318           0 :   if (trackletTree) {
     319           0 :     if (!fTrackletArray)
     320           0 :       fTrackletArray = new TClonesArray("AliTRDtrackletGTU", 1000);
     321             : 
     322           0 :     Int_t hc;
     323           0 :     TClonesArray *ar = 0x0;
     324           0 :     trackletTree->SetBranchAddress("hc", &hc);
     325           0 :     trackletTree->SetBranchAddress("trkl", &ar);
     326             : 
     327           0 :     for (Int_t iEntry = 0; iEntry < trackletTree->GetEntries(); iEntry++) {
     328           0 :       trackletTree->GetEntry(iEntry);
     329           0 :       AliDebug(2, Form("%i tracklets in HC %i", ar->GetEntriesFast(), hc));
     330           0 :       for (Int_t iTracklet = 0; iTracklet < ar->GetEntriesFast(); iTracklet++) {
     331           0 :         AliTRDtrackletWord *trklWord = (AliTRDtrackletWord*) (*ar)[iTracklet];
     332           0 :         new((*fTrackletArray)[fTrackletArray->GetEntriesFast()]) AliTRDtrackletGTU(new AliTRDtrackletWord(trklWord->GetTrackletWord(), hc));
     333             :       }
     334             :     }
     335             :     return kTRUE;
     336           0 :   }
     337             : 
     338           0 :   AliError("No raw tracklet tree found\n");
     339             : 
     340           0 :   return kFALSE;
     341           4 : }
     342             : 
     343             : Bool_t AliTRDgtuSim::WriteTracksToDataFile(TList *listOfTracks, Int_t event)
     344             : {
     345             :   // write the found tracks to a data file
     346             :   // used for comparison to VHDL simulation
     347             : 
     348             :     Int_t sm = 0;
     349             :     Int_t stack = 0;
     350             : 
     351             :     FILE *out;
     352           0 :     out = fopen("test.data", "a");
     353             : 
     354           0 :     AliDebug(1,Form("%i tracks found in event %i", listOfTracks->GetSize(), event));
     355             :     // fprintf(out, "0 %5i %2i %i  00000000\n", event, sm, stack);
     356           0 :     for (Int_t i = 0; i < listOfTracks->GetSize(); i++) {
     357           0 :         AliTRDtrackGTU *trk = (AliTRDtrackGTU*) listOfTracks->At(i);
     358           0 :         sm = trk->GetSector();
     359           0 :         stack = trk->GetStack();
     360             : 
     361           0 :         ULong64_t trackWord = 1;
     362           0 :         AppendBits(trackWord,   1, 0);
     363           0 :         AppendBits(trackWord,   6, trk->GetTrackletMask());
     364           0 :         AppendBits(trackWord,  18, (Int_t) trk->GetA());
     365           0 :         AppendBits(trackWord,  18, (Int_t) trk->GetB());
     366           0 :         AppendBits(trackWord,  12, (Int_t) trk->GetC());
     367           0 :         AppendBits(trackWord,   8, trk->GetPID());
     368           0 :         fprintf(out, "ev. %i sec. %i stack %i - track word: 0x%016llx, ",
     369           0 :                 event, sm, stack, trackWord);
     370             : 
     371           0 :         trackWord = 0;
     372           0 :         AppendBits(trackWord, 11, 0); // flags
     373           0 :         AppendBits(trackWord,  3, 0);
     374           0 :         AppendBits(trackWord, 13, trk->GetYapprox());
     375           0 :         AppendBits(trackWord,  6, trk->GetTrackletIndex(5));
     376           0 :         AppendBits(trackWord,  6, trk->GetTrackletIndex(4));
     377           0 :         AppendBits(trackWord,  6, trk->GetTrackletIndex(3));
     378           0 :         AppendBits(trackWord,  6, trk->GetTrackletIndex(2));
     379           0 :         AppendBits(trackWord,  6, trk->GetTrackletIndex(1));
     380           0 :         AppendBits(trackWord,  6, trk->GetTrackletIndex(0));
     381           0 :         fprintf(out, "extended track word: 0x%016llx\n", trackWord);
     382             : 
     383           0 :         fprintf(out, "1 %5i %2i %2i %3i %3i %3i %3i %3i %3i %3i %4i %f\n", event, sm, stack, trk->GetTrackletMask(),
     384           0 :                trk->GetTrackletIndex(5),
     385           0 :                trk->GetTrackletIndex(4),
     386           0 :                trk->GetTrackletIndex(3),
     387           0 :                trk->GetTrackletIndex(2),
     388           0 :                trk->GetTrackletIndex(1),
     389           0 :                trk->GetTrackletIndex(0),
     390           0 :                trk->GetPtInt(),
     391           0 :                trk->GetPt());
     392           0 :     }
     393           0 :     fclose(out);
     394           0 :     return kTRUE;
     395             : }
     396             : 
     397             : Bool_t AliTRDgtuSim::WriteTracksToESD(const TList * const listOfTracks, AliESDEvent *esd)
     398             : {
     399             :   // fill the found tracks to the given ESD event
     400             : 
     401          78 :     if (esd) {
     402           0 :         TIter next(listOfTracks);
     403           0 :         while (AliTRDtrackGTU *trk = (AliTRDtrackGTU*) next()) {
     404           0 :             AliESDTrdTrack *trdtrack = trk->CreateTrdTrack();
     405           0 :             esd->AddTrdTrack(trdtrack);
     406           0 :             delete trdtrack;
     407           0 :         }
     408           0 :     }
     409          39 :     return kTRUE;
     410           0 : }
     411             : 
     412             : Bool_t AliTRDgtuSim::WriteTracksToLoader(const TList * const listOfTracks)
     413             : {
     414             :   // write the GTU tracks to the dedicated loader
     415             :   // these tracks contain more information than the ones in the ESD
     416             : 
     417          78 :   AliRunLoader *rl = AliRunLoader::Instance();
     418             :   AliDataLoader *dl = 0x0;
     419          39 :   if (rl)
     420          39 :     dl = rl->GetLoader("TRDLoader")->GetDataLoader("gtutracks");
     421          39 :   if (!dl) {
     422           0 :     AliError("Could not get the GTU-track data loader!");
     423           0 :     return kFALSE;
     424             :   }
     425             : 
     426          39 :   TTree *trackTree = dl->Tree();
     427          39 :   if (!trackTree) {
     428           4 :     dl->MakeTree();
     429           4 :     trackTree = dl->Tree();
     430           4 :   }
     431             : 
     432          39 :   AliTRDtrackGTU *trk = 0x0;
     433             : 
     434          39 :   if (!trackTree->GetBranch("TRDtrackGTU"))
     435           4 :     trackTree->Branch("TRDtrackGTU", "AliTRDtrackGTU", &trk, 32000);
     436             : 
     437         117 :   AliDebug(1, Form("Writing %i tracks to loader", listOfTracks->GetEntries()));
     438          39 :   TIter next(listOfTracks);
     439         147 :   while ((trk = (AliTRDtrackGTU*) next())) {
     440          15 :     trackTree->SetBranchAddress("TRDtrackGTU", &trk);
     441          15 :     trackTree->Fill();
     442             :   }
     443             : 
     444          39 :   dl->WriteData("OVERWRITE");
     445             : 
     446             :   return kTRUE;
     447          78 : }

Generated by: LCOV version 1.11