]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/AliTRDgtuSim.cxx
Split dEdxUtils into dEdxBaseUtils, dEdxCalibUtils, dEdxReconUtils and one CalibHistA...
[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
2f1bde31 171Bool_t AliTRDgtuSim::RunGTU(AliLoader *loader, AliESDEvent *esd, Int_t label)
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 {
2f1bde31 189 LoadTracklets(esd, label);
44eafcf2 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
2f1bde31 253Bool_t AliTRDgtuSim::LoadTracklets(const AliESDEvent *const esd, Int_t label)
44eafcf2 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);
2f1bde31 262 if (label < -1) {
263 if (trkl->GetLabel() == label)
264 new ((*fTrackletArray)[fTrackletArray->GetEntries()]) AliTRDtrackletGTU(trkl);
265 }
266 else
267 if (trkl->GetLabel() >= -1)
268 new ((*fTrackletArray)[fTrackletArray->GetEntries()]) AliTRDtrackletGTU(trkl);
44eafcf2 269 }
270
271 return kTRUE;
272}
273
5f006bd7 274Bool_t AliTRDgtuSim::LoadTracklets(AliLoader *const loader)
52c19022 275{
36dc3337 276 // load the tracklets using the given loader
277
c8b1590d 278 AliDebug(1,"Loading tracklets ...");
52c19022 279
c1ad4629 280 if (!fFeeParam->GetTracklet())
281 return kFALSE;
282
52c19022 283 if (!loader) {
284 AliError("No loader given!");
285 return kFALSE;
286 }
287
288 AliDataLoader *trackletLoader = loader->GetDataLoader("tracklets");
289 if (!trackletLoader) {
290 AliError("No tracklet loader found!");
291 return kFALSE;
292 }
293
294 trackletLoader->Load();
f7247d06 295 TTree *trackletTree = 0x0;
52c19022 296
f7247d06 297 // simulated tracklets
298 trackletTree = trackletLoader->Tree();
299 if (trackletTree) {
300 TBranch *trklbranch = trackletTree->GetBranch("mcmtrklbranch");
301 if (trklbranch) {
52c19022 302 if (!fTrackletArray)
44eafcf2 303 fTrackletArray = new TClonesArray("AliTRDtrackletGTU", 1000);
52c19022 304
44eafcf2 305 AliTRDtrackletMCM *trkl = 0x0;
52c19022 306 trklbranch->SetAddress(&trkl);
307 for (Int_t iTracklet = 0; iTracklet < trklbranch->GetEntries(); iTracklet++) {
f7247d06 308 trklbranch->GetEntry(iTracklet);
44eafcf2 309 new ((*fTrackletArray)[fTrackletArray->GetEntries()]) AliTRDtrackletGTU(new AliTRDtrackletMCM(*trkl));
059f00c5 310 ((AliTRDtrackletGTU *)((*fTrackletArray)[fTrackletArray->GetEntries()-1]))->SetMCMtrackletIndex(iTracklet);
52c19022 311 }
312 return kTRUE;
f7247d06 313 }
52c19022 314 }
315
f7247d06 316 // raw tracklets
317 AliTreeLoader *tl = (AliTreeLoader*) trackletLoader->GetBaseLoader("tracklets-raw");
318 trackletTree = tl ? tl->Load(), tl->Tree() : 0x0;
52c19022 319
f7247d06 320 if (trackletTree) {
321 if (!fTrackletArray)
44eafcf2 322 fTrackletArray = new TClonesArray("AliTRDtrackletGTU", 1000);
5f006bd7 323
324 Int_t hc;
f7247d06 325 TClonesArray *ar = 0x0;
326 trackletTree->SetBranchAddress("hc", &hc);
327 trackletTree->SetBranchAddress("trkl", &ar);
328
329 for (Int_t iEntry = 0; iEntry < trackletTree->GetEntries(); iEntry++) {
330 trackletTree->GetEntry(iEntry);
2cf67435 331 AliDebug(2, Form("%i tracklets in HC %i", ar->GetEntriesFast(), hc));
f7247d06 332 for (Int_t iTracklet = 0; iTracklet < ar->GetEntriesFast(); iTracklet++) {
333 AliTRDtrackletWord *trklWord = (AliTRDtrackletWord*) (*ar)[iTracklet];
44eafcf2 334 new((*fTrackletArray)[fTrackletArray->GetEntriesFast()]) AliTRDtrackletGTU(new AliTRDtrackletWord(trklWord->GetTrackletWord(), hc));
52c19022 335 }
f7247d06 336 }
337 return kTRUE;
52c19022 338 }
5f006bd7 339
f7247d06 340 AliError("No raw tracklet tree found\n");
52c19022 341
f7247d06 342 return kFALSE;
52c19022 343}
344
5f006bd7 345Bool_t AliTRDgtuSim::WriteTracksToDataFile(TList *listOfTracks, Int_t event)
52c19022 346{
36dc3337 347 // write the found tracks to a data file
348 // used for comparison to VHDL simulation
349
52c19022 350 Int_t sm = 0;
351 Int_t stack = 0;
352
353 FILE *out;
354 out = fopen("test.data", "a");
355
36dc3337 356 AliDebug(1,Form("%i tracks found in event %i", listOfTracks->GetSize(), event));
44eafcf2 357 // fprintf(out, "0 %5i %2i %i 00000000\n", event, sm, stack);
36dc3337 358 for (Int_t i = 0; i < listOfTracks->GetSize(); i++) {
359 AliTRDtrackGTU *trk = (AliTRDtrackGTU*) listOfTracks->At(i);
52c19022 360 sm = trk->GetSector();
361 stack = trk->GetStack();
44eafcf2 362
363 ULong64_t trackWord = 1;
364 AppendBits(trackWord, 1, 0);
365 AppendBits(trackWord, 6, trk->GetTrackletMask());
366 AppendBits(trackWord, 18, (Int_t) trk->GetA());
367 AppendBits(trackWord, 18, (Int_t) trk->GetB());
368 AppendBits(trackWord, 12, (Int_t) trk->GetC());
369 AppendBits(trackWord, 8, trk->GetPID());
370 fprintf(out, "ev. %i sec. %i stack %i - track word: 0x%016llx, ",
371 event, sm, stack, trackWord);
372
373 trackWord = 0;
374 AppendBits(trackWord, 11, 0); // flags
375 AppendBits(trackWord, 3, 0);
376 AppendBits(trackWord, 13, trk->GetYapprox());
377 AppendBits(trackWord, 6, trk->GetTrackletIndex(5));
378 AppendBits(trackWord, 6, trk->GetTrackletIndex(4));
379 AppendBits(trackWord, 6, trk->GetTrackletIndex(3));
380 AppendBits(trackWord, 6, trk->GetTrackletIndex(2));
381 AppendBits(trackWord, 6, trk->GetTrackletIndex(1));
382 AppendBits(trackWord, 6, trk->GetTrackletIndex(0));
383 fprintf(out, "extended track word: 0x%016llx\n", trackWord);
384
5f006bd7 385 fprintf(out, "1 %5i %2i %2i %3i %3i %3i %3i %3i %3i %3i %4i %f\n", event, sm, stack, trk->GetTrackletMask(),
386 trk->GetTrackletIndex(5),
387 trk->GetTrackletIndex(4),
388 trk->GetTrackletIndex(3),
389 trk->GetTrackletIndex(2),
390 trk->GetTrackletIndex(1),
52c19022 391 trk->GetTrackletIndex(0),
5f006bd7 392 trk->GetPtInt(),
52c19022 393 trk->GetPt());
394 }
395 fclose(out);
396 return kTRUE;
397}
398
5f006bd7 399Bool_t AliTRDgtuSim::WriteTracksToESD(const TList * const listOfTracks, AliESDEvent *esd)
52c19022 400{
36dc3337 401 // fill the found tracks to the given ESD event
402
52c19022 403 if (esd) {
36dc3337 404 TIter next(listOfTracks);
52c19022 405 while (AliTRDtrackGTU *trk = (AliTRDtrackGTU*) next()) {
406 AliESDTrdTrack *trdtrack = trk->CreateTrdTrack();
407 esd->AddTrdTrack(trdtrack);
408 delete trdtrack;
409 }
410 }
411 return kTRUE;
412}
c8b1590d 413
2cf67435 414Bool_t AliTRDgtuSim::WriteTracksToLoader(const TList * const listOfTracks)
c8b1590d 415{
36dc3337 416 // write the GTU tracks to the dedicated loader
417 // these tracks contain more information than the ones in the ESD
418
c8b1590d 419 AliRunLoader *rl = AliRunLoader::Instance();
420 AliDataLoader *dl = 0x0;
421 if (rl)
422 dl = rl->GetLoader("TRDLoader")->GetDataLoader("gtutracks");
423 if (!dl) {
424 AliError("Could not get the GTU-track data loader!");
425 return kFALSE;
426 }
427
428 TTree *trackTree = dl->Tree();
429 if (!trackTree) {
430 dl->MakeTree();
431 trackTree = dl->Tree();
432 }
5f006bd7 433
c8b1590d 434 AliTRDtrackGTU *trk = 0x0;
2cf67435 435
f7247d06 436 if (!trackTree->GetBranch("TRDtrackGTU"))
437 trackTree->Branch("TRDtrackGTU", "AliTRDtrackGTU", &trk, 32000);
5f006bd7 438
b5d16822 439 AliDebug(1, Form("Writing %i tracks to loader", listOfTracks->GetEntries()));
2cf67435 440 TIter next(listOfTracks);
3512dabb 441 while ((trk = (AliTRDtrackGTU*) next())) {
f7247d06 442 trackTree->SetBranchAddress("TRDtrackGTU", &trk);
c8b1590d 443 trackTree->Fill();
444 }
445
446 dl->WriteData("OVERWRITE");
447
448 return kTRUE;
449}