#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 "AliMUONTriggerChamberEff.h"
#include "AliMUONTriggerTrackStoreV1.h"
-#include "AliMUONClusterStoreV2.h"
+#include "AliMUONTriggerTrack.h"
+#include "AliMUONLocalTrigger.h"
+#include "AliMUONVCluster.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 <Riostream.h>
+#include <TRandom.h>
#include <TTree.h>
/// \cond CLASSIMP
//_____________________________________________________________________________
-AliMUONTracker::AliMUONTracker(AliMUONVClusterServer& clusterServer,
+AliMUONTracker::AliMUONTracker(AliMUONVClusterServer* clusterServer,
+ const AliMUONVDigitStore& digitStore,
const AliMUONDigitMaker* digitMaker,
const AliMUONGeometryTransformer* transformer,
- const AliMUONTriggerCircuit* triggerCircuit,
- AliMUONTriggerChamberEff* chamberEff)
+ const AliMUONTriggerCircuit* triggerCircuit)
: AliTracker(),
fDigitMaker(digitMaker), // not owner
fTransformer(transformer), // not owner
fTriggerCircuit(triggerCircuit), // not owner
- fTrigChamberEff(chamberEff), // not owner
fTrackHitPatternMaker(0x0),
fTrackReco(0x0),
fClusterStore(0x0),
fTriggerStore(0x0),
- fClusterServer(clusterServer)
+ fClusterServer(clusterServer),
+ fIsOwnerOfClusterServer(kFALSE),
+ fDigitStore(digitStore), // not owner
+ fInputClusterStore(0x0),
+ fTriggerTrackStore(0x0)
{
/// constructor
if (fTransformer && fDigitMaker)
fTrackHitPatternMaker = new AliMUONTrackHitPattern(*fTransformer,*fDigitMaker);
+
+ if (!fClusterServer)
+ {
+ AliInfo("No cluster server given. Will use AliMUONLegacyClusterServer");
+ fIsOwnerOfClusterServer = kTRUE;
+ }
+ else
+ {
+ TIter next(fDigitStore.CreateIterator());
+ fClusterServer->UseDigits(next);
+
+ SetupClusterServer(*fClusterServer);
+ }
}
//_____________________________________________________________________________
delete fTrackHitPatternMaker;
delete fClusterStore;
delete fTriggerStore;
+ if ( fIsOwnerOfClusterServer ) delete fClusterServer;
+ delete fInputClusterStore;
+ delete fTriggerTrackStore;
}
//_____________________________________________________________________________
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");
return 2;
}
- ClusterStore()->Connect(*clustersTree,kFALSE);
+ if ( fIsOwnerOfClusterServer )
+ {
+ fInputClusterStore = AliMUONVClusterStore::Create(*clustersTree);
+ if ( fInputClusterStore )
+ {
+ AliInfo(Form("Created %s from cluster tree",fInputClusterStore->ClassName()));
+ fInputClusterStore->Clear();
+ fInputClusterStore->Connect(*clustersTree,kFALSE);
+ }
+ delete fClusterServer;
+ fClusterServer = new AliMUONLegacyClusterServer(*fTransformer,fInputClusterStore);
+ SetupClusterServer(*fClusterServer);
+ }
+
fTriggerStore->Connect(*clustersTree,kFALSE);
clustersTree->GetEvent(0);
AliDebug(1,"");
AliCodeTimerAuto("")
- if (!fTrackReco) CreateTrackReconstructor();
+ if (!fTrackReco)
+ {
+ fTrackReco = CreateTrackReconstructor(AliMUONReconstructor::GetRecoParam()->GetTrackingMode(),fClusterServer);
+ }
// if the required tracking mode does not exist
if (!fTrackReco) return 1;
return 3;
}
- // 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);
+ if ( fTriggerCircuit )
+ {
+ TriggerTrackStore()->Clear();
+ fTrackReco->EventReconstructTrigger(*fTriggerCircuit,*fTriggerStore,*(TriggerTrackStore()));
}
+
+ if ( AliMUONReconstructor::GetRecoParam()->BypassSt45() && TriggerTrackStore()->GetSize() > 5 )
+ {
+ // Hard cut to reject shower events
+
+ AliCodeTimerAuto("MUON Shower events");
- // Match tracker/trigger tracks
- if ( triggerTrackStore && fTrackHitPatternMaker ) {
- fTrackReco->ValidateTracksWithTrigger(*trackStore,*triggerTrackStore,*fTriggerStore,*fTrackHitPatternMaker);
+ 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);
- // Compute trigger chamber efficiency
- if( triggerTrackStore && fTrigChamberEff){
- AliCodeTimerStart("EventChamberEff");
- fTrigChamberEff->EventChamberEff(*fTriggerStore,*triggerTrackStore,*trackStore);
- AliCodeTimerStop("EventChamberEff");
+ // Match tracker/trigger tracks
+ if ( fTrackHitPatternMaker )
+ {
+ fTrackReco->ValidateTracksWithTrigger(*trackStore,*(TriggerTrackStore()),*fTriggerStore,*fTrackHitPatternMaker);
}
// Fill ESD
// cleanup
delete trackStore;
- delete triggerTrackStore;
return 0;
}
AliDebug(1,"");
AliCodeTimerAuto("")
- // 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<AliMUONTrack*>(next()) ) )
- {
- AliMUONTrackParam* trackParam = static_cast<AliMUONTrackParam*>((track->GetTrackParamAtCluster())->First());
+ if (AliMUONReconstructor::GetRecoParam()->SaveFullClusterInESD() &&
+ gRandom->Uniform(100.) <= AliMUONReconstructor::GetRecoParam()->GetPercentOfFullClusterInESD()) {
- /// 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);
+ while ( ( track = static_cast<AliMUONTrack*>(next()) ) ) {
+
+ if (track->GetMatchTrigger() > 0) {
+ locTrg = static_cast<AliMUONLocalTrigger*>(fTriggerStore->FindLocal(track->LoCircuit()));
+ AliMUONESDInterface::MUONToESD(*track, esdTrack, vertex, &fDigitStore, locTrg);
+ } else AliMUONESDInterface::MUONToESD(*track, esdTrack, vertex, &fDigitStore);
+
+ 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]);
+ } else {
- // setting data member of ESD MUON
- esdTrack.Clear("C"); // remove already attached clusters
- esdTrack.SetMuonClusterMap(0); // important to use the Add..() methods
+ while ( ( track = static_cast<AliMUONTrack*>(next()) ) ) {
+
+ if (track->GetMatchTrigger() > 0) {
+ locTrg = static_cast<AliMUONLocalTrigger*>(fTriggerStore->FindLocal(track->LoCircuit()));
+ AliMUONESDInterface::MUONToESD(*track, esdTrack, vertex, 0x0, locTrg);
+ } else AliMUONESDInterface::MUONToESD(*track, esdTrack, vertex);
+
+ esd->AddMuonTrack(&esdTrack);
+ }
- // 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<AliMUONTrackParam*>(track->GetTrackParamAtCluster()->After(trackParam));
+ }
+
+ // 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<AliMUONTriggerTrack*>(itTriggerTrack()) ) ) {
+
+ locTrg = static_cast<AliMUONLocalTrigger*>(fTriggerStore->FindLocal(triggerTrack->GetLoTrgNum()));
+
+ // check if this local trigger has already been matched
+ TIter itTrack(trackStore.CreateIterator());
+ while ( ( track = static_cast<AliMUONTrack*>(itTrack()) ) ) {
+ matched = (track->LoCircuit() == locTrg->LoCircuit());
+ if (matched) break;
}
+ if (matched) continue;
+
+ AliMUONESDInterface::MUONToESD(*locTrg, esdTrack, ghostId);
- // storing ESD MUON Track into ESD Event
esd->AddMuonTrack(&esdTrack);
- } // end of loop on tracks
+ ghostId -= 1;
+ }
+
}
//_____________________________________________________________________________
-void AliMUONTracker::CreateTrackReconstructor()
+AliMUONVTrackReconstructor* AliMUONTracker::CreateTrackReconstructor(const char* trackingMode, AliMUONVClusterServer* clusterServer)
{
/// Create track reconstructor, depending on tracking mode set in RecoParam
- TString opt(AliMUONReconstructor::GetRecoParam()->GetTrackingMode());
+ AliMUONVTrackReconstructor* trackReco(0x0);
+
+ TString opt(trackingMode);
opt.ToUpper();
if (strstr(opt,"ORIGINAL"))
{
- fTrackReco = new AliMUONTrackReconstructor(fClusterServer);
+ trackReco = new AliMUONTrackReconstructor(clusterServer);
}
else if (strstr(opt,"KALMAN"))
{
- fTrackReco = new AliMUONTrackReconstructorK(fClusterServer);
+ trackReco = new AliMUONTrackReconstructorK(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()));
+ AliInfoClass(Form("Will use %s for tracking",trackReco->ClassName()));
+
+ return trackReco;
}
//_____________________________________________________________________________
{
/// Clear internal clusterStore
- ClusterStore()->Clear();
+ delete fInputClusterStore;
+ fInputClusterStore = 0x0;
}
+
+
+//_____________________________________________________________________________
+void
+AliMUONTracker::SetupClusterServer(AliMUONVClusterServer& clusterServer)
+{
+ /// Setup the cluster server
+
+ if ( AliMUONReconstructor::GetRecoParam()->BypassSt45() )
+ {
+ Bool_t ok = clusterServer.UseTriggerTrackStore(TriggerTrackStore());
+
+ if ( ok )
+
+ {
+ AliWarning("WILL USE TRIGGER TRACKS TO GENERATE CLUSTERS IN STATIONS 4 AND 5, THUS BYPASSING REAL CLUSTERS IN THOSE TWO STATIONS !!!");
+ }
+ else
+ {
+ AliWarning("BYPASSING OF ST45 REQUESTED, BUT CLUSTERSERVER DOES NOT SEEM TO SUPPORT IT !!!");
+ }
+ }
+}
+
+