X-Git-Url: http://git.uio.no/git/?p=u%2Fmrichter%2FAliRoot.git;a=blobdiff_plain;f=MUON%2FAliMUONTracker.cxx;h=382bae80c50a932f5e271dda2181dfa02772b718;hp=797b4dc8c4e274fe4be19f354df8c722b982298c;hb=64f628e94306d7f396bc99ad8015215a61fc4287;hpb=683cb6c5538805954750251a818e556da428b79f diff --git a/MUON/AliMUONTracker.cxx b/MUON/AliMUONTracker.cxx index 797b4dc8c4e..382bae80c50 100644 --- a/MUON/AliMUONTracker.cxx +++ b/MUON/AliMUONTracker.cxx @@ -22,40 +22,40 @@ /// 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 //----------------------------------------------------------------------------- #include "AliMUONTracker.h" -#include "AliMUONReconstructor.h" +#include "AliCodeTimer.h" +#include "AliESDEvent.h" +#include "AliESDMuonTrack.h" +#include "AliESDVertex.h" +#include "AliLog.h" +#include "AliMUONClusterStoreV2.h" +#include "AliMUONESDInterface.h" +#include "AliMUONLegacyClusterServer.h" #include "AliMUONRecoParam.h" +#include "AliMUONReconstructor.h" #include "AliMUONTrack.h" #include "AliMUONTrackExtrap.h" #include "AliMUONTrackHitPattern.h" #include "AliMUONTrackParam.h" -#include "AliMUONVCluster.h" -#include "AliMUONVClusterServer.h" #include "AliMUONTrackReconstructor.h" #include "AliMUONTrackReconstructorK.h" #include "AliMUONTrackStoreV1.h" #include "AliMUONTriggerTrackStoreV1.h" -#include "AliMUONClusterStoreV2.h" +#include "AliMUONTriggerTrack.h" +#include "AliMUONLocalTrigger.h" +#include "AliMUONVClusterServer.h" +#include "AliMUONVDigitStore.h" #include "AliMUONVTriggerStore.h" - -#include "AliESDEvent.h" -#include "AliESDMuonTrack.h" -#include "AliESDMuonCluster.h" -#include "AliESDVertex.h" -#include "AliLog.h" -#include "AliCodeTimer.h" - #include +#include #include /// \cond CLASSIMP @@ -64,23 +64,41 @@ ClassImp(AliMUONTracker) //_____________________________________________________________________________ -AliMUONTracker::AliMUONTracker(AliMUONVClusterServer& clusterServer, - 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) +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) + { + AliDebug(1,"No cluster server given. Will use AliMUONLegacyClusterServer"); + fIsOwnerOfClusterServer = kTRUE; + } + else + { + TIter next(fkDigitStore.CreateIterator()); + fClusterServer->UseDigits(next,&digitStore); + + SetupClusterServer(*fClusterServer); + } } //_____________________________________________________________________________ @@ -91,6 +109,9 @@ AliMUONTracker::~AliMUONTracker() delete fTrackHitPatternMaker; delete fClusterStore; delete fTriggerStore; + if ( fIsOwnerOfClusterServer ) delete fClusterServer; + delete fInputClusterStore; + delete fTriggerTrackStore; } //_____________________________________________________________________________ @@ -105,14 +126,26 @@ AliMUONTracker::ClusterStore() const return fClusterStore; } +//_____________________________________________________________________________ +AliMUONVTriggerTrackStore* +AliMUONTracker::TriggerTrackStore() const +{ + /// Return (and create if necessary) the trigger track container + if (!fTriggerTrackStore) + { + fTriggerTrackStore = new AliMUONTriggerTrackStoreV1; + } + return fTriggerTrackStore; +} + //_____________________________________________________________________________ Int_t AliMUONTracker::LoadClusters(TTree* clustersTree) { /// Load triggerStore from clustersTree - ClusterStore()->Clear(); - delete fTriggerStore; + delete fInputClusterStore; + fInputClusterStore=0x0; if ( ! clustersTree ) { AliFatal("No clustersTree"); @@ -127,7 +160,22 @@ Int_t AliMUONTracker::LoadClusters(TTree* clustersTree) return 2; } - ClusterStore()->Connect(*clustersTree,kFALSE); + if ( fIsOwnerOfClusterServer ) + { + fInputClusterStore = AliMUONVClusterStore::Create(*clustersTree); + if ( fInputClusterStore ) + { + AliDebug(1,Form("Created %s from cluster tree",fInputClusterStore->ClassName())); + fInputClusterStore->Clear(); + fInputClusterStore->Connect(*clustersTree,kFALSE); + } + delete fClusterServer; + fClusterServer = new AliMUONLegacyClusterServer(*fkTransformer,fInputClusterStore, + GetRecoParam()->BypassSt4(), + GetRecoParam()->BypassSt5()); + SetupClusterServer(*fClusterServer); + } + fTriggerStore->Connect(*clustersTree,kFALSE); clustersTree->GetEvent(0); @@ -140,9 +188,12 @@ Int_t AliMUONTracker::Clusters2Tracks(AliESDEvent* esd) { /// Performs the tracking and store the resulting tracks in the ESD AliDebug(1,""); - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) - if (!fTrackReco) CreateTrackReconstructor(); + if (!fTrackReco) + { + fTrackReco = CreateTrackReconstructor(GetRecoParam(),fClusterServer); + } // if the required tracking mode does not exist if (!fTrackReco) return 1; @@ -158,20 +209,33 @@ Int_t AliMUONTracker::Clusters2Tracks(AliESDEvent* esd) return 3; } + // Make trigger tracks + if ( fkTriggerCircuit ) + { + TriggerTrackStore()->Clear(); + fTrackReco->EventReconstructTrigger(*fkTriggerCircuit,*fTriggerStore,*(TriggerTrackStore())); + } + + if ( TriggerTrackStore()->GetSize() > GetRecoParam()->GetMaxTriggerTracks() ) + { + // cut to reject shower events + + AliCodeTimerAuto("MUON Shower events",1); + + AliWarning(Form("Probably got a shower event (%d trigger tracks). Will not reconstruct tracks.", + TriggerTrackStore()->GetSize())); + + return 0; + } + // Make tracker tracks AliMUONVTrackStore* trackStore = new AliMUONTrackStoreV1; fTrackReco->EventReconstruct(*(ClusterStore()),*trackStore); - // Make trigger tracks - AliMUONVTriggerTrackStore* triggerTrackStore(0x0); - if ( fTriggerCircuit ) { - triggerTrackStore = new AliMUONTriggerTrackStoreV1; - fTrackReco->EventReconstructTrigger(*fTriggerCircuit,*fTriggerStore,*triggerTrackStore); - } - // Match tracker/trigger tracks - if ( triggerTrackStore && fTrackHitPatternMaker ) { - fTrackReco->ValidateTracksWithTrigger(*trackStore,*triggerTrackStore,*fTriggerStore,*fTrackHitPatternMaker); + if ( fTrackHitPatternMaker ) + { + fTrackReco->ValidateTracksWithTrigger(*trackStore,*(TriggerTrackStore()),*fTriggerStore,*fTrackHitPatternMaker); } // Fill ESD @@ -179,106 +243,109 @@ Int_t AliMUONTracker::Clusters2Tracks(AliESDEvent* esd) // cleanup delete trackStore; - delete triggerTrackStore; return 0; } //_____________________________________________________________________________ -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("") + AliCodeTimerAuto("",0) - // Get vertex - Double_t vertex[3] = {0}; - Double_t errXVtx = 0., errYVtx = 0.; + // get ITS vertex + Double_t vertex[3] = {0., 0., 0.}; const AliESDVertex* esdVert = esd->GetVertex(); - if (esdVert->GetNContributors()) - { + if (esdVert->GetNContributors()) { esdVert->GetXYZ(vertex); - errXVtx = esdVert->GetXRes(); - errYVtx = esdVert->GetYRes(); AliDebug(1,Form("found vertex (%e,%e,%e)",vertex[0],vertex[1],vertex[2])); } - // setting ESD MUON class - AliESDMuonTrack esdTrack; - AliESDMuonCluster esdCluster; - + // fill ESD event including all info in ESD cluster if required and only for the given fraction of events AliMUONTrack* track; - AliMUONVCluster* cluster; + AliMUONLocalTrigger* locTrg; + AliESDMuonTrack esdTrack; TIter next(trackStore.CreateIterator()); - - while ( ( track = static_cast(next()) ) ) - { - AliMUONTrackParam* trackParam = static_cast((track->GetTrackParamAtCluster())->First()); + if (GetRecoParam()->SaveFullClusterInESD() && + gRandom->Uniform(100.) <= GetRecoParam()->GetPercentOfFullClusterInESD()) { + + while ( ( track = static_cast(next()) ) ) { + + 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); + } - /// Extrapolate to vertex (which is set to (0,0,0) if not available, see above) - AliMUONTrackParam trackParamAtVtx(*trackParam); - AliMUONTrackExtrap::ExtrapToVertex(&trackParamAtVtx, vertex[0], vertex[1], vertex[2], errXVtx, errYVtx); + } else { + + while ( ( track = static_cast(next()) ) ) { + + 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); + } - /// Extrapolate to vertex plan (which is set to z=0 if not available, see above) - AliMUONTrackParam trackParamAtDCA(*trackParam); - AliMUONTrackExtrap::ExtrapToVertexWithoutBranson(&trackParamAtDCA, vertex[2]); + } + + // 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; + TIter itTriggerTrack(fTriggerTrackStore->CreateIterator()); + while ( ( triggerTrack = static_cast(itTriggerTrack()) ) ) { - // setting data member of ESD MUON - esdTrack.Clear("C"); // remove already attached clusters - esdTrack.SetMuonClusterMap(0); // important to use the Add..() methods + locTrg = static_cast(fTriggerStore->FindLocal(triggerTrack->GetLoTrgNum())); - // at first station - trackParam->SetParamForUncorrected(esdTrack); - trackParam->SetCovFor(esdTrack); - // at vertex - trackParamAtVtx.SetParamFor(esdTrack); - // at Distance of Closest Approach - trackParamAtDCA.SetParamForDCA(esdTrack); - // global info - esdTrack.SetChi2(track->GetGlobalChi2()); - esdTrack.SetNHit(track->GetNClusters()); - esdTrack.SetLocalTrigger(track->GetLocalTrigger()); - esdTrack.SetChi2MatchTrigger(track->GetChi2MatchTrigger()); - esdTrack.SetHitsPatternInTrigCh(track->GetHitsPatternInTrigCh()); - // muon cluster info - while (trackParam) { - cluster = trackParam->GetClusterPtr(); - esdCluster.SetUniqueID(cluster->GetUniqueID()); - esdCluster.SetXYZ(cluster->GetX(), cluster->GetY(), cluster->GetZ()); - esdCluster.SetErrXY(cluster->GetErrX(), cluster->GetErrY()); - esdTrack.AddCluster(esdCluster); - esdTrack.AddInMuonClusterMap(cluster->GetChamberId()); - trackParam = static_cast(track->GetTrackParamAtCluster()->After(trackParam)); + // 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); - // storing ESD MUON Track into ESD Event esd->AddMuonTrack(&esdTrack); - } // end of loop on tracks + ghostId -= 1; + } + } //_____________________________________________________________________________ -void AliMUONTracker::CreateTrackReconstructor() +AliMUONVTrackReconstructor* AliMUONTracker::CreateTrackReconstructor(const AliMUONRecoParam* recoParam, AliMUONVClusterServer* clusterServer) { /// Create track reconstructor, depending on tracking mode set in RecoParam - TString opt(AliMUONReconstructor::GetRecoParam()->GetTrackingMode()); + AliMUONVTrackReconstructor* trackReco(0x0); + + TString opt(recoParam->GetTrackingMode()); opt.ToUpper(); if (strstr(opt,"ORIGINAL")) { - fTrackReco = new AliMUONTrackReconstructor(fClusterServer); + trackReco = new AliMUONTrackReconstructor(recoParam,clusterServer); } else if (strstr(opt,"KALMAN")) { - fTrackReco = new AliMUONTrackReconstructorK(fClusterServer); + trackReco = new AliMUONTrackReconstructorK(recoParam,clusterServer); } else { - AliError(Form("tracking mode \"%s\" does not exist",opt.Data())); - return; + AliErrorClass(Form("tracking mode \"%s\" does not exist",opt.Data())); + return 0x0; } - AliInfo(Form("Will use %s for tracking",fTrackReco->ClassName())); + AliDebugClass(1,Form("Will use %s for tracking",trackReco->ClassName())); + + return trackReco; } //_____________________________________________________________________________ @@ -286,5 +353,51 @@ void AliMUONTracker::UnloadClusters() { /// Clear internal clusterStore - ClusterStore()->Clear(); + delete fInputClusterStore; + fInputClusterStore = 0x0; +} + + +//_____________________________________________________________________________ +void +AliMUONTracker::SetupClusterServer(AliMUONVClusterServer& clusterServer) +{ + /// Setup the cluster server + + 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(Form("WILL USE TRIGGER TRACKS TO GENERATE CLUSTERS IN %s, " + "THUS BYPASSING REAL CLUSTERS IN %s!!!",msg1.Data(),msg2.Data())); + } + else + { + AliWarning("BYPASSING OF ST4 AND/OR 5 REQUESTED, BUT CLUSTERSERVER DOES NOT SEEM TO SUPPORT IT !!!"); + } + } } + +