]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/AliTRDgtuSim.cxx
Attempt to monitor what file is read and merged by what job
[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(new AliTRDgtuTMU()),
59   fTrackletArray(0x0)
60 {
61
62 }
63
64 AliTRDgtuSim::~AliTRDgtuSim()
65 {
66   // destructor
67
68   if (fTrackletArray)
69     fTrackletArray->Clear();
70   delete fTrackletArray;
71   delete fTMU;
72 }
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   ifstream input(filename.Data());
80
81   std::string str;
82   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   fTMU->Reset();
95   Bool_t pendingTracklets = kFALSE;;
96
97   TClonesArray trklArray("AliTRDtrackletWord", 100);
98   TClonesArray trklArrayGTU("AliTRDtrackletGTU", 100);
99
100   AliDebug(1, Form("--------- Reading from %s ----------", filename.Data()));
101   while (getline(input, str)) {
102     lineno++;
103     string = str;
104
105     TObjArray *tokens = string.Tokenize(" ");
106     if (tokens->GetEntriesFast() < 7) {
107       AliWarning(Form("Invalid input in line %i, too few parameters", lineno));
108       delete tokens;
109       continue;
110     }
111
112     if ( ((TObjString*) tokens->At(0))->GetString().Atoi() < event) {
113       delete tokens;
114       continue;
115     }
116     iEvent = ((TObjString*) tokens->At(0))->GetString().Atoi();
117     iSec = ((TObjString*) tokens->At(1))->GetString().Atoi();
118     iStack = ((TObjString*) tokens->At(2))->GetString().Atoi();
119     iLink = 2 * ((TObjString*) tokens->At(3))->GetString().Atoi() + ((TObjString*) tokens->At(4))->GetString().Atoi();
120
121     if ((iEvent != iEventPrev) ||
122         (iStack != iStackPrev) ||
123         (iSec != iSecPrev)) {
124       if(pendingTracklets) {
125         TList *listOfTracks = new TList();
126         fTMU->SetStack(iStackPrev);
127         fTMU->SetSector(iSecPrev);
128         fTMU->RunTMU(listOfTracks);
129         AliDebug(1,Form("--- There are %i tracks. Writing ...", listOfTracks->GetEntries()));
130         WriteTracksToDataFile(listOfTracks, iEventPrev);
131         if (listOfTracks->GetEntries() > 0)
132           AliDebug(2,Form("   %4.1f GeV/c", ((AliTRDtrackGTU*) listOfTracks->At(0))->GetPt() ));
133         fTMU->Reset();
134         delete listOfTracks;
135       } else {
136         pendingTracklets = kTRUE;
137       }
138       iStackPrev = iStack;
139       iSecPrev = iSec;
140       iEventPrev = iEvent;
141       evcnt++;
142       if (evcnt == noev)
143         break;
144     }
145     for (Int_t i = 5; i < tokens->GetEntriesFast(); i++) {
146       UInt_t trackletWord = 0;
147       sscanf(((TObjString*) tokens->At(i))->GetString().Data(), "%i", &trackletWord);
148       if (trackletWord == 0x10001000)
149         break;
150       AliDebug(2, Form("link: %2i trkl: %2i - %s -> 0x%08x",
151                        iLink, i-4, ((TObjString*) tokens->At(i))->GetString().Data(), trackletWord));
152       AliTRDtrackletWord *tracklet = new (trklArray[trklArray.GetEntriesFast()])       AliTRDtrackletWord(trackletWord);
153       AliTRDtrackletGTU   *trkl    = new (trklArrayGTU[trklArrayGTU.GetEntriesFast()]) AliTRDtrackletGTU(tracklet);
154       if (fTMU)
155         fTMU->AddTracklet(trkl, iLink);
156     }
157     //
158     delete tokens;
159   }
160
161   if (pendingTracklets && evcnt < noev) {
162     TList *listOfTracks = new TList();
163     fTMU->SetStack(iStackPrev);
164     fTMU->SetSector(iSecPrev);
165     fTMU->RunTMU(listOfTracks);
166     WriteTracksToDataFile(listOfTracks, iEventPrev);
167     delete listOfTracks;
168     fTMU->Reset();
169   }
170
171   AliInfo(Form("Analyzed %i events", evcnt));
172   return kTRUE;
173 }
174
175 Bool_t AliTRDgtuSim::RunGTU(AliLoader *loader, AliESDEvent *esd, Int_t label, Int_t outLabel)
176 {
177   // run the GTU on tracklets taken from the loader
178   // if specified the GTU tracks are written to the ESD event
179
180   if (!fFeeParam->GetTracklet())
181     return kFALSE;
182
183   if (fTrackletArray)
184     fTrackletArray->Clear();
185
186   if (loader) {
187     if (!LoadTracklets(loader)) {
188         AliError("Could not load the tracklets. Nothing done ...");
189         return kFALSE;
190     }
191   }
192   else {
193     LoadTracklets(esd, label);
194   }
195
196     AliDebug(1, Form("running on %i tracklets", fTrackletArray->GetEntriesFast()));
197
198     Int_t iStackPrev = -1;
199     Int_t iSecPrev = -1;
200     Int_t iSec = -1;
201     Int_t iStack = -1;
202     Int_t iLink = -1;
203
204     fTMU->Reset();
205     Bool_t pendingTracklets = kFALSE;
206     TList *listOfTracks = new TList();
207
208     TIter next(fTrackletArray);
209     while (AliTRDtrackletGTU *trkl = (AliTRDtrackletGTU*) next()) {
210         iSec = trkl->GetDetector() / 30;
211         iStack = (trkl->GetDetector() % 30) / 6;
212         iLink = trkl->GetHCId() % 12;
213
214         if (iStack != iStackPrev || iSec != iSecPrev) {
215             if(pendingTracklets) {
216                 fTMU->SetStack(iStackPrev);
217                 fTMU->SetSector(iSecPrev);
218                 fTMU->RunTMU(listOfTracks, 0x0, outLabel);
219                 if (loader)
220                   WriteTracksToLoader(listOfTracks);
221                 WriteTracksToESD(listOfTracks, esd);
222                 listOfTracks->Clear();
223                 fTMU->Reset();
224             } else {
225               pendingTracklets = kTRUE;
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 (pendingTracklets) {
239         fTMU->SetStack(iStackPrev);
240         fTMU->SetSector(iSecPrev);
241         fTMU->RunTMU(listOfTracks, 0x0, outLabel);
242         if (loader)
243           WriteTracksToLoader(listOfTracks);
244         WriteTracksToESD(listOfTracks, esd);
245         listOfTracks->Clear();
246         fTMU->Reset();
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 }