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