//////////////////////////////////////////////////////////////////////////////
//
// This class contains the procedures simulation ADC signal for the
-// Forward Multiplicity detector : Hits->Digits and Hits->SDigits
+// Forward Multiplicity detector : SDigits->Digits
//
// Digits consists of
// - Detector #
// +-----------------+ +------------------+
// | AliFMDDigitizer | | AliFMDSDigitizer |
// +-----------------+ +------------------+
+// |
+// +-------------------+
+// | AliFMDSSDigitizer |
+// +-------------------+
//
// These classes has several paramters:
//
//
#include <TTree.h> // ROOT_TTree
-//#include <TRandom.h> // ROOT_TRandom
-#include <AliLog.h> // ALILOG_H
-#include "AliFMDDigitizer.h" // ALIFMDDIGITIZER_H
+#include <TFile.h>
+#include "AliFMDDebug.h" // Better debug macros
+#include "AliFMDDigitizer.h" // ALIFMDSSDIGITIZER_H
#include "AliFMD.h" // ALIFMD_H
-#include "AliFMDGeometry.h" // ALIFMDGEOMETRY_H
-#include "AliFMDDetector.h" // ALIFMDDETECTOR_H
-#include "AliFMDRing.h" // ALIFMDRING_H
-#include "AliFMDHit.h" // ALIFMDHIT_H
+#include "AliFMDSDigit.h" // ALIFMDDIGIT_H
#include "AliFMDDigit.h" // ALIFMDDIGIT_H
#include "AliFMDParameters.h" // ALIFMDPARAMETERS_H
#include <AliRunDigitizer.h> // ALIRUNDIGITIZER_H
//====================================================================
ClassImp(AliFMDDigitizer)
+#if 0
+;
+#endif
//____________________________________________________________________
-AliFMDDigitizer::AliFMDDigitizer()
- : AliFMDBaseDigitizer()
+Bool_t
+AliFMDDigitizer::Init()
{
- // Default ctor - don't use it
+ // Initialisation
+ if (!AliFMDBaseDigitizer::Init()) return kFALSE;
+
+#if 0
+ // Get the AliRun object
+ AliRun* run = fRunLoader->GetAliRun();
+ if (!run) {
+ AliWarning("Loading gAlice");
+ fRunLoader->LoadgAlice();
+ if (!run) {
+ AliError("Can not get Run from Run Loader");
+ return kFALSE;
+ }
+ }
+
+ // Get the AliFMD object
+ fFMD = static_cast<AliFMD*>(run->GetDetector("FMD"));
+ if (!fFMD) {
+ AliError("Can not get FMD from gAlice");
+ return kFALSE;
+ }
+#endif
+ return kTRUE;
}
-//____________________________________________________________________
-AliFMDDigitizer::AliFMDDigitizer(AliRunDigitizer* manager)
- : AliFMDBaseDigitizer(manager)
-{
- // Normal CTOR
- AliDebug(1," processed");
-}
//____________________________________________________________________
void
-AliFMDDigitizer::Exec(Option_t*)
+AliFMDDigitizer::Exec(Option_t*)
{
- // Get the output manager
- TString outFolder(fManager->GetOutputFolderName());
- AliRunLoader* out =
- AliRunLoader::GetRunLoader(outFolder.Data());
- // Get the FMD output manager
- AliLoader* outFMD = out->GetLoader("FMDLoader");
-
- // Get the input loader
- TString inFolder(fManager->GetInputFolderName(0));
- fRunLoader =
- AliRunLoader::GetRunLoader(inFolder.Data());
- if (!fRunLoader) {
- AliError("Can not find Run Loader for input stream 0");
+ if (!fManager) {
+ AliError("No digitisation manager defined");
return;
}
- // Get the AliRun object
- if (!fRunLoader->GetAliRun()) fRunLoader->LoadgAlice();
+ // Clear array of deposited energies
+ fEdep.Reset();
+
+ AliRunLoader* runLoader = 0;
+ if (!gAlice) {
+ TString folderName(fManager->GetInputFolderName(0));
+ runLoader = AliRunLoader::GetRunLoader(folderName.Data());
+ if (!runLoader) {
+ AliError(Form("Failed at getting run loader from %s",
+ folderName.Data()));
+ return;
+ }
+ if (!runLoader->GetAliRun()) runLoader->LoadgAlice();
+ runLoader->GetAliRun();
+ }
+ if (!gAlice) {
+ AliError("Can not get Run from Run Loader");
+ return;
+ }
+
// Get the AliFMD object
- AliFMD* fmd =
- static_cast<AliFMD*>(fRunLoader->GetAliRun()->GetDetector("FMD"));
- if (!fmd) {
+ fFMD = static_cast<AliFMD*>(gAlice->GetDetector("FMD"));
+ if (!fFMD) {
AliError("Can not get FMD from gAlice");
return;
- }
+ }
+
+ // Loop over input files
Int_t nFiles= fManager->GetNinputs();
+ AliFMDDebug(1, (" Digitizing event number %d, got %d inputs",
+ fManager->GetOutputEventNr(), nFiles));
for (Int_t inputFile = 0; inputFile < nFiles; inputFile++) {
- AliDebug(1,Form(" Digitizing event number %d",
- fManager->GetOutputEventNr()));
+ AliFMDDebug(5, ("Now reading input # %d", inputFile));
// Get the current loader
- fRunLoader =
+ AliRunLoader* currentLoader =
AliRunLoader::GetRunLoader(fManager->GetInputFolderName(inputFile));
- if (!fRunLoader) Fatal("Exec", "no run loader");
+ if (!currentLoader) {
+ Error("Exec", Form("no run loader for input file # %d", inputFile));
+ continue;
+ }
+
// Cache contriutions
- SumContributions(fmd);
- }
- // Digitize the event
- DigitizeHits(fmd);
+ AliFMDDebug(5, ("Now summing the contributions from input # %d",inputFile));
- // Load digits from the tree
- outFMD->LoadDigits("update");
- // Get the tree of digits
- TTree* digitTree = outFMD->TreeD();
- if (!digitTree) {
- outFMD->MakeTree("D");
- digitTree = outFMD->TreeD();
- }
- digitTree->Reset();
- // Make a branch in the tree
- TClonesArray* digits = fmd->Digits();
- fmd->MakeBranchInTree(digitTree, fmd->GetName(), &(digits), 4000, 0);
- // TBranch* digitBranch = digitTree->GetBranch(fmd->GetName());
- // Fill the tree
- Int_t write = 0;
- write = digitTree->Fill();
- AliDebug(1, Form("Wrote %d bytes to digit tree", write));
+ // Get the FMD loader
+ AliLoader* inFMD = currentLoader->GetLoader("FMDLoader");
+ // And load the summable digits
+ inFMD->LoadSDigits("READ");
- // Write the digits to disk
- outFMD->WriteDigits("OVERWRITE");
- outFMD->UnloadHits();
- outFMD->UnloadDigits();
+ // Get the tree of summable digits
+ TTree* sdigitsTree = inFMD->TreeS();
+ if (!sdigitsTree) {
+ AliError("No sdigit tree from manager");
+ continue;
+ }
+ if (AliLog::GetDebugLevel("FMD","") >= 10) {
+ TFile* file = sdigitsTree->GetCurrentFile();
+ if (!file) {
+ AliWarning("Input tree has no file!");
+ }
+ else {
+ AliFMDDebug(10, ("Input tree file %s content:", file->GetName()));
+ file->ls();
+ }
+ // AliFMDDebug(5, ("Input tree %s file structure:",
+ // sdigitsTree->GetName()));
+ // sdigitsTree->Print();
+ }
- // Reset the digits in the AliFMD object
- fmd->ResetDigits();
-}
+ // Get the FMD branch
+ TBranch* sdigitsBranch = sdigitsTree->GetBranch("FMD");
+ if (!sdigitsBranch) {
+ AliError("Failed to get sdigit branch");
+ return;
+ }
+ // Set the branch addresses
+ fFMD->SetTreeAddress();
-//____________________________________________________________________
-UShort_t
-AliFMDDigitizer::MakePedestal(UShort_t detector,
- Char_t ring,
- UShort_t sector,
- UShort_t strip) const
-{
- // Make a pedestal
- AliFMDParameters* param =AliFMDParameters::Instance();
- Float_t mean =param->GetPedestal(detector,ring,sector,strip);
- Float_t width =param->GetPedestalWidth(detector,ring,sector,strip);
- return UShort_t(TMath::Max(gRandom->Gaus(mean, width), 0.));
-}
+ // Sum contributions from the sdigits
+ AliFMDDebug(3, ("Will now sum contributions from SDigits"));
+ SumContributions(sdigitsBranch);
-//____________________________________________________________________
-void
-AliFMDDigitizer::AddDigit(AliFMD* fmd,
- UShort_t detector,
- Char_t ring,
- UShort_t sector,
- UShort_t strip,
- Float_t /* edep */,
- UShort_t count1,
- Short_t count2,
- Short_t count3) const
-{
- // Add a digit
- fmd->AddDigitByFields(detector, ring, sector, strip, count1, count2, count3);
+ // Unload the sdigits
+ inFMD->UnloadSDigits();
+ }
+
+ TString outFolder(fManager->GetOutputFolderName());
+ AliRunLoader* out = AliRunLoader::GetRunLoader(outFolder.Data());
+ AliLoader* outFMD = out->GetLoader("FMDLoader");
+ if (!outFMD) {
+ AliError("Cannot get the FMDLoader output folder");
+ return;
+ }
+ TTree* outTree = MakeOutputTree(outFMD);
+ if (!outTree) {
+ AliError("Failed to get output tree");
+ return;
+ }
+ // Set the branch address
+ fFMD->SetTreeAddress();
+
+ // And digitize the cached data
+ DigitizeHits();
+
+ // Fill the tree
+ Int_t write = outTree->Fill();
+ AliFMDDebug(5, ("Wrote %d bytes to digit tree", write));
+
+ // Store the digits
+ StoreDigits(outFMD);
}
//____________________________________________________________________
void
-AliFMDDigitizer::CheckDigit(AliFMDDigit* digit,
- UShort_t nhits,
- const TArrayI& counts)
+AliFMDDigitizer::SumContributions(TBranch* sdigitsBranch)
{
- // Check that digit is consistent
- AliFMDParameters* param = AliFMDParameters::Instance();
- UShort_t det = digit->Detector();
- Char_t ring = digit->Ring();
- UShort_t sec = digit->Sector();
- UShort_t str = digit->Strip();
- Float_t mean = param->GetPedestal(det,ring,sec,str);
- Float_t width = param->GetPedestalWidth(det,ring,sec,str);
- UShort_t range = param->GetVA1MipRange();
- UShort_t size = param->GetAltroChannelSize();
- Int_t integral = counts[0];
- if (counts[1] >= 0) integral += counts[1];
- if (counts[2] >= 0) integral += counts[2];
- integral -= Int_t(mean + 2 * width);
- if (integral < 0) integral = 0;
+ // Sum energy deposited contributions from each sdigits in a cache
+ // (fEdep).
+ AliFMDDebug(3, ("Runnin our version of SumContributions"));
+
+ // Get a list of hits from the FMD manager
+ TClonesArray *fmdSDigits = fFMD->SDigits();
- Float_t convF = Float_t(range) / size;
- Float_t mips = integral * convF;
- if (mips > Float_t(nhits) + .5 || mips < Float_t(nhits) - .5)
- Warning("CheckDigit", "Digit -> %4.2f MIPS != %d +/- .5 hits",
- mips, nhits);
+ // Get number of entries in the tree
+ Int_t nevents = Int_t(sdigitsBranch->GetEntries());
+
+ Int_t read = 0;
+ // Loop over the events in the
+ for (Int_t event = 0; event < nevents; event++) {
+ // Read in entry number `event'
+ read += sdigitsBranch->GetEntry(event);
+
+ // Get the number of sdigits
+ Int_t nsdigits = fmdSDigits->GetEntries ();
+ AliFMDDebug(3, ("Got %5d SDigits", nsdigits));
+ for (Int_t sdigit = 0; sdigit < nsdigits; sdigit++) {
+ // Get the sdigit number `sdigit'
+ AliFMDSDigit* fmdSDigit =
+ static_cast<AliFMDSDigit*>(fmdSDigits->UncheckedAt(sdigit));
+
+ AliFMDDebug(5, ("Adding contribution of %d tracks",
+ fmdSDigit->GetNTrack()));
+ AliFMDDebug(15, ("Contrib from FMD%d%c[%2d,%3d] (%s) from track %d",
+ fmdSDigit->Detector(),
+ fmdSDigit->Ring(),
+ fmdSDigit->Sector(),
+ fmdSDigit->Strip(),
+ fmdSDigit->GetName(),
+ fmdSDigit->GetTrack(0)));
+
+ // Extract parameters
+ AddContribution(fmdSDigit->Detector(),
+ fmdSDigit->Ring(),
+ fmdSDigit->Sector(),
+ fmdSDigit->Strip(),
+ fmdSDigit->Edep(),
+ kTRUE,
+ fmdSDigit->GetNTrack(),
+ fmdSDigit->GetTracks());
+ } // sdigit loop
+ } // event loop
+
+
+ AliFMDDebug(3, ("Size of cache: %d bytes, read %d bytes",
+ sizeof(fEdep), read));
}
//____________________________________________________________________