X-Git-Url: http://git.uio.no/git/?p=u%2Fmrichter%2FAliRoot.git;a=blobdiff_plain;f=MUON%2FAliMUONTracker.cxx;h=382bae80c50a932f5e271dda2181dfa02772b718;hp=7938b0db9ec3ce51634587c30faf99c37b477a31;hb=ab3b76f17cae287a10df00479e3b3d24e6731dc6;hpb=d7820279b508b2cac5f888f335c84179d90ba7f5 diff --git a/MUON/AliMUONTracker.cxx b/MUON/AliMUONTracker.cxx index 7938b0db9ec..382bae80c50 100644 --- a/MUON/AliMUONTracker.cxx +++ b/MUON/AliMUONTracker.cxx @@ -22,11 +22,9 @@ /// reconstruct tracks from recpoints /// /// Actual tracking is performed by some AliMUONVTrackReconstructor children -/// Tracking modes (ORIGINAL, KALMAN) and associated options and parameters -/// can be changed by using: -/// AliMUONRecoParam *muonRecoParam = AliMUONRecoParam::GetLow(High)FluxParam(); -/// muonRecoParam->Set...(); // see methods in AliMUONRecoParam.h for details -/// AliMUONReconstructor::SetRecoParam(muonRecoParam); +/// Tracking modes (ORIGINAL, KALMAN) and associated options and parameters can be changed +/// through the AliMUONRecoParam object set in the reconstruction macro or read from the CDB +/// (see methods in AliMUONRecoParam.h file for details) /// /// \author Christian Finck and Laurent Aphecetche, SUBATECH Nantes //----------------------------------------------------------------------------- @@ -53,7 +51,6 @@ #include "AliMUONTriggerTrackStoreV1.h" #include "AliMUONTriggerTrack.h" #include "AliMUONLocalTrigger.h" -#include "AliMUONVCluster.h" #include "AliMUONVClusterServer.h" #include "AliMUONVDigitStore.h" #include "AliMUONVTriggerStore.h" @@ -67,38 +64,38 @@ ClassImp(AliMUONTracker) //_____________________________________________________________________________ -AliMUONTracker::AliMUONTracker(AliMUONVClusterServer* clusterServer, - const AliMUONVDigitStore& digitStore, - const AliMUONDigitMaker* digitMaker, +AliMUONTracker::AliMUONTracker(const AliMUONRecoParam* recoParam, + AliMUONVClusterServer* clusterServer, + AliMUONVDigitStore& digitStore, const AliMUONGeometryTransformer* transformer, const AliMUONTriggerCircuit* triggerCircuit) : AliTracker(), - fDigitMaker(digitMaker), // not owner - fTransformer(transformer), // not owner - fTriggerCircuit(triggerCircuit), // not owner - fTrackHitPatternMaker(0x0), - fTrackReco(0x0), - fClusterStore(0x0), - fTriggerStore(0x0), - fClusterServer(clusterServer), - fIsOwnerOfClusterServer(kFALSE), - fDigitStore(digitStore), // not owner - fInputClusterStore(0x0), - fTriggerTrackStore(0x0) +fkTransformer(transformer), // not owner +fkTriggerCircuit(triggerCircuit), // not owner +fTrackHitPatternMaker(0x0), +fTrackReco(0x0), +fClusterStore(0x0), +fTriggerStore(0x0), +fClusterServer(clusterServer), +fIsOwnerOfClusterServer(kFALSE), +fkDigitStore(digitStore), // not owner +fInputClusterStore(0x0), +fTriggerTrackStore(0x0), +fkRecoParam(recoParam) { /// constructor - if (fTransformer && fDigitMaker) - fTrackHitPatternMaker = new AliMUONTrackHitPattern(*fTransformer,*fDigitMaker); + if (fkTransformer) + fTrackHitPatternMaker = new AliMUONTrackHitPattern(recoParam,*fkTransformer,fkDigitStore); if (!fClusterServer) { - AliInfo("No cluster server given. Will use AliMUONLegacyClusterServer"); + AliDebug(1,"No cluster server given. Will use AliMUONLegacyClusterServer"); fIsOwnerOfClusterServer = kTRUE; } else { - TIter next(fDigitStore.CreateIterator()); - fClusterServer->UseDigits(next); + TIter next(fkDigitStore.CreateIterator()); + fClusterServer->UseDigits(next,&digitStore); SetupClusterServer(*fClusterServer); } @@ -168,12 +165,14 @@ Int_t AliMUONTracker::LoadClusters(TTree* clustersTree) fInputClusterStore = AliMUONVClusterStore::Create(*clustersTree); if ( fInputClusterStore ) { - AliInfo(Form("Created %s from cluster tree",fInputClusterStore->ClassName())); + AliDebug(1,Form("Created %s from cluster tree",fInputClusterStore->ClassName())); fInputClusterStore->Clear(); fInputClusterStore->Connect(*clustersTree,kFALSE); } delete fClusterServer; - fClusterServer = new AliMUONLegacyClusterServer(*fTransformer,fInputClusterStore); + fClusterServer = new AliMUONLegacyClusterServer(*fkTransformer,fInputClusterStore, + GetRecoParam()->BypassSt4(), + GetRecoParam()->BypassSt5()); SetupClusterServer(*fClusterServer); } @@ -189,11 +188,11 @@ Int_t AliMUONTracker::Clusters2Tracks(AliESDEvent* esd) { /// Performs the tracking and store the resulting tracks in the ESD AliDebug(1,""); - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) if (!fTrackReco) { - fTrackReco = CreateTrackReconstructor(AliMUONReconstructor::GetRecoParam()->GetTrackingMode(),fClusterServer); + fTrackReco = CreateTrackReconstructor(GetRecoParam(),fClusterServer); } // if the required tracking mode does not exist @@ -211,17 +210,17 @@ Int_t AliMUONTracker::Clusters2Tracks(AliESDEvent* esd) } // Make trigger tracks - if ( fTriggerCircuit ) + if ( fkTriggerCircuit ) { TriggerTrackStore()->Clear(); - fTrackReco->EventReconstructTrigger(*fTriggerCircuit,*fTriggerStore,*(TriggerTrackStore())); + fTrackReco->EventReconstructTrigger(*fkTriggerCircuit,*fTriggerStore,*(TriggerTrackStore())); } - if ( AliMUONReconstructor::GetRecoParam()->BypassSt45() && TriggerTrackStore()->GetSize() > 5 ) + if ( TriggerTrackStore()->GetSize() > GetRecoParam()->GetMaxTriggerTracks() ) { - // Hard cut to reject shower events + // cut to reject shower events - AliCodeTimerAuto("MUON Shower events"); + AliCodeTimerAuto("MUON Shower events",1); AliWarning(Form("Probably got a shower event (%d trigger tracks). Will not reconstruct tracks.", TriggerTrackStore()->GetSize())); @@ -249,18 +248,14 @@ Int_t AliMUONTracker::Clusters2Tracks(AliESDEvent* esd) } //_____________________________________________________________________________ -void AliMUONTracker::FillESD(AliMUONVTrackStore& trackStore, AliESDEvent* esd) const +void AliMUONTracker::FillESD(const AliMUONVTrackStore& trackStore, AliESDEvent* esd) const { /// Fill the ESD from the trackStore AliDebug(1,""); - AliCodeTimerAuto("") - - AliMUONTrack* track; - AliESDMuonTrack esdTrack; - Double_t vertex[3] = {0., 0., 0.}; - TIter next(trackStore.CreateIterator()); + AliCodeTimerAuto("",0) // get ITS vertex + Double_t vertex[3] = {0., 0., 0.}; const AliESDVertex* esdVert = esd->GetVertex(); if (esdVert->GetNContributors()) { esdVert->GetXYZ(vertex); @@ -268,117 +263,79 @@ 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 - if (AliMUONReconstructor::GetRecoParam()->SaveFullClusterInESD() && - gRandom->Uniform(100.) <= AliMUONReconstructor::GetRecoParam()->GetPercentOfFullClusterInESD()) { + AliMUONTrack* track; + AliMUONLocalTrigger* locTrg; + AliESDMuonTrack esdTrack; + TIter next(trackStore.CreateIterator()); + if (GetRecoParam()->SaveFullClusterInESD() && + gRandom->Uniform(100.) <= 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, &fkDigitStore, locTrg); + } else AliMUONESDInterface::MUONToESD(*track, esdTrack, vertex, &fkDigitStore); + 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, triggerTrack); + + esd->AddMuonTrack(&esdTrack); + ghostId -= 1; + } } //_____________________________________________________________________________ -AliMUONVTrackReconstructor* AliMUONTracker::CreateTrackReconstructor(const char* trackingMode, AliMUONVClusterServer* clusterServer) +AliMUONVTrackReconstructor* AliMUONTracker::CreateTrackReconstructor(const AliMUONRecoParam* recoParam, AliMUONVClusterServer* clusterServer) { /// Create track reconstructor, depending on tracking mode set in RecoParam AliMUONVTrackReconstructor* trackReco(0x0); - TString opt(trackingMode); + TString opt(recoParam->GetTrackingMode()); opt.ToUpper(); if (strstr(opt,"ORIGINAL")) { - trackReco = new AliMUONTrackReconstructor(*clusterServer); + trackReco = new AliMUONTrackReconstructor(recoParam,clusterServer); } else if (strstr(opt,"KALMAN")) { - trackReco = new AliMUONTrackReconstructorK(*clusterServer); + trackReco = new AliMUONTrackReconstructorK(recoParam,clusterServer); } else { @@ -386,7 +343,7 @@ AliMUONVTrackReconstructor* AliMUONTracker::CreateTrackReconstructor(const char* return 0x0; } - AliInfoClass(Form("Will use %s for tracking",trackReco->ClassName())); + AliDebugClass(1,Form("Will use %s for tracking",trackReco->ClassName())); return trackReco; } @@ -407,18 +364,38 @@ AliMUONTracker::SetupClusterServer(AliMUONVClusterServer& clusterServer) { /// Setup the cluster server - if ( AliMUONReconstructor::GetRecoParam()->BypassSt45() ) + if ( GetRecoParam()->BypassSt4() || + GetRecoParam()->BypassSt5() ) { Bool_t ok = clusterServer.UseTriggerTrackStore(TriggerTrackStore()); + TString msg1; + TString msg2; + + if ( GetRecoParam()->BypassSt45() ) + { + msg1 = "STATIONS 4 AND 5"; + msg2 = "THOSE TWO STATIONS"; + } + else if ( GetRecoParam()->BypassSt4() ) + { + msg1 = "STATION 4"; + msg2 = "THAT STATION"; + } + else if ( GetRecoParam()->BypassSt5() ) + { + msg1 = "STATION 5"; + msg2 = "THAT STATION"; + } + if ( ok ) - { - AliWarning("WILL USE TRIGGER TRACKS TO GENERATE CLUSTERS IN STATIONS 4 AND 5, THUS BYPASSING REAL CLUSTERS IN THOSE TWO STATIONS !!!"); + AliWarning(Form("WILL USE TRIGGER TRACKS TO GENERATE CLUSTERS IN %s, " + "THUS BYPASSING REAL CLUSTERS IN %s!!!",msg1.Data(),msg2.Data())); } else { - AliWarning("BYPASSING OF ST45 REQUESTED, BUT CLUSTERSERVER DOES NOT SEEM TO SUPPORT IT !!!"); + AliWarning("BYPASSING OF ST4 AND/OR 5 REQUESTED, BUT CLUSTERSERVER DOES NOT SEEM TO SUPPORT IT !!!"); } } }