/* $Id$ */
+//-----------------------------------------------------------------------------
+// Class AliMUON
+// ------------------
+// AliDetector class for MUON subsystem
+// providing simulation data management
+//-----------------------------------------------------------------------------
-///////////////////////////////////////////////
-// Manager and hits classes for set:MUON //
-////////////////////////////////////////////////
-
-#include "Riostream.h"
-
-#include <AliPDG.h>
-#include <TBRIK.h>
-#include <TCanvas.h>
-#include <TDirectory.h>
-#include <TFile.h>
-#include <TGeometry.h>
-#include <TMinuit.h>
-#include <TNode.h>
-#include <TNtuple.h>
-#include <TObjArray.h>
-#include <TObject.h>
-#include <TObjectTable.h>
-#include <TPad.h>
-#include <TParticle.h>
-#include <TROOT.h>
-#include <TRandom.h>
-#include <TRotMatrix.h>
-#include <TTUBE.h>
-#include <TTUBE.h>
-#include <TTree.h>
-#include <TVector.h>
-#include <TVirtualMC.h>
-
-#include "AliConst.h"
-#include "AliHeader.h"
-#include "AliHitMap.h"
-#include "AliLoader.h"
-#include "AliESD.h"
-#include "AliESDMuonTrack.h"
-#include "AliMC.h"
-#include "AliMUONLoader.h"
#include "AliMUON.h"
-#include "AliMUONTriggerTrack.h"
-#include "AliMUONEventReconstructor.h"
-#include "AliMUONClusterReconstructor.h"
-#include "AliMUONTrack.h"
-#include "AliMUONTrackParam.h"
+
+#include "AliMUONSDigitizerV2.h"
+#include "AliMUONDigitizerV3.h"
+#include "AliMUONDigitMaker.h"
+#include "AliMUONCalibrationData.h"
+
+#include "AliMUONDigitStoreV1.h"
+#include "AliMUONVTriggerStore.h"
+#include "AliMUONHitStoreV1.h"
+
#include "AliMUONChamberTrigger.h"
-#include "AliMUONClusterFinderAZ.h"
-#include "AliMUONClusterInput.h"
#include "AliMUONConstants.h"
-#include "AliMUONDigit.h"
-#include "AliMUONGlobalTrigger.h"
-#include "AliMUONHit.h"
-#include "AliMUONHitMapA1.h"
-#include "AliMUONLocalTrigger.h"
-#include "AliMUONMerger.h"
-#include "AliMUONPadHit.h"
-#include "AliMUONRawCluster.h"
-#include "AliMUONTransientDigit.h"
-#include "AliMUONTriggerCircuit.h"
-#include "AliMUONTriggerDecision.h"
+#include "AliMUONGeometry.h"
+#include "AliMUONGeometryTransformer.h"
+#include "AliMUONGeometryBuilder.h"
#include "AliMUONVGeometryBuilder.h"
-#include "AliRun.h"
-#include "AliMUONDigitizerv1.h"
-#include "AliMUONSDigitizerv1.h"
+#include "AliMUONCommonGeometryBuilder.h"
+#include "AliMUONSt1GeometryBuilderV2.h"
+#include "AliMUONSt2GeometryBuilderV2.h"
+#include "AliMUONSlatGeometryBuilder.h"
+#include "AliMUONTriggerGeometryBuilder.h"
+#include "AliMUONRawWriter.h"
+
+#include "AliLoader.h"
+#include "AliCDBManager.h"
+#include "AliRunDigitizer.h"
+#include "AliMC.h"
+#include "AliRun.h"
+#include "AliRawDataHeaderSim.h"
+#include "AliLog.h"
+
+#include <TObjArray.h>
// Defaults parameters for Z positions of chambers
// taken from values for "stations" in AliMUON::AliMUON
// according to (Z1 = zch) and (Z2 = zch + DTPLANES)
// for the first and second chambers in the station, respectively
-ClassImp(AliMUON)
+/// \cond CLASSIMP
+ClassImp(AliMUON)
+/// \endcond
+
//__________________________________________________________________
AliMUON::AliMUON()
-{
-// Default Constructor
-//
- fNCh = 0;
- fNTrackingCh = 0;
+ : AliDetector(),
+ fNCh(0),
+ fNTrackingCh(0),
+ fSplitLevel(0),
+ fChambers(0),
+ fGeometryBuilder(0),
+ fAccCut(kFALSE),
+ fAccMin(0.),
+ fAccMax(0.),
+ fMaxStepGas(0.),
+ fMaxStepAlu(0.),
+ fMaxDestepGas(0.),
+ fMaxDestepAlu(0.),
+ fMaxIterPad(0),
+ fCurIterPad(0),
+ fTriggerScalerEvent(kFALSE),
+ fTriggerResponseV1(kFALSE),
+ fTriggerCoinc44(0),
+ fTriggerEffCells(0),
+ fDigitizerWithNoise(1),
+ fDigitizerNSigmas(4.0),
+ fIsTailEffect(kTRUE),
+ fRawWriter(0x0),
+ fDigitMaker(0x0),
+ fHitStore(0x0),
+ fDigitStoreConcreteClassName(),
+ fCalibrationData(0x0)
+{
+/// Default Constructor
+
+ AliDebug(1,Form("default (empty) ctor this=%p",this));
fIshunt = 0;
- fChambers = 0;
- fGeometryBuilders = 0;
- fTriggerCircuits = 0;
- fAccMin = 0.;
- fAccMax = 0.;
- fAccCut = kFALSE;
- fMerger = 0;
- fFileName = 0;
- fMUONData = 0;
- fSplitLevel = 0;
}
+
//__________________________________________________________________
-AliMUON::AliMUON(const char *name, const char *title)
- : AliDetector(name,title)
-{
-//Begin_Html
-/*
-<img src="gif/alimuon.gif">
-*/
-//End_Html
- fMUONData = 0x0;
- fSplitLevel= 0;
- fIshunt = 0;
-
- fNCh = AliMUONConstants::NCh();
- fNTrackingCh = AliMUONConstants::NTrackingCh();
-
- SetMarkerColor(kRed);//
-//
-// Creating List of Chambers
+AliMUON::AliMUON(const char *name, const char* title)
+ : AliDetector(name, title),
+ fNCh(AliMUONConstants::NCh()),
+ fNTrackingCh(AliMUONConstants::NTrackingCh()),
+ fSplitLevel(0),
+ fChambers(0),
+ fGeometryBuilder(0),
+ fAccCut(kFALSE),
+ fAccMin(0.),
+ fAccMax(0.),
+ fMaxStepGas(0.1),
+ fMaxStepAlu(0.1),
+ fMaxDestepGas(-1), // Negatives values are ignored by geant3 CONS200
+ fMaxDestepAlu(-1), // in the calculation of the tracking parameters
+ fMaxIterPad(0),
+ fCurIterPad(0),
+ fTriggerScalerEvent(kFALSE),
+ fTriggerResponseV1(kFALSE),
+ fTriggerCoinc44(0),
+ fTriggerEffCells(0),
+ fDigitizerWithNoise(1),
+ fDigitizerNSigmas(4.0),
+ fIsTailEffect(kTRUE),
+ fRawWriter(0x0),
+ fDigitMaker(new AliMUONDigitMaker),
+ fHitStore(0x0),
+ fDigitStoreConcreteClassName("AliMUONDigitStoreV2S"),
+ fCalibrationData()
+{
+ /// Standard constructor
+
+ AliDebug(1,Form("ctor this=%p",this));
+ fIshunt = 0;
+
+ //PH SetMarkerColor(kRed);//
+
+ // Geometry builder
+ fGeometryBuilder = new AliMUONGeometryBuilder(this);
+
+ // Common geometry definitions
+ fGeometryBuilder
+ ->AddBuilder(new AliMUONCommonGeometryBuilder(this));
+
+ // 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.
+
+ 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());
- fGeometryBuilders = new TObjArray(AliMUONConstants::NCh());
-
+ fChambers->SetOwner(kTRUE);
+
// Loop over stations
for (Int_t st = 0; st < AliMUONConstants::NCh() / 2; st++) {
// Loop over 2 chambers in the station
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...)
-
- // Negatives values are ignored by geant3 CONS200 in the calculation of the tracking parameters
- fMaxStepGas=0.1;
- fMaxStepAlu=0.1;
- fMaxDestepGas=-1;
- fMaxDestepAlu=-1;
-
- fMaxIterPad = 0;
- fCurIterPad = 0;
-
- fAccMin = 0.;
- fAccMax = 0.;
- fAccCut = kFALSE;
-
- // cp new design of AliMUONTriggerDecision
- fTriggerCircuits = new TObjArray(AliMUONConstants::NTriggerCircuit());
- for (Int_t circ=0; circ<AliMUONConstants::NTriggerCircuit(); circ++) {
- fTriggerCircuits->AddAt(new AliMUONTriggerCircuit(),circ);
- }
- fMerger = 0;
-}
-//____________________________________________________________________
-AliMUON::AliMUON(const AliMUON& rMUON):AliDetector(rMUON)
-{
-// Dummy copy constructor
- ;
-
+
+ Int_t runnumber = AliCDBManager::Instance()->GetRun();
+
+ fCalibrationData = new AliMUONCalibrationData(runnumber);
}
+
//____________________________________________________________________
AliMUON::~AliMUON()
{
-// Destructor
- if(fDebug) printf("%s: Calling AliMUON destructor !!!\n",ClassName());
- fIshunt = 0;
- if (fMerger) delete fMerger;
+/// Destructor
- if (fGeometryBuilders){
- fGeometryBuilders->Delete();
- delete fGeometryBuilders;
- }
- if (fChambers){
- fChambers->Delete();
- delete fChambers;
- }
- if (fTriggerCircuits){
- fTriggerCircuits->Delete();
- delete fTriggerCircuits;
- }
- delete fMUONData;
+ AliDebug(1,Form("dtor this=%p",this));
+ delete fChambers;
+ delete fGeometryBuilder;
+ delete fRawWriter;
+ delete fDigitMaker;
+ delete fHitStore;
+ delete fCalibrationData;
}
+
//_____________________________________________________________________________
void AliMUON::AddGeometryBuilder(AliMUONVGeometryBuilder* geomBuilder)
{
-// Adds the geometry builder to the list
-// ---
+/// Add the geometry builder to the list
- fGeometryBuilders->Add(geomBuilder);
+ fGeometryBuilder->AddBuilder(geomBuilder);
}
+
//____________________________________________________________________
-void AliMUON::BuildGeometry()
+const AliMUONGeometry* AliMUON::GetGeometry() const
{
-// Geometry for event display
- for (Int_t i=0; i<7; i++) {
- for (Int_t j=0; j<2; j++) {
- Int_t id=2*i+j+1;
- this->Chamber(id-1).SegmentationModel(1)->Draw("eventdisplay");
- }
+/// Return geometry parametrisation
+
+ if ( !fGeometryBuilder) {
+ AliWarningStream() << "GeometryBuilder not defined." << std::endl;
+ return 0;
}
-}
-//___________________________________________________________________
-Int_t AliMUON::DistancetoPrimitive(Int_t , Int_t )
+
+ return fGeometryBuilder->GetGeometry();
+}
+
+//____________________________________________________________________
+const AliMUONGeometryTransformer* AliMUON::GetGeometryTransformer() const
{
- return 9999;
-}
+/// Return geometry parametrisation
+
+ const AliMUONGeometry* kGeometry = GetGeometry();
+
+ if ( !kGeometry) return 0;
+
+ return kGeometry->GetTransformer();
+}
+
//__________________________________________________________________
-void AliMUON::SetTreeAddress()
+void
+AliMUON::MakeBranch(Option_t* opt)
{
- GetMUONData()->SetLoader(fLoader);
- // GetMUONData()->MakeBranch("D,S,RC");
- // GetMUONData()->SetTreeAddress("H,D,S,RC");
- GetMUONData()->SetTreeAddress("H");
- if (fHits != GetMUONData()->Hits()) {
+ /// Create branche(s) to hold MUON hits
+ AliDebug(1,"");
+
+ TString sopt(opt);
+ if ( sopt != "H" ) return;
+
+ if (!fHitStore)
+ {
+ fHitStore = new AliMUONHitStoreV1;
if ( gAlice->GetMCApp() )
- if ( gAlice->GetMCApp()->GetHitLists() )
- gAlice->GetMCApp()->AddHitList (fHits); // For purifyKine, only necessary when Hit list is created in AliMUONData
+ {
+ if ( gAlice->GetMCApp()->GetHitLists() )
+ {
+ // AliStack::PurifyKine needs to be able to loop on our hits
+ // to remap the track numbers.
+ gAlice->GetMCApp()->AddHitList(fHitStore->Collection());
+ }
+ }
}
- fHits = GetMUONData()->Hits(); // Added by Ivana to use the methods FisrtHit, NextHit of AliDetector
-
-}
-//____________________________________________________________________
-void AliMUON::SetPadSize(Int_t id, Int_t isec, Float_t p1, Float_t p2)
-{
-// Set the pad size for chamber id and cathode isec
- Int_t i=2*(id-1);
- ((AliMUONChamber*) fChambers->At(i)) ->SetPadSize(isec,p1,p2);
- ((AliMUONChamber*) fChambers->At(i+1))->SetPadSize(isec,p1,p2);
+ TTree* treeH = fLoader->TreeH();
+
+ if (!treeH)
+ {
+ AliFatal("No TreeH");
+ }
+
+ fHitStore->Connect(*treeH);
}
-//___________________________________________
-void AliMUON::SetChambersZ(const Float_t *Z)
+//__________________________________________________________________
+void
+AliMUON::SetTreeAddress()
{
- // 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;
+ /// Set Hits tree address
+
+// if ( gAlice->GetMCApp() && fHitStore )
+// {
+// TList* l = gAlice->GetMCApp()->GetHitLists();
+// if ( l )
+// {
+// TObject* o = l->First();
+// if (o!=fHitStore->HitCollection())
+// {
+// AliError(Form("Something is strange hitcollection=%x",fHitStore->HitCollection()));
+// l->Print();
+// }
+// }
+// }
}
+
//_________________________________________________________________
-void AliMUON::SetChambersZToDefault()
+void
+AliMUON::ResetHits()
{
- // Set Z values for all chambers (tracking and trigger)
- // to default values
- SetChambersZ(AliMUONConstants::DefaultChamberZ());
- return;
+ /// Reset hits
+
+ AliDebug(1,"");
+ if (fHitStore) fHitStore->Clear();
}
+
//_________________________________________________________________
void AliMUON::SetChargeSlope(Int_t id, Float_t p1)
{
-// Set the inverse charge slope for chamber id
+/// Set the inverse charge slope for chamber id
+
Int_t i=2*(id-1); //PH ((AliMUONChamber*) (*fChambers)[i])->SetSigmaIntegration(p1);
//PH ((AliMUONChamber*) (*fChambers)[i+1])->SetSigmaIntegration(p1);
((AliMUONChamber*) fChambers->At(i))->SetChargeSlope(p1);
//__________________________________________________________________
void AliMUON::SetChargeSpread(Int_t id, Float_t p1, Float_t p2)
{
-// Set sigma of charge spread for chamber id
+/// Set sigma of charge spread for chamber id
+
Int_t i=2*(id-1);
((AliMUONChamber*) fChambers->At(i))->SetChargeSpread(p1,p2);
((AliMUONChamber*) fChambers->At(i+1))->SetChargeSpread(p1,p2);
//___________________________________________________________________
void AliMUON::SetSigmaIntegration(Int_t id, Float_t p1)
{
-// Set integration limits for charge spread
+/// Set integration limits for charge spread
Int_t i=2*(id-1);
((AliMUONChamber*) fChambers->At(i))->SetSigmaIntegration(p1);
((AliMUONChamber*) fChambers->At(i+1))->SetSigmaIntegration(p1);
//__________________________________________________________________
void AliMUON::SetMaxAdc(Int_t id, Int_t p1)
{
-// Set maximum number for ADCcounts (saturation)
+/// Set maximum number for ADCcounts (saturation)
+
Int_t i=2*(id-1);
((AliMUONChamber*) fChambers->At(i))->SetMaxAdc(p1);
((AliMUONChamber*) fChambers->At(i+1))->SetMaxAdc(p1);
}
+
//__________________________________________________________________
void AliMUON::SetMaxStepGas(Float_t p1)
{
-// Set stepsize in gas
+/// Set stepsize in gas
+
fMaxStepGas=p1;
}
//__________________________________________________________________
void AliMUON::SetMaxStepAlu(Float_t p1)
{
-// Set step size in Alu
+/// Set step size in Alu
+
fMaxStepAlu=p1;
}
//__________________________________________________________________
void AliMUON::SetMaxDestepGas(Float_t p1)
{
-// Set maximum step size in Gas
+/// Set maximum step size in Gas
+
fMaxDestepGas=p1;
}
//__________________________________________________________________
void AliMUON::SetMaxDestepAlu(Float_t p1)
{
-// Set maximum step size in Alu
+/// Set maximum step size in Alu
+
fMaxDestepAlu=p1;
}
-//___________________________________________________________________
-void AliMUON::SetAcceptance(Bool_t acc, Float_t angmin, Float_t angmax)
-{
-// Set acceptance cuts
- fAccCut=acc;
- fAccMin=angmin*TMath::Pi()/180;
- fAccMax=angmax*TMath::Pi()/180;
- Int_t ch;
- if (acc) {
- for (Int_t st = 0; st < AliMUONConstants::NCh() / 2; st++) {
- // Loop over 2 chambers in the station
- for (Int_t stCH = 0; stCH < 2; stCH++) {
- ch = 2 * st + stCH;
- // Set chamber inner and outer radius according to acceptance cuts
- Chamber(ch).SetRInner(TMath::Abs(AliMUONConstants::DefaultChamberZ(ch)*TMath::Tan(fAccMin)));
- Chamber(ch).SetROuter(TMath::Abs(AliMUONConstants::DefaultChamberZ(ch)*TMath::Tan(fAccMax)));
- } // chamber loop
- } // station loop
- }
-}
//____________________________________________________________________
Float_t AliMUON::GetMaxStepGas() const
{
-// Return stepsize in gas
+/// Return stepsize in gas
return fMaxStepGas;
}
//____________________________________________________________________
Float_t AliMUON::GetMaxStepAlu() const
{
-// Return step size in Alu
+/// Return step size in Alu
return fMaxStepAlu;
}
//____________________________________________________________________
Float_t AliMUON::GetMaxDestepGas() const
{
-// Return maximum step size in Gas
+/// Return maximum step size in Gas
return fMaxDestepGas;
}
//____________________________________________________________________
Float_t AliMUON::GetMaxDestepAlu() const
{
-// Return maximum step size in Gas
+/// Return maximum step size in Gas
return fMaxDestepAlu;
}
//____________________________________________________________________
-void AliMUON::SetSegmentationModel(Int_t id, Int_t isec, AliSegmentation *segmentation)
+ void AliMUON::SetAlign(Bool_t align)
{
-// Set the segmentation for chamber id cathode isec
- ((AliMUONChamber*) fChambers->At(id))->SetSegmentationModel(isec, segmentation);
+/// Set option for alignement to geometry builder
+
+ fGeometryBuilder->SetAlign(align);
+}
-}
-//____________________________________________________________________
-void AliMUON::SetResponseModel(Int_t id, AliMUONResponse *response)
-{
-// Set the response for chamber id
- ((AliMUONChamber*) fChambers->At(id))->SetResponseModel(response);
-}
//____________________________________________________________________
-void AliMUON::SetReconstructionModel(Int_t id, AliMUONClusterFinderVS *reconst)
+ void AliMUON::SetAlign(const TString& fileName, Bool_t align)
{
-// Set ClusterFinder for chamber id
- ((AliMUONChamber*) fChambers->At(id))->SetReconstructionModel(reconst);
-}
+/// Set option for alignement to geometry builder
+
+ fGeometryBuilder->SetAlign(fileName, align);
+}
+
//____________________________________________________________________
-void AliMUON::SetNsec(Int_t id, Int_t nsec)
+void AliMUON::SetResponseModel(Int_t id, const AliMUONResponse& response)
{
-// Set number of segmented cathods for chamber id
- ((AliMUONChamber*) fChambers->At(id))->SetNsec(nsec);
+/// Set the response for chamber id
+ ((AliMUONChamber*) fChambers->At(id))->SetResponseModel(response);
}
+
//____________________________________________________________________
AliDigitizer* AliMUON::CreateDigitizer(AliRunDigitizer* manager) const
{
- return new AliMUONDigitizerv1(manager);
+/// Return digitizer
+
+ AliMUONDigitizerV3* digitizer = new AliMUONDigitizerV3(manager, fDigitizerWithNoise);
+ AliMUONDigitizerV3::SetNSigmas(fDigitizerNSigmas);
+ digitizer->SetCalibrationData(fCalibrationData);
+ return digitizer;
}
+
//_____________________________________________________________________
void AliMUON::SDigits2Digits()
{
+/// Write TreeD here only
-// write TreeD here
-
- if (!fMerger) {
- if (gAlice->GetDebug()>0) {
- cerr<<"AliMUON::SDigits2Digits: create default AliMUONMerger "<<endl;
- cerr<<" no merging, just digitization of 1 event will be done"<<endl;
- }
- fMerger = new AliMUONMerger();
- }
- fMerger->Init();
- fMerger->Digitise();
char hname[30];
// sprintf(hname,"TreeD%d",fLoader->GetHeader()->GetEvent());
fLoader->TreeD()->Write(hname,TObject::kOverwrite);
//_____________________________________________________________________
void AliMUON::Hits2SDigits()
{
- // Empty for the moment which means that AliSimulation is
- // using AliMUONDigitalisationv1 and SDigits are not created. MErging is done at the Hit level
+/// Perform Hits2Digits using SDigitizerV2
+
+ AliMUONSDigitizerV2 sdigitizer;
+ sdigitizer.ExecuteTask();
}
-//_______________________________________________________________________
-AliLoader* AliMUON::MakeLoader(const char* topfoldername)
-{
-//builds standard getter (AliLoader type)
-//if detector wants to use castomized getter, it must overload this method
- if (GetDebug())
- Info("MakeLoader",
- "Creating standard getter for detector %s. Top folder is %s.",
- GetName(),topfoldername);
- fLoader = new AliLoader(GetName(),topfoldername);
- fMUONData = new AliMUONData(fLoader,GetName(),GetName());
- fMUONData->SetSplitLevel(fSplitLevel);
- return fLoader;
-}
+//_____________________________________________________________________
+void AliMUON::Digits2Raw()
+{
+/// Convert digits of the current event to raw data
-//_______________________________________________________________________
-void AliMUON::Trigger(Int_t /*nev*/){
-// call the Trigger Algorithm and fill TreeR
-
- Int_t singlePlus[3] = {0,0,0};
- Int_t singleMinus[3] = {0,0,0};
- Int_t singleUndef[3] = {0,0,0};
- Int_t pairUnlike[3] = {0,0,0};
- Int_t pairLike[3] = {0,0,0};
-
- ResetTrigger();
- AliMUONTriggerDecision* decision= new AliMUONTriggerDecision(fLoader,1);
- decision->Trigger();
- decision->GetGlobalTrigger(singlePlus, singleMinus, singleUndef,
- pairUnlike, pairLike);
-
- // add a local trigger in the list
- GetMUONData()->AddGlobalTrigger(singlePlus, singleMinus, singleUndef, pairUnlike, pairLike);
- Int_t i;
-
- for (Int_t icirc=0; icirc<AliMUONConstants::NTriggerCircuit(); icirc++) {
- if(decision->GetITrigger(icirc)==1) {
- Int_t localtr[7]={0,0,0,0,0,0,0};
- Int_t loLpt[2]={0,0}; Int_t loHpt[2]={0,0}; Int_t loApt[2]={0,0};
- decision->GetLutOutput(icirc, loLpt, loHpt, loApt);
- localtr[0] = icirc;
- localtr[1] = decision->GetStripX11(icirc);
- localtr[2] = decision->GetDev(icirc);
- localtr[3] = decision->GetStripY11(icirc);
- for (i=0; i<2; i++) { // convert the Lut output in 1 digit
- localtr[4] = localtr[4]+Int_t(loLpt[i]*TMath::Power(2,i));
- localtr[5] = localtr[5]+Int_t(loHpt[i]*TMath::Power(2,i));
- localtr[6] = localtr[6]+Int_t(loApt[i]*TMath::Power(2,i));
- }
- GetMUONData()->AddLocalTrigger(localtr); // add a local trigger in the list
+ AliRawDataHeaderSim header;
+
+ if (!fRawWriter)
+ {
+ fRawWriter = new AliMUONRawWriter;
+ AliDebug(1,Form("Creating %s",fRawWriter->ClassName()));
+ if (fTriggerScalerEvent == kTRUE)
+ {
+ fRawWriter->SetScalersNumbers();
}
}
- delete decision;
-
- // fLoader->TreeR()->Fill();
- GetMUONData()->Fill("GLT"); //Filling Global and Local Trigger GLT
- // char hname[30];
- // sprintf(hname,"TreeR%d",nev);
- // fLoader->TreeR()->Write(hname,TObject::kOverwrite);
- // fLoader->TreeR()->Reset();
- fLoader->WriteRecPoints("OVERWRITE");
+ fLoader->LoadDigits("READ");
- // printf("\n End of trigger for event %d\n", nev);
-}
-
-//____________________________________________________________________
-void AliMUON::Digits2Reco()
-{
- FindClusters();
- Int_t nev = gAlice->GetHeader()->GetEvent();
- GetMUONData()->Fill("RC"); //Filling Reconstructed Cluster
- fLoader->WriteRecPoints("OVERWRITE");
- GetMUONData()->ResetRawClusters();
- Info("Digits2Reco","End of cluster finding for event %d", nev);
-}
-//____________________________________________________________________
-void AliMUON::FindClusters()
-{
-//
-// Perform cluster finding
-//
- TClonesArray *dig1, *dig2;
- Int_t ndig, k;
- dig1 = new TClonesArray("AliMUONDigit",1000);
- dig2 = new TClonesArray("AliMUONDigit",1000);
- AliMUONDigit *digit;
-// Loop on chambers and on cathode planes
-//
- ResetRawClusters();
- TClonesArray * muonDigits;
-
- for (Int_t ich = 0; ich < 10; ich++) {
- //PH AliMUONChamber* iChamber = (AliMUONChamber*) (*fChambers)[ich];
- AliMUONChamber* iChamber = (AliMUONChamber*) fChambers->At(ich);
- AliMUONClusterFinderVS* rec = iChamber->ReconstructionModel();
-
- ResetDigits();
- GetMUONData()->GetCathode(0);
- //TClonesArray *
- muonDigits = GetMUONData()->Digits(ich);
- ndig=muonDigits->GetEntriesFast();
- if(fDebug)
- printf("\n 1 Found %d digits in %p chamber %d", ndig, muonDigits,ich);
- TClonesArray &lhits1 = *dig1;
- Int_t n = 0;
- for (k = 0; k < ndig; k++) {
- digit = (AliMUONDigit*) muonDigits->UncheckedAt(k);
- if (rec->TestTrack(digit->Track(0)))
- new(lhits1[n++]) AliMUONDigit(*digit);
- }
- GetMUONData()->ResetDigits();
- GetMUONData()->GetCathode(1);
- muonDigits = GetMUONData()->Digits(ich);
- ndig=muonDigits->GetEntriesFast();
- if(fDebug)
- printf("\n 2 Found %d digits in %p %d", ndig, muonDigits, ich);
- TClonesArray &lhits2 = *dig2;
- n=0;
-
- for (k=0; k<ndig; k++) {
- digit= (AliMUONDigit*) muonDigits->UncheckedAt(k);
- if (rec->TestTrack(digit->Track(0)))
- new(lhits2[n++]) AliMUONDigit(*digit);
- }
+ TTree* treeD = fLoader->TreeD();
+
+ if (!treeD)
+ {
+ AliError("Could not get TreeD");
+ return;
+ }
+
+ AliMUONVTriggerStore* triggerStore = AliMUONVTriggerStore::Create(*treeD);
+ AliMUONVDigitStore* digitStore = AliMUONVDigitStore::Create(*treeD);
- if (rec) {
- AliMUONClusterInput::Instance()->SetDigits(ich, dig1, dig2);
- rec->FindRawClusters();
- }
- dig1->Delete();
- dig2->Delete();
- } // for ich
- delete dig1;
- delete dig2;
-}
-//______________________________________________________________________
-#ifdef never
-void AliMUON::Streamer(TBuffer &R__b)_
-{
- // Stream an object of class AliMUON.
- AliMUONChamber *iChamber;
- AliMUONTriggerCircuit *iTriggerCircuit;
- AliSegmentation *segmentation;
- AliMUONResponse *response;
- TClonesArray *digitsaddress;
- TClonesArray *rawcladdress;
- Int_t i;
- if (R__b.IsReading()) {
- Version_t R__v = R__b.ReadVersion(); if (R__v) { }
- AliDetector::Streamer(R__b);
- R__b >> fNPadHits;
- R__b >> fPadHits; // diff
- R__b >> fNLocalTrigger;
- R__b >> fLocalTrigger;
- R__b >> fNGlobalTrigger;
- R__b >> fGlobalTrigger;
- R__b >> fDchambers;
- R__b >> fRawClusters;
- R__b.ReadArray(fNdch);
- R__b.ReadArray(fNrawch);
- R__b >> fAccCut;
- R__b >> fAccMin;
- R__b >> fAccMax;
- R__b >> fChambers;
- R__b >> fTriggerCircuits;
- for (i =0; i<AliMUONConstants::NTriggerCircuit(); i++) {
- iTriggerCircuit=(AliMUONTriggerCircuit*) (*fTriggerCircuits)[i];
- iTriggerCircuit->Streamer(R__b);
- }
-// Stream chamber related information
- for (i =0; i<AliMUONConstants::NCh(); i++) {
- iChamber=(AliMUONChamber*) (*fChambers)[i];
- iChamber->Streamer(R__b);
- if (iChamber->Nsec()==1) {
- segmentation=iChamber->SegmentationModel(1);
- if (segmentation)
- segmentation->Streamer(R__b);
- } else {
- segmentation=iChamber->SegmentationModel(1);
- if (segmentation)
- segmentation->Streamer(R__b);
- if (segmentation)
- segmentation=iChamber->SegmentationModel(2);
- segmentation->Streamer(R__b);
- }
- response=iChamber->ResponseModel();
- if (response)
- response->Streamer(R__b);
- digitsaddress=(TClonesArray*) (*fDchambers)[i];
- digitsaddress->Streamer(R__b);
- if (i < AliMUONConstants::NTrackingCh()) {
- rawcladdress=(TClonesArray*) (*fRawClusters)[i];
- rawcladdress->Streamer(R__b);
- }
- }
-
- } else {
- R__b.WriteVersion(AliMUON::IsA());
- AliDetector::Streamer(R__b);
- R__b << fNPadHits;
- R__b << fPadHits; // diff
- R__b << fNLocalTrigger;
- R__b << fLocalTrigger;
- R__b << fNGlobalTrigger;
- R__b << fGlobalTrigger;
- R__b << fDchambers;
- R__b << fRawClusters;
- R__b.WriteArray(fNdch, AliMUONConstants::NCh());
- R__b.WriteArray(fNrawch, AliMUONConstants::NTrackingCh());
-
- R__b << fAccCut;
- R__b << fAccMin;
- R__b << fAccMax;
-
- R__b << fChambers;
- R__b << fTriggerCircuits;
- for (i =0; i<AliMUONConstants::NTriggerCircuit(); i++) {
- iTriggerCircuit=(AliMUONTriggerCircuit*) (*fTriggerCircuits)[i];
- iTriggerCircuit->Streamer(R__b);
- }
- for (i =0; i<AliMUONConstants::NCh(); i++) {
- iChamber=(AliMUONChamber*) (*fChambers)[i];
- iChamber->Streamer(R__b);
- if (iChamber->Nsec()==1) {
- segmentation=iChamber->SegmentationModel(1);
- if (segmentation)
- segmentation->Streamer(R__b);
- } else {
- segmentation=iChamber->SegmentationModel(1);
- if (segmentation)
- segmentation->Streamer(R__b);
- segmentation=iChamber->SegmentationModel(2);
- if (segmentation)
- segmentation->Streamer(R__b);
- }
- response=iChamber->ResponseModel();
- if (response)
- response->Streamer(R__b);
- digitsaddress=(TClonesArray*) (*fDchambers)[i];
- digitsaddress->Streamer(R__b);
- if (i < AliMUONConstants::NTrackingCh()) {
- rawcladdress=(TClonesArray*) (*fRawClusters)[i];
- rawcladdress->Streamer(R__b);
- }
- }
- }
-}
-#endif
-//_______________________________________________________________________
-AliMUONPadHit* AliMUON::FirstPad(AliMUONHit* hit, TClonesArray *clusters)
-{
-// to be removed
- // Initialise the pad iterator
- // Return the address of the first padhit for hit
- TClonesArray *theClusters = clusters;
- Int_t nclust = theClusters->GetEntriesFast();
- if (nclust && hit->PHlast() > 0) {
- AliMUON::fMaxIterPad=hit->PHlast();
- AliMUON::fCurIterPad=hit->PHfirst();
- return (AliMUONPadHit*) clusters->UncheckedAt(AliMUON::fCurIterPad-1);
- } else {
- return 0;
- }
-}
-//_______________________________________________________________________
-AliMUONPadHit* AliMUON::NextPad(TClonesArray *clusters)
-{
- // To be removed
-// Get next pad (in iterator)
-//
- AliMUON::fCurIterPad++;
- if (AliMUON::fCurIterPad <= AliMUON::fMaxIterPad) {
- return (AliMUONPadHit*) clusters->UncheckedAt(AliMUON::fCurIterPad-1);
- } else {
- return 0;
- }
+ triggerStore->Connect(*treeD,kFALSE);
+ digitStore->Connect(*treeD,kFALSE);
+
+ treeD->GetEvent(0);
+
+ fRawWriter->SetHeader(header);
+ if (!fRawWriter->Digits2Raw(digitStore,triggerStore))
+ {
+ AliError("pb writting raw data");
+ }
+
+ delete triggerStore;
+ delete digitStore;
+
+ fLoader->UnloadDigits();
}
-//_______________________________________________________________________
-AliMUONRawCluster *AliMUON::RawCluster(Int_t ichamber, Int_t icathod, Int_t icluster)
-{
-//
-// Return rawcluster (icluster) for chamber ichamber and cathode icathod
-// Obsolete ??
- TClonesArray *muonRawCluster = GetMUONData()->RawClusters(ichamber);
- ResetRawClusters();
- TTree *treeR = fLoader->TreeR();
- Int_t nent=(Int_t)treeR->GetEntries();
- treeR->GetEvent(nent-2+icathod-1);
- //treeR->GetEvent(icathod);
- //Int_t nrawcl = (Int_t)muonRawCluster->GetEntriesFast();
-
- AliMUONRawCluster * mRaw = (AliMUONRawCluster*)muonRawCluster->UncheckedAt(icluster);
- //printf("RawCluster _ nent nrawcl icluster mRaw %d %d %d%p\n",nent,nrawcl,icluster,mRaw);
-
- return mRaw;
-}
-//________________________________________________________________________
-void AliMUON::SetMerger(AliMUONMerger* merger)
-{
-// Set pointer to merger
- fMerger = merger;
-}
-//________________________________________________________________________
-AliMUONMerger* AliMUON::Merger()
-{
-// Return pointer to merger
- return fMerger;
-}
-//________________________________________________________________________
-AliMUON& AliMUON::operator = (const AliMUON& /*rhs*/)
-{
-// copy operator
-// dummy version
- return *this;
-}
-//________________________________________________________________________
-void AliMUON::Reconstruct() const
+//_____________________________________________________________________
+Bool_t AliMUON::Raw2SDigits(AliRawReader* rawReader)
{
+/// Convert raw data to SDigit
-// AliLoader* loader = GetLoader();
-
- AliRunLoader* runLoader = fLoader->GetRunLoader();
- Int_t nEvents = runLoader->GetNumberOfEvents();
-
-// used local container for each method
-// passing fLoader as argument, could be avoided ???
- AliMUONEventReconstructor* recoEvent = new AliMUONEventReconstructor(fLoader);
- AliMUONData* dataEvent = recoEvent->GetMUONData();
-
- AliMUONClusterReconstructor* recoCluster = new AliMUONClusterReconstructor(fLoader);
- AliMUONData* dataCluster = recoCluster->GetMUONData();
+ fLoader->LoadDigits("READ");
+ if (!fLoader->TreeS()) fLoader->MakeSDigitsContainer();
- AliMUONTriggerDecision* trigDec = new AliMUONTriggerDecision(fLoader);
- AliMUONData* dataTrig = trigDec->GetMUONData();
+ TTree* treeS = fLoader->TreeS();
+
+ AliMUONVDigitStore* sDigitStore = new AliMUONDigitStoreV1;
+ sDigitStore->Connect(*treeS);
+
+ fDigitMaker->Raw2Digits(rawReader,sDigitStore,0x0);
+ fLoader->WriteSDigits("OVERWRITE");
- for (Int_t i = 0; i < 10; i++) {
- AliMUONClusterFinderVS *RecModel = new AliMUONClusterFinderVS();
- RecModel->SetGhostChi2Cut(10);
- recoCluster->SetReconstructionModel(i,RecModel);
- }
+ fLoader->UnloadSDigits();
- fLoader->LoadDigits("READ");
- fLoader->LoadRecPoints("RECREATE");
- fLoader->LoadTracks("RECREATE");
-
- // Loop over events
- for(Int_t ievent = 0; ievent < nEvents; ievent++) {
- printf("Event %d\n",ievent);
- runLoader->GetEvent(ievent);
-
- //----------------------- digit2cluster & Digits2Trigger -------------------
- if (!fLoader->TreeR()) fLoader->MakeRecPointsContainer();
-
- // tracking branch
- dataCluster->MakeBranch("RC");
- dataCluster->SetTreeAddress("D,RC");
- recoCluster->Digits2Clusters();
- dataCluster->Fill("RC");
-
- // trigger branch
- dataTrig->MakeBranch("GLT");
- dataTrig->SetTreeAddress("D,GLT");
- trigDec->Digits2Trigger();
- dataTrig->Fill("GLT");
-
- fLoader->WriteRecPoints("OVERWRITE");
-
- //---------------------------- Track & TriggerTrack ---------------------
- if (!fLoader->TreeT()) fLoader->MakeTracksContainer();
-
- // trigger branch
- dataEvent->MakeBranch("RL"); //trigger track
- dataEvent->SetTreeAddress("RL");
- recoEvent->EventReconstructTrigger();
- dataEvent->Fill("RL");
-
- // tracking branch
- dataEvent->MakeBranch("RT"); //track
- dataEvent->SetTreeAddress("RT");
- recoEvent->EventReconstruct();
- dataEvent->Fill("RT");
-
- fLoader->WriteTracks("OVERWRITE");
-
- //--------------------------- Resetting branches -----------------------
- dataCluster->ResetDigits();
- dataCluster->ResetRawClusters();
-
- dataTrig->ResetDigits();
- dataTrig->ResetTrigger();
-
- dataEvent->ResetRawClusters();
- dataEvent->ResetTrigger();
- dataEvent->ResetRecTracks();
- dataEvent->ResetRecTriggerTracks();
+ delete sDigitStore;
- }
- fLoader->UnloadDigits();
- fLoader->UnloadRecPoints();
- fLoader->UnloadTracks();
-
- delete recoCluster;
- delete recoEvent;
- delete trigDec;
+ return kTRUE;
}
-//________________________________________________________________________
-void AliMUON::FillESD(AliESD* event) const
-{
-
- TClonesArray* recTracksArray;
- TClonesArray* recTrigTracksArray;
-
- //YS AliLoader* loader = GetLoader();
- AliRunLoader* runLoader = fLoader->GetRunLoader(); //YS loader->GetRunLoader();
- fLoader->LoadTracks("READ"); //YS
-
- // declaration
- Int_t ievent;
- Int_t ntrackhits;
- Double_t fitfmin;
+//_______________________________________________________________________
+AliLoader* AliMUON::MakeLoader(const char* topfoldername)
+{
+/// Build standard getter (AliLoader type);
+/// if detector wants to use castomized getter, it must overload this method
+ AliDebug(1,Form("Creating standard getter for detector %s. Top folder is %s.",
+ GetName(),topfoldername));
+ fLoader = new AliLoader(GetName(),topfoldername);
- Double_t bendingSlope, nonBendingSlope, fInverseBendingMomentum;
- Double_t fXRec, fYRec, fZRec;
+ return fLoader;
+}
- Float_t x11, y11, thetaX,thetaY ;
+//________________________________________________________________________
+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()
- //YS Int_t nEvents = runLoader->GetNumberOfEvents();
+ delete fGeometryBuilder;
+ fGeometryBuilder = new AliMUONGeometryBuilder(this);
+ fGeometryBuilder
+ ->AddBuilder(new AliMUONCommonGeometryBuilder(this));
+}
- // setting pointer for tracks, triggertracks& trackparam at vertex
- AliMUONTrack * rectrack;
- AliMUONTriggerTrack * rectriggertrack;
- AliMUONTrackParam *trackParam;
-
- ievent = runLoader->GetEventNumber() ; //YS, seems not to be implemented yet (Ch. F)
- //YS for (ievent = 0; ievent < nEvents; ievent++) {
- runLoader->GetEvent(ievent);
+//____________________________________________________________________
+Bool_t AliMUON::GetTriggerResponseV1() const
+{
+///
+/// Returns fTriggerResponseV1
+///
+ return fTriggerResponseV1;
+
+}
- // setting ESD MUON class
- AliESDMuonTrack* ESDTrack = new AliESDMuonTrack() ;
+//____________________________________________________________________
+Int_t AliMUON::GetTriggerCoinc44() const
+{
+///
+/// Returns fTriggerCoinc44
+///
+ return fTriggerCoinc44;
+
+}
- // -------------------- tracks-------------
- fMUONData->SetTreeAddress("RT");
- fMUONData->GetRecTracks();
- recTracksArray = fMUONData->RecTracks();
-
- Int_t nrectracks = (Int_t) recTracksArray->GetEntriesFast(); //
+//____________________________________________________________________
+Bool_t AliMUON::GetTriggerEffCells() const
+{
+///
+/// Returns fTriggerEffCells
+///
+ return fTriggerEffCells;
+
+}
- //-------------------- trigger tracks-------------
- Bool_t ifirst = true;
- Long_t trigPat = 0;
- fMUONData->SetTreeAddress("RL");
- fMUONData->GetRecTriggerTracks();
- recTrigTracksArray = fMUONData->RecTriggerTracks();
-
- Int_t ntrectracks = (Int_t) recTrigTracksArray->GetEntriesFast(); //YS
-
- //printf(">>> Event %d Number of Recconstructed tracks %d \n",ievent, nrectracks);
-
- Int_t ntracks = TMath::Max(nrectracks, ntrectracks);
-
- // loop over tracks
- for (Int_t irectracks = 0; irectracks < ntracks; irectracks++) {
-
- // -------------------- tracks-------------
- // not the best way to do, avoid creating two "branches" in fMuonTracks
- if (irectracks < nrectracks) {
- rectrack = (AliMUONTrack*) recTracksArray->At(irectracks);
-
- trackParam = rectrack->GetTrackParamAtVertex();
-
- bendingSlope = trackParam->GetBendingSlope();
- nonBendingSlope = trackParam->GetNonBendingSlope();
- fInverseBendingMomentum = trackParam->GetInverseBendingMomentum();
- fXRec = trackParam->GetNonBendingCoor();
- fYRec = trackParam->GetBendingCoor();
- fZRec = trackParam->GetZ();
-
- ntrackhits = rectrack->GetNTrackHits();
- fitfmin = rectrack->GetFitFMin();
-
- // setting data member of ESD MUON
- ESDTrack->SetInverseBendingMomentum(fInverseBendingMomentum);
- ESDTrack->SetThetaX(TMath::ATan(nonBendingSlope));
- ESDTrack->SetThetaY(TMath::ATan(bendingSlope));
- ESDTrack->SetZ(fZRec);
- ESDTrack->SetBendingCoor(fYRec);
- ESDTrack->SetNonBendingCoor(fXRec);
- ESDTrack->SetChi2(fitfmin);
- ESDTrack->SetNHit(ntrackhits);
- }
- // -------------------- trigger tracks-------------
- if (irectracks < ntrectracks) {
- rectriggertrack = (AliMUONTriggerTrack*) recTrigTracksArray->At(irectracks);
- if (ifirst) {
- ifirst = false;
- trigPat = rectriggertrack->GetGTPattern();
- }
+//____________________________________________________________________
+Int_t AliMUON::GetDigitizerWithNoise() const
+{
+///
+/// Returns fDigitizerWithNoise
+///
+ return fDigitizerWithNoise;
+
+}
- x11 = rectriggertrack->GetY11();
- y11 = rectriggertrack->GetY11();
- thetaX = rectriggertrack->GetThetax();
- thetaY = rectriggertrack->GetThetay();
-
- // setting data member of ESD MUON trigger
- ESDTrack->SetThetaX11(thetaX);
- ESDTrack->SetThetaY11(thetaY);
- ESDTrack->SetX11(x11);
- ESDTrack->SetY11(y11);
- }
- // storing ESD MUON Track into ESD Event & reset muondata
- if (ntrectracks+ntrectracks != 0)
- event->AddMuonTrack(ESDTrack);
- } // end loop tracks
-
- // if (ntrectracks+ntrectracks != 0)
- // event->SetTrigger(trigPat);
- // Waiting for STEER update
- fMUONData->ResetRecTracks();
- fMUONData->ResetRecTriggerTracks();
-
- //} // end loop on event
- fLoader->UnloadTracks();
-}