]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - FMD/AliFMDDigitizer.cxx
Removing the tasks from the digitization (Ruben)
[u/mrichter/AliRoot.git] / FMD / AliFMDDigitizer.cxx
index f68ee457c991de49f7fbc3ec2b8f6e80c1db93a0..69d42dc9a18978ad82c43fc1a38e688574b0ccf9 100644 (file)
@@ -1,28 +1,31 @@
-/**************************************************************************
- * Copyright(c) 2004, ALICE Experiment at CERN, All rights reserved. *
- *                                                                        *
- * Author: The ALICE Off-line Project.                                    *
- * Contributors are mentioned in the code where appropriate.              *
- *                                                                        *
- * Permission to use, copy, modify and distribute this software and its   *
- * documentation strictly for non-commercial purposes is hereby granted   *
- * without fee, provided that the above copyright notice appears in all   *
- * copies and that both the copyright notice and this permission notice   *
- * appear in the supporting documentation. The authors make no claims     *
- * about the suitability of this software for any purpose. It is          *
- * provided "as is" without express or implied warranty.                  *
- **************************************************************************/
-/* $Id$ */
-/** @file    AliFMDDigitizer.cxx
-    @author  Christian Holm Christensen <cholm@nbi.dk>
-    @date    Mon Mar 27 12:38:26 2006
-    @brief   FMD Digitizers implementation
-    @ingroup FMD_sim
-*/
+//************************************************************************
+// Copyright(c) 2004, ALICE Experiment at CERN, All rights reserved. *
+//                                                                        *
+// Author: The ALICE Off-line Project.                                    *
+// Contributors are mentioned in the code where appropriate.              *
+//                                                                        *
+// Permission to use, copy, modify and distribute this software and its   *
+// documentation strictly for non-commercial purposes is hereby granted   *
+// without fee, provided that the above copyright notice appears in all   *
+// copies and that both the copyright notice and this permission notice   *
+// appear in the supporting documentation. The authors make no claims     *
+// about the suitability of this software for any purpose. It is          *
+// provided "as is" without express or implied warranty.                  *
+//************************************************************************/
+// $Id$ */
+/**
+ * @file    AliFMDDigitizer.cxx
+ * 
+ * @author  Christian Holm Christensen <cholm@nbi.dk>
+ * @date    Mon Mar 27 12:38:26 2006
+ * @brief   FMD Digitizers implementation
+ *
+ * @ingroup FMD_sim
+ */
 //////////////////////////////////////////////////////////////////////////////
 //
 //  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
+#include <AliDigitizationInput.h>      // ALIRUNDIGITIZER_H
 #include <AliRun.h>            // ALIRUN_H
 #include <AliLoader.h>         // ALILOADER_H
 #include <AliRunLoader.h>      // ALIRUNLOADER_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::Digitize(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");
+  // 
+  // Execute this digitizer.  
+  // This member function will be called once per event by the passed
+  // AliDigitizationInput* digInput object. 
+  // 
+  // Parameters:
+  //    options Not used 
+  //
+  if (!fDigInput) { 
+    AliError("No digitisation input 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(fDigInput->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;
-  }
+  }  
+
 
-  Int_t nFiles= fManager->GetNinputs();
+  // Loop over input files
+  Int_t nFiles= fDigInput->GetNinputs();
+  AliFMDDebug(1, (" Digitizing event number %d, got %d inputs",
+                 fDigInput->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::GetRunLoader(fManager->GetInputFolderName(inputFile));
-    if (!fRunLoader) Fatal("Exec", "no run loader");
+    AliRunLoader* currentLoader = 
+      AliRunLoader::GetRunLoader(fDigInput->GetInputFolderName(inputFile));
+    if (!currentLoader) { 
+      Error("Exec", "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 input");
+      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(fDigInput->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 contributions from SDigits 
+  // 
+  // Parameters:
+  //    sdigitsBranch Branch of SDigit data 
+  //
+  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", 
+                 int(sizeof(fEdep)), read));
 }
 
 //____________________________________________________________________