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