X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=FMD%2FAliFMDInput.cxx;h=18e0b4bbc7a4a8d310a2d8409876bc966f208d71;hb=98dff241d22478e053fc4ff1db265f36931375c5;hp=8d10fa2cd51edcdf5b9c210107da19efd204dfd4;hpb=97b4001ecb2d8b6ebc891f38fc0da5517cef430f;p=u%2Fmrichter%2FAliRoot.git diff --git a/FMD/AliFMDInput.cxx b/FMD/AliFMDInput.cxx index 8d10fa2cd51..18e0b4bbc7a 100644 --- a/FMD/AliFMDInput.cxx +++ b/FMD/AliFMDInput.cxx @@ -29,12 +29,14 @@ // Latest changes by Christian Holm Christensen // #include "AliFMDInput.h" // ALIFMDHIT_H -#include "AliLog.h" // ALILOG_H +#include "AliFMDDebug.h" // ALIFMDDEBUG_H ALILOG_H #include "AliLoader.h" // ALILOADER_H #include "AliRunLoader.h" // ALIRUNLOADER_H #include "AliRun.h" // ALIRUN_H #include "AliStack.h" // ALISTACK_H #include "AliRawReaderFile.h" // ALIRAWREADERFILE_H +#include "AliRawReaderRoot.h" // ALIRAWREADERROOT_H +#include "AliRawReaderDate.h" // ALIRAWREADERDATE_H #include "AliFMD.h" // ALIFMD_H #include "AliFMDHit.h" // ALIFMDHIT_H #include "AliFMDDigit.h" // ALIFMDDigit_H @@ -43,9 +45,10 @@ #include "AliFMDRawReader.h" // ALIFMDRAWREADER_H #include #include +#include #include #include -#include +#include #include // ROOT_TTree #include // ROOT_TChain #include // ROOT_TParticle @@ -56,6 +59,9 @@ #include // ROOT_TSystemDirectory #include // ROOT_Riostream #include // ROOT_TFile +#include +#include + //____________________________________________________________________ ClassImp(AliFMDInput) #if 0 @@ -72,8 +78,8 @@ AliFMDInput::AliFMDInput() fFMDLoader(0), fReader(0), fFMD(0), - fMainESD(0), fESD(0), + fESDEvent(0), fTreeE(0), fTreeH(0), fTreeD(0), @@ -87,10 +93,14 @@ AliFMDInput::AliFMDInput() fArrayS(0), fArrayR(0), fArrayA(0), + fHeader(0), fGeoManager(0), fTreeMask(0), - fIsInit(kFALSE) + fRawFile(""), + fIsInit(kFALSE), + fEventCount(0) { + // Constructor of an FMD input object. Specify what data to read in // using the AddLoad member function. Sub-classes should at a // minimum overload the member function Event. A full job can be @@ -108,8 +118,8 @@ AliFMDInput::AliFMDInput(const char* gAliceFile) fFMDLoader(0), fReader(0), fFMD(0), - fMainESD(0), fESD(0), + fESDEvent(0), fTreeE(0), fTreeH(0), fTreeD(0), @@ -123,10 +133,14 @@ AliFMDInput::AliFMDInput(const char* gAliceFile) fArrayS(0), fArrayR(0), fArrayA(0), + fHeader(0), fGeoManager(0), fTreeMask(0), - fIsInit(kFALSE) + fRawFile(""), + fIsInit(kFALSE), + fEventCount(0) { + // Constructor of an FMD input object. Specify what data to read in // using the AddLoad member function. Sub-classes should at a // minimum overload the member function Event. A full job can be @@ -200,13 +214,22 @@ AliFMDInput::Init() TString fname(file->GetName()); if (fname.Contains("AliESDs")) fChainE->AddFile(fname.Data()); } - fChainE->SetBranchAddress("ESD", &fMainESD); + fESDEvent = new AliESDEvent(); + fESDEvent->ReadFromTree(fChainE); + // fChainE->SetBranchAddress("ESD", &fMainESD); + } if (TESTBIT(fTreeMask, kRaw)) { AliInfo("Getting FMD raw data digits"); fArrayA = new TClonesArray("AliFMDDigit"); - fReader = new AliRawReaderFile(-1); + if (!fRawFile.IsNull() && fRawFile.EndsWith(".root")) + fReader = new AliRawReaderRoot(fRawFile.Data()); + else if (!fRawFile.IsNull() && fRawFile.EndsWith(".raw")) + fReader = new AliRawReaderDate(fRawFile.Data()); + else + fReader = new AliRawReaderFile(-1); + } // Optionally, get the geometry @@ -233,7 +256,7 @@ AliFMDInput::Init() else { Int_t nAlign = array->GetEntries(); for (Int_t i = 0; i < nAlign; i++) { - AliAlignObjAngles* a = static_cast(array->At(i)); + AliAlignObjParams* a = static_cast(array->At(i)); if (!a->ApplyToGeometry()) { AliWarning(Form("Failed to apply alignment to %s", a->GetSymName())); @@ -243,7 +266,7 @@ AliFMDInput::Init() } } - + fEventCount = 0; fIsInit = kTRUE; return fIsInit; } @@ -262,27 +285,37 @@ AliFMDInput::Begin(Int_t event) AliError("Not initialized"); return fIsInit; } + // Get the event if (fLoader->GetEvent(event)) return kFALSE; - AliInfo(Form("Now in event %d/%d", event, NEvents())); + AliInfo(Form("Now in event %8d/%8d", event, NEvents())); // Possibly load global kinematics information - if (TESTBIT(fTreeMask, kKinematics)) { - AliInfo("Getting kinematics"); + if (TESTBIT(fTreeMask, kKinematics) || TESTBIT(fTreeMask, kTracks)) { + // AliInfo("Getting kinematics"); if (fLoader->LoadKinematics()) return kFALSE; fStack = fLoader->Stack(); } + // Possibly load FMD Hit information - if (TESTBIT(fTreeMask, kHits)) { - AliInfo("Getting FMD hits"); - if (fFMDLoader->LoadHits()) return kFALSE; + if (TESTBIT(fTreeMask, kHits) || TESTBIT(fTreeMask, kTracks)) { + // AliInfo("Getting FMD hits"); + if (!fFMDLoader || fFMDLoader->LoadHits()) return kFALSE; fTreeH = fFMDLoader->TreeH(); if (!fArrayH) fArrayH = fFMD->Hits(); } + + // Possibly load heaedr information + if (TESTBIT(fTreeMask, kHeader)) { + // AliInfo("Getting FMD hits"); + if (!fLoader /* || fLoader->LoadHeader()*/) return kFALSE; + fHeader = fLoader->GetHeader(); + } + // Possibly load FMD Digit information if (TESTBIT(fTreeMask, kDigits)) { - AliInfo("Getting FMD digits"); - if (fFMDLoader->LoadDigits()) return kFALSE; + // AliInfo("Getting FMD digits"); + if (!fFMDLoader || fFMDLoader->LoadDigits()) return kFALSE; fTreeD = fFMDLoader->TreeD(); if (fTreeD) { if (!fArrayD) fArrayD = fFMD->Digits(); @@ -292,27 +325,32 @@ AliFMDInput::Begin(Int_t event) AliWarning(Form("Failed to load FMD Digits")); } } + // Possibly load FMD Sdigit information if (TESTBIT(fTreeMask, kSDigits)) { - AliInfo("Getting FMD summable digits"); - if (fFMDLoader->LoadSDigits()) return kFALSE; + // AliInfo("Getting FMD summable digits"); + if (!fFMDLoader || fFMDLoader->LoadSDigits()) return kFALSE; fTreeS = fFMDLoader->TreeS(); if (!fArrayS) fArrayS = fFMD->SDigits(); } + // Possibly load FMD RecPoints information if (TESTBIT(fTreeMask, kRecPoints)) { - AliInfo("Getting FMD reconstructed points"); - if (fFMDLoader->LoadRecPoints()) return kFALSE; + // AliInfo("Getting FMD reconstructed points"); + if (!fFMDLoader || fFMDLoader->LoadRecPoints()) return kFALSE; fTreeR = fFMDLoader->TreeR(); if (!fArrayR) fArrayR = new TClonesArray("AliFMDRecPoint"); fTreeR->SetBranchAddress("FMD", &fArrayR); - } // Possibly load FMD ESD information + } + + // Possibly load FMD ESD information if (TESTBIT(fTreeMask, kESD)) { - AliInfo("Getting FMD event summary data"); + // AliInfo("Getting FMD event summary data"); Int_t read = fChainE->GetEntry(event); if (read <= 0) return kFALSE; - fESD = fMainESD->GetFMDData(); + fESD = fESDEvent->GetFMDData(); if (!fESD) return kFALSE; +#if 0 TFile* f = fChainE->GetFile(); if (f) { TObject* o = f->GetStreamerInfoList()->FindObject("AliFMDMap"); @@ -323,16 +361,18 @@ AliFMDInput::Begin(Int_t event) } } // fESD->CheckNeedUShort(fChainE->GetFile()); +#endif } + // Possibly load FMD Digit information if (TESTBIT(fTreeMask, kRaw)) { - AliInfo("Getting FMD raw data digits"); + // AliInfo("Getting FMD raw data digits"); if (!fReader->NextEvent()) return kFALSE; AliFMDRawReader r(fReader, 0); fArrayA->Clear(); r.ReadAdcs(fArrayA); } - + fEventCount++; return kTRUE; } @@ -351,6 +391,8 @@ AliFMDInput::Event() // if (TESTBIT(fTreeMask, kHits)) if (!ProcessHits()) return kFALSE; + if (TESTBIT(fTreeMask, kTracks)) + if (!ProcessTracks()) return kFALSE; if (TESTBIT(fTreeMask, kDigits)) if (!ProcessDigits()) return kFALSE; if (TESTBIT(fTreeMask, kSDigits)) @@ -375,19 +417,23 @@ AliFMDInput::ProcessHits() AliError("No hit tree defined"); return kFALSE; } + if (!fArrayH) { + AliError("No hit array defined"); + return kFALSE; + } + Int_t nTracks = fTreeH->GetEntries(); for (Int_t i = 0; i < nTracks; i++) { Int_t hitRead = fTreeH->GetEntry(i); if (hitRead <= 0) continue; - if (!fArrayH) { - AliError("No hit array defined"); - return kFALSE; - } + Int_t nHit = fArrayH->GetEntries(); if (nHit <= 0) continue; + for (Int_t j = 0; j < nHit; j++) { AliFMDHit* hit = static_cast(fArrayH->At(j)); if (!hit) continue; + TParticle* track = 0; if (TESTBIT(fTreeMask, kKinematics) && fStack) { Int_t trackno = hit->Track(); @@ -399,6 +445,50 @@ AliFMDInput::ProcessHits() return kTRUE; } +//____________________________________________________________________ +Bool_t +AliFMDInput::ProcessTracks() +{ + // Read the hit tree, and pass each hit to the member function + // ProcessTrack. + if (!fStack) { + AliError("No track tree defined"); + return kFALSE; + } + if (!fTreeH) { + AliError("No hit tree defined"); + return kFALSE; + } + if (!fArrayH) { + AliError("No hit array defined"); + return kFALSE; + } + + // Int_t nTracks = fStack->GetNtrack(); + Int_t nTracks = fTreeH->GetEntries(); + for (Int_t i = 0; i < nTracks; i++) { + Int_t trackno = nTracks - i - 1; + TParticle* track = fStack->Particle(trackno); + if (!track) continue; + + // Get the hits for this track. + Int_t hitRead = fTreeH->GetEntry(i); + Int_t nHit = fArrayH->GetEntries(); + if (nHit == 0 || hitRead <= 0) { + // Let user code see the track, even if there's no hits. + if (!ProcessTrack(trackno, track, 0)) return kFALSE; + continue; + } + + // Loop over the hits corresponding to this track. + for (Int_t j = 0; j < nHit; j++) { + AliFMDHit* hit = static_cast(fArrayH->At(j)); + if (!ProcessTrack(trackno, track, hit)) return kFALSE; + } + } + return kTRUE; +} + //____________________________________________________________________ Bool_t AliFMDInput::ProcessDigits() @@ -517,13 +607,13 @@ AliFMDInput::End() return fIsInit; } // Possibly unload global kinematics information - if (TESTBIT(fTreeMask, kKinematics)) { + if (TESTBIT(fTreeMask, kKinematics) || TESTBIT(fTreeMask, kTracks)) { fLoader->UnloadKinematics(); // fTreeK = 0; fStack = 0; } // Possibly unload FMD Hit information - if (TESTBIT(fTreeMask, kHits)) { + if (TESTBIT(fTreeMask, kHits) || TESTBIT(fTreeMask, kTracks)) { fFMDLoader->UnloadHits(); fTreeH = 0; } @@ -542,7 +632,7 @@ AliFMDInput::End() fFMDLoader->UnloadRecPoints(); fTreeR = 0; } - AliInfo("Now out event"); + // AliInfo("Now out event"); return kTRUE; } @@ -566,6 +656,31 @@ AliFMDInput::Run() return retval; } +//__________________________________________________________________ +TArrayF +AliFMDInput::MakeLogScale(Int_t n, Double_t min, Double_t max) +{ + // Service function to define a logarithmic axis. + // Parameters: + // n Number of bins + // min Minimum of axis + // max Maximum of axis + TArrayF bins(n+1); + bins[0] = min; + if (n <= 20) { + for (Int_t i = 1; i < n+1; i++) bins[i] = bins[i-1] + (max-min)/n; + return bins; + } + Float_t dp = n / TMath::Log10(max / min); + Float_t pmin = TMath::Log10(min); + for (Int_t i = 1; i < n+1; i++) { + Float_t p = pmin + i / dp; + bins[i] = TMath::Power(10, p); + } + return bins; +} + + //____________________________________________________________________ //