#include "AliMUONRawCluster.h"
#include "AliMUONTransientDigit.h"
#include "AliMUONTriggerCircuit.h"
+#include "AliMUONGeometry.h"
+#include "AliMUONGeometryTransformer.h"
#include "AliMUONGeometryBuilder.h"
#include "AliMUONCommonGeometryBuilder.h"
#include "AliMUONVGeometryBuilder.h"
-#include "AliMUONGeometryDEIndexing.h"
#include "AliMUONGeometrySegmentation.h"
#include "AliMUONDigitizerv2.h"
#include "AliMUONSDigitizerv1.h"
-#include "AliMUONRawData.h"
-#include "AliMUONFactoryV2.h"
+#include "AliMUONRawWriter.h"
+#include "AliMUONSegmentation.h"
#include "AliLog.h"
+#include "AliMUONSDigitizerV2.h"
+#include "AliMUONDigitizerV3.h"
+
+#include "AliMUONSt1GeometryBuilderV2.h"
+#include "AliMUONSt2GeometryBuilderV2.h"
+#include "AliMUONSlatGeometryBuilder.h"
+#include "AliMUONTriggerGeometryBuilder.h"
+
// Defaults parameters for Z positions of chambers
// taken from values for "stations" in AliMUON::AliMUON
// const Float_t zch[7]={528, 690., 975., 1249., 1449., 1610, 1710.};
fChambers(0),
fTriggerCircuits(0),
fGeometryBuilder(0),
- fSegmentationType(2),// set to 2 default wise new seg
- fDEIndexing(0),
+ fSegmentation(0),
fAccCut(kFALSE),
fAccMin(0.),
fAccMax(0.),
fMaxDestepAlu(0.),
fMaxIterPad(0),
fCurIterPad(0),
- fFactory(0)
+ fTriggerScalerEvent(kFALSE),
+ fSDigitizerType(""),
+ fDigitizerType(""),
+ fRawWriter(0x0)
{
// Default Constructor
//
+ AliDebug(1,Form("default (empty) ctor this=%p",this));
fIshunt = 0;
}
//__________________________________________________________________
-AliMUON::AliMUON(const char *name, const char *title)
+AliMUON::AliMUON(const char *name, const char *title,
+ const char* sDigitizerClassName,
+ const char* digitizerClassName)
: AliDetector(name,title),
fNCh(AliMUONConstants::NCh()),
fNTrackingCh(AliMUONConstants::NTrackingCh()),
fChambers(0),
fTriggerCircuits(0),
fGeometryBuilder(0),
- fSegmentationType(2),// set to 2 default wise new seg
- fDEIndexing(0),
+ fSegmentation(0),
fAccCut(kFALSE),
fAccMin(0.),
fAccMax(0.),
fMaxDestepAlu(-1), // in the calculation of the tracking parameters
fMaxIterPad(0),
fCurIterPad(0),
- fFactory(0)
+ fTriggerScalerEvent(kFALSE),
+ fSDigitizerType(sDigitizerClassName),
+ fDigitizerType(digitizerClassName),
+ fRawWriter(0x0)
{
-
+ AliDebug(1,Form("ctor this=%p",this));
fIshunt = 0;
SetMarkerColor(kRed);//
fGeometryBuilder
->AddBuilder(new AliMUONCommonGeometryBuilder(this));
- // Define the global transformation:
- // Transformation from the old ALICE coordinate system to a new one:
- // x->-x, z->-z
- TGeoRotation* rotGlobal
- = new TGeoRotation("rotGlobal", 90., 180., 90., 90., 180., 0.);
- fGeometryBuilder
- ->SetGlobalTransformation (TGeoCombiTrans(0., 0., 0., rotGlobal));
-
- // Detection elements indexing
- fDEIndexing = new AliMUONGeometryDEIndexing();
+ // By default, add also all the needed geometry builders.
+ // If you want to change this from outside, please use ResetGeometryBuilder
+ // method, followed by AddGeometryBuilder ones.
-//
-// Creating List of Chambers
+ AddGeometryBuilder(new AliMUONSt1GeometryBuilderV2(this));
+ AddGeometryBuilder(new AliMUONSt2GeometryBuilderV2(this));
+ AddGeometryBuilder(new AliMUONSlatGeometryBuilder(this));
+ AddGeometryBuilder(new AliMUONTriggerGeometryBuilder(this));
+
+ //
+ // Creating List of Chambers
Int_t ch;
fChambers = new TObjArray(AliMUONConstants::NCh());
if (ch < AliMUONConstants::NTrackingCh()) {
fChambers->AddAt(new AliMUONChamber(ch),ch);
} else {
- fChambers->AddAt(new AliMUONChamberTrigger(ch),ch);
+ fChambers->AddAt(new AliMUONChamberTrigger(ch, GetGeometryTransformer()),ch);
}
- AliMUONChamber* chamber = (AliMUONChamber*) fChambers->At(ch);
- //chamber->SetGid(0);
- // Default values for Z of chambers
- chamber->SetZ(AliMUONConstants::DefaultChamberZ(ch));
- //
- chamber->InitGeo(AliMUONConstants::DefaultChamberZ(ch));
- // Set chamber inner and outer radius to default
- chamber->SetRInner(AliMUONConstants::Dmin(st)/2.);
- chamber->SetROuter(AliMUONConstants::Dmax(st)/2.);
- //
} // Chamber stCH (0, 1) in
} // Station st (0...)
AliMUON::~AliMUON()
{
// Destructor
- AliDebug(1,"Calling AliMUON destructor");
+ AliDebug(1,Form("dtor this=%p",this));
fIshunt = 0;
if (fChambers){
}
delete fMUONData;
delete fGeometryBuilder;
- delete fDEIndexing;
- delete fFactory;
+ delete fSegmentation;
+ delete fRawWriter;
}
//________________________________________________________________________
{
// Geometry for event display
- if (!fSegmentationType) {
- AliFatal("No Segmentation Type defined.");
- return;
- }
-
// for (Int_t i = 0; i < AliMUONConstants::NCh(); i++)
// this->Chamber(i).SegmentationModel2(1)->Draw("eventdisplay");// to be check !
}
+//____________________________________________________________________
+const AliMUONGeometry* AliMUON::GetGeometry() const
+{
+// Return geometry parametrisation
+
+ if ( !fGeometryBuilder) {
+ AliWarningStream() << "GeometryBuilder not defined." << std::endl;
+ return 0;
+ }
+
+ return fGeometryBuilder->GetGeometry();
+}
+
+//____________________________________________________________________
+const AliMUONGeometryTransformer* AliMUON::GetGeometryTransformer() const
+{
+// Return geometry parametrisation
+
+ const AliMUONGeometry* kGeometry = GetGeometry();
+
+ if ( !kGeometry) return 0;
+
+ return kGeometry->GetTransformer();
+}
+
//__________________________________________________________________
void AliMUON::SetTreeAddress()
{
fHits = GetMUONData()->Hits(); // Added by Ivana to use the methods FisrtHit, NextHit of AliDetector
}
-//___________________________________________
-void AliMUON::SetChambersZ(const Float_t *Z)
-{
- // Set Z values for all chambers (tracking and trigger)
- // from the array pointed to by "Z"
- for (Int_t ch = 0; ch < AliMUONConstants::NCh(); ch++)
- ((AliMUONChamber*) fChambers->At(ch))->SetZ(Z[ch]);
- return;
-}
-//_________________________________________________________________
-void AliMUON::SetChambersZToDefault()
-{
- // Set Z values for all chambers (tracking and trigger)
- // to default values
- SetChambersZ(AliMUONConstants::DefaultChamberZ());
- return;
-}
//_________________________________________________________________
void AliMUON::SetChargeSlope(Int_t id, Float_t p1)
{
fGeometryBuilder->SetAlign(align);
}
-
+
//____________________________________________________________________
-void AliMUON::SetSegmentationModel(Int_t id, Int_t isec, AliMUONGeometrySegmentation* segmentation)
+ void AliMUON::SetAlign(const TString& fileName, Bool_t align)
{
-// Set the segmentation for chamber id cathode isec
- ((AliMUONChamber*) fChambers->At(id))->SetSegmentationModel(isec, segmentation);
+ // Sets option for alignement to geometry builder
+
+ fGeometryBuilder->SetAlign(fileName, align);
+}
-}
//____________________________________________________________________
void AliMUON::SetResponseModel(Int_t id, AliMUONResponse *response)
{
((AliMUONChamber*) fChambers->At(id))->SetResponseModel(response);
}
//____________________________________________________________________
-void AliMUON::SetNsec(Int_t id, Int_t nsec)
+AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager) const
{
-// Set number of segmented cathods for chamber id
- ((AliMUONChamber*) fChambers->At(id))->SetNsec(nsec);
+ // FIXME: the selection of the class should be done through a factory
+ // mechanism. (see also Hits2SDigits()).
+
+ AliInfo(Form("Digitizer used : %s",fDigitizerType.Data()));
+
+ if ( fDigitizerType == "digitizer:default" )
+ {
+ return new AliMUONDigitizerv2(manager);
+ }
+ else if ( fDigitizerType == "digitizer:NewDigitizerNewTrigger" )
+ {
+ return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerElectronics);
+ }
+ else if ( fDigitizerType == "digitizer:NewDigitizerOldTrigger" )
+ {
+ return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerDecision, kFALSE, kFALSE);
+ }
+ else if ( fDigitizerType == "digitizer:NewDigitizerEffTrigger" )
+ {
+ return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerDecision, kTRUE, kFALSE);
+ }
+ else if ( fDigitizerType == "digitizer:NewDigitizerWithNoiseOldTrigger" )
+ {
+ return new AliMUONDigitizerV3(manager,AliMUONDigitizerV3::kTriggerDecision, kFALSE, kTRUE);
+ }
+ else
+ {
+ AliFatal(Form("Unknown digitizer type : %s",fDigitizerType.Data()));
+ }
+ return 0x0;
}
-//____________________________________________________________________
-AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager) const
+
+//_____________________________________________________________________
+TString
+AliMUON::SDigitizerType() const
{
- return new AliMUONDigitizerv2(manager);
+ return fSDigitizerType;
}
+
//_____________________________________________________________________
void AliMUON::SDigits2Digits()
{
//_____________________________________________________________________
void AliMUON::Hits2SDigits()
{
- // Adaption of AliMUONSDigitizerv1 to be excuted by the AliSimulation framework
- AliRunLoader* runLoader = fLoader->GetRunLoader();
- AliRunDigitizer * manager = new AliRunDigitizer(1,1);
- manager->SetInputStream(0,runLoader->GetFileName(),AliConfig::GetDefaultEventFolderName());
- AliMUONDigitizer * dMUON = new AliMUONSDigitizerv1(manager);
- fLoader->LoadHits("READ");
- for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
- runLoader->GetEvent(iEvent);
- dMUON->Exec("");
+ // FIXME: the selection of the sdigitizer should be done through a
+ // factory mechanism.
+
+ AliInfo(Form("SDigitizer used : %s",fSDigitizerType.Data()));
+
+ if ( fSDigitizerType == "sdigitizer:default" )
+ {
+ // Adaption of AliMUONSDigitizerv1 to be excuted by the AliSimulation framework
+ AliRunLoader* runLoader = fLoader->GetRunLoader();
+ AliRunDigitizer * manager = new AliRunDigitizer(1,1);
+ manager->SetInputStream(0,runLoader->GetFileName(),AliConfig::GetDefaultEventFolderName());
+ AliMUONDigitizer * dMUON = new AliMUONSDigitizerv1(manager);
+ fLoader->LoadHits("READ");
+ for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
+ runLoader->GetEvent(iEvent);
+ dMUON->Exec("");
+ }
+ fLoader->UnloadHits();
+ }
+ else if ( fSDigitizerType == "sdigitizer:AliMUONSDigitizerV2" )
+ {
+ TTask* sdigitizer = new AliMUONSDigitizerV2;
+ sdigitizer->ExecuteTask();
+ }
+ else
+ {
+ AliFatal(Form("Unknown sdigitizer classname : %s",fSDigitizerType.Data()));
}
- fLoader->UnloadHits();
}
+
+//_____________________________________________________________________
+TString
+AliMUON::DigitizerType() const
+{
+ return fDigitizerType;
+}
+
//_____________________________________________________________________
void AliMUON::Digits2Raw()
{
// convert digits of the current event to raw data
- AliMUONRawData* rawData;
-
- rawData = new AliMUONRawData(fLoader);
- if (!rawData->Digits2Raw()) AliInfo("pb writting raw data");
- delete rawData;
- return;
+ if (!fRawWriter)
+ {
+ fRawWriter = new AliMUONRawWriter(fMUONData);
+ if (fTriggerScalerEvent == kTRUE)
+ {
+ fRawWriter->SetScalerEvent();
+ }
+ }
+
+ if (!fRawWriter->Digits2Raw())
+ {
+ AliError("pb writting raw data");
+ }
}
+
//_______________________________________________________________________
AliLoader* AliMUON::MakeLoader(const char* topfoldername)
{
return mRaw;
}
-//________________________________________________________________________
+//________________________________________________________________________
+void
+AliMUON::ResetGeometryBuilder()
+{
+ // Only to be used by "experts" wanting to change the geometry builders
+ // to be used.
+ // As the ctor of AliMUON now defines a default geometrybuilder, this
+ // ResetGeometryBuilder() must be called prior to call the
+ // AddGeometryBuilder()
+ delete fGeometryBuilder;
+ fGeometryBuilder = new AliMUONGeometryBuilder(this);
+ fGeometryBuilder
+ ->AddBuilder(new AliMUONCommonGeometryBuilder(this));
+}