/* $Id$ */
-#include "AliRun.h"
-#include "AliRunDigitizer.h"
-#include "AliRunLoader.h"
-
#include "AliMUONDigitizer.h"
#include "AliMUONConstants.h"
-#include "AliMUONChamber.h"
+#include "AliMUONSegmentation.h"
#include "AliMUONHitMapA1.h"
#include "AliMUON.h"
#include "AliMUONLoader.h"
-#include "AliMUONChamber.h"
#include "AliMUONConstants.h"
-#include "AliMUONDigitizer.h"
#include "AliMUONTransientDigit.h"
-#include "AliMUONHitMapA1.h"
#include "AliMUONTriggerDecision.h"
#include "AliLog.h"
+#include "AliMUONGeometryTransformer.h"
+#include "AliMUONGeometryModule.h"
+#include "AliMUONGeometryStore.h"
+#include "AliRun.h"
+#include "AliRunDigitizer.h"
+#include "AliRunLoader.h"
/////////////////////////////////////////////////////////////////////////////////////
//
fTDList(0),
fTDCounter(0),
fMask(0),
- fSignal(0),
- fDebug(0)
+ fSignal(0)
{
// Default constructor.
// Initializes all pointers to NULL.
fTDList(0),
fTDCounter(0),
fMask(0),
- fSignal(0),
- fDebug(0)
+ fSignal(0)
{
// Constructor which should be used rather than the default constructor.
// Initializes all pointers to NULL.
return *this;
}
-
-//------------------------------------------------------------------------
-Int_t AliMUONDigitizer::GetSegmentation()
-{
- if (!fMUON->WhichSegmentation()) {
- AliFatal("No Segmentation Type defined.");
- return kFALSE;
- } else
- return fMUON->WhichSegmentation();
-
-}
//------------------------------------------------------------------------
Bool_t AliMUONDigitizer::Init()
}
//------------------------------------------------------------------------
-void AliMUONDigitizer::Exec(Option_t* option)
+void AliMUONDigitizer::Exec(Option_t* /*option*/)
{
// The main work loop starts here.
// The digitization process is broken up into two steps:
// stream. Done in CreateDigits()
AliDebug(1, "Running digitiser.");
- ParseOptions(option);
if (fManager->GetNinputs() == 0)
{
AliDebug(4,Form( "Updating transient digit 0x%X", (void*)mTD));
// Choosing the maping of the cathode plane of the chamber:
- Int_t iNchCpl= mTD->Chamber() + (mTD->Cathode()-1) * AliMUONConstants::NCh();
+ Int_t detElemId = mTD->DetElemId();
+
+ Int_t iNchCpl= fNDetElemId[detElemId] + (mTD->Cathode()-1) * AliMUONConstants::NDetElem();
+
AliMUONTransientDigit *pdigit =
static_cast<AliMUONTransientDigit*>( fHitMap[iNchCpl]->GetHit(mTD->PadX(),mTD->PadY()) );
AliDebug(4,Form( "Adding transient digit 0x%X", (void*)mTD));
// Choosing the maping of the cathode plane of the chamber:
- Int_t iNchCpl= mTD->Chamber() + (mTD->Cathode()-1) * AliMUONConstants::NCh();
+
+ Int_t detElemId = mTD->DetElemId();
+ Int_t iNchCpl= fNDetElemId[detElemId] + (mTD->Cathode()-1) * AliMUONConstants::NDetElem();
+
fTDList->AddAtAndExpand(mTD, fTDCounter);
- fHitMap[iNchCpl]->SetHit( mTD->PadX(), mTD->PadY(), fTDCounter);
- fTDCounter++;
+ if (iNchCpl>-1 && iNchCpl<2*AliMUONConstants::NDetElem()) {
+ fHitMap[iNchCpl]->SetHit( mTD->PadX(), mTD->PadY(), fTDCounter);
+ fTDCounter++;
+ }
}
//------------------------------------------------------------------------
// as mTD. If yes then kTRUE is returned else kFASLE is returned.
// Choosing the maping of the cathode plane of the chamber:
- Int_t iNchCpl= mTD->Chamber() + (mTD->Cathode()-1) * AliMUONConstants::NCh();
- return( fHitMap[iNchCpl]->TestHit(mTD->PadX(), mTD->PadY()) );
+ Int_t detElemId = mTD->DetElemId();
+
+ Int_t iNchCpl= fNDetElemId[detElemId] + (mTD->Cathode()-1) *AliMUONConstants::NDetElem() ;
+
+ // Int_t iNchCpl= mTD->Chamber() + (mTD->Cathode()-1) * AliMUONConstants::NCh();
+ if (iNchCpl>-1 && iNchCpl<2*AliMUONConstants::NDetElem())
+ return( fHitMap[iNchCpl]->TestHit(mTD->PadX(), mTD->PadY()) );
+ else return kFALSE;
}
//-----------------------------------------------------------------------
fTDList->Sort(); // sort by idDE
AliDebug(2, "Creating digits...");
- for (Int_t icat = 0; icat < 2; icat++) {
+ // for (Int_t icat = 0; icat < 2; icat++) {
+
+ Int_t digitindex[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
//
// Filling Digit List
// Must be the same cathode, otherwise we will fill a mixture
// of digits from both cathodes.
- if (icat != td->Cathode() - 1) continue;
+ //if (icat != td->Cathode() - 1) continue;
AliDebug(3,Form( "Creating digit from transient digit 0x%X", (void*)td));
Int_t q = GetSignalFrom(td);
- if (q > 0) AddDigit(td, q);
+ if (q > 0) {
+ Int_t chamber = td->Chamber();
+ if (0 <= chamber && chamber <= 13 )
+ AddDigit(td, q, digitindex[chamber]++);
+ else
+ AliError(Form("Invalid chamber %d\n",chamber));
+ }
}
FillOutputData();
- }
+ // }
+ fTDCounter = 0;
}
//------------------------------------------------------------------------
-void AliMUONDigitizer::AddDigit(AliMUONTransientDigit* td, Int_t responseCharge)
+void AliMUONDigitizer::AddDigit(
+ AliMUONTransientDigit* td, Int_t responseCharge,
+ Int_t digitindex
+ )
{
// Prepares the digits, track and charge arrays in preparation for a call to
// AddDigit(Int_t, Int_t[kMAXTRACKS], Int_t[kMAXTRACKS], Int_t[6])
digits[3] = responseCharge;
digits[4] = td->Physics();
digits[5] = td->Hit();
- if (GetSegmentation() == 1)
- digits[6] = 0;
- else
- digits[6] = td->DetElemId();
+ digits[6] = td->DetElemId();
Int_t nptracks = td->GetNTracks();
if (nptracks > kMAXTRACKS) {
OnWriteTransientDigit(td);
AddDigit(td->Chamber(), tracks, charges, digits);
- AddDigitTrigger(td->Chamber(), tracks, charges, digits);
+ AddDigitTrigger(td->Chamber(), tracks, charges, digits, digitindex);
}
//------------------------------------------------------------------------
return kTRUE;
}
-//------------------------------------------------------------------------
-void AliMUONDigitizer::ParseOptions(Option_t* options)
-{
-// Called by the Exec method. ParseOptions should parse the option string given to the Exec method.
-//
-// The following options are defined:
-// "debug" - Sets the debug level to 99, which will show all debug messages.
-// "deb" - Same as "debug", implemented for backward comparability.
-//
-// If an invalid option is specified it is simply ignored.
-
- TString optionString = options;
- if (optionString.Data() == "debug" ||
- optionString.Data() == "deb" // maintained for compatability.
- )
- {
- AliInfo("Called with option \"debug\".");
- SetDebug(99);
- }
-}
//------------------------------------------------------------------------
void AliMUONDigitizer::InitArrays()
// Array of pointer of the AliMUONHitMapA1:
// two HitMaps per chamber, or one HitMap per cahtode plane
- fHitMap = new AliMUONHitMapA1* [2*AliMUONConstants::NCh()];
-
- if (fMUON->WhichSegmentation() == 1) {
- // Loop over chambers for the definition AliMUONHitMap
- for (Int_t i = 0; i < AliMUONConstants::NCh(); i++) {
-
- AliDebug(4,Form( "Creating hit map for chamber %d, cathode 1.", i+1));
- AliMUONChamber* chamber = &(fMUON->Chamber(i));
- AliSegmentation* c1Segmentation = chamber->SegmentationModel(1); // Cathode plane 1
- fHitMap[i] = new AliMUONHitMapA1(c1Segmentation, fTDList);
- AliDebug(4,Form( "Creating hit map for chamber %d, cathode 2.", i+1));
- AliSegmentation* c2Segmentation = chamber->SegmentationModel(2); // Cathode plane 2
- fHitMap[i+AliMUONConstants::NCh()] = new AliMUONHitMapA1(c2Segmentation, fTDList);
- }
+ fHitMap = new AliMUONHitMapA1* [2*AliMUONConstants::NDetElem()];
+ for (Int_t i=0; i<2*AliMUONConstants::NDetElem(); i++) fHitMap[i] = 0x0;
+
+ Int_t k = 0;
+ Int_t idDE;
+
+ for (Int_t i = 0; i < AliMUONConstants::NCh(); i++) {
+
- } else {
- for (Int_t i = 0; i < AliMUONConstants::NCh(); i++) {
- AliDebug(4,Form( "Creating hit map for chamber %d, cathode 1.", i+1));
- AliMUONChamber* chamber = &(fMUON->Chamber(i));
- AliMUONGeometrySegmentation* c1Segmentation = chamber->SegmentationModel2(1); // Cathode plane 1
- fHitMap[i] = new AliMUONHitMapA1(101,c1Segmentation, fTDList); // put idDE = 100 maybe # pads max ?
- AliDebug(4,Form( "Creating hit map for chamber %d, cathode 2.", i+1));
- AliMUONGeometrySegmentation* c2Segmentation = chamber->SegmentationModel2(2); // Cathode plane 2
- fHitMap[i+AliMUONConstants::NCh()] = new AliMUONHitMapA1(101,c2Segmentation, fTDList);
+ AliDebug(4,Form( "Creating hit map for chamber %d, cathode 1.", i+1));
+ AliMUONSegmentation* segmentation = fMUON->GetSegmentation();
+ AliMUONGeometrySegmentation* c1Segmentation
+ = segmentation->GetModuleSegmentation(i, 0); // Cathode plane 1
+ AliDebug(4,Form( "Creating hit map for chamber %d, cathode 2.", i+1));
+ AliMUONGeometrySegmentation* c2Segmentation
+ = segmentation->GetModuleSegmentation(i, 1); // Cathode plane 2
+
+ const AliMUONGeometryTransformer* kGeometryTransformer
+ = fMUON->GetGeometryTransformer();
+
+ AliMUONGeometryStore* detElements
+ = kGeometryTransformer->GetModuleTransformer(i)->GetDetElementStore();
+
+
+ // Loop over detection elements
+ for (Int_t j=0; j<detElements->GetNofEntries(); j++) {
+
+ idDE = detElements->GetEntry(j)->GetUniqueID();
+ fNDetElemId[idDE] = k;
+
+ Int_t npx1 = c1Segmentation->Npx(idDE)+1;
+ Int_t npy1 = c1Segmentation->Npy(idDE)+1;
+ fHitMap[k] = new AliMUONHitMapA1(npx1, npy1, fTDList);
+
+ Int_t npx2 = c2Segmentation->Npx(idDE)+1;
+ Int_t npy2 = c2Segmentation->Npy(idDE)+1;
+ fHitMap[k+AliMUONConstants::NDetElem()] = new AliMUONHitMapA1(npx2, npy2, fTDList);
+ k++;
}
}
}
// The arrays fTDList and fHitMap are deleted and the pointers set to NULL.
AliDebug(2, "Deleting internal arrays.");
- for(Int_t i = 0; i < 2*AliMUONConstants::NCh(); i++)
- {
- AliDebug(4,Form( "Deleting hit map for chamber %d, cathode %d.",
- i%AliMUONConstants::NCh()+1, i/AliMUONConstants::NCh()+1));
+ for(Int_t i = 0; i < 2*AliMUONConstants::NDetElem(); i++) {
delete fHitMap[i];
}
delete [] fHitMap;