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