From b1fea02e530a9bb2a0617e8ba8555154193cb52a Mon Sep 17 00:00:00 2001 From: ivana Date: Wed, 4 Jun 2008 11:15:00 +0000 Subject: [PATCH] - Put the code to fill ESD with trigger data back in the correct framework: change MUONESDInterface to set(get) MUONLocalTrigger data in(from) the ESDMuonTrack. - Added protection here and there against ghost tracks ESD (containing trigger data but dummy tracker data). - Use the method AliMUONVTrackReconstrutor::Refit() to recompute precisely the track parameters at each cluster (instead of a simply extrapolating the parameters at the first one) when recovering the MUONTrack from the ESDMuonTrack in the MUONESDInterface. (Philippe P.) --- MUON/AliMUONCheck.cxx | 4 + MUON/AliMUONESDInterface.cxx | 201 +++++++++++++++-- MUON/AliMUONESDInterface.h | 35 ++- MUON/AliMUONQADataMakerRec.cxx | 4 + MUON/AliMUONRecoCheck.cxx | 8 +- MUON/AliMUONRecoParam.h | 4 +- MUON/AliMUONTrack.cxx | 23 ++ MUON/AliMUONTrack.h | 2 + MUON/AliMUONTrackParam.cxx | 2 +- MUON/AliMUONTrackReconstructor.cxx | 9 +- MUON/AliMUONTrackReconstructor.h | 4 +- MUON/AliMUONTrackReconstructorK.cxx | 9 +- MUON/AliMUONTrackReconstructorK.h | 4 +- MUON/AliMUONTracker.cxx | 118 ++++------ MUON/AliMUONVTrackReconstructor.cxx | 9 +- MUON/AliMUONVTrackReconstructor.h | 6 +- MUON/MUONRefit.C | 10 +- MUON/MUONefficiency.C | 6 + MUON/MUONmassPlot_ESD.C | 6 + MUON/READMErec.txt | 325 +++++++++++++++++++++++++--- MUON/runReconstruction.C | 3 +- 21 files changed, 634 insertions(+), 158 deletions(-) diff --git a/MUON/AliMUONCheck.cxx b/MUON/AliMUONCheck.cxx index 91515181dbf..086c0f157bb 100644 --- a/MUON/AliMUONCheck.cxx +++ b/MUON/AliMUONCheck.cxx @@ -264,6 +264,10 @@ AliMUONCheck::CheckESD(Bool_t pdc06TriggerResponse) for ( Int_t iTrack1 = 0; iTrack1GetMuonTrack(iTrack1); + + // skip fake tracks (ghosts) + if (!muonTrack->ContainTrackerData()) continue; + ftracktot++; thetaX = muonTrack->GetThetaX(); diff --git a/MUON/AliMUONESDInterface.cxx b/MUON/AliMUONESDInterface.cxx index 589bf70e0b5..34ec71c9ff5 100644 --- a/MUON/AliMUONESDInterface.cxx +++ b/MUON/AliMUONESDInterface.cxx @@ -22,10 +22,15 @@ #include "AliMUONVClusterStore.h" #include "AliMUONVDigit.h" #include "AliMUONVDigitStore.h" +#include "AliMUONLocalTrigger.h" +#include "AliMUONVTriggerStore.h" #include "AliMUON2DMapIterator.h" #include "AliMUONTrackParam.h" #include "AliMUONTrackExtrap.h" #include "AliMUONConstants.h" +#include "AliMUONTracker.h" +#include "AliMUONRecoParam.h" +#include "AliMUONVTrackReconstructor.h" #include "AliMpExMapIterator.h" #include "AliMpVSegmentation.h" @@ -53,7 +58,7 @@ /// /// 1) using the static methods converting the objects one by one /// -/// 2) loading a whole ESDEvent and using the getters and/or the iterators +/// 2) loading a whole ESDEvent and using the finders and/or the iterators /// to access the corresponding MUON objects /// /// \author Philippe Pillot @@ -63,15 +68,19 @@ ClassImp(AliMUONESDInterface) /// \endcond +AliMUONVTrackReconstructor* AliMUONESDInterface::fgTracker = 0x0; + TString AliMUONESDInterface::fgTrackStoreName = "AliMUONTrackStoreV1"; TString AliMUONESDInterface::fgClusterStoreName = "AliMUONClusterStoreV2"; TString AliMUONESDInterface::fgDigitStoreName = "AliMUONDigitStoreV2R"; +TString AliMUONESDInterface::fgTriggerStoreName = "AliMUONTriggerStoreV1"; //_____________________________________________________________________________ AliMUONESDInterface::AliMUONESDInterface() : TObject(), fTracks(0x0), fDigits(0x0), + fTriggers(0x0), fClusterMap(0x0), fDigitMap(0x0) { @@ -84,6 +93,7 @@ AliMUONESDInterface::~AliMUONESDInterface() /// Destructor delete fTracks; delete fDigits; + delete fTriggers; delete fClusterMap; delete fDigitMap; } @@ -98,6 +108,7 @@ void AliMUONESDInterface::Clear(Option_t*) /// clear memory delete fTracks; fTracks = 0x0; delete fDigits; fDigits = 0x0; + delete fTriggers; fTriggers = 0x0; delete fClusterMap; fClusterMap = 0x0; delete fDigitMap; fDigitMap = 0x0; } @@ -113,6 +124,9 @@ void AliMUONESDInterface::Reset() if (fDigits) fDigits->Clear("C"); else fDigits = NewDigitStore(); + if (fTriggers) fTriggers->Clear("C"); + else fTriggers = NewTriggerStore(); + if (fClusterMap) fClusterMap->Clear(); else fClusterMap = new AliMpExMap; fClusterMap->SetOwner(kTRUE); @@ -137,6 +151,12 @@ void AliMUONESDInterface::LoadEvent(AliESDEvent& esdEvent) // get ESD track AliESDMuonTrack* esdTrack = esdEvent.GetMuonTrack(iTrack); + // fill trigger store if related info are availables + if (esdTrack->ContainTriggerData()) Add(*esdTrack, *fTriggers); + + // fill tracker data if availables + if (!esdTrack->ContainTrackerData()) continue; + // add it to track store AliMUONTrack* track = Add(*esdTrack, *fTracks); @@ -170,7 +190,7 @@ void AliMUONESDInterface::LoadEvent(AliESDEvent& esdEvent) // loop over ESD pads Int_t nPads = esdCluster->GetNPads(); - for (Int_t iPad = 0; iPad < nPads; iPad++) { + for (Int_t iPad = 0; iPad < nPads; iPad++) { // get ESD pad AliESDMuonPad *esdPad = (AliESDMuonPad*) esdCluster->GetPads().UncheckedAt(iPad); @@ -250,6 +270,13 @@ Int_t AliMUONESDInterface::GetNDigitsInCluster(UInt_t clusterId) const return cluster ? cluster->GetNDigits() : 0; } +//___________________________________________________________________________ +Int_t AliMUONESDInterface::GetNTriggers() const +{ + /// return the number of triggers + return fTriggers ? fTriggers->GetSize() : 0; +} + //___________________________________________________________________________ AliMUONTrack* AliMUONESDInterface::FindTrack(UInt_t trackId) const { @@ -301,6 +328,13 @@ AliMUONVDigit* AliMUONESDInterface::FindDigit(UInt_t digitId) const return digit; } +//___________________________________________________________________________ +AliMUONLocalTrigger* AliMUONESDInterface::FindLocalTrigger(Int_t boardNumber) const +{ + /// return MUON local trigger "boardNumber" + return (fTriggers) ? fTriggers->FindLocal(boardNumber) : 0x0; +} + //___________________________________________________________________________ TIterator* AliMUONESDInterface::CreateTrackIterator() const { @@ -369,6 +403,13 @@ TIterator* AliMUONESDInterface::CreateDigitIteratorInCluster(UInt_t clusterId) c return 0x0; } +//___________________________________________________________________________ +TIterator* AliMUONESDInterface::CreateLocalTriggerIterator() const +{ + /// return iterator over all local trigger + return fTriggers ? fTriggers->CreateLocalIterator() : 0x0; +} + //___________________________________________________________________________ AliMUONVCluster* AliMUONESDInterface::FindClusterInTrack(const AliMUONTrack& track, UInt_t clusterId) const { @@ -425,6 +466,18 @@ AliMUONVDigitStore* AliMUONESDInterface::NewDigitStore() return reinterpret_cast(classPtr->New()); } +//_____________________________________________________________________________ +AliMUONVTriggerStore* AliMUONESDInterface::NewTriggerStore() +{ + /// Create an empty trigger store of type fgTriggerStoreName + TClass* classPtr = TClass::GetClass(fgTriggerStoreName); + if (!classPtr || !classPtr->InheritsFrom("AliMUONVTriggerStore")) { + cout<<"E-AliMUONESDInterface::NewTriggerStore: Unable to create store of type "<(classPtr->New()); +} + //_________________________________________________________________________ void AliMUONESDInterface::GetParamAtVertex(const AliESDMuonTrack& esdTrack, AliMUONTrackParam& trackParam) { @@ -559,6 +612,13 @@ void AliMUONESDInterface::ESDToMUON(const AliESDMuonTrack& esdTrack, AliMUONTrac { /// Transfert data from ESDMuon track to MUON track + // if the ESDMuon track is a ghost then return an empty MUON track + if (!esdTrack.ContainTrackerData()) { + track.Reset(); + track.SetUniqueID(esdTrack.GetUniqueID()); + return; + } + track.Clear("C"); // global info @@ -617,8 +677,9 @@ void AliMUONESDInterface::ESDToMUON(const AliESDMuonTrack& esdTrack, AliMUONTrac firstTrackParam->SetZ(esdTrack.GetZUncorrected()); // reset the z to the one stored in ESD AliMUONTrackExtrap::ExtrapToZCov(firstTrackParam,firstTrackParam->GetClusterPtr()->GetZ()); - // Compute track parameters and covariances at each cluster from those at the first one - track.UpdateCovTrackParamAtCluster(); + // refit the track to get better parameters and covariances at each cluster (temporary disable track improvement) + if (!fgTracker) fgTracker = AliMUONTracker::CreateTrackReconstructor(AliMUONReconstructor::GetRecoParam()->GetTrackingMode(),0x0); + if (!fgTracker->RefitTrack(track, kFALSE)) track.UpdateCovTrackParamAtCluster(); } else { @@ -642,6 +703,37 @@ void AliMUONESDInterface::ESDToMUON(const AliESDMuonTrack& esdTrack, AliMUONTrac } +//_____________________________________________________________________________ +void AliMUONESDInterface::ESDToMUON(const AliESDMuonTrack& esdTrack, AliMUONLocalTrigger& locTrg) +{ + /// Transfert trigger data from ESDMuon track to the MUONLocalTtrigger object + + // if the ESDMuon track is a ghost then return an empty MUON track + if (!esdTrack.ContainTriggerData()) { + AliMUONLocalTrigger emptyLocTrg; + locTrg = emptyLocTrg; + return; + } + + locTrg.SetLoCircuit(esdTrack.LoCircuit()); + locTrg.SetLoStripX(esdTrack.LoStripX()); + locTrg.SetLoStripY(esdTrack.LoStripY()); + locTrg.SetLoDev(esdTrack.LoDev()); + locTrg.SetLoLpt(esdTrack.LoLpt()); + locTrg.SetLoHpt(esdTrack.LoHpt()); + locTrg.SetLoSdev(1); + locTrg.SetLoTrigY(1); + locTrg.SetX1Pattern(esdTrack.GetTriggerX1Pattern()); + locTrg.SetX2Pattern(esdTrack.GetTriggerX2Pattern()); + locTrg.SetX3Pattern(esdTrack.GetTriggerX3Pattern()); + locTrg.SetX4Pattern(esdTrack.GetTriggerX4Pattern()); + locTrg.SetY1Pattern(esdTrack.GetTriggerY1Pattern()); + locTrg.SetY2Pattern(esdTrack.GetTriggerY2Pattern()); + locTrg.SetY3Pattern(esdTrack.GetTriggerY3Pattern()); + locTrg.SetY4Pattern(esdTrack.GetTriggerY4Pattern()); + +} + //_____________________________________________________________________________ void AliMUONESDInterface::ESDToMUON(const AliESDMuonCluster& esdCluster, AliMUONVCluster& cluster) { @@ -671,9 +763,9 @@ void AliMUONESDInterface::ESDToMUON(const AliESDMuonPad& esdPad, AliMUONVDigit& const AliMpVSegmentation* seg = AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(esdPad.GetDetElemId(), esdPad.GetManuId()); AliMpPad pad = seg->PadByLocation(AliMpIntPair(esdPad.GetManuId(), esdPad.GetManuChannel()), kFALSE); - digit.Saturated(kFALSE); + digit.Saturated(esdPad.IsSaturated()); digit.Used(kFALSE); - digit.Calibrated(kTRUE); + digit.Calibrated(esdPad.IsCalibrated()); digit.SetUniqueID(esdPad.GetUniqueID()); digit.SetCharge(esdPad.GetCharge()); digit.SetADC(esdPad.GetADC()); @@ -682,13 +774,31 @@ void AliMUONESDInterface::ESDToMUON(const AliESDMuonPad& esdPad, AliMUONVDigit& } //_____________________________________________________________________________ -void AliMUONESDInterface::MUONToESD(const AliMUONTrack& track, AliESDMuonTrack& esdTrack, const Double_t vertex[3], const AliMUONVDigitStore* digits) +void AliMUONESDInterface::MUONToESD(const AliMUONTrack& track, AliESDMuonTrack& esdTrack, const Double_t vertex[3], + const AliMUONVDigitStore* digits, const AliMUONLocalTrigger* locTrg) { /// Transfert data from MUON track to ESDMuon track /// Incorporate the ESDPads if the digits are provided + /// Add trigger info if the MUON track is matched with a trigger track + + // empty MUON track -> produce a ghost ESDMuon track if trigger info are available otherwise produce an empty track + if (track.GetNClusters() == 0) { + if (locTrg) MUONToESD(*locTrg, esdTrack, track.GetUniqueID()); + else { + cout<<"W-AliMUONESDInterface::MUONToESD: will produce an empty ESDMuon track"<((track.GetTrackParamAtCluster())->First()); SetParamAtFirstCluster(*trackParam, esdTrack); @@ -704,14 +814,6 @@ void AliMUONESDInterface::MUONToESD(const AliMUONTrack& track, AliESDMuonTrack& AliMUONTrackExtrap::ExtrapToVertexWithoutBranson(&trackParamAtDCA, vertex[2]); SetParamAtDCA(trackParamAtDCA, esdTrack); - // set global info - esdTrack.SetUniqueID(track.GetUniqueID()); - esdTrack.SetChi2(track.GetGlobalChi2()); - esdTrack.SetNHit(track.GetNClusters()); - esdTrack.SetLocalTrigger(track.GetLocalTrigger()); - esdTrack.SetChi2MatchTrigger(track.GetChi2MatchTrigger()); - esdTrack.SetHitsPatternInTrigCh(track.GetHitsPatternInTrigCh()); - // set muon cluster info AliESDMuonCluster esdCluster; esdTrack.SetMuonClusterMap(0); @@ -722,6 +824,60 @@ void AliMUONESDInterface::MUONToESD(const AliMUONTrack& track, AliESDMuonTrack& trackParam = static_cast(track.GetTrackParamAtCluster()->After(trackParam)); } + // set trigger info + esdTrack.SetLocalTrigger(track.GetLocalTrigger()); + esdTrack.SetChi2MatchTrigger(track.GetChi2MatchTrigger()); + esdTrack.SetHitsPatternInTrigCh(track.GetHitsPatternInTrigCh()); + if (locTrg) { + esdTrack.SetTriggerX1Pattern(locTrg->GetX1Pattern()); + esdTrack.SetTriggerY1Pattern(locTrg->GetY1Pattern()); + esdTrack.SetTriggerX2Pattern(locTrg->GetX2Pattern()); + esdTrack.SetTriggerY2Pattern(locTrg->GetY2Pattern()); + esdTrack.SetTriggerX3Pattern(locTrg->GetX3Pattern()); + esdTrack.SetTriggerY3Pattern(locTrg->GetY3Pattern()); + esdTrack.SetTriggerX4Pattern(locTrg->GetX4Pattern()); + esdTrack.SetTriggerY4Pattern(locTrg->GetY4Pattern()); + } else { + esdTrack.SetTriggerX1Pattern(0); + esdTrack.SetTriggerY1Pattern(0); + esdTrack.SetTriggerX2Pattern(0); + esdTrack.SetTriggerY2Pattern(0); + esdTrack.SetTriggerX3Pattern(0); + esdTrack.SetTriggerY3Pattern(0); + esdTrack.SetTriggerX4Pattern(0); + esdTrack.SetTriggerY4Pattern(0); + } + +} + +//_____________________________________________________________________________ +void AliMUONESDInterface::MUONToESD(const AliMUONLocalTrigger& locTrg, AliESDMuonTrack& esdTrack, UInt_t trackId) +{ + /// Build ghost ESDMuon track containing only informations about trigger track + + esdTrack.Reset(); + esdTrack.SetUniqueID(trackId); + + // set trigger info + AliMUONTrack muonTrack; + muonTrack.SetLocalTrigger(locTrg.LoCircuit(), + locTrg.LoStripX(), + locTrg.LoStripY(), + locTrg.LoDev(), + locTrg.LoLpt(), + locTrg.LoHpt()); + esdTrack.SetLocalTrigger(muonTrack.GetLocalTrigger()); + esdTrack.SetChi2MatchTrigger(0.); + esdTrack.SetHitsPatternInTrigCh(0); + esdTrack.SetTriggerX1Pattern(locTrg.GetX1Pattern()); + esdTrack.SetTriggerY1Pattern(locTrg.GetY1Pattern()); + esdTrack.SetTriggerX2Pattern(locTrg.GetX2Pattern()); + esdTrack.SetTriggerY2Pattern(locTrg.GetY2Pattern()); + esdTrack.SetTriggerX3Pattern(locTrg.GetX3Pattern()); + esdTrack.SetTriggerY3Pattern(locTrg.GetY3Pattern()); + esdTrack.SetTriggerX4Pattern(locTrg.GetX4Pattern()); + esdTrack.SetTriggerY4Pattern(locTrg.GetY4Pattern()); + } //_____________________________________________________________________________ @@ -762,18 +918,31 @@ void AliMUONESDInterface::MUONToESD(const AliMUONVDigit& digit, AliESDMuonPad& e esdPad.SetUniqueID(digit.GetUniqueID()); esdPad.SetADC(digit.ADC()); esdPad.SetCharge(digit.Charge()); + esdPad.SetCalibrated(digit.IsCalibrated()); + esdPad.SetSaturated(digit.IsSaturated()); } //___________________________________________________________________________ AliMUONTrack* AliMUONESDInterface::Add(const AliESDMuonTrack& esdTrack, AliMUONVTrackStore& trackStore) { /// Create MUON track from ESDMuon track and add it to the store - /// return a pointer to the track into the store + /// return a pointer to the track into the store (0x0 if the track already exist) + if(trackStore.FindObject(esdTrack.GetUniqueID())) return 0x0; AliMUONTrack* track = trackStore.Add(AliMUONTrack()); ESDToMUON(esdTrack, *track); return track; } +//___________________________________________________________________________ +void AliMUONESDInterface::Add(const AliESDMuonTrack& esdTrack, AliMUONVTriggerStore& triggerStore) +{ + /// Create MUON local trigger from ESDMuon track and add it to the store if not already there + if (triggerStore.FindLocal(esdTrack.LoCircuit())) return; + AliMUONLocalTrigger locTrg; + ESDToMUON(esdTrack, locTrg); + triggerStore.Add(locTrg); +} + //___________________________________________________________________________ AliMUONVCluster* AliMUONESDInterface::Add(const AliESDMuonCluster& esdCluster, AliMUONVClusterStore& clusterStore) { diff --git a/MUON/AliMUONESDInterface.h b/MUON/AliMUONESDInterface.h index 9858ea9466a..a6b141d5154 100644 --- a/MUON/AliMUONESDInterface.h +++ b/MUON/AliMUONESDInterface.h @@ -23,7 +23,10 @@ class AliMUONVCluster; class AliMUONVClusterStore; class AliMUONVDigit; class AliMUONVDigitStore; +class AliMUONLocalTrigger; +class AliMUONVTriggerStore; class AliMUONTrackParam; +class AliMUONVTrackReconstructor; class AliESDEvent; class AliESDMuonTrack; class AliESDMuonCluster; @@ -45,6 +48,8 @@ public: // methods to play with internal objects AliMUONVTrackStore* GetTracks() const {return fTracks;} /// Return internal track store AliMUONVDigitStore* GetDigits() const {return fDigits;} + /// Return internal trigger store + AliMUONVTriggerStore* GetTriggers() const {return fTriggers;} // Return numbers of tracks/clusters/digits Int_t GetNTracks() const; @@ -54,12 +59,14 @@ public: // methods to play with internal objects Int_t GetNDigits(UInt_t trackId) const; Int_t GetNDigits(UInt_t trackId, UInt_t clusterId) const; Int_t GetNDigitsInCluster(UInt_t clusterId) const; + Int_t GetNTriggers() const; // Find internal MUON objects - AliMUONTrack* FindTrack(UInt_t trackId) const; - AliMUONVCluster* FindCluster(UInt_t clusterId) const; - AliMUONVCluster* FindCluster(UInt_t trackId, UInt_t clusterId) const; - AliMUONVDigit* FindDigit(UInt_t digitId) const; + AliMUONTrack* FindTrack(UInt_t trackId) const; + AliMUONVCluster* FindCluster(UInt_t clusterId) const; + AliMUONVCluster* FindCluster(UInt_t trackId, UInt_t clusterId) const; + AliMUONVDigit* FindDigit(UInt_t digitId) const; + AliMUONLocalTrigger* FindLocalTrigger(Int_t boardNumber) const; // iterate over internal MUON objects TIterator* CreateTrackIterator() const; @@ -69,6 +76,7 @@ public: // methods to play with internal objects TIterator* CreateDigitIterator(UInt_t trackId) const; TIterator* CreateDigitIterator(UInt_t trackId, UInt_t clusterId) const; TIterator* CreateDigitIteratorInCluster(UInt_t clusterId) const; + TIterator* CreateLocalTriggerIterator() const; public: // static methods @@ -79,11 +87,14 @@ public: // static methods static void UseClusterStore(TString name) {fgClusterStoreName = name;} /// Set the version of digit store static void UseDigitStore(TString name) {fgDigitStoreName = name;} + /// Set the version of trigger store + static void UseTriggerStore(TString name) {fgTriggerStoreName = name;} // Create empty stores (use the version defined in this interface) static AliMUONVTrackStore* NewTrackStore(); static AliMUONVClusterStore* NewClusterStore(); static AliMUONVDigitStore* NewDigitStore(); + static AliMUONVTriggerStore* NewTriggerStore(); // ESD track parameters --> MUON track parameters static void GetParamAtVertex(const AliESDMuonTrack& esdTrack, AliMUONTrackParam& trackParam); @@ -99,17 +110,21 @@ public: // static methods // ESDMuon objects --> MUON objects conversion static void ESDToMUON(const AliESDMuonTrack& esdTrack, AliMUONTrack& track); + static void ESDToMUON(const AliESDMuonTrack& esdTrack, AliMUONLocalTrigger& locTrg); static void ESDToMUON(const AliESDMuonCluster& esdCluster, AliMUONVCluster& cluster); static void ESDToMUON(const AliESDMuonPad& esdPad, AliMUONVDigit& digit); // MUON objects --> ESDMuon objects conversion - static void MUONToESD(const AliMUONTrack& track, AliESDMuonTrack& esdTrack, const Double_t vertex[3], const AliMUONVDigitStore* digits = 0x0); + static void MUONToESD(const AliMUONTrack& track, AliESDMuonTrack& esdTrack, const Double_t vertex[3], + const AliMUONVDigitStore* digits = 0x0, const AliMUONLocalTrigger* locTrg = 0x0); + static void MUONToESD(const AliMUONLocalTrigger& locTrg, AliESDMuonTrack& esdTrack, UInt_t trackId); static void MUONToESD(const AliMUONVCluster& cluster, AliESDMuonCluster& esdCluster, const AliMUONVDigitStore* digits = 0x0); static void MUONToESD(const AliMUONVDigit& digit, AliESDMuonPad& esdPad); // Add ESD object into the corresponding MUON store // return a pointer to the corresponding MUON object into the store static AliMUONTrack* Add(const AliESDMuonTrack& esdTrack, AliMUONVTrackStore& trackStore); + static void Add(const AliESDMuonTrack& esdTrack, AliMUONVTriggerStore& triggerStore); static AliMUONVCluster* Add(const AliESDMuonCluster& esdCluster, AliMUONVClusterStore& clusterStore); static AliMUONVDigit* Add(const AliESDMuonPad& esdPad, AliMUONVDigitStore& digitStore); @@ -128,18 +143,22 @@ private: private: + static AliMUONVTrackReconstructor* fgTracker; ///< track reconstructor for refitting + static TString fgTrackStoreName; ///< class name of the track store to use static TString fgClusterStoreName; ///< class name of the cluster store to use static TString fgDigitStoreName; ///< class name of the digit store to use + static TString fgTriggerStoreName; ///< class name of the trigger store to use // data containers - AliMUONVTrackStore* fTracks; ///< track container - AliMUONVDigitStore* fDigits; ///< digit container + AliMUONVTrackStore* fTracks; ///< track container + AliMUONVDigitStore* fDigits; ///< digit container + AliMUONVTriggerStore* fTriggers; ///< trigger container // maps (to speed up data retrieval) AliMpExMap* fClusterMap; ///< map of clusters AliMpExMap* fDigitMap; ///< map of digits - + ClassDef(AliMUONESDInterface,0) }; diff --git a/MUON/AliMUONQADataMakerRec.cxx b/MUON/AliMUONQADataMakerRec.cxx index 0eab9ebb05a..8a6eb8b6d0b 100644 --- a/MUON/AliMUONQADataMakerRec.cxx +++ b/MUON/AliMUONQADataMakerRec.cxx @@ -438,6 +438,10 @@ void AliMUONQADataMakerRec::MakeESDs(AliESDEvent* esd) for (Int_t iTrack = 0; iTrack < nTracks; ++iTrack) { AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack); + + // skip "ghosts" + if (!muonTrack->ContainTrackerData()) continue; + muonTrack->LorentzP(v1); GetESDsData(1)->Fill(v1.P()); diff --git a/MUON/AliMUONRecoCheck.cxx b/MUON/AliMUONRecoCheck.cxx index c1fbe485d16..64394965c0b 100644 --- a/MUON/AliMUONRecoCheck.cxx +++ b/MUON/AliMUONRecoCheck.cxx @@ -186,10 +186,12 @@ void AliMUONRecoCheck::MakeReconstructedTracks() /// Make reconstructed tracks if (!(fRecoTrackStore = AliMUONESDInterface::NewTrackStore())) return; - // loop over all reconstructed tracks and add them to the store + // loop over all reconstructed tracks and add them to the store (skip ghosts) Int_t nTracks = (Int_t) fESDEvent->GetNumberOfMuonTracks(); - for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) - AliMUONESDInterface::Add(*(fESDEvent->GetMuonTrack(iTrack)), *fRecoTrackStore); + for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) { + AliESDMuonTrack* esdTrack = fESDEvent->GetMuonTrack(iTrack); + if (esdTrack->ContainTrackerData()) AliMUONESDInterface::Add(*esdTrack, *fRecoTrackStore); + } } diff --git a/MUON/AliMUONRecoParam.h b/MUON/AliMUONRecoParam.h index a0302e7df42..baf5c9c818b 100644 --- a/MUON/AliMUONRecoParam.h +++ b/MUON/AliMUONRecoParam.h @@ -77,9 +77,9 @@ class AliMUONRecoParam : public AliDetectorRecoParam /// set the vertex dispersion (cm) in non bending plane (used for original tracking only) void SetNonBendingVertexDispersion(Double_t val) {fNonBendingVertexDispersion = val;} - /// return the vertex dispersion (cm) in bending plane (used for original tracking only) + /// return the vertex dispersion (cm) in non bending plane (used for original tracking only) Double_t GetNonBendingVertexDispersion() const {return fNonBendingVertexDispersion;} - /// set the vertex dispersion (cm) in non bending plane (used for original tracking only) + /// set the vertex dispersion (cm) in bending plane (used for original tracking only) void SetBendingVertexDispersion(Double_t val) {fBendingVertexDispersion = val;} /// return the vertex dispersion (cm) in bending plane (used for original tracking only) Double_t GetBendingVertexDispersion() const {return fBendingVertexDispersion;} diff --git a/MUON/AliMUONTrack.cxx b/MUON/AliMUONTrack.cxx index 804ca8446b6..139e479afe2 100644 --- a/MUON/AliMUONTrack.cxx +++ b/MUON/AliMUONTrack.cxx @@ -299,6 +299,29 @@ void AliMUONTrack::Clear(Option_t* opt) delete fTrackParamAtVertex; fTrackParamAtVertex = 0x0; } + //__________________________________________________________________________ +void AliMUONTrack::Reset() +{ + /// Reset to default values + SetUniqueID(0); + fFitWithVertex = kFALSE; + fVertexErrXY2[0] = 0.; + fVertexErrXY2[1] = 0.; + fFitWithMCS = kFALSE; + fGlobalChi2 = -1.; + fImproved = kFALSE; + fMatchTrigger = -1; + floTrgNum = -1; + fChi2MatchTrigger = 0.; + fTrackID = 0; + fHitsPatternInTrigCh = 0; + fLocalTrigger = 0; + delete fTrackParamAtCluster; fTrackParamAtCluster = 0x0; + delete fClusterWeightsNonBending; fClusterWeightsNonBending = 0x0; + delete fClusterWeightsBending; fClusterWeightsBending = 0x0; + delete fTrackParamAtVertex; fTrackParamAtVertex = 0x0; +} + //__________________________________________________________________________ TClonesArray* AliMUONTrack::GetTrackParamAtCluster() const { diff --git a/MUON/AliMUONTrack.h b/MUON/AliMUONTrack.h index 14d0d1316c2..87e8db3eeb9 100644 --- a/MUON/AliMUONTrack.h +++ b/MUON/AliMUONTrack.h @@ -29,6 +29,8 @@ class AliMUONTrack : public TObject AliMUONTrack (const AliMUONTrack& track); // copy constructor AliMUONTrack& operator=(const AliMUONTrack& track); // assignment operator + void Reset(); + TClonesArray* GetTrackParamAtCluster() const; void AddTrackParamAtCluster(const AliMUONTrackParam &trackParam, AliMUONVCluster &cluster, Bool_t copy = kFALSE); void RemoveTrackParamAtCluster(AliMUONTrackParam *trackParam); diff --git a/MUON/AliMUONTrackParam.cxx b/MUON/AliMUONTrackParam.cxx index 42f218a4960..045920c9306 100644 --- a/MUON/AliMUONTrackParam.cxx +++ b/MUON/AliMUONTrackParam.cxx @@ -232,7 +232,7 @@ Double_t AliMUONTrackParam::P() const if (TMath::Abs(fParameters(4,0)) > 0) { Double_t pYZ = TMath::Abs(1.0 / fParameters(4,0)); Double_t pZ = - pYZ / (TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0))); // spectro. (z<0) - return TMath::Abs(pZ) * TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0) + fParameters(1,0) * fParameters(1,0)); + return - pZ * TMath::Sqrt(1.0 + fParameters(3,0) * fParameters(3,0) + fParameters(1,0) * fParameters(1,0)); } else return FLT_MAX; } diff --git a/MUON/AliMUONTrackReconstructor.cxx b/MUON/AliMUONTrackReconstructor.cxx index a7221970952..5b340b2d1b7 100644 --- a/MUON/AliMUONTrackReconstructor.cxx +++ b/MUON/AliMUONTrackReconstructor.cxx @@ -53,7 +53,7 @@ ClassImp(AliMUONTrackReconstructor) // Class implementation in ROOT context /// \endcond //__________________________________________________________________________ -AliMUONTrackReconstructor::AliMUONTrackReconstructor(AliMUONVClusterServer& clusterServer) +AliMUONTrackReconstructor::AliMUONTrackReconstructor(AliMUONVClusterServer* clusterServer) : AliMUONVTrackReconstructor(clusterServer) { /// Constructor @@ -92,7 +92,7 @@ void AliMUONTrackReconstructor::MakeTrackCandidates(AliMUONVClusterStore& cluste for (Int_t i = firstChamber; i <= lastChamber; ++i ) { - if (AliMUONReconstructor::GetRecoParam()->UseChamber(i)) fClusterServer.Clusterize(i, clusterStore, AliMpArea()); + if (fClusterServer && AliMUONReconstructor::GetRecoParam()->UseChamber(i)) fClusterServer->Clusterize(i, clusterStore, AliMpArea()); } // Loop over stations(1..) 5 and 4 and make track candidates @@ -1416,7 +1416,7 @@ void AliMUONTrackReconstructor::FinalizeTrack(AliMUONTrack &track) } //__________________________________________________________________________ -Bool_t AliMUONTrackReconstructor::RefitTrack(AliMUONTrack &track) +Bool_t AliMUONTrackReconstructor::RefitTrack(AliMUONTrack &track, Bool_t enableImprovement) { /// re-fit the given track @@ -1443,7 +1443,8 @@ Bool_t AliMUONTrackReconstructor::RefitTrack(AliMUONTrack &track) Fit(track, kTRUE, kFALSE, kTRUE); // Improve the reconstructed tracks if required - if (AliMUONReconstructor::GetRecoParam()->ImproveTracks()) ImproveTrack(track); + track.SetImproved(kFALSE); + if (enableImprovement && AliMUONReconstructor::GetRecoParam()->ImproveTracks()) ImproveTrack(track); // Fill AliMUONTrack data members FinalizeTrack(track); diff --git a/MUON/AliMUONTrackReconstructor.h b/MUON/AliMUONTrackReconstructor.h index 0048ecefd08..35a7d9a15e2 100644 --- a/MUON/AliMUONTrackReconstructor.h +++ b/MUON/AliMUONTrackReconstructor.h @@ -21,10 +21,10 @@ class AliMUONTrackReconstructor : public AliMUONVTrackReconstructor public: - AliMUONTrackReconstructor(AliMUONVClusterServer& clusterServer); // default Constructor + AliMUONTrackReconstructor(AliMUONVClusterServer* clusterServer); // default Constructor virtual ~AliMUONTrackReconstructor(); // Destructor - virtual Bool_t RefitTrack(AliMUONTrack &track); + virtual Bool_t RefitTrack(AliMUONTrack &track, Bool_t enableImprovement = kTRUE); protected: diff --git a/MUON/AliMUONTrackReconstructorK.cxx b/MUON/AliMUONTrackReconstructorK.cxx index f9505ad0bcc..a23a3463189 100644 --- a/MUON/AliMUONTrackReconstructorK.cxx +++ b/MUON/AliMUONTrackReconstructorK.cxx @@ -51,7 +51,7 @@ ClassImp(AliMUONTrackReconstructorK) // Class implementation in ROOT context /// \endcond //__________________________________________________________________________ -AliMUONTrackReconstructorK::AliMUONTrackReconstructorK(AliMUONVClusterServer& clusterServer) +AliMUONTrackReconstructorK::AliMUONTrackReconstructorK(AliMUONVClusterServer* clusterServer) : AliMUONVTrackReconstructor(clusterServer) { /// Constructor @@ -90,7 +90,7 @@ void AliMUONTrackReconstructorK::MakeTrackCandidates(AliMUONVClusterStore& clust for (Int_t i = firstChamber; i <= lastChamber; ++i ) { - if (AliMUONReconstructor::GetRecoParam()->UseChamber(i)) fClusterServer.Clusterize(i, clusterStore, AliMpArea()); + if (fClusterServer && AliMUONReconstructor::GetRecoParam()->UseChamber(i)) fClusterServer->Clusterize(i, clusterStore, AliMpArea()); } // Loop over stations(1..) 5 and 4 and make track candidates @@ -1532,7 +1532,7 @@ void AliMUONTrackReconstructorK::FinalizeTrack(AliMUONTrack &track) } //__________________________________________________________________________ -Bool_t AliMUONTrackReconstructorK::RefitTrack(AliMUONTrack &track) +Bool_t AliMUONTrackReconstructorK::RefitTrack(AliMUONTrack &track, Bool_t enableImprovement) { /// re-fit the given track @@ -1546,7 +1546,8 @@ Bool_t AliMUONTrackReconstructorK::RefitTrack(AliMUONTrack &track) RetraceTrack(track,kTRUE); // Improve the reconstructed tracks if required - if (AliMUONReconstructor::GetRecoParam()->ImproveTracks()) ImproveTrack(track); + track.SetImproved(kFALSE); + if (enableImprovement && AliMUONReconstructor::GetRecoParam()->ImproveTracks()) ImproveTrack(track); // Fill AliMUONTrack data members FinalizeTrack(track); diff --git a/MUON/AliMUONTrackReconstructorK.h b/MUON/AliMUONTrackReconstructorK.h index d8142c42305..011e9ff20b5 100644 --- a/MUON/AliMUONTrackReconstructorK.h +++ b/MUON/AliMUONTrackReconstructorK.h @@ -20,10 +20,10 @@ class AliMUONTrackReconstructorK : public AliMUONVTrackReconstructor public: - AliMUONTrackReconstructorK(AliMUONVClusterServer& clusterServer); // default Constructor + AliMUONTrackReconstructorK(AliMUONVClusterServer* clusterServer); // default Constructor virtual ~AliMUONTrackReconstructorK(); // Destructor - virtual Bool_t RefitTrack(AliMUONTrack &track); + virtual Bool_t RefitTrack(AliMUONTrack &track, Bool_t enableImprovement = kTRUE); protected: diff --git a/MUON/AliMUONTracker.cxx b/MUON/AliMUONTracker.cxx index 7938b0db9ec..f6149f9aa54 100644 --- a/MUON/AliMUONTracker.cxx +++ b/MUON/AliMUONTracker.cxx @@ -255,12 +255,8 @@ void AliMUONTracker::FillESD(AliMUONVTrackStore& trackStore, AliESDEvent* esd) c AliDebug(1,""); AliCodeTimerAuto("") - AliMUONTrack* track; - AliESDMuonTrack esdTrack; - Double_t vertex[3] = {0., 0., 0.}; - TIter next(trackStore.CreateIterator()); - // get ITS vertex + Double_t vertex[3] = {0., 0., 0.}; const AliESDVertex* esdVert = esd->GetVertex(); if (esdVert->GetNContributors()) { esdVert->GetXYZ(vertex); @@ -268,97 +264,59 @@ void AliMUONTracker::FillESD(AliMUONVTrackStore& trackStore, AliESDEvent* esd) c } // fill ESD event including all info in ESD cluster if required and only for the given fraction of events + AliMUONTrack* track; + AliMUONLocalTrigger* locTrg; + AliESDMuonTrack esdTrack; + TIter next(trackStore.CreateIterator()); if (AliMUONReconstructor::GetRecoParam()->SaveFullClusterInESD() && gRandom->Uniform(100.) <= AliMUONReconstructor::GetRecoParam()->GetPercentOfFullClusterInESD()) { while ( ( track = static_cast(next()) ) ) { - AliMUONESDInterface::MUONToESD(*track, esdTrack, vertex, &fDigitStore); - // set the trigger x/y strips pattern - if (esdTrack.GetMatchTrigger()) { - AliMUONLocalTrigger* locTrg = static_cast(fTriggerStore->FindLocal(esdTrack.LoCircuit())); - esdTrack.SetTriggerX1Pattern(locTrg->GetX1Pattern()); - esdTrack.SetTriggerY1Pattern(locTrg->GetY1Pattern()); - esdTrack.SetTriggerX2Pattern(locTrg->GetX2Pattern()); - esdTrack.SetTriggerY2Pattern(locTrg->GetY2Pattern()); - esdTrack.SetTriggerX3Pattern(locTrg->GetX3Pattern()); - esdTrack.SetTriggerY3Pattern(locTrg->GetY3Pattern()); - esdTrack.SetTriggerX4Pattern(locTrg->GetX4Pattern()); - esdTrack.SetTriggerY4Pattern(locTrg->GetY4Pattern()); - } + + if (track->GetMatchTrigger() > 0) { + locTrg = static_cast(fTriggerStore->FindLocal(track->LoCircuit())); + AliMUONESDInterface::MUONToESD(*track, esdTrack, vertex, &fDigitStore, locTrg); + } else AliMUONESDInterface::MUONToESD(*track, esdTrack, vertex, &fDigitStore); + esd->AddMuonTrack(&esdTrack); } } else { while ( ( track = static_cast(next()) ) ) { - AliMUONESDInterface::MUONToESD(*track, esdTrack, vertex); - // set the trigger x/y strips pattern - if (esdTrack.GetMatchTrigger()) { - AliMUONLocalTrigger* locTrg = static_cast(fTriggerStore->FindLocal(esdTrack.LoCircuit())); - esdTrack.SetTriggerX1Pattern(locTrg->GetX1Pattern()); - esdTrack.SetTriggerY1Pattern(locTrg->GetY1Pattern()); - esdTrack.SetTriggerX2Pattern(locTrg->GetX2Pattern()); - esdTrack.SetTriggerY2Pattern(locTrg->GetY2Pattern()); - esdTrack.SetTriggerX3Pattern(locTrg->GetX3Pattern()); - esdTrack.SetTriggerY3Pattern(locTrg->GetY3Pattern()); - esdTrack.SetTriggerX4Pattern(locTrg->GetX4Pattern()); - esdTrack.SetTriggerY4Pattern(locTrg->GetY4Pattern()); - } + + if (track->GetMatchTrigger() > 0) { + locTrg = static_cast(fTriggerStore->FindLocal(track->LoCircuit())); + AliMUONESDInterface::MUONToESD(*track, esdTrack, vertex, 0x0, locTrg); + } else AliMUONESDInterface::MUONToESD(*track, esdTrack, vertex); + esd->AddMuonTrack(&esdTrack); } } - - // fill the local trigger decisions not matched with tracks - // associate them to "ghost" tracks - - Int_t loTrgNum(-1); + + // fill the local trigger decisions not matched with tracks (associate them to "ghost" tracks) + UInt_t ghostId = 0xFFFFFFFF - 1; Bool_t matched = kFALSE; - AliMUONTriggerTrack *triggerTrack; - AliMUONTrack muonTrack; - AliESDMuonTrack esdGhostTrack; TIter itTriggerTrack(fTriggerTrackStore->CreateIterator()); - while ( ( triggerTrack = static_cast(itTriggerTrack() ) -) ) - { - loTrgNum = triggerTrack->GetLoTrgNum(); - AliMUONLocalTrigger* locTrg = static_cast(fTriggerStore->FindLocal(loTrgNum)); - - /* verify if this local trigger has been already matched */ - TIter itTrack(trackStore.CreateIterator()); - while ( ( track = static_cast(itTrack()) ) ) - { - if (matched = (track->LoCircuit() == locTrg->LoCircuit())) break; - } - if (matched) continue; - - muonTrack.SetLocalTrigger(locTrg->LoCircuit(), - locTrg->LoStripX(), - locTrg->LoStripY(), - locTrg->LoDev(), - locTrg->LoLpt(), - locTrg->LoHpt()); - - /* make the AliESDMuonTrack from the "track" object */ - - esdGhostTrack.SetLocalTrigger(muonTrack.GetLocalTrigger()); - // set the transverse momentum of this track to "zero" - esdGhostTrack.SetInverseBendingMomentum(1.E+10); - esdGhostTrack.SetInverseBendingMomentumAtDCA(1.E+10); - esdGhostTrack.SetInverseBendingMomentumUncorrected(1.E+10); - // set the trigger x/y strips pattern - esdGhostTrack.SetTriggerX1Pattern(locTrg->GetX1Pattern()); - esdGhostTrack.SetTriggerY1Pattern(locTrg->GetY1Pattern()); - esdGhostTrack.SetTriggerX2Pattern(locTrg->GetX2Pattern()); - esdGhostTrack.SetTriggerY2Pattern(locTrg->GetY2Pattern()); - esdGhostTrack.SetTriggerX3Pattern(locTrg->GetX3Pattern()); - esdGhostTrack.SetTriggerY3Pattern(locTrg->GetY3Pattern()); - esdGhostTrack.SetTriggerX4Pattern(locTrg->GetX4Pattern()); - esdGhostTrack.SetTriggerY4Pattern(locTrg->GetY4Pattern()); - esd->AddMuonTrack(&esdGhostTrack); - + while ( ( triggerTrack = static_cast(itTriggerTrack()) ) ) { + + locTrg = static_cast(fTriggerStore->FindLocal(triggerTrack->GetLoTrgNum())); + + // check if this local trigger has already been matched + TIter itTrack(trackStore.CreateIterator()); + while ( ( track = static_cast(itTrack()) ) ) { + matched = (track->LoCircuit() == locTrg->LoCircuit()); + if (matched) break; } + if (matched) continue; + + AliMUONESDInterface::MUONToESD(*locTrg, esdTrack, ghostId); + + esd->AddMuonTrack(&esdTrack); + ghostId -= 1; + } } @@ -374,11 +332,11 @@ AliMUONVTrackReconstructor* AliMUONTracker::CreateTrackReconstructor(const char* if (strstr(opt,"ORIGINAL")) { - trackReco = new AliMUONTrackReconstructor(*clusterServer); + trackReco = new AliMUONTrackReconstructor(clusterServer); } else if (strstr(opt,"KALMAN")) { - trackReco = new AliMUONTrackReconstructorK(*clusterServer); + trackReco = new AliMUONTrackReconstructorK(clusterServer); } else { diff --git a/MUON/AliMUONVTrackReconstructor.cxx b/MUON/AliMUONVTrackReconstructor.cxx index d63e4475bb1..d2314bae0d0 100644 --- a/MUON/AliMUONVTrackReconstructor.cxx +++ b/MUON/AliMUONVTrackReconstructor.cxx @@ -93,13 +93,14 @@ ClassImp(AliMUONVTrackReconstructor) // Class implementation in ROOT context /// \endcond //__________________________________________________________________________ -AliMUONVTrackReconstructor::AliMUONVTrackReconstructor(AliMUONVClusterServer& clusterServer) +AliMUONVTrackReconstructor::AliMUONVTrackReconstructor(AliMUONVClusterServer* clusterServer) : TObject(), fRecTracksPtr(0x0), fNRecTracks(0), - fClusterServer(clusterServer) + fClusterServer(clusterServer) { /// Constructor for class AliMUONVTrackReconstructor + /// WARNING: if clusterServer=0x0, no clusterization will be possible at this level // Memory allocation for the TClonesArray of reconstructed tracks fRecTracksPtr = new TClonesArray("AliMUONTrack", 100); @@ -353,7 +354,7 @@ void AliMUONVTrackReconstructor::AskForNewClustersInChamber(const AliMUONTrackPa /// Ask the clustering to reconstruct new clusters around the track candidate position // check if the current chamber is useable - if (!AliMUONReconstructor::GetRecoParam()->UseChamber(chamber)) return; + if (!fClusterServer || !AliMUONReconstructor::GetRecoParam()->UseChamber(chamber)) return; // maximum distance between the center of the chamber and a detection element // (accounting for the inclination of the chamber) @@ -378,7 +379,7 @@ void AliMUONVTrackReconstructor::AskForNewClustersInChamber(const AliMUONTrackPa AliMpArea area(position, dimensions); // ask to cluterize in the given area of the given chamber - fClusterServer.Clusterize(chamber, clusterStore, area); + fClusterServer->Clusterize(chamber, clusterStore, area); } diff --git a/MUON/AliMUONVTrackReconstructor.h b/MUON/AliMUONVTrackReconstructor.h index 259072cae11..8e566555a29 100644 --- a/MUON/AliMUONVTrackReconstructor.h +++ b/MUON/AliMUONVTrackReconstructor.h @@ -34,7 +34,7 @@ class TClonesArray; class AliMUONVTrackReconstructor : public TObject { public: - AliMUONVTrackReconstructor(AliMUONVClusterServer& clusterServer); // default Constructor + AliMUONVTrackReconstructor(AliMUONVClusterServer* clusterServer); // default Constructor virtual ~AliMUONVTrackReconstructor(); // Destructor void EventReconstruct(AliMUONVClusterStore& clusterStore, @@ -50,7 +50,7 @@ class AliMUONVTrackReconstructor : public TObject { const AliMUONTrackHitPattern& trackHitPattern); /// re-fit the given track - virtual Bool_t RefitTrack(AliMUONTrack &track) = 0; + virtual Bool_t RefitTrack(AliMUONTrack &track, Bool_t enableImprovement = kTRUE) = 0; protected: @@ -58,7 +58,7 @@ class AliMUONVTrackReconstructor : public TObject { TClonesArray *fRecTracksPtr; ///< pointer to array of reconstructed tracks Int_t fNRecTracks; ///< number of reconstructed tracks - AliMUONVClusterServer& fClusterServer; ///< reference to our cluster server + AliMUONVClusterServer* fClusterServer; ///< reference to our cluster server // Functions AliMUONVTrackReconstructor (const AliMUONVTrackReconstructor& rhs); ///< copy constructor diff --git a/MUON/MUONRefit.C b/MUON/MUONRefit.C index 70667592758..e7bed8ae6d5 100644 --- a/MUON/MUONRefit.C +++ b/MUON/MUONRefit.C @@ -113,7 +113,10 @@ void MUONRefit(Int_t nevents = -1, const char* esdFileNameIn = "AliESDs.root", c // loop over digit to modify their charge AliMUONVDigit *digit; TIter next(esdInterface.CreateDigitIterator()); - while ((digit = static_cast(next()))) digit->SetCharge(digit->ADC()); + while ((digit = static_cast(next()))) { + digit->SetCharge(digit->ADC()); + digit->Calibrated(kFALSE); + } // refit the tracks from digits AliMUONVTrackStore* newTrackStore = refitter.ReconstructFromDigits(); @@ -127,8 +130,13 @@ void MUONRefit(Int_t nevents = -1, const char* esdFileNameIn = "AliESDs.root", c // get the ESD track AliESDMuonTrack* esdTrack = (AliESDMuonTrack*) esdTracks->UncheckedAt(iTrack); + + // skip ghost tracks (leave them unchanged in the new ESD file) + if (!esdTrack->ContainTrackerData()) continue; + // get the corresponding MUON track AliMUONTrack* track = esdInterface.FindTrack(esdTrack->GetUniqueID()); + // Find the corresponding re-fitted MUON track AliMUONTrack* newTrack = (AliMUONTrack*) newTrackStore->FindObject(esdTrack->GetUniqueID()); diff --git a/MUON/MUONefficiency.C b/MUON/MUONefficiency.C index 46adede4349..e4326ccc4f7 100644 --- a/MUON/MUONefficiency.C +++ b/MUON/MUONefficiency.C @@ -351,6 +351,9 @@ Bool_t MUONefficiency( char* filename = "galice.root", char* geoFilename = "geom // loop over all reconstructed tracks (also first track of combination) for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) { + // skip ghosts + if (!esd->GetMuonTrack(iTrack)->ContainTrackerData()) continue; + AliESDMuonTrack* muonTrack = new AliESDMuonTrack(*(esd->GetMuonTrack(iTrack))); // extrapolate to vertex if required and available @@ -414,6 +417,9 @@ Bool_t MUONefficiency( char* filename = "galice.root", char* geoFilename = "geom // loop over second track of combination for (Int_t iTrack2 = iTrack + 1; iTrack2 < nTracks; iTrack2++) { + // skip ghosts + if (!esd->GetMuonTrack(iTrack2)->ContainTrackerData()) continue; + AliESDMuonTrack* muonTrack2 = new AliESDMuonTrack(*(esd->GetMuonTrack(iTrack2))); // extrapolate to vertex if required and available diff --git a/MUON/MUONmassPlot_ESD.C b/MUON/MUONmassPlot_ESD.C index 7fe6e1ba6fe..59b3ccded0e 100644 --- a/MUON/MUONmassPlot_ESD.C +++ b/MUON/MUONmassPlot_ESD.C @@ -218,6 +218,9 @@ Bool_t MUONmassPlot(char* filename = "generated/galice.root", Int_t ExtrapToVert // loop over all reconstructed tracks (also first track of combination) for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) { + // skip ghosts + if (!esd->GetMuonTrack(iTrack)->ContainTrackerData()) continue; + AliESDMuonTrack* muonTrack = new AliESDMuonTrack(*(esd->GetMuonTrack(iTrack))); // extrapolate to vertex if required and available @@ -271,6 +274,9 @@ Bool_t MUONmassPlot(char* filename = "generated/galice.root", Int_t ExtrapToVert // loop over second track of combination for (Int_t iTrack2 = iTrack + 1; iTrack2 < nTracks; iTrack2++) { + // skip ghosts + if (!esd->GetMuonTrack(iTrack2)->ContainTrackerData()) continue; + AliESDMuonTrack* muonTrack2 = new AliESDMuonTrack(*(esd->GetMuonTrack(iTrack2))); // extrapolate to vertex if required and available diff --git a/MUON/READMErec.txt b/MUON/READMErec.txt index 0d9d0d179cd..20c4ccf6341 100644 --- a/MUON/READMErec.txt +++ b/MUON/READMErec.txt @@ -4,47 +4,318 @@ \page README_rec Reconstruction -The reconstruction is a multistage process, driven by the AliMUONReconstructor class : +The reconstruction is a multistage process, driven by the AliMUONTracker and AliMUONReconstructor classes +via the AliReconstruction class, which is divided into three parts: +- the digitization of the electronic response, +- the clustering of the digits to locate the crossing point of the muon with the chamber, +- the tracking to reconstruct the trajectory of the muon in the spectrometer from which we can extract the kinematics. -- We read the RAW data, convert them (convert them back for simulated data) to -AliMUONDigit. Performed by AliMUONDigitMaker. -- We calibrate the digits, by subtracting pedestals and multiplying by gains. Performed - by AliMUONDigitCalibrator. Calibrated digits might be saved (back) to TreeD. -- We make clusters by associating digits, producing AliMUONRawCluster objects that end up - in TreeR of MUON.RecPoints#.root file(s). Steered by AliMUONClusterReconstructor. @ref AliMUONVClusterFinder "More..." +All the adjustable options and parameters used to tune the different part of the reconstruction are handled by the class AliMUONRecoParam. -Part of the reconstruction, but not really steered by AliMUONReconstructor, is the - last stage, the tracking, i.e. associating clusters to form tracks. Steered by AliMUONTracker. - Producing AliMUONTrack objects that end up in TreeT of MUON.Tracks#.root and AliESDMuonTrack objects -that end up in the ESD (Event Summary Data), AliESDs.root file. @ref AliMUONVTrackReconstructor "More..." +\section rec_s1 Digitization -\section rec_s1 How to tune the muon reconstruction +- We read the RAW data, convert them (convert them back for simulated data) to digit (object inheriting from AliMUONVDigit +stored into containers inheriting from AliMUONVDigitStore). This conversion is performed by the class AliMUONDigitMaker. +- We calibrate the digits, via AliMUONDigitCalibrator, by subtracting pedestals and multiplying by gains. All the calibration parameters +(pedestals, gains, capacitances and HV) are read from the OCDB and stored into AliMUONCalibrationData objects. +- We create the status of the digit (e.g. pedestal higher than maximum or HV switched off), using AliMUONPadStatusMaker. +- We create the status map for each digit, i.e the global status (good/bad) of that digit and of its neighbords, using AliMUONPadStatusMapMaker. +- Calibrated digits might be saved (back) to TreeD in MUON.Digits.root file. -Several options and adjustable parameters allow to tune the entire reconstruction. -These can be changed by adding the following lines in the reconstruction macro (@ref runReconstruction.C) : -
-  AliMUONRecoParam *muonRecoParam = AliMUONRecoParam::GetLow(High)FluxParam();
+\section rec_s2 Clustering
+
+- We convert the digits having a positive charge into pads (AliMUONPad objects), which also contain information about the digit geometrical
+position.
+- We loop over pads in the bending and non-bending planes of the DE to form groups of contiguous pads. We then merge the overlapping groups
+of pads from both cathodes to build the pre-clusters that are the objects to be clusterized.
+- We unfold each pre-cluster in order to extract the number and the position of individual clusters merged in it (complex pre-clusters are
+made of a superimposition of signals from muon from physical background (e.g. hadrons) and from electronic noise).
+
+Several versions of pre-clustering are available, all inheriting from AliMUONVClusterFinder, with different ways to loop over pads to form
+pre-clusters:
+- AliMUONPreClusterFinder
+- AliMUONPreClusterFinderV2
+- AliMUONPreClusterFinderV3
+
+Several version of clustering are available, all inheriting from AliMUONVClusterFinder, with different degrees of complexity:
+- AliMUONClusterFinderCOG simply compute the Center Of Gravity of the charge distribution in the pre-cluster.
+- AliMUONClusterFinderSimpleFit simply fit the charge distribution with a single 2D Mathieson function.
+- AliMUONClusterFinderMLEM uses the Maximum Likelihood Expectation Minimization algorithm.
+This is a recursive procedure which determines the number and the approximate position of clusters into the pre-cluster that are needed
+to reproduce the whole charge distribution. It assumes that the charge distribution of each single cluster follow a 2D Mathieson function.
+If the estimated number of clusters is too high (>3), the pre-cluster is split into several groups of 1-2 or 3 clusters selected having
+the minimum total coupling to all the other clusters into the pre-cluster. Each group of clusters is then fitted with a sum of 2D Mathieson
+functions to extract their exact position.
+- AliMUONClusterFinderPeakCOG is a simplified version of the MLEM clusterizer, without splitting and computing the Center Of Gravity of the
+local charge distribution to extract the position of every clusters found in the pre-cluster.
+- AliMUONClusterFinderPeakFit is another simplified version of the MLEM clusterizer again without splitting. The pre-cluster is fitted with
+a sum of 2D Mathieson if it contains less than 3 clusters or we switch to the above COG method.
+
+The cluster recontruction is driven by the class AliMUONSimpleClusterServer, inheriting from AliMUONVClusterServer.
+It can be performed either before or during the tracking. In the first case, all the chambers are fully clusterized and the clusters (objects
+inheriting from AliMUONVCluster stored into containers inheriting from AliMUONVClusterStore) are saved to TreeR in Muon.RecPoints.root file.
+We use the class AliMUONLegacyClusterServer (also inheriting from AliMUONVClusterServer) read back the TreeR and provide clusters to the tracking.
+In the second case, we clusterize the chambers only in the region where we are looking for new clusters to be attached to the track candidates.
+This makes the clustering faster but the clusters cannot be saved to the TreeR.
+
+
+\section rec_s3 Tracking
+
+The MUON code provides two different algorithms to reconstruct the muon trajectory. In both cases the general tracking procedure is the same,
+the only difference being the way the track parameters are computed from the cluster positions. The "Original" algorithm perform a fit of the
+track parameters using the MINUIT package of Root, while the "Kalman" algorithm compute them using analytical formulae. The classes driving
+the tracking are AliMUONTrackReconstructor and AliMUONTrackReconstructorK for the "Original" and the "Kalman" algorithms respectively,
+both inheriting from AliMUONVTrackReconstructor. The reconstructed muon tracks are objects of the class AliMUONTrack.
+
+The general tracking procedure is as follow:
+- Build primary track candidates using clusters on station 4 and 5: Make all combination of clusters between the two chambers of station 5(4).
+For each combination compute the local position and orientation of the track and estimate its bending momentum given the averaged magnetic field
+inside the dipole and assuming that the track is coming from the vertex. Then select pairs for which the estimated bending momentum and the
+non-bending slope are within given limits. Extrapolate the primary track candidates to station 4(5), look for at least one compatible cluster to
+validate them and recompute the track parameters.
+- Remove the identical track candidates, i.e. the ones sharing exactly the same clusters.
+- Propagate the track to station 3, 2 then 1 and, at each step, ask the "ClusterServer" to provide clusters in the region of interest,
+and select the one(s) compatible with the track. The track is validated if we find at least 1 cluster per station.
+- Remove the double tracks, i.e. the ones sharing more than half of their clusters, keeping the one with the larger number of cluster or the
+one with the lowest chi2 in case of equality. Then recompute the track parameters at each attached cluster (using the so called Smoother algorithm
+in the case of the "Kalman" tracking).
+- The reconstructed tracks are finally matched with the trigger tracks (reconstructed from the local response of the trigger) to identify the
+muon(s) that made the trigger.
+
+The new clusters to be attached to the track are selected according to their local chi2 (i.e. their transverse position relatively to the track,
+normalized by the convolution of the cluster resolution with the resolution of track extrapolated at the cluster location).
+If several compatible clusters are foundon the same chamber, the track candidate is duplicated to consider all the possibilities.
+
+The last part of the tracking is the extrapolation of the reconstructed tracks to the vertex of the collision. The vertex position is measured
+by the SPD (the Silicon Pixel layers of the ITS Detector). In order to be able to perform any kind of muon analysis, we need to compute the track
+parameters assuming the muon has been produced in the initial collision as well as the track parameters in the vertex plane. The first set of
+parameters is obtained by correcting for energy loss and multiple Coulomb scattering in the front absorber (we force the track to come from the
+exact vertex position (x,y,z) by using the Branson correction), while the second one is obtained by correcting for energy loss only.
+
+The final results of the reconstruction - from which we will perform the physical analyses, compute detector efficiencies and perform calibration
+checks - are stored in objects of the class AliESDMuonTrack and saved in AliESD.root file. Three kinds of track can be saved: a tracker track
+matched with a trigger track, a tracker track alone and a trigger track alone (unused data members are set to default in the last two cases).
+The complete list of MUON data saved into ESD is given in section @ref rec_s5.
+
+
+\section rec_s4 How to tune the muon reconstruction
+
+Several options and adjustable parameters allow to tune the entire reconstruction. These can be changed by adding the following lines in the
+reconstruction macro (runReconstruction.C):
+\verbatim
+  AliMUONRecoParam *muonRecoParam = AliMUONRecoParam::Get...Param();
   muonRecoParam->Use...();
   muonRecoParam->Set...();
   ...
   AliRecoParam::Instance()->RegisterRecoParam(muonRecoParam);
-
+\endverbatim + +Three sets of default parameters are available: +- GetLowFluxParam(): parameters for p-p collisions +- GetHighFluxParam(): parameters for Pb-Pb collisions +- GetCosmicParam(): parameters for cosmic runs + +Every option/parameter can also be set one by one. Here is the complete list of available setters: +- SetCalibrationMode("mode"): set the calibration mode: NOGAIN (only do pedestal subtraction), + GAIN (do pedestal subtraction and apply gain correction, but with a single capacitance value for all channels), + GAINCONSTANTCAPA (as GAIN, but with a channel-dependent capacitance value). +- SetClusteringMode("mode"): set the clustering (pre-clustering) mode: NOCLUSTERING, PRECLUSTER, PRECLUSTERV2, PRECLUSTERV3, COG, + SIMPLEFIT, SIMPLEFITV3, MLEM:DRAW, MLEM, MLEMV2, MLEMV3. +- SetTrackingMode("mode"): Set the tracking mode: ORIGINAL, KALMAN. +- CombineClusterTrackReco(flag): switch on/off the combined cluster/track reconstruction +- SaveFullClusterInESD(flag, % of event): save all cluster info (including pads) in ESD, for the given percentage of events + (100% by default) +- SetMostProbBendingMomentum(value): set the most probable value (GeV/c) of momentum in bending plane (used when B=0) +- SetMinBendingMomentum(value): set the minimum acceptable value (GeV/c) of track momentum in bending plane +- SetMaxBendingMomentum(value): set the maximum acceptable value (GeV/c) of track momentum in bending plane +- SetMaxNonBendingSlope(value): set the maximum value of the track slope in non bending plane +- SetMaxBendingSlope(value): set the maximum value of the track slope in non bending plane (used when B=0) +- SetNonBendingVertexDispersion(value): set the vertex dispersion (cm) in non bending plane (used for original tracking only) +- SetBendingVertexDispersion(value): set the vertex dispersion (cm) in bending plane (used for original tracking only) +- SetMaxNonBendingDistanceToTrack(value): set the maximum distance to the track to search for compatible cluster(s) in non bending + direction. This value is convoluted with the track resolution to define the region of interest. +- SetMaxBendingDistanceToTrack(value): set the maximum distance to the track to search for compatible cluster(s) in bending direction + This value is convoluted with the track resolution to define the region of interest. +- SetSigmaCutForTracking(value): set the cut in sigma to apply on cluster (local chi2) and track (global chi2) during tracking +- ImproveTracks(flag, sigma cut): recompute the local chi2 of each cluster with the final track parameters and removed the ones that + do not pass a new quality cut. The track is removed if we do not end with at least one good cluster per station. +- ImproveTracks(flag): same as above using the default quality cut +- SetSigmaCutForTrigger(value): set the cut in sigma to apply on track during trigger hit pattern search +- SetStripCutForTrigger(value): set the cut in strips to apply on trigger track during trigger chamber efficiency +- SetMaxStripAreaForTrigger(value): set the maximum search area in strips to apply on trigger track during trigger chamber efficiency +- SetMaxNormChi2MatchTrigger(value): set the maximum normalized chi2 for tracker/trigger track matching +- TrackAllTracks(flag): consider all the clusters passing the sigma cut (duplicate the track) or only the best one +- RecoverTracks(flag): if no cluster is found in a given station, we try it again after having removed the worst of the 2 clusters + attached in the previous station (assuming it was a cluster from background). +- MakeTrackCandidatesFast(flag): make the primary track candidates formed by cluster on stations 4 and 5 assuming there is no + magnetic field in that region to speed up the reconstruction. +- MakeMoreTrackCandidates(Bool_t flag): make the primary track candidate using 1 cluster on station 4 and 1 cluster on station 5 + instead of starting from 2 clusters in the same station. +- ComplementTracks(Bool_t flag): look for potentially missing cluster to be attached to the track (a track may contain up to 2 + clusters per chamber do to the superimposition of DE, while the tracking procedure is done in such a way that only 1 can be attached). +- UseSmoother(Bool_t flag): use or not the smoother to recompute the track parameters at each attached cluster + (used for Kalman tracking only) +- UseChamber(Int_t iCh, Bool_t flag): set the chambers to be used (disable the clustering if the chamber is not used). +- RequestStation(Int_t iSt, Bool_t flag): impose/release the condition "at least 1 cluster per station" for that station. +- BypassSt45(Bool_t value): make the primary track candidate from the trigger track instead of using station 4 and 5. + +We can use the method Print("FULL") to printout all the parameters and options set in the class AliMUONRecoParam. + + +\section rec_s5 ESD content + +The final results of the reconstruction are stored in objects of the class AliESDMuonTrack. Those objects contain: +- Tracker track parameters (x, theta_x, y, theta_y, 1/p_yz) at vertex (x=x_vtx; y=y_vtx) +- Tracker track parameters in the vertex plane +- Tracker track parameters at first cluster +- Tracker track parameter covariances at first cluster +- Tracker track global informations (chi2, number of clusters, cluster map) +- TClonesArray of associated clusters stored in AliESDMuonCluster objects +- Trigger track informations (local trigger decision, strip pattern, hit pattern) +- Chi2 of tracker/trigger track matching + +Each AliESDMuonCluster object contain by default: +- Cluster ID providing information about the location of the cluster (chamber ID and DE ID) +- Cluster position (x,y,z) +- Cluster resolution (sigma_x,sigma_y) + +More information about clusters can be stored in these objects for a given fraction of events: +- Charge +- Chi2 +- TClonesArray of associated pads stored in AliESDMuonPad objects + +Each AliESDMuonPad object contain: +- Digit ID providing information about the location of the digit (DE ID, Manu ID, Manu channel and cathode) +- Raw charge (ADC value) +- Calibrated charge + + +\section rec_s6 Conversion between MUON/ESD objects + +Every conversion between MUON objects (AliMUOVDigit/AliMUONVCluster/AliMUONTrack) and ESD objects +(AliESDMuonPad/AliESDMuonCluster/AliESDMuonTrack) is done by the class AliMUONESDInterface. There are 2 ways of using this class: + +1) Using the static methods to convert the objects one by one (and possibly put them into the provided store): +- Get track parameters at vertex, at DCA, ...: +\verbatim + ... + AliESDMuonTrack* esdTrack = new AliESDMuonTrack(*(esd->GetMuonTrack(iTrack))); + AliMUONTrackParam param; + AliMUONESDInterface::GetParamAtVertex(*esdTrack, param); +\endverbatim + +- Convert an AliMUONVDigit to an AliESDMuonPad: +\verbatim + ... + AliMUONVDigit *digit = ...; + AliESDMuonPad esdPad; + AliMUONESDInterface::MUONToESD(*digit, esdPad); +\endverbatim + +- Convert an AliMUONLocalTrigger to a ghost AliESDMuonTrack (containing only trigger informations): +\verbatim + ... + AliMUONLocalTrigger* locTrg = ...; + AliESDMuonTrack esdTrack; + AliMUONESDInterface::MUONToESD(locTrg, esdTrack, trackId); +\endverbatim + +- Convert an AliESDMuonTrack to an AliMUONTrack: +\verbatim + ... + AliESDMuonTrack* esdTrack = new AliESDMuonTrack(*(esd->GetMuonTrack(iTrack))); + AliMUONTrack track; + AliMUONESDInterface::ESDToMUON(*esdTrack, track); +\endverbatim + +- Add an AliESDMuonTrack into an AliMUONVTrackStore: +\verbatim + ... + AliESDMuonTrack* esdTrack = new AliESDMuonTrack(*(esd->GetMuonTrack(iTrack))); + AliMUONVTrackStore *trackStore = AliMUONESDInteface::NewTrackStore(); + AliMUONESDInterface::Add(*esdTrack, *trackStore); +\endverbatim + +2) Loading an entire ESDEvent and using the finders and/or the iterators to access the corresponding MUON objects: +- First load the ESD event: +\verbatim + AliMUONESDInterface esdInterface; + esdInterface.LoadEvent(*esd); +\endverbatim + +- Get the track store: +\verbatim + AliMUONVTrackStore* trackStore = esdInterface.GetTracks(); +\endverbatim + +- Access the number of digits in a particular cluster: +\verbatim + Int_t nDigits = esdInterface.GetNDigitsInCluster(clusterId); +\endverbatim + +- Find a particular digit using its ID: +\verbatim + AliMUONVDigit *digit = esdInterface.FindDigit(digitId); +\endverbatim + +- Find a particular cluster in a given track using their IDs: +\verbatim + AliMUONVCluster* cluster = esdInterface.FindCluster(trackId, clusterId); +\endverbatim + +- Iterate over all clusters of a particular track using an iterator: +\verbatim + TIterator* nextCluster = esdInterface.CreateClusterIterator(trackId); + while ((cluster = static_cast(nextCluster()))) {...} +\endverbatim + +Note: You can change (via static method) the type of the store this class is using: +\verbatim + AliMUONESDInterface::UseTrackStore("name"); + AliMUONESDInterface::UseClusterStore("name"); + AliMUONESDInterface::UseDigitStore("name"); + AliMUONESDInterface::UseTriggerStore("name"); +\endverbatim + + +\section rec_s7 ESD cluster/track refitting + +We can re-clusterize and re-track the clusters/tracks stored into the ESD by using the class AliMUONRefitter. This class gets the MUON objects +to be refitted from an instance of AliMUONESDInterface (see section @ref rec_s6), then uses the reconstruction framework to refit the +objects. The reconstruction parameters are still set via the class AliMUONRecoParam (see section @ref rec_s5). The initial data are not changed. +Results are stored into new MUON objects. The aim of the refitting is to be able to study effects of changing the reconstruction parameters or the +calibration parameters without re-running the entire reconstruction. -Have a look at @ref AliMUONRecoParam for the complete list -of options/parameters with their purpose. +To use this class we first have to connect it to the ESD interface containing MUON objects: +\verbatim + AliMUONRefitter refitter; + refitter.Connect(&esdInterface); +\endverbatim +We can then: +- Re-clusterize the ESD clusters using the attached ESD pads (several new clusters can be reconstructed per ESD cluster): +\verbatim + AliMUONVClusterStore* clusterStore = refitter.ReClusterize(iTrack, iCluster); + AliMUONVClusterStore* clusterStore = refitter.ReClusterize(clusterId); +\endverbatim + +- Re-fit the ESD tracks using the attached ESD clusters: +\verbatim + AliMUONTrack* track = refitter.RetrackFromClusters(iTrack); + AliMUONVTrackStore* trackStore = refitter.ReconstructFromClusters(); +\endverbatim + +- Reconstruct the ESD tracks from ESD pads (i.e. re-clusterize the attached clusters). Consider all the combination of clusters and return only + the best one: +\verbatim + AliMUONTrack* track = refitter.RetrackFromDigits(iTrack); + AliMUONVTrackStore* trackStore = refitter.ReconstructFromDigits(); +\endverbatim -\section rec_s2 How to convert MUON digit/cluster/track into ESD pad/cluster/track and vice versa +The macro MUONRefit.C is an example of using this class. The results are stored in a new AliESDs.root file. -The class @ref AliMUONESDInterface is doing the job. -There are 2 ways of using this class: -1) using the static methods to convert the objects one by one (and possibly put them - into the provided store). -2) loading an entire ESDEvent and using the getters and/or the iterators - to access the corresponding MUON objects. -Note: You can change (via static method) the type of the store this class is using. This chapter is defined in the READMErec.txt file. diff --git a/MUON/runReconstruction.C b/MUON/runReconstruction.C index 4854858405e..84ead158fa0 100644 --- a/MUON/runReconstruction.C +++ b/MUON/runReconstruction.C @@ -59,13 +59,14 @@ void runReconstruction(int seed, const char* input, const char* recoptions) AliMUONRecoParam *muonRecoParam = AliMUONRecoParam::GetLowFluxParam(); muonRecoParam->CombineClusterTrackReco(kFALSE); + //muonRecoParam->SaveFullClusterInESD(kTRUE,100.); //muonRecoParam->SetClusteringMode("PEAKFIT"); //muonRecoParam->SetClusteringMode("PEAKCOG"); muonRecoParam->Print("FULL"); AliRecoParam::Instance()->RegisterRecoParam(muonRecoParam); - //MuonRec->SetRunQA(kFALSE); + MuonRec->SetRunQA(kFALSE); MuonRec->Run(); -- 2.43.0