]> git.uio.no Git - u/mrichter/AliRoot.git/blame - FMD/AliFMDInput.cxx
Adding a setter forgotten earlier
[u/mrichter/AliRoot.git] / FMD / AliFMDInput.cxx
CommitLineData
a1f80595 1/**************************************************************************
2 * Copyright(c) 2004, 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 **************************************************************************/
a1f80595 15/* $Id$ */
c2fc1258 16/** @file AliFMDInput.cxx
17 @author Christian Holm Christensen <cholm@nbi.dk>
18 @date Mon Mar 27 12:42:40 2006
19 @brief FMD utility classes for reading FMD data
20*/
a1f80595 21//___________________________________________________________________
22//
23// The classes defined here, are utility classes for reading in data
24// for the FMD. They are put in a seperate library to not polute the
25// normal libraries. The classes are intended to be used as base
26// classes for customized class that do some sort of analysis on the
27// various types of data produced by the FMD.
28//
29// Latest changes by Christian Holm Christensen
30//
31#include "AliFMDInput.h" // ALIFMDHIT_H
69893a66 32#include "AliFMDDebug.h" // ALIFMDDEBUG_H ALILOG_H
8f6ee336 33#include "AliLoader.h" // ALILOADER_H
34#include "AliRunLoader.h" // ALIRUNLOADER_H
35#include "AliRun.h" // ALIRUN_H
36#include "AliStack.h" // ALISTACK_H
d760ea03 37#include "AliRawReaderFile.h" // ALIRAWREADERFILE_H
039842fe 38#include "AliRawReaderRoot.h" // ALIRAWREADERROOT_H
39#include "AliRawReaderDate.h" // ALIRAWREADERDATE_H
e1a9aea4 40#include "AliRawEventHeaderBase.h"
8f6ee336 41#include "AliFMD.h" // ALIFMD_H
a1f80595 42#include "AliFMDHit.h" // ALIFMDHIT_H
8f6ee336 43#include "AliFMDDigit.h" // ALIFMDDigit_H
02a27b50 44#include "AliFMDSDigit.h" // ALIFMDDigit_H
bf000c32 45#include "AliFMDRecPoint.h" // ALIFMDRECPOINT_H
d760ea03 46#include "AliFMDRawReader.h" // ALIFMDRAWREADER_H
bf000c32 47#include <AliESD.h>
48#include <AliESDFMD.h>
df137876 49#include <AliESDEvent.h>
1e8f773e 50#include <AliCDBManager.h>
51#include <AliCDBEntry.h>
90dbf5fb 52#include <AliAlignObjParams.h>
08d168d9 53#include <AliTrackReference.h>
8f6ee336 54#include <TTree.h> // ROOT_TTree
bf000c32 55#include <TChain.h> // ROOT_TChain
8f6ee336 56#include <TParticle.h> // ROOT_TParticle
57#include <TString.h> // ROOT_TString
58#include <TDatabasePDG.h> // ROOT_TDatabasePDG
59#include <TMath.h> // ROOT_TMath
60#include <TGeoManager.h> // ROOT_TGeoManager
bf000c32 61#include <TSystemDirectory.h> // ROOT_TSystemDirectory
8f6ee336 62#include <Riostream.h> // ROOT_Riostream
97b4001e 63#include <TFile.h> // ROOT_TFile
a1e17193 64#include <TStreamerInfo.h>
7003fbd0 65#include <TArrayF.h>
66
a1f80595 67//____________________________________________________________________
68ClassImp(AliFMDInput)
69#if 0
70 ; // This is here to keep Emacs for indenting the next line
71#endif
72
73
74//____________________________________________________________________
75AliFMDInput::AliFMDInput()
42f1b2f5 76 : TNamed("AliFMDInput", "Input handler for various FMD data"),
77 fGAliceFile(""),
a1f80595 78 fLoader(0),
79 fRun(0),
80 fStack(0),
81 fFMDLoader(0),
d760ea03 82 fReader(0),
5cf05dbb 83 fFMDReader(0),
a1f80595 84 fFMD(0),
bf000c32 85 fESD(0),
df137876 86 fESDEvent(0),
a1f80595 87 fTreeE(0),
88 fTreeH(0),
08d168d9 89 fTreeTR(0),
a1f80595 90 fTreeD(0),
91 fTreeS(0),
92 fTreeR(0),
b5ee4425 93 fTreeA(0),
bf000c32 94 fChainE(0),
a1f80595 95 fArrayE(0),
96 fArrayH(0),
faf80567 97 fArrayTR(0),
a1f80595 98 fArrayD(0),
99 fArrayS(0),
bf000c32 100 fArrayR(0),
d760ea03 101 fArrayA(0),
17e542eb 102 fHeader(0),
b5ee4425 103 fGeoManager(0),
a1f80595 104 fTreeMask(0),
039842fe 105 fRawFile(""),
17e542eb 106 fIsInit(kFALSE),
107 fEventCount(0)
a1f80595 108{
df137876 109
a1f80595 110 // Constructor of an FMD input object. Specify what data to read in
111 // using the AddLoad member function. Sub-classes should at a
112 // minimum overload the member function Event. A full job can be
113 // executed using the member function Run.
114}
115
116
117
118//____________________________________________________________________
119AliFMDInput::AliFMDInput(const char* gAliceFile)
42f1b2f5 120 : TNamed("AliFMDInput", "Input handler for various FMD data"),
121 fGAliceFile(gAliceFile),
a1f80595 122 fLoader(0),
123 fRun(0),
124 fStack(0),
125 fFMDLoader(0),
d760ea03 126 fReader(0),
5cf05dbb 127 fFMDReader(0),
a1f80595 128 fFMD(0),
bf000c32 129 fESD(0),
df137876 130 fESDEvent(0),
a1f80595 131 fTreeE(0),
132 fTreeH(0),
08d168d9 133 fTreeTR(0),
a1f80595 134 fTreeD(0),
135 fTreeS(0),
136 fTreeR(0),
b5ee4425 137 fTreeA(0),
bf000c32 138 fChainE(0),
a1f80595 139 fArrayE(0),
140 fArrayH(0),
faf80567 141 fArrayTR(0),
a1f80595 142 fArrayD(0),
143 fArrayS(0),
bf000c32 144 fArrayR(0),
d760ea03 145 fArrayA(0),
17e542eb 146 fHeader(0),
b5ee4425 147 fGeoManager(0),
a1f80595 148 fTreeMask(0),
039842fe 149 fRawFile(""),
17e542eb 150 fIsInit(kFALSE),
151 fEventCount(0)
a1f80595 152{
df137876 153
a1f80595 154 // Constructor of an FMD input object. Specify what data to read in
155 // using the AddLoad member function. Sub-classes should at a
156 // minimum overload the member function Event. A full job can be
157 // executed using the member function Run.
158}
159
160//____________________________________________________________________
161Int_t
162AliFMDInput::NEvents() const
163{
164 // Get number of events
e064ab4a 165 if (TESTBIT(fTreeMask, kRaw) ||
166 TESTBIT(fTreeMask, kRawCalib)) return fReader->GetNumberOfEvents();
faf80567 167 if (fChainE) return fChainE->GetEntriesFast();
a1f80595 168 if (fTreeE) return fTreeE->GetEntries();
169 return -1;
170}
171
172//____________________________________________________________________
173Bool_t
174AliFMDInput::Init()
175{
176 // Initialize the object. Get the needed loaders, and such.
177
178 // Check if we have been initialized
179 if (fIsInit) {
180 AliWarning("Already initialized");
181 return fIsInit;
182 }
faf80567 183 Info("Init","Initialising w/mask 0x%04x\n"
184 "\tHits: %d\n"
185 "\tKinematics: %d\n"
186 "\tDigits: %d\n"
187 "\tSDigits: %d\n"
188 "\tHeader: %d\n"
189 "\tRecPoints: %d\n"
190 "\tESD: %d\n"
191 "\tRaw: %d\n"
e064ab4a 192 "\tRawCalib: %d\n"
faf80567 193 "\tGeometry: %d\n"
194 "\tTracks: %d\n"
195 "\tTracksRefs: %d",
196 fTreeMask,
197 TESTBIT(fTreeMask, kHits),
198 TESTBIT(fTreeMask, kKinematics),
199 TESTBIT(fTreeMask, kDigits),
200 TESTBIT(fTreeMask, kSDigits),
201 TESTBIT(fTreeMask, kHeader),
202 TESTBIT(fTreeMask, kRecPoints),
203 TESTBIT(fTreeMask, kESD),
204 TESTBIT(fTreeMask, kRaw),
e064ab4a 205 TESTBIT(fTreeMask, kRawCalib),
faf80567 206 TESTBIT(fTreeMask, kGeometry),
207 TESTBIT(fTreeMask, kTracks),
208 TESTBIT(fTreeMask, kTrackRefs));
a1f80595 209 // Get the run
faf80567 210 if (TESTBIT(fTreeMask, kDigits) ||
211 TESTBIT(fTreeMask, kSDigits) ||
212 TESTBIT(fTreeMask, kKinematics) ||
213 TESTBIT(fTreeMask, kTrackRefs) ||
214 TESTBIT(fTreeMask, kTracks) ||
215 TESTBIT(fTreeMask, kHeader)) {
216 if (!gSystem->FindFile(".:/", fGAliceFile)) {
217 AliWarning(Form("Cannot find file %s in .:/", fGAliceFile.Data()));
59194467 218 }
faf80567 219 else {
220 fLoader = AliRunLoader::Open(fGAliceFile.Data(), "Alice", "read");
221 if (!fLoader) {
222 AliError(Form("Coulnd't read the file %s", fGAliceFile.Data()));
223 return kFALSE;
224 }
225 AliInfo(Form("Opened GAlice file %s", fGAliceFile.Data()));
226
227 if (fLoader->LoadgAlice()) return kFALSE;
228
229 fRun = fLoader->GetAliRun();
230
231 // Get the FMD
232 fFMD = static_cast<AliFMD*>(fRun->GetDetector("FMD"));
233 if (!fFMD) {
234 AliError("Failed to get detector FMD from loader");
235 return kFALSE;
236 }
237
238 // Get the FMD loader
239 fFMDLoader = fLoader->GetLoader("FMDLoader");
240 if (!fFMDLoader) {
241 AliError("Failed to get detector FMD loader from loader");
242 return kFALSE;
243 }
244 if (fLoader->LoadHeader()) {
245 AliError("Failed to get event header information from loader");
246 return kFALSE;
247 }
248 fTreeE = fLoader->TreeE();
59194467 249 }
a1f80595 250 }
8f6ee336 251
bf000c32 252 // Optionally, get the ESD files
253 if (TESTBIT(fTreeMask, kESD)) {
254 fChainE = new TChain("esdTree");
c2fc1258 255 TSystemDirectory dir(".",".");
bf000c32 256 TList* files = dir.GetListOfFiles();
c2fc1258 257 TSystemFile* file = 0;
258 if (!files) {
259 AliError("No files");
260 return kFALSE;
261 }
bf000c32 262 files->Sort();
263 TIter next(files);
264 while ((file = static_cast<TSystemFile*>(next()))) {
265 TString fname(file->GetName());
266 if (fname.Contains("AliESDs")) fChainE->AddFile(fname.Data());
267 }
df137876 268 fESDEvent = new AliESDEvent();
269 fESDEvent->ReadFromTree(fChainE);
270 // fChainE->SetBranchAddress("ESD", &fMainESD);
271
bf000c32 272 }
273
e064ab4a 274 if (TESTBIT(fTreeMask, kRaw) ||
275 TESTBIT(fTreeMask, kRawCalib)) {
d760ea03 276 AliInfo("Getting FMD raw data digits");
277 fArrayA = new TClonesArray("AliFMDDigit");
0b1b2076 278#if 0
279 if (!fRawFile.IsNull() && fRawFile.EndsWith(".root"))
039842fe 280 fReader = new AliRawReaderRoot(fRawFile.Data());
281 else if (!fRawFile.IsNull() && fRawFile.EndsWith(".raw"))
282 fReader = new AliRawReaderDate(fRawFile.Data());
283 else
284 fReader = new AliRawReaderFile(-1);
0b1b2076 285#else
286 if(!fRawFile.IsNull())
287 fReader = AliRawReader::Create(fRawFile.Data());
288 else
289 fReader = new AliRawReaderFile(-1);
290#endif
5cf05dbb 291 fFMDReader = new AliFMDRawReader(fReader, 0);
d760ea03 292 }
293
8f6ee336 294 // Optionally, get the geometry
295 if (TESTBIT(fTreeMask, kGeometry)) {
59194467 296 if (fRun) {
297 TString fname(fRun->GetGeometryFileName());
298 if (fname.IsNull()) {
299 Warning("Init", "No file name for the geometry from AliRun");
300 fname = gSystem->DirName(fGAliceFile);
301 fname.Append("/geometry.root");
302 }
303 fGeoManager = TGeoManager::Import(fname.Data());
304 if (!fGeoManager) {
305 Fatal("Init", "No geometry manager found");
306 return kFALSE;
307 }
8f6ee336 308 }
59194467 309 else {
310 AliGeomManager::LoadGeometry();
8f6ee336 311 }
1e8f773e 312 AliCDBManager* cdb = AliCDBManager::Instance();
313 AliCDBEntry* align = cdb->Get("FMD/Align/Data");
314 if (align) {
315 AliInfo("Got alignment data from CDB");
316 TClonesArray* array = dynamic_cast<TClonesArray*>(align->GetObject());
317 if (!array) {
318 AliWarning("Invalid align data from CDB");
319 }
320 else {
321 Int_t nAlign = array->GetEntries();
322 for (Int_t i = 0; i < nAlign; i++) {
90dbf5fb 323 AliAlignObjParams* a = static_cast<AliAlignObjParams*>(array->At(i));
1e8f773e 324 if (!a->ApplyToGeometry()) {
325 AliWarning(Form("Failed to apply alignment to %s",
b760c02e 326 a->GetSymName()));
1e8f773e 327 }
328 }
329 }
330 }
8f6ee336 331 }
bf000c32 332
69893a66 333 fEventCount = 0;
a1f80595 334 fIsInit = kTRUE;
335 return fIsInit;
336}
337
338//____________________________________________________________________
339Bool_t
340AliFMDInput::Begin(Int_t event)
341{
342 // Called at the begining of each event. Per default, it gets the
343 // data trees and gets pointers to the output arrays. Users can
344 // overload this, but should call this member function in the
345 // overloaded member function of the derived class.
346
347 // Check if we have been initialized
348 if (!fIsInit) {
349 AliError("Not initialized");
350 return fIsInit;
351 }
7003fbd0 352
a1f80595 353 // Get the event
59194467 354 if (fLoader && fLoader->GetEvent(event)) return kFALSE;
69893a66 355 AliInfo(Form("Now in event %8d/%8d", event, NEvents()));
a1f80595 356
357 // Possibly load global kinematics information
f95a63c4 358 if (TESTBIT(fTreeMask, kKinematics) || TESTBIT(fTreeMask, kTracks)) {
69893a66 359 // AliInfo("Getting kinematics");
42f1b2f5 360 if (fLoader->LoadKinematics("READ")) return kFALSE;
a1f80595 361 fStack = fLoader->Stack();
362 }
7003fbd0 363
a1f80595 364 // Possibly load FMD Hit information
f95a63c4 365 if (TESTBIT(fTreeMask, kHits) || TESTBIT(fTreeMask, kTracks)) {
69893a66 366 // AliInfo("Getting FMD hits");
42f1b2f5 367 if (!fFMDLoader || fFMDLoader->LoadHits("READ")) return kFALSE;
a1f80595 368 fTreeH = fFMDLoader->TreeH();
369 if (!fArrayH) fArrayH = fFMD->Hits();
370 }
08d168d9 371
372 // Possibly load FMD TrackReference information
373 if (TESTBIT(fTreeMask, kTrackRefs) || TESTBIT(fTreeMask, kTracks)) {
374 // AliInfo("Getting FMD hits");
375 if (!fLoader || fLoader->LoadTrackRefs("READ")) return kFALSE;
376 fTreeTR = fLoader->TreeTR();
377 if (!fArrayTR) fArrayTR = new TClonesArray("AliTrackReference");
378 fTreeTR->SetBranchAddress("TrackReferences", &fArrayTR);
379 }
380
9b98d361 381 // Possibly load heaedr information
382 if (TESTBIT(fTreeMask, kHeader)) {
383 // AliInfo("Getting FMD hits");
384 if (!fLoader /* || fLoader->LoadHeader()*/) return kFALSE;
385 fHeader = fLoader->GetHeader();
386 }
387
a1f80595 388 // Possibly load FMD Digit information
389 if (TESTBIT(fTreeMask, kDigits)) {
69893a66 390 // AliInfo("Getting FMD digits");
42f1b2f5 391 if (!fFMDLoader || fFMDLoader->LoadDigits("READ")) return kFALSE;
a1f80595 392 fTreeD = fFMDLoader->TreeD();
a9579262 393 if (fTreeD) {
394 if (!fArrayD) fArrayD = fFMD->Digits();
395 }
396 else {
397 fArrayD = 0;
398 AliWarning(Form("Failed to load FMD Digits"));
399 }
a1f80595 400 }
7003fbd0 401
a1f80595 402 // Possibly load FMD Sdigit information
403 if (TESTBIT(fTreeMask, kSDigits)) {
69893a66 404 // AliInfo("Getting FMD summable digits");
faf80567 405 if (!fFMDLoader || fFMDLoader->LoadSDigits("READ")) {
406 AliWarning("Failed to load SDigits!");
407 return kFALSE;
408 }
a1f80595 409 fTreeS = fFMDLoader->TreeS();
410 if (!fArrayS) fArrayS = fFMD->SDigits();
411 }
7003fbd0 412
a1f80595 413 // Possibly load FMD RecPoints information
414 if (TESTBIT(fTreeMask, kRecPoints)) {
69893a66 415 // AliInfo("Getting FMD reconstructed points");
42f1b2f5 416 if (!fFMDLoader || fFMDLoader->LoadRecPoints("READ")) return kFALSE;
a1f80595 417 fTreeR = fFMDLoader->TreeR();
bf000c32 418 if (!fArrayR) fArrayR = new TClonesArray("AliFMDRecPoint");
419 fTreeR->SetBranchAddress("FMD", &fArrayR);
7003fbd0 420 }
421
422 // Possibly load FMD ESD information
bf000c32 423 if (TESTBIT(fTreeMask, kESD)) {
69893a66 424 // AliInfo("Getting FMD event summary data");
bf000c32 425 Int_t read = fChainE->GetEntry(event);
426 if (read <= 0) return kFALSE;
df137876 427 fESD = fESDEvent->GetFMDData();
bf000c32 428 if (!fESD) return kFALSE;
7003fbd0 429#if 0
97b4001e 430 TFile* f = fChainE->GetFile();
431 if (f) {
432 TObject* o = f->GetStreamerInfoList()->FindObject("AliFMDMap");
433 if (o) {
434 TStreamerInfo* info = static_cast<TStreamerInfo*>(o);
435 std::cout << "AliFMDMap class version read is "
436 << info->GetClassVersion() << std::endl;
437 }
438 }
439 // fESD->CheckNeedUShort(fChainE->GetFile());
7003fbd0 440#endif
bf000c32 441 }
7003fbd0 442
d760ea03 443 // Possibly load FMD Digit information
e064ab4a 444 if (TESTBIT(fTreeMask, kRaw) || TESTBIT(fTreeMask, kRawCalib)) {
506dc39d 445 Bool_t mon = fRawFile.Contains("mem://");
5cf05dbb 446 // AliInfo("Getting FMD raw data digits");
506dc39d 447 if (mon) std::cout << "Waiting for event ..." << std::flush;
e1a9aea4 448 do {
449 if (!fReader->NextEvent()) {
506dc39d 450 if (mon) {
e1a9aea4 451 gSystem->Sleep(3);
452 continue;
453 }
454 return kFALSE;
455 }
456 UInt_t eventType = fReader->GetType();
457 if(eventType == AliRawEventHeaderBase::kPhysicsEvent ||
458 eventType == AliRawEventHeaderBase::kCalibrationEvent)
459 break;
460 } while (true);
506dc39d 461 if (mon) std::cout << "got it" << std::endl;
5cf05dbb 462 // AliFMDRawReader r(fReader, 0);
d760ea03 463 fArrayA->Clear();
5cf05dbb 464 fFMDReader->ReadAdcs(fArrayA);
59194467 465 AliFMDDebug(1, ("Got a total of %d digits", fArrayA->GetEntriesFast()));
d760ea03 466 }
69893a66 467 fEventCount++;
bf000c32 468 return kTRUE;
469}
470
471
472//____________________________________________________________________
473Bool_t
474AliFMDInput::Event()
475{
476 // Process one event. The default implementation one or more of
477 //
478 // - ProcessHits if the hits are loaded.
479 // - ProcessDigits if the digits are loaded.
480 // - ProcessSDigits if the sumbable digits are loaded.
481 // - ProcessRecPoints if the reconstructed points are loaded.
482 // - ProcessESD if the event summary data is loaded
483 //
484 if (TESTBIT(fTreeMask, kHits))
485 if (!ProcessHits()) return kFALSE;
08d168d9 486 if (TESTBIT(fTreeMask, kTrackRefs))
487 if (!ProcessTrackRefs()) return kFALSE;
f95a63c4 488 if (TESTBIT(fTreeMask, kTracks))
489 if (!ProcessTracks()) return kFALSE;
bf000c32 490 if (TESTBIT(fTreeMask, kSDigits))
491 if (!ProcessSDigits()) return kFALSE;
faf80567 492 if (TESTBIT(fTreeMask, kDigits))
493 if (!ProcessDigits()) return kFALSE;
d760ea03 494 if (TESTBIT(fTreeMask, kRaw))
495 if (!ProcessRawDigits()) return kFALSE;
e064ab4a 496 if (TESTBIT(fTreeMask, kRawCalib))
497 if (!ProcessRawCalibDigits()) return kFALSE;
bf000c32 498 if (TESTBIT(fTreeMask, kRecPoints))
499 if (!ProcessRecPoints()) return kFALSE;
500 if (TESTBIT(fTreeMask, kESD))
a9579262 501 if (!ProcessESDs()) return kFALSE;
506dc39d 502 if (TESTBIT(fTreeMask, kUser))
503 if (!ProcessUsers()) return kFALSE;
bf000c32 504
505 return kTRUE;
506}
507
508//____________________________________________________________________
509Bool_t
510AliFMDInput::ProcessHits()
511{
02a27b50 512 // Read the hit tree, and pass each hit to the member function
513 // ProcessHit.
bf000c32 514 if (!fTreeH) {
515 AliError("No hit tree defined");
516 return kFALSE;
517 }
ddaa8027 518 if (!fArrayH) {
519 AliError("No hit array defined");
520 return kFALSE;
521 }
522
bf000c32 523 Int_t nTracks = fTreeH->GetEntries();
524 for (Int_t i = 0; i < nTracks; i++) {
525 Int_t hitRead = fTreeH->GetEntry(i);
526 if (hitRead <= 0) continue;
ddaa8027 527
bf000c32 528 Int_t nHit = fArrayH->GetEntries();
529 if (nHit <= 0) continue;
ddaa8027 530
bf000c32 531 for (Int_t j = 0; j < nHit; j++) {
532 AliFMDHit* hit = static_cast<AliFMDHit*>(fArrayH->At(j));
533 if (!hit) continue;
ddaa8027 534
bf000c32 535 TParticle* track = 0;
536 if (TESTBIT(fTreeMask, kKinematics) && fStack) {
537 Int_t trackno = hit->Track();
538 track = fStack->Particle(trackno);
539 }
540 if (!ProcessHit(hit, track)) return kFALSE;
541 }
542 }
543 return kTRUE;
544}
08d168d9 545//____________________________________________________________________
546Bool_t
547AliFMDInput::ProcessTrackRefs()
548{
549 // Read the reconstrcted points tree, and pass each reconstruction
550 // object (AliFMDRecPoint) to either ProcessRecPoint.
551 if (!fTreeTR) {
552 AliError("No track reference tree defined");
553 return kFALSE;
554 }
555 if (!fArrayTR) {
556 AliError("No track reference array defined");
557 return kFALSE;
558 }
bf000c32 559
08d168d9 560 Int_t nEv = fTreeTR->GetEntries();
561 for (Int_t i = 0; i < nEv; i++) {
562 Int_t trRead = fTreeTR->GetEntry(i);
563 if (trRead <= 0) continue;
564 Int_t nTrackRefs = fArrayTR->GetEntries();
565 for (Int_t j = 0; j < nTrackRefs; j++) {
566 AliTrackReference* trackRef = static_cast<AliTrackReference*>(fArrayTR->At(j));
567 if (!trackRef) continue;
568 if (trackRef->DetectorId() != AliTrackReference::kFMD) continue;
569 TParticle* track = 0;
570 if (TESTBIT(fTreeMask, kKinematics) && fStack) {
571 Int_t trackno = trackRef->GetTrack();
572 track = fStack->Particle(trackno);
573 }
574 if (!ProcessTrackRef(trackRef,track)) return kFALSE;
575 }
576 }
577 return kTRUE;
578}
f95a63c4 579//____________________________________________________________________
580Bool_t
581AliFMDInput::ProcessTracks()
582{
583 // Read the hit tree, and pass each hit to the member function
ddaa8027 584 // ProcessTrack.
f95a63c4 585 if (!fStack) {
586 AliError("No track tree defined");
587 return kFALSE;
588 }
589 if (!fTreeH) {
590 AliError("No hit tree defined");
591 return kFALSE;
592 }
ddaa8027 593 if (!fArrayH) {
594 AliError("No hit array defined");
595 return kFALSE;
596 }
597
598 // Int_t nTracks = fStack->GetNtrack();
f95a63c4 599 Int_t nTracks = fTreeH->GetEntries();
600 for (Int_t i = 0; i < nTracks; i++) {
ddaa8027 601 Int_t trackno = nTracks - i - 1;
602 TParticle* track = fStack->Particle(trackno);
f95a63c4 603 if (!track) continue;
ddaa8027 604
605 // Get the hits for this track.
f95a63c4 606 Int_t hitRead = fTreeH->GetEntry(i);
ddaa8027 607 Int_t nHit = fArrayH->GetEntries();
608 if (nHit == 0 || hitRead <= 0) {
609 // Let user code see the track, even if there's no hits.
610 if (!ProcessTrack(trackno, track, 0)) return kFALSE;
611 continue;
f95a63c4 612 }
f95a63c4 613
ddaa8027 614 // Loop over the hits corresponding to this track.
f95a63c4 615 for (Int_t j = 0; j < nHit; j++) {
616 AliFMDHit* hit = static_cast<AliFMDHit*>(fArrayH->At(j));
ddaa8027 617 if (!ProcessTrack(trackno, track, hit)) return kFALSE;
618 }
f95a63c4 619 }
620 return kTRUE;
621}
622
bf000c32 623//____________________________________________________________________
624Bool_t
625AliFMDInput::ProcessDigits()
626{
627 // Read the digit tree, and pass each digit to the member function
628 // ProcessDigit.
42f1b2f5 629 if (!fTreeD) {
630 AliError("No digit tree defined");
631 return kFALSE;
632 }
633 if (!fArrayD) {
634 AliError("No digit array defined");
635 return kFALSE;
636 }
637
bf000c32 638 Int_t nEv = fTreeD->GetEntries();
639 for (Int_t i = 0; i < nEv; i++) {
640 Int_t digitRead = fTreeD->GetEntry(i);
641 if (digitRead <= 0) continue;
642 Int_t nDigit = fArrayD->GetEntries();
42f1b2f5 643 AliFMDDebug(0, ("Got %5d digits for this event", nDigit));
bf000c32 644 if (nDigit <= 0) continue;
645 for (Int_t j = 0; j < nDigit; j++) {
646 AliFMDDigit* digit = static_cast<AliFMDDigit*>(fArrayD->At(j));
647 if (!digit) continue;
648 if (!ProcessDigit(digit)) return kFALSE;
649 }
650 }
651 return kTRUE;
652}
653
654//____________________________________________________________________
655Bool_t
656AliFMDInput::ProcessSDigits()
657{
658 // Read the summable digit tree, and pass each sumable digit to the
659 // member function ProcessSdigit.
42f1b2f5 660 if (!fTreeS) {
661 AliWarning("No sdigit tree defined");
662 return kTRUE; // Empty SDigits is fine
663 }
664 if (!fArrayS) {
665 AliWarning("No sdigit array defined");
666 return kTRUE; // Empty SDigits is fine
667 }
668
669 Int_t nEv = fTreeS->GetEntries();
bf000c32 670 for (Int_t i = 0; i < nEv; i++) {
671 Int_t sdigitRead = fTreeS->GetEntry(i);
faf80567 672 if (sdigitRead <= 0) {
673 AliInfo(Form("Read nothing from tree"));
674 continue;
675 }
676 Int_t nSdigit = fArrayS->GetEntriesFast();
42f1b2f5 677 AliFMDDebug(0, ("Got %5d digits for this event", nSdigit));
faf80567 678 AliInfo(Form("Got %5d digits for this event", nSdigit));
bf000c32 679 if (nSdigit <= 0) continue;
680 for (Int_t j = 0; j < nSdigit; j++) {
681 AliFMDSDigit* sdigit = static_cast<AliFMDSDigit*>(fArrayS->At(j));
682 if (!sdigit) continue;
683 if (!ProcessSDigit(sdigit)) return kFALSE;
684 }
685 }
686 return kTRUE;
687}
688
d760ea03 689//____________________________________________________________________
690Bool_t
691AliFMDInput::ProcessRawDigits()
692{
693 // Read the digit tree, and pass each digit to the member function
694 // ProcessDigit.
42f1b2f5 695 if (!fArrayA) {
696 AliError("No raw digit array defined");
697 return kFALSE;
698 }
699
d760ea03 700 Int_t nDigit = fArrayA->GetEntries();
701 if (nDigit <= 0) return kTRUE;
702 for (Int_t j = 0; j < nDigit; j++) {
703 AliFMDDigit* digit = static_cast<AliFMDDigit*>(fArrayA->At(j));
704 if (!digit) continue;
59194467 705 if (AliLog::GetDebugLevel("FMD","") >= 40 && j < 30)
706 digit->Print();
d760ea03 707 if (!ProcessRawDigit(digit)) return kFALSE;
708 }
709 return kTRUE;
710}
711
e064ab4a 712//____________________________________________________________________
713Bool_t
714AliFMDInput::ProcessRawCalibDigits()
715{
716 // Read the digit tree, and pass each digit to the member function
717 // ProcessDigit.
718 if (!fArrayA) {
719 AliError("No raw digit array defined");
720 return kFALSE;
721 }
722
723 Int_t nDigit = fArrayA->GetEntries();
724 if (nDigit <= 0) return kTRUE;
725 for (Int_t j = 0; j < nDigit; j++) {
726 AliFMDDigit* digit = static_cast<AliFMDDigit*>(fArrayA->At(j));
727 if (!digit) continue;
728 if (AliLog::GetDebugLevel("FMD","") >= 40 && j < 30)
729 digit->Print();
730 if (!ProcessRawCalibDigit(digit)) return kFALSE;
731 }
732 return kTRUE;
733}
734
bf000c32 735//____________________________________________________________________
736Bool_t
737AliFMDInput::ProcessRecPoints()
738{
739 // Read the reconstrcted points tree, and pass each reconstruction
740 // object (AliFMDRecPoint) to either ProcessRecPoint.
42f1b2f5 741 if (!fTreeR) {
742 AliError("No recpoint tree defined");
743 return kFALSE;
744 }
745 if (!fArrayR) {
746 AliError("No recpoints array defined");
747 return kFALSE;
748 }
749
bf000c32 750 Int_t nEv = fTreeR->GetEntries();
751 for (Int_t i = 0; i < nEv; i++) {
752 Int_t recRead = fTreeR->GetEntry(i);
753 if (recRead <= 0) continue;
754 Int_t nRecPoint = fArrayR->GetEntries();
755 for (Int_t j = 0; j < nRecPoint; j++) {
756 AliFMDRecPoint* recPoint = static_cast<AliFMDRecPoint*>(fArrayR->At(j));
757 if (!recPoint) continue;
758 if (!ProcessRecPoint(recPoint)) return kFALSE;
759 }
a1f80595 760 }
761 return kTRUE;
762}
763
a9579262 764//____________________________________________________________________
765Bool_t
766AliFMDInput::ProcessESDs()
767{
768 // Process event summary data
769 if (!fESD) return kFALSE;
770 for (UShort_t det = 1; det <= 3; det++) {
771 Char_t rings[] = { 'I', (det == 1 ? '\0' : 'O'), '\0' };
772 for (Char_t* rng = rings; *rng != '\0'; rng++) {
773 UShort_t nsec = (*rng == 'I' ? 20 : 40);
774 UShort_t nstr = (*rng == 'I' ? 512 : 256);
775 for (UShort_t sec = 0; sec < nsec; sec++) {
776 for (UShort_t str = 0; str < nstr; str++) {
777 Float_t eta = fESD->Eta(det,*rng,sec,str);
778 Float_t mult = fESD->Multiplicity(det,*rng,sec,str);
97b4001e 779 if (!fESD->IsAngleCorrected())
780 mult *= TMath::Abs(TMath::Cos(2.*TMath::ATan(TMath::Exp(-eta))));
a9579262 781 if (!ProcessESD(det, *rng, sec, str, eta, mult)) continue;
782 }
783 }
784 }
785 }
786 return kTRUE;
787}
788
506dc39d 789//____________________________________________________________________
790Bool_t
791AliFMDInput::ProcessUsers()
792{
793 // Process event summary data
794 for (UShort_t det = 1; det <= 3; det++) {
795 Char_t rings[] = { 'I', (det == 1 ? '\0' : 'O'), '\0' };
796 for (Char_t* rng = rings; *rng != '\0'; rng++) {
797 UShort_t nsec = (*rng == 'I' ? 20 : 40);
798 UShort_t nstr = (*rng == 'I' ? 512 : 256);
799 for (UShort_t sec = 0; sec < nsec; sec++) {
800 for (UShort_t str = 0; str < nstr; str++) {
801 Float_t v = GetSignal(det,*rng,sec,str);
802 if (!ProcessUser(det, *rng, sec, str, v)) continue;
803 }
804 }
805 }
806 }
807 return kTRUE;
808}
809
a1f80595 810//____________________________________________________________________
811Bool_t
812AliFMDInput::End()
813{
814 // Called at the end of each event. Per default, it unloads the
815 // data trees and resets the pointers to the output arrays. Users
816 // can overload this, but should call this member function in the
817 // overloaded member function of the derived class.
818
819 // Check if we have been initialized
820 if (!fIsInit) {
821 AliError("Not initialized");
822 return fIsInit;
823 }
824 // Possibly unload global kinematics information
f95a63c4 825 if (TESTBIT(fTreeMask, kKinematics) || TESTBIT(fTreeMask, kTracks)) {
a1f80595 826 fLoader->UnloadKinematics();
827 // fTreeK = 0;
828 fStack = 0;
829 }
830 // Possibly unload FMD Hit information
f95a63c4 831 if (TESTBIT(fTreeMask, kHits) || TESTBIT(fTreeMask, kTracks)) {
a1f80595 832 fFMDLoader->UnloadHits();
833 fTreeH = 0;
834 }
835 // Possibly unload FMD Digit information
836 if (TESTBIT(fTreeMask, kDigits)) {
837 fFMDLoader->UnloadDigits();
838 fTreeD = 0;
839 }
840 // Possibly unload FMD Sdigit information
841 if (TESTBIT(fTreeMask, kSDigits)) {
842 fFMDLoader->UnloadSDigits();
843 fTreeS = 0;
844 }
845 // Possibly unload FMD RecPoints information
846 if (TESTBIT(fTreeMask, kRecPoints)) {
847 fFMDLoader->UnloadRecPoints();
848 fTreeR = 0;
849 }
f48d9b11 850 // AliInfo("Now out event");
a1f80595 851 return kTRUE;
852}
853
854//____________________________________________________________________
855Bool_t
856AliFMDInput::Run()
857{
858 // Run over all events and files references in galice.root
859
860 Bool_t retval;
861 if (!(retval = Init())) return retval;
862
863 Int_t nEvents = NEvents();
59194467 864 for (Int_t event = 0; nEvents < 0 || event < nEvents; event++) {
a1f80595 865 if (!(retval = Begin(event))) break;
866 if (!(retval = Event())) break;
867 if (!(retval = End())) break;
868 }
869 if (!retval) return retval;
870 retval = Finish();
871 return retval;
872}
873
69893a66 874//__________________________________________________________________
875TArrayF
876AliFMDInput::MakeLogScale(Int_t n, Double_t min, Double_t max)
877{
878 // Service function to define a logarithmic axis.
879 // Parameters:
880 // n Number of bins
881 // min Minimum of axis
882 // max Maximum of axis
883 TArrayF bins(n+1);
884 bins[0] = min;
885 if (n <= 20) {
886 for (Int_t i = 1; i < n+1; i++) bins[i] = bins[i-1] + (max-min)/n;
887 return bins;
888 }
889 Float_t dp = n / TMath::Log10(max / min);
890 Float_t pmin = TMath::Log10(min);
891 for (Int_t i = 1; i < n+1; i++) {
892 Float_t p = pmin + i / dp;
893 bins[i] = TMath::Power(10, p);
894 }
895 return bins;
896}
897
898
a1f80595 899
a1f80595 900//____________________________________________________________________
901//
902// EOF
903//