* about the suitability of this software for any purpose. It is *
* provided "as is" without express or implied warranty. *
**************************************************************************/
-
/* $Id$ */
-
+/** @file AliFMDInput.cxx
+ @author Christian Holm Christensen <cholm@nbi.dk>
+ @date Mon Mar 27 12:42:40 2006
+ @brief FMD utility classes for reading FMD data
+*/
//___________________________________________________________________
//
// The classes defined here, are utility classes for reading in data
#include "AliRunLoader.h" // ALIRUNLOADER_H
#include "AliRun.h" // ALIRUN_H
#include "AliStack.h" // ALISTACK_H
+#include "AliRawReaderFile.h" // ALIRAWREADERFILE_H
#include "AliFMD.h" // ALIFMD_H
#include "AliFMDHit.h" // ALIFMDHIT_H
#include "AliFMDDigit.h" // ALIFMDDigit_H
-#include "AliFMDMultStrip.h" // ALIFMDMultStrip_H
-#include "AliFMDMultRegion.h" // ALIFMDMultRegion_H
+#include "AliFMDSDigit.h" // ALIFMDDigit_H
+#include "AliFMDRecPoint.h" // ALIFMDRECPOINT_H
+#include "AliFMDRawReader.h" // ALIFMDRAWREADER_H
+#include <AliESD.h>
+#include <AliESDFMD.h>
+#include <AliCDBManager.h>
+#include <AliCDBEntry.h>
+#include <AliAlignObjAngles.h>
#include <TTree.h> // ROOT_TTree
+#include <TChain.h> // ROOT_TChain
#include <TParticle.h> // ROOT_TParticle
#include <TString.h> // ROOT_TString
#include <TDatabasePDG.h> // ROOT_TDatabasePDG
#include <TMath.h> // ROOT_TMath
#include <TGeoManager.h> // ROOT_TGeoManager
+#include <TSystemDirectory.h> // ROOT_TSystemDirectory
#include <Riostream.h> // ROOT_Riostream
//____________________________________________________________________
fRun(0),
fStack(0),
fFMDLoader(0),
+ fReader(0),
fFMD(0),
+ fMainESD(0),
+ fESD(0),
fTreeE(0),
fTreeH(0),
fTreeD(0),
fTreeS(0),
fTreeR(0),
+ fTreeA(0),
+ fChainE(0),
fArrayE(0),
fArrayH(0),
fArrayD(0),
fArrayS(0),
- fArrayN(0),
- fArrayP(0),
+ fArrayR(0),
+ fArrayA(0),
+ fGeoManager(0),
fTreeMask(0),
fIsInit(kFALSE)
{
fRun(0),
fStack(0),
fFMDLoader(0),
+ fReader(0),
fFMD(0),
+ fMainESD(0),
+ fESD(0),
fTreeE(0),
fTreeH(0),
fTreeD(0),
fTreeS(0),
fTreeR(0),
+ fTreeA(0),
+ fChainE(0),
fArrayE(0),
fArrayH(0),
fArrayD(0),
fArrayS(0),
- fArrayN(0),
- fArrayP(0),
+ fArrayR(0),
+ fArrayA(0),
+ fGeoManager(0),
fTreeMask(0),
fIsInit(kFALSE)
{
}
fTreeE = fLoader->TreeE();
+ // Optionally, get the ESD files
+ if (TESTBIT(fTreeMask, kESD)) {
+ fChainE = new TChain("esdTree");
+ TSystemDirectory dir(".",".");
+ TList* files = dir.GetListOfFiles();
+ TSystemFile* file = 0;
+ if (!files) {
+ AliError("No files");
+ return kFALSE;
+ }
+ files->Sort();
+ TIter next(files);
+ while ((file = static_cast<TSystemFile*>(next()))) {
+ TString fname(file->GetName());
+ if (fname.Contains("AliESDs")) fChainE->AddFile(fname.Data());
+ }
+ fChainE->SetBranchAddress("ESD", &fMainESD);
+ }
+
+ if (TESTBIT(fTreeMask, kRaw)) {
+ AliInfo("Getting FMD raw data digits");
+ fArrayA = new TClonesArray("AliFMDDigit");
+ fReader = new AliRawReaderFile(-1);
+ }
+
// Optionally, get the geometry
if (TESTBIT(fTreeMask, kGeometry)) {
TString fname(fRun->GetGeometryFileName());
Fatal("Init", "No geometry manager found");
return kFALSE;
}
+ AliCDBManager* cdb = AliCDBManager::Instance();
+ AliCDBEntry* align = cdb->Get("FMD/Align/Data");
+ if (align) {
+ AliInfo("Got alignment data from CDB");
+ TClonesArray* array = dynamic_cast<TClonesArray*>(align->GetObject());
+ if (!array) {
+ AliWarning("Invalid align data from CDB");
+ }
+ else {
+ Int_t nAlign = array->GetEntries();
+ for (Int_t i = 0; i < nAlign; i++) {
+ AliAlignObjAngles* a = static_cast<AliAlignObjAngles*>(array->At(i));
+ if (!a->ApplyToGeometry()) {
+ AliWarning(Form("Failed to apply alignment to %s",
+ a->GetVolPath()));
+ }
+ }
+ }
+ }
}
+
fIsInit = kTRUE;
return fIsInit;
AliInfo("Getting FMD reconstructed points");
if (fFMDLoader->LoadRecPoints()) return kFALSE;
fTreeR = fFMDLoader->TreeR();
- if (!fArrayN) fArrayN = new TClonesArray("AliFMDMultStrip");
- // if (!fArrayP) fArrayP = new TClonesArray("AliFMDMultRegion");
- fTreeR->SetBranchAddress("FMD", &fArrayN);
- // fTreeR->SetBranchAddress("FMDPoisson", &fArrayP);
+ if (!fArrayR) fArrayR = new TClonesArray("AliFMDRecPoint");
+ fTreeR->SetBranchAddress("FMD", &fArrayR);
+ } // Possibly load FMD ESD information
+ if (TESTBIT(fTreeMask, kESD)) {
+ AliInfo("Getting FMD event summary data");
+ Int_t read = fChainE->GetEntry(event);
+ if (read <= 0) return kFALSE;
+ fESD = fMainESD->GetFMDData();
+ if (!fESD) return kFALSE;
}
+ // Possibly load FMD Digit information
+ if (TESTBIT(fTreeMask, kRaw)) {
+ AliInfo("Getting FMD raw data digits");
+ if (!fReader->NextEvent()) return kFALSE;
+ AliFMDRawReader r(fReader, 0);
+ fArrayA->Clear();
+ r.ReadAdcs(fArrayA);
+ }
+
return kTRUE;
}
+
//____________________________________________________________________
-Bool_t
-AliFMDInput::End()
+Bool_t
+AliFMDInput::Event()
{
- // Called at the end of each event. Per default, it unloads the
- // data trees and resets the pointers to the output arrays. Users
- // can overload this, but should call this member function in the
- // overloaded member function of the derived class.
-
- // Check if we have been initialized
- if (!fIsInit) {
- AliError("Not initialized");
- return fIsInit;
- }
- // Possibly unload global kinematics information
- if (TESTBIT(fTreeMask, kKinematics)) {
- fLoader->UnloadKinematics();
- // fTreeK = 0;
- fStack = 0;
- }
- // Possibly unload FMD Hit information
- if (TESTBIT(fTreeMask, kHits)) {
- fFMDLoader->UnloadHits();
- fTreeH = 0;
- }
- // Possibly unload FMD Digit information
- if (TESTBIT(fTreeMask, kDigits)) {
- fFMDLoader->UnloadDigits();
- fTreeD = 0;
- }
- // Possibly unload FMD Sdigit information
- if (TESTBIT(fTreeMask, kSDigits)) {
- fFMDLoader->UnloadSDigits();
- fTreeS = 0;
- }
- // Possibly unload FMD RecPoints information
- if (TESTBIT(fTreeMask, kRecPoints)) {
- fFMDLoader->UnloadRecPoints();
- fTreeR = 0;
- }
- AliInfo("Now out event");
+ // Process one event. The default implementation one or more of
+ //
+ // - ProcessHits if the hits are loaded.
+ // - ProcessDigits if the digits are loaded.
+ // - ProcessSDigits if the sumbable digits are loaded.
+ // - ProcessRecPoints if the reconstructed points are loaded.
+ // - ProcessESD if the event summary data is loaded
+ //
+ if (TESTBIT(fTreeMask, kHits))
+ if (!ProcessHits()) return kFALSE;
+ if (TESTBIT(fTreeMask, kDigits))
+ if (!ProcessDigits()) return kFALSE;
+ if (TESTBIT(fTreeMask, kSDigits))
+ if (!ProcessSDigits()) return kFALSE;
+ if (TESTBIT(fTreeMask, kRaw))
+ if (!ProcessRawDigits()) return kFALSE;
+ if (TESTBIT(fTreeMask, kRecPoints))
+ if (!ProcessRecPoints()) return kFALSE;
+ if (TESTBIT(fTreeMask, kESD))
+ if (!ProcessESD(fESD)) return kFALSE;
+
return kTRUE;
}
//____________________________________________________________________
-Bool_t
-AliFMDInput::Run()
-{
- // Run over all events and files references in galice.root
-
- Bool_t retval;
- if (!(retval = Init())) return retval;
-
- Int_t nEvents = NEvents();
- for (Int_t event = 0; event < nEvents; event++) {
- if (!(retval = Begin(event))) break;
- if (!(retval = Event())) break;
- if (!(retval = End())) break;
- }
- if (!retval) return retval;
- retval = Finish();
- return retval;
-}
-
-//====================================================================
-ClassImp(AliFMDInputHits)
-#if 0
- ;
-#endif
-
-Bool_t
-AliFMDInputHits::Event()
+Bool_t
+AliFMDInput::ProcessHits()
{
// Read the hit tree, and pass each hit to the member function
- // ProcessHit. Optionally, if the user said `AddLoad(kKinematics)'
- // the track corresponding to the hit will also be passed to the
- // ProcessHit member function of the derived class.
+ // ProcessHit.
if (!fTreeH) {
AliError("No hit tree defined");
return kFALSE;
return kTRUE;
}
-//====================================================================
-ClassImp(AliFMDInputDigits)
-#if 0
- ;
-#endif
-
-Bool_t
-AliFMDInputDigits::Event()
+//____________________________________________________________________
+Bool_t
+AliFMDInput::ProcessDigits()
{
// Read the digit tree, and pass each digit to the member function
// ProcessDigit.
return kTRUE;
}
-//====================================================================
-ClassImp(AliFMDInputSDigits)
-#if 0
- ;
-#endif
-
-Bool_t
-AliFMDInputSDigits::Event()
+//____________________________________________________________________
+Bool_t
+AliFMDInput::ProcessSDigits()
{
// Read the summable digit tree, and pass each sumable digit to the
// member function ProcessSdigit.
return kTRUE;
}
-//====================================================================
-ClassImp(AliFMDInputRecPoints)
-#if 0
- ;
-#endif
+//____________________________________________________________________
+Bool_t
+AliFMDInput::ProcessRawDigits()
+{
+ // Read the digit tree, and pass each digit to the member function
+ // ProcessDigit.
+ Int_t nDigit = fArrayA->GetEntries();
+ if (nDigit <= 0) return kTRUE;
+ for (Int_t j = 0; j < nDigit; j++) {
+ AliFMDDigit* digit = static_cast<AliFMDDigit*>(fArrayA->At(j));
+ if (!digit) continue;
+ if (!ProcessRawDigit(digit)) return kFALSE;
+ }
+ return kTRUE;
+}
-Bool_t
-AliFMDInputRecPoints::Event()
+//____________________________________________________________________
+Bool_t
+AliFMDInput::ProcessRecPoints()
{
// Read the reconstrcted points tree, and pass each reconstruction
- // object to either ProcessStrip (for AliFMDMultStrip objects), or
- // ProcessRegion (for AliFMDMultRegion objects).
+ // object (AliFMDRecPoint) to either ProcessRecPoint.
Int_t nEv = fTreeR->GetEntries();
for (Int_t i = 0; i < nEv; i++) {
Int_t recRead = fTreeR->GetEntry(i);
if (recRead <= 0) continue;
- Int_t nRecStrip = fArrayN->GetEntries();
- for (Int_t j = 0; j < nRecStrip; j++) {
- AliFMDMultStrip* strip = static_cast<AliFMDMultStrip*>(fArrayN->At(j));
- if (!strip) continue;
- if (!ProcessStrip(strip)) return kFALSE;
- }
- Int_t nRecRegion = fArrayP->GetEntries();
- for (Int_t j = 0; j < nRecRegion; j++) {
- AliFMDMultRegion* region =static_cast<AliFMDMultRegion*>(fArrayP->At(j));
- if (!region) continue;
- if (!ProcessRegion(region)) return kFALSE;
+ Int_t nRecPoint = fArrayR->GetEntries();
+ for (Int_t j = 0; j < nRecPoint; j++) {
+ AliFMDRecPoint* recPoint = static_cast<AliFMDRecPoint*>(fArrayR->At(j));
+ if (!recPoint) continue;
+ if (!ProcessRecPoint(recPoint)) return kFALSE;
}
}
return kTRUE;
}
-
+//____________________________________________________________________
+Bool_t
+AliFMDInput::End()
+{
+ // Called at the end of each event. Per default, it unloads the
+ // data trees and resets the pointers to the output arrays. Users
+ // can overload this, but should call this member function in the
+ // overloaded member function of the derived class.
+
+ // Check if we have been initialized
+ if (!fIsInit) {
+ AliError("Not initialized");
+ return fIsInit;
+ }
+ // Possibly unload global kinematics information
+ if (TESTBIT(fTreeMask, kKinematics)) {
+ fLoader->UnloadKinematics();
+ // fTreeK = 0;
+ fStack = 0;
+ }
+ // Possibly unload FMD Hit information
+ if (TESTBIT(fTreeMask, kHits)) {
+ fFMDLoader->UnloadHits();
+ fTreeH = 0;
+ }
+ // Possibly unload FMD Digit information
+ if (TESTBIT(fTreeMask, kDigits)) {
+ fFMDLoader->UnloadDigits();
+ fTreeD = 0;
+ }
+ // Possibly unload FMD Sdigit information
+ if (TESTBIT(fTreeMask, kSDigits)) {
+ fFMDLoader->UnloadSDigits();
+ fTreeS = 0;
+ }
+ // Possibly unload FMD RecPoints information
+ if (TESTBIT(fTreeMask, kRecPoints)) {
+ fFMDLoader->UnloadRecPoints();
+ fTreeR = 0;
+ }
+ AliInfo("Now out event");
+ return kTRUE;
+}
+
+//____________________________________________________________________
+Bool_t
+AliFMDInput::Run()
+{
+ // Run over all events and files references in galice.root
+
+ Bool_t retval;
+ if (!(retval = Init())) return retval;
+
+ Int_t nEvents = NEvents();
+ for (Int_t event = 0; event < nEvents; event++) {
+ if (!(retval = Begin(event))) break;
+ if (!(retval = Event())) break;
+ if (!(retval = End())) break;
+ }
+ if (!retval) return retval;
+ retval = Finish();
+ return retval;
+}
+
//____________________________________________________________________
//