1 /**************************************************************************
2 * Copyright(c) 2004, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
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
21 //___________________________________________________________________
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.
29 // Latest changes by Christian Holm Christensen
31 #include "AliFMDInput.h" // ALIFMDHIT_H
32 #include "AliFMDDebug.h" // ALIFMDDEBUG_H ALILOG_H
33 #include "AliLoader.h" // ALILOADER_H
34 #include "AliRunLoader.h" // ALIRUNLOADER_H
35 #include "AliRun.h" // ALIRUN_H
36 #include "AliStack.h" // ALISTACK_H
37 #include "AliRawReaderFile.h" // ALIRAWREADERFILE_H
38 #include "AliRawReaderRoot.h" // ALIRAWREADERROOT_H
39 #include "AliRawReaderDate.h" // ALIRAWREADERDATE_H
40 #include "AliRawEventHeaderBase.h"
41 #include "AliFMD.h" // ALIFMD_H
42 #include "AliFMDHit.h" // ALIFMDHIT_H
43 #include "AliFMDDigit.h" // ALIFMDDigit_H
44 #include "AliFMDSDigit.h" // ALIFMDDigit_H
45 #include "AliFMDRecPoint.h" // ALIFMDRECPOINT_H
46 #include "AliFMDRawReader.h" // ALIFMDRAWREADER_H
48 #include <AliESDFMD.h>
49 #include <AliESDEvent.h>
50 #include <AliCDBManager.h>
51 #include <AliCDBEntry.h>
52 #include <AliAlignObjParams.h>
53 #include <AliTrackReference.h>
54 #include <TTree.h> // ROOT_TTree
55 #include <TChain.h> // ROOT_TChain
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
61 #include <TSystemDirectory.h> // ROOT_TSystemDirectory
62 #include <Riostream.h> // ROOT_Riostream
63 #include <TFile.h> // ROOT_TFile
64 #include <TStreamerInfo.h>
67 //____________________________________________________________________
70 ; // This is here to keep Emacs for indenting the next line
74 //____________________________________________________________________
75 AliFMDInput::AliFMDInput()
76 : TNamed("AliFMDInput", "Input handler for various FMD data"),
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.
118 //____________________________________________________________________
119 AliFMDInput::AliFMDInput(const char* gAliceFile)
120 : TNamed("AliFMDInput", "Input handler for various FMD data"),
121 fGAliceFile(gAliceFile),
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.
160 //____________________________________________________________________
162 AliFMDInput::NEvents() const
164 // Get number of events
165 if (TESTBIT(fTreeMask, kRaw) ||
166 TESTBIT(fTreeMask, kRawCalib)) return fReader->GetNumberOfEvents();
167 if (fChainE) return fChainE->GetEntriesFast();
168 if (fTreeE) return fTreeE->GetEntries();
172 //____________________________________________________________________
176 // Initialize the object. Get the needed loaders, and such.
178 // Check if we have been initialized
180 AliWarning("Already initialized");
183 Info("Init","Initialising w/mask 0x%04x\n"
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),
205 TESTBIT(fTreeMask, kRawCalib),
206 TESTBIT(fTreeMask, kGeometry),
207 TESTBIT(fTreeMask, kTracks),
208 TESTBIT(fTreeMask, kTrackRefs));
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()));
220 fLoader = AliRunLoader::Open(fGAliceFile.Data(), "Alice", "read");
222 AliError(Form("Coulnd't read the file %s", fGAliceFile.Data()));
225 AliInfo(Form("Opened GAlice file %s", fGAliceFile.Data()));
227 if (fLoader->LoadgAlice()) return kFALSE;
229 fRun = fLoader->GetAliRun();
232 fFMD = static_cast<AliFMD*>(fRun->GetDetector("FMD"));
234 AliError("Failed to get detector FMD from loader");
238 // Get the FMD loader
239 fFMDLoader = fLoader->GetLoader("FMDLoader");
241 AliError("Failed to get detector FMD loader from loader");
244 if (fLoader->LoadHeader()) {
245 AliError("Failed to get event header information from loader");
248 fTreeE = fLoader->TreeE();
252 // Optionally, get the ESD files
253 if (TESTBIT(fTreeMask, kESD)) {
254 fChainE = new TChain("esdTree");
255 TSystemDirectory dir(".",".");
256 TList* files = dir.GetListOfFiles();
257 TSystemFile* file = 0;
259 AliError("No files");
264 while ((file = static_cast<TSystemFile*>(next()))) {
265 TString fname(file->GetName());
266 if (fname.Contains("AliESDs")) fChainE->AddFile(fname.Data());
268 fESDEvent = new AliESDEvent();
269 fESDEvent->ReadFromTree(fChainE);
270 // fChainE->SetBranchAddress("ESD", &fMainESD);
274 if (TESTBIT(fTreeMask, kRaw) ||
275 TESTBIT(fTreeMask, kRawCalib)) {
276 AliInfo("Getting FMD raw data digits");
277 fArrayA = new TClonesArray("AliFMDDigit");
279 if (!fRawFile.IsNull() && fRawFile.EndsWith(".root"))
280 fReader = new AliRawReaderRoot(fRawFile.Data());
281 else if (!fRawFile.IsNull() && fRawFile.EndsWith(".raw"))
282 fReader = new AliRawReaderDate(fRawFile.Data());
284 fReader = new AliRawReaderFile(-1);
286 if(!fRawFile.IsNull())
287 fReader = AliRawReader::Create(fRawFile.Data());
289 fReader = new AliRawReaderFile(-1);
291 fFMDReader = new AliFMDRawReader(fReader, 0);
294 // Optionally, get the geometry
295 if (TESTBIT(fTreeMask, kGeometry)) {
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");
303 fGeoManager = TGeoManager::Import(fname.Data());
305 Fatal("Init", "No geometry manager found");
310 AliGeomManager::LoadGeometry();
312 AliCDBManager* cdb = AliCDBManager::Instance();
313 AliCDBEntry* align = cdb->Get("FMD/Align/Data");
315 AliInfo("Got alignment data from CDB");
316 TClonesArray* array = dynamic_cast<TClonesArray*>(align->GetObject());
318 AliWarning("Invalid align data from CDB");
321 Int_t nAlign = array->GetEntries();
322 for (Int_t i = 0; i < nAlign; i++) {
323 AliAlignObjParams* a = static_cast<AliAlignObjParams*>(array->At(i));
324 if (!a->ApplyToGeometry()) {
325 AliWarning(Form("Failed to apply alignment to %s",
338 //____________________________________________________________________
340 AliFMDInput::Begin(Int_t event)
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.
347 // Check if we have been initialized
349 AliError("Not initialized");
354 if (fLoader && fLoader->GetEvent(event)) return kFALSE;
355 AliInfo(Form("Now in event %8d/%8d", event, NEvents()));
357 // Possibly load global kinematics information
358 if (TESTBIT(fTreeMask, kKinematics) || TESTBIT(fTreeMask, kTracks)) {
359 // AliInfo("Getting kinematics");
360 if (fLoader->LoadKinematics("READ")) return kFALSE;
361 fStack = fLoader->Stack();
364 // Possibly load FMD Hit information
365 if (TESTBIT(fTreeMask, kHits) || TESTBIT(fTreeMask, kTracks)) {
366 // AliInfo("Getting FMD hits");
367 if (!fFMDLoader || fFMDLoader->LoadHits("READ")) return kFALSE;
368 fTreeH = fFMDLoader->TreeH();
369 if (!fArrayH) fArrayH = fFMD->Hits();
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);
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();
388 // Possibly load FMD Digit information
389 if (TESTBIT(fTreeMask, kDigits)) {
390 // AliInfo("Getting FMD digits");
391 if (!fFMDLoader || fFMDLoader->LoadDigits("READ")) return kFALSE;
392 fTreeD = fFMDLoader->TreeD();
394 if (!fArrayD) fArrayD = fFMD->Digits();
398 AliWarning(Form("Failed to load FMD Digits"));
402 // Possibly load FMD Sdigit information
403 if (TESTBIT(fTreeMask, kSDigits)) {
404 // AliInfo("Getting FMD summable digits");
405 if (!fFMDLoader || fFMDLoader->LoadSDigits("READ")) {
406 AliWarning("Failed to load SDigits!");
409 fTreeS = fFMDLoader->TreeS();
410 if (!fArrayS) fArrayS = fFMD->SDigits();
413 // Possibly load FMD RecPoints information
414 if (TESTBIT(fTreeMask, kRecPoints)) {
415 // AliInfo("Getting FMD reconstructed points");
416 if (!fFMDLoader || fFMDLoader->LoadRecPoints("READ")) return kFALSE;
417 fTreeR = fFMDLoader->TreeR();
418 if (!fArrayR) fArrayR = new TClonesArray("AliFMDRecPoint");
419 fTreeR->SetBranchAddress("FMD", &fArrayR);
422 // Possibly load FMD ESD information
423 if (TESTBIT(fTreeMask, kESD)) {
424 // AliInfo("Getting FMD event summary data");
425 Int_t read = fChainE->GetEntry(event);
426 if (read <= 0) return kFALSE;
427 fESD = fESDEvent->GetFMDData();
428 if (!fESD) return kFALSE;
430 TFile* f = fChainE->GetFile();
432 TObject* o = f->GetStreamerInfoList()->FindObject("AliFMDMap");
434 TStreamerInfo* info = static_cast<TStreamerInfo*>(o);
435 std::cout << "AliFMDMap class version read is "
436 << info->GetClassVersion() << std::endl;
439 // fESD->CheckNeedUShort(fChainE->GetFile());
443 // Possibly load FMD Digit information
444 if (TESTBIT(fTreeMask, kRaw) || TESTBIT(fTreeMask, kRawCalib)) {
445 // AliInfo("Getting FMD raw data digits");
446 std::cout << "Waiting for event ..." << std::endl;
448 if (!fReader->NextEvent()) {
449 if (fRawFile.Contains("mem://")) {
455 UInt_t eventType = fReader->GetType();
456 if(eventType == AliRawEventHeaderBase::kPhysicsEvent ||
457 eventType == AliRawEventHeaderBase::kCalibrationEvent)
460 // AliFMDRawReader r(fReader, 0);
462 fFMDReader->ReadAdcs(fArrayA);
463 AliFMDDebug(1, ("Got a total of %d digits", fArrayA->GetEntriesFast()));
470 //____________________________________________________________________
474 // Process one event. The default implementation one or more of
476 // - ProcessHits if the hits are loaded.
477 // - ProcessDigits if the digits are loaded.
478 // - ProcessSDigits if the sumbable digits are loaded.
479 // - ProcessRecPoints if the reconstructed points are loaded.
480 // - ProcessESD if the event summary data is loaded
482 if (TESTBIT(fTreeMask, kHits))
483 if (!ProcessHits()) return kFALSE;
484 if (TESTBIT(fTreeMask, kTrackRefs))
485 if (!ProcessTrackRefs()) return kFALSE;
486 if (TESTBIT(fTreeMask, kTracks))
487 if (!ProcessTracks()) return kFALSE;
488 if (TESTBIT(fTreeMask, kSDigits))
489 if (!ProcessSDigits()) return kFALSE;
490 if (TESTBIT(fTreeMask, kDigits))
491 if (!ProcessDigits()) return kFALSE;
492 if (TESTBIT(fTreeMask, kRaw))
493 if (!ProcessRawDigits()) return kFALSE;
494 if (TESTBIT(fTreeMask, kRawCalib))
495 if (!ProcessRawCalibDigits()) return kFALSE;
496 if (TESTBIT(fTreeMask, kRecPoints))
497 if (!ProcessRecPoints()) return kFALSE;
498 if (TESTBIT(fTreeMask, kESD))
499 if (!ProcessESDs()) return kFALSE;
504 //____________________________________________________________________
506 AliFMDInput::ProcessHits()
508 // Read the hit tree, and pass each hit to the member function
511 AliError("No hit tree defined");
515 AliError("No hit array defined");
519 Int_t nTracks = fTreeH->GetEntries();
520 for (Int_t i = 0; i < nTracks; i++) {
521 Int_t hitRead = fTreeH->GetEntry(i);
522 if (hitRead <= 0) continue;
524 Int_t nHit = fArrayH->GetEntries();
525 if (nHit <= 0) continue;
527 for (Int_t j = 0; j < nHit; j++) {
528 AliFMDHit* hit = static_cast<AliFMDHit*>(fArrayH->At(j));
531 TParticle* track = 0;
532 if (TESTBIT(fTreeMask, kKinematics) && fStack) {
533 Int_t trackno = hit->Track();
534 track = fStack->Particle(trackno);
536 if (!ProcessHit(hit, track)) return kFALSE;
541 //____________________________________________________________________
543 AliFMDInput::ProcessTrackRefs()
545 // Read the reconstrcted points tree, and pass each reconstruction
546 // object (AliFMDRecPoint) to either ProcessRecPoint.
548 AliError("No track reference tree defined");
552 AliError("No track reference array defined");
556 Int_t nEv = fTreeTR->GetEntries();
557 for (Int_t i = 0; i < nEv; i++) {
558 Int_t trRead = fTreeTR->GetEntry(i);
559 if (trRead <= 0) continue;
560 Int_t nTrackRefs = fArrayTR->GetEntries();
561 for (Int_t j = 0; j < nTrackRefs; j++) {
562 AliTrackReference* trackRef = static_cast<AliTrackReference*>(fArrayTR->At(j));
563 if (!trackRef) continue;
564 if (trackRef->DetectorId() != AliTrackReference::kFMD) continue;
565 TParticle* track = 0;
566 if (TESTBIT(fTreeMask, kKinematics) && fStack) {
567 Int_t trackno = trackRef->GetTrack();
568 track = fStack->Particle(trackno);
570 if (!ProcessTrackRef(trackRef,track)) return kFALSE;
575 //____________________________________________________________________
577 AliFMDInput::ProcessTracks()
579 // Read the hit tree, and pass each hit to the member function
582 AliError("No track tree defined");
586 AliError("No hit tree defined");
590 AliError("No hit array defined");
594 // Int_t nTracks = fStack->GetNtrack();
595 Int_t nTracks = fTreeH->GetEntries();
596 for (Int_t i = 0; i < nTracks; i++) {
597 Int_t trackno = nTracks - i - 1;
598 TParticle* track = fStack->Particle(trackno);
599 if (!track) continue;
601 // Get the hits for this track.
602 Int_t hitRead = fTreeH->GetEntry(i);
603 Int_t nHit = fArrayH->GetEntries();
604 if (nHit == 0 || hitRead <= 0) {
605 // Let user code see the track, even if there's no hits.
606 if (!ProcessTrack(trackno, track, 0)) return kFALSE;
610 // Loop over the hits corresponding to this track.
611 for (Int_t j = 0; j < nHit; j++) {
612 AliFMDHit* hit = static_cast<AliFMDHit*>(fArrayH->At(j));
613 if (!ProcessTrack(trackno, track, hit)) return kFALSE;
619 //____________________________________________________________________
621 AliFMDInput::ProcessDigits()
623 // Read the digit tree, and pass each digit to the member function
626 AliError("No digit tree defined");
630 AliError("No digit array defined");
634 Int_t nEv = fTreeD->GetEntries();
635 for (Int_t i = 0; i < nEv; i++) {
636 Int_t digitRead = fTreeD->GetEntry(i);
637 if (digitRead <= 0) continue;
638 Int_t nDigit = fArrayD->GetEntries();
639 AliFMDDebug(0, ("Got %5d digits for this event", nDigit));
640 if (nDigit <= 0) continue;
641 for (Int_t j = 0; j < nDigit; j++) {
642 AliFMDDigit* digit = static_cast<AliFMDDigit*>(fArrayD->At(j));
643 if (!digit) continue;
644 if (!ProcessDigit(digit)) return kFALSE;
650 //____________________________________________________________________
652 AliFMDInput::ProcessSDigits()
654 // Read the summable digit tree, and pass each sumable digit to the
655 // member function ProcessSdigit.
657 AliWarning("No sdigit tree defined");
658 return kTRUE; // Empty SDigits is fine
661 AliWarning("No sdigit array defined");
662 return kTRUE; // Empty SDigits is fine
665 Int_t nEv = fTreeS->GetEntries();
666 for (Int_t i = 0; i < nEv; i++) {
667 Int_t sdigitRead = fTreeS->GetEntry(i);
668 if (sdigitRead <= 0) {
669 AliInfo(Form("Read nothing from tree"));
672 Int_t nSdigit = fArrayS->GetEntriesFast();
673 AliFMDDebug(0, ("Got %5d digits for this event", nSdigit));
674 AliInfo(Form("Got %5d digits for this event", nSdigit));
675 if (nSdigit <= 0) continue;
676 for (Int_t j = 0; j < nSdigit; j++) {
677 AliFMDSDigit* sdigit = static_cast<AliFMDSDigit*>(fArrayS->At(j));
678 if (!sdigit) continue;
679 if (!ProcessSDigit(sdigit)) return kFALSE;
685 //____________________________________________________________________
687 AliFMDInput::ProcessRawDigits()
689 // Read the digit tree, and pass each digit to the member function
692 AliError("No raw digit array defined");
696 Int_t nDigit = fArrayA->GetEntries();
697 if (nDigit <= 0) return kTRUE;
698 for (Int_t j = 0; j < nDigit; j++) {
699 AliFMDDigit* digit = static_cast<AliFMDDigit*>(fArrayA->At(j));
700 if (!digit) continue;
701 if (AliLog::GetDebugLevel("FMD","") >= 40 && j < 30)
703 if (!ProcessRawDigit(digit)) return kFALSE;
708 //____________________________________________________________________
710 AliFMDInput::ProcessRawCalibDigits()
712 // Read the digit tree, and pass each digit to the member function
715 AliError("No raw digit array defined");
719 Int_t nDigit = fArrayA->GetEntries();
720 if (nDigit <= 0) return kTRUE;
721 for (Int_t j = 0; j < nDigit; j++) {
722 AliFMDDigit* digit = static_cast<AliFMDDigit*>(fArrayA->At(j));
723 if (!digit) continue;
724 if (AliLog::GetDebugLevel("FMD","") >= 40 && j < 30)
726 if (!ProcessRawCalibDigit(digit)) return kFALSE;
731 //____________________________________________________________________
733 AliFMDInput::ProcessRecPoints()
735 // Read the reconstrcted points tree, and pass each reconstruction
736 // object (AliFMDRecPoint) to either ProcessRecPoint.
738 AliError("No recpoint tree defined");
742 AliError("No recpoints array defined");
746 Int_t nEv = fTreeR->GetEntries();
747 for (Int_t i = 0; i < nEv; i++) {
748 Int_t recRead = fTreeR->GetEntry(i);
749 if (recRead <= 0) continue;
750 Int_t nRecPoint = fArrayR->GetEntries();
751 for (Int_t j = 0; j < nRecPoint; j++) {
752 AliFMDRecPoint* recPoint = static_cast<AliFMDRecPoint*>(fArrayR->At(j));
753 if (!recPoint) continue;
754 if (!ProcessRecPoint(recPoint)) return kFALSE;
760 //____________________________________________________________________
762 AliFMDInput::ProcessESDs()
764 // Process event summary data
765 if (!fESD) return kFALSE;
766 for (UShort_t det = 1; det <= 3; det++) {
767 Char_t rings[] = { 'I', (det == 1 ? '\0' : 'O'), '\0' };
768 for (Char_t* rng = rings; *rng != '\0'; rng++) {
769 UShort_t nsec = (*rng == 'I' ? 20 : 40);
770 UShort_t nstr = (*rng == 'I' ? 512 : 256);
771 for (UShort_t sec = 0; sec < nsec; sec++) {
772 for (UShort_t str = 0; str < nstr; str++) {
773 Float_t eta = fESD->Eta(det,*rng,sec,str);
774 Float_t mult = fESD->Multiplicity(det,*rng,sec,str);
775 if (!fESD->IsAngleCorrected())
776 mult *= TMath::Abs(TMath::Cos(2.*TMath::ATan(TMath::Exp(-eta))));
777 if (!ProcessESD(det, *rng, sec, str, eta, mult)) continue;
785 //____________________________________________________________________
789 // Called at the end of each event. Per default, it unloads the
790 // data trees and resets the pointers to the output arrays. Users
791 // can overload this, but should call this member function in the
792 // overloaded member function of the derived class.
794 // Check if we have been initialized
796 AliError("Not initialized");
799 // Possibly unload global kinematics information
800 if (TESTBIT(fTreeMask, kKinematics) || TESTBIT(fTreeMask, kTracks)) {
801 fLoader->UnloadKinematics();
805 // Possibly unload FMD Hit information
806 if (TESTBIT(fTreeMask, kHits) || TESTBIT(fTreeMask, kTracks)) {
807 fFMDLoader->UnloadHits();
810 // Possibly unload FMD Digit information
811 if (TESTBIT(fTreeMask, kDigits)) {
812 fFMDLoader->UnloadDigits();
815 // Possibly unload FMD Sdigit information
816 if (TESTBIT(fTreeMask, kSDigits)) {
817 fFMDLoader->UnloadSDigits();
820 // Possibly unload FMD RecPoints information
821 if (TESTBIT(fTreeMask, kRecPoints)) {
822 fFMDLoader->UnloadRecPoints();
825 // AliInfo("Now out event");
829 //____________________________________________________________________
833 // Run over all events and files references in galice.root
836 if (!(retval = Init())) return retval;
838 Int_t nEvents = NEvents();
839 for (Int_t event = 0; nEvents < 0 || event < nEvents; event++) {
840 if (!(retval = Begin(event))) break;
841 if (!(retval = Event())) break;
842 if (!(retval = End())) break;
844 if (!retval) return retval;
849 //__________________________________________________________________
851 AliFMDInput::MakeLogScale(Int_t n, Double_t min, Double_t max)
853 // Service function to define a logarithmic axis.
856 // min Minimum of axis
857 // max Maximum of axis
861 for (Int_t i = 1; i < n+1; i++) bins[i] = bins[i-1] + (max-min)/n;
864 Float_t dp = n / TMath::Log10(max / min);
865 Float_t pmin = TMath::Log10(min);
866 for (Int_t i = 1; i < n+1; i++) {
867 Float_t p = pmin + i / dp;
868 bins[i] = TMath::Power(10, p);
875 //____________________________________________________________________