X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUON.cxx;h=e02164ecfb68e17d21bbc93c5c2babbf5d006603;hb=8c0e3489b34f51f1e2b69d87f28fea86e956fa4a;hp=74f787db3b6e103a0ef68e6034047d522ac34eed;hpb=d12a7158071fadfaa7bffffba4e08a03b4c12342;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUON.cxx b/MUON/AliMUON.cxx index 74f787db3b6..e02164ecfb6 100644 --- a/MUON/AliMUON.cxx +++ b/MUON/AliMUON.cxx @@ -53,19 +53,25 @@ #include "AliMUON.h" #include "AliMUONChamberTrigger.h" #include "AliMUONConstants.h" -#include "AliMUONHit.h" -#include "AliMUONMerger.h" -#include "AliMUONPadHit.h" +#include "AliMUONHit.h" #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 "AliMUONGeometrySegmentation.h" #include "AliMUONDigitizerv2.h" #include "AliMUONSDigitizerv1.h" -#include "AliMUONRawData.h" +#include "AliMUONRawWriter.h" +#include "AliMUONSegmentation.h" #include "AliLog.h" +#include "AliMUONSDigitizerV2.h" +#include "AliMUONDigitizerV3.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.}; @@ -92,6 +98,7 @@ AliMUON::AliMUON() fChambers(0), fTriggerCircuits(0), fGeometryBuilder(0), + fSegmentation(0), fAccCut(kFALSE), fAccMin(0.), fAccMax(0.), @@ -101,15 +108,20 @@ AliMUON::AliMUON() fMaxDestepAlu(0.), fMaxIterPad(0), fCurIterPad(0), - fMerger(0) + fTriggerScalerEvent(kFALSE), + fSDigitizerType(""), + fDigitizerType("") { // 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()), @@ -118,6 +130,7 @@ AliMUON::AliMUON(const char *name, const char *title) fChambers(0), fTriggerCircuits(0), fGeometryBuilder(0), + fSegmentation(0), fAccCut(kFALSE), fAccMin(0.), fAccMax(0.), @@ -127,12 +140,22 @@ AliMUON::AliMUON(const char *name, const char *title) fMaxDestepAlu(-1), // in the calculation of the tracking parameters fMaxIterPad(0), fCurIterPad(0), - fMerger(0) + fTriggerScalerEvent(kFALSE), + fSDigitizerType(sDigitizerClassName), + fDigitizerType(digitizerClassName) { - + AliDebug(1,Form("ctor this=%p",this)); fIshunt = 0; SetMarkerColor(kRed);// + + // Geometry builder + fGeometryBuilder = new AliMUONGeometryBuilder(this); + + // Common geometry definitions + fGeometryBuilder + ->AddBuilder(new AliMUONCommonGeometryBuilder(this)); + // // Creating List of Chambers Int_t ch; @@ -149,18 +172,8 @@ AliMUON::AliMUON(const char *name, const char *title) 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...) @@ -169,9 +182,6 @@ AliMUON::AliMUON(const char *name, const char *title) for (Int_t circ=0; circAddAt(new AliMUONTriggerCircuit(),circ); } - - // Geometry builder - fGeometryBuilder = new AliMUONGeometryBuilder(this); } //____________________________________________________________________ @@ -187,9 +197,8 @@ AliMUON::AliMUON(const AliMUON& rMUON) AliMUON::~AliMUON() { // Destructor - AliDebug(1,"Calling AliMUON destructor"); + AliDebug(1,Form("dtor this=%p",this)); fIshunt = 0; - if (fMerger) delete fMerger; if (fChambers){ fChambers->Delete(); @@ -201,6 +210,7 @@ AliMUON::~AliMUON() } delete fMUONData; delete fGeometryBuilder; + delete fSegmentation; } //________________________________________________________________________ @@ -229,14 +239,38 @@ void AliMUON::BuildGeometry() { // 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"); - } - } + +// 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() { @@ -254,32 +288,6 @@ void AliMUON::SetTreeAddress() 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); -} - -//___________________________________________ -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) { @@ -340,27 +348,6 @@ void AliMUON::SetMaxDestepAlu(Float_t p1) 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 { @@ -395,19 +382,20 @@ Float_t AliMUON::GetMaxDestepAlu() const //____________________________________________________________________ void AliMUON::SetAlign(Bool_t align) - { +{ // Sets option for alignement to geometry builder fGeometryBuilder->SetAlign(align); } - + //____________________________________________________________________ -void AliMUON::SetSegmentationModel(Int_t id, Int_t isec, AliSegmentation *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) { @@ -415,29 +403,45 @@ 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); + } + 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() { // write TreeD here - if (!fMerger) { - AliDebug(1,"Create default AliMUONMerger "); - AliDebug(1," no merging, just digitization of 1 event will be done"); - fMerger = new AliMUONMerger(); - } - fMerger->Init(); - fMerger->Digitise(); char hname[30]; // sprintf(hname,"TreeD%d",fLoader->GetHeader()->GetEvent()); fLoader->TreeD()->Write(hname,TObject::kOverwrite); @@ -447,29 +451,53 @@ 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; + AliMUONRawWriter rawData(fLoader,fMUONData); - rawData = new AliMUONRawData(fLoader); - if (!rawData->WriteRawData()) AliInfo("pb writting raw data"); - delete rawData; - return; + if (fTriggerScalerEvent == kTRUE) rawData.SetScalerEvent(); + if (!rawData.Digits2Raw()) AliInfo("pb writting raw data"); } + //_______________________________________________________________________ AliLoader* AliMUON::MakeLoader(const char* topfoldername) { @@ -485,35 +513,6 @@ AliLoader* AliMUON::MakeLoader(const char* topfoldername) return fLoader; } //_______________________________________________________________________ -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) { - fMaxIterPad=hit->PHlast(); - fCurIterPad=hit->PHfirst(); - return (AliMUONPadHit*) clusters->UncheckedAt(fCurIterPad-1); - } else { - return 0; - } -} -//_______________________________________________________________________ -AliMUONPadHit* AliMUON::NextPad(TClonesArray *clusters) -{ - // To be removed -// Get next pad (in iterator) -// - fCurIterPad++; - if (fCurIterPad <= fMaxIterPad) { - return (AliMUONPadHit*) clusters->UncheckedAt(fCurIterPad-1); - } else { - return 0; - } -} -//_______________________________________________________________________ AliMUONRawCluster *AliMUON::RawCluster(Int_t ichamber, Int_t icathod, Int_t icluster) { @@ -534,42 +533,4 @@ AliMUONRawCluster *AliMUON::RawCluster(Int_t ichamber, Int_t icathod, Int_t iclu return mRaw; } //________________________________________________________________________ -void AliMUON::SetMerger(AliMUONMerger* merger) -{ -// Set pointer to merger - fMerger = merger; -} -//________________________________________________________________________ -AliMUONMerger* AliMUON::Merger() -{ -// Return pointer to merger - return fMerger; -} -/* PH Commented out waiting for correct implementation -//________________________________________________________________________ -void AliMUON::RemapTrackHitIDs(Int_t* map) -{ -// Remaps the track numbers in the hits arrays, so that they correspond -// to the entry indices in the Kine tree. -// The correspondance is not direct. To get the real index into the Kine tree -// compute the particle index as follows: -// -// num_primaries = AliStack::GetNprimary(); -// num_tracks = AliStack::GetNtracks(); -// track = AliMUONHit::Track() -// -// if (track < num_primaries) -// particleindex = track + num_tracks - num_primaries; -// else -// particleindex = track - num_primaries; - - // Remap the track numbers based on the specified map. - AliMUONData* data = GetMUONData(); - TClonesArray* hits = data->Hits(); - for (Int_t i = 0; i < hits->GetEntriesFast(); i++) - { - AliMUONHit* hit = static_cast( hits->At(i) ); - hit->SetTrack( map[hit->Track()] ); - }; -}; -*/ +