#include "AliMUONConstants.h"
#include "AliMUONESDInterface.h"
#include "AliMUONTrackParam.h"
+#include "AliMUONTriggerTrack.h"
+#include "AliMUONVTriggerTrackStore.h"
#include "AliMCEventHandler.h"
#include "AliMCEvent.h"
#include "AliStack.h"
#include "AliESDEvent.h"
#include "AliESDMuonTrack.h"
+#include "AliGeomManager.h"
+#include "AliMpCDB.h"
+#include "AliMpDDLStore.h"
+#include "AliMUONCDB.h"
+#include "AliMUONGeometryTransformer.h"
+#include "AliMUONTriggerCircuit.h"
+#include "AliMUONVTrackReconstructor.h"
+#include "AliMUONVTriggerStore.h"
+
+#include "TGeoManager.h"
+
#include <TFile.h>
#include <TTree.h>
#include <TParticle.h>
#include <TParticlePDG.h>
#include <Riostream.h>
+#include "AliMUONRecoCheck.h"
+
/// \cond CLASSIMP
ClassImp(AliMUONRecoCheck)
/// \endcond
fCurrentEvent(0),
fTrackRefStore(0x0),
fRecoTrackRefStore(0x0),
+fRecoTriggerRefStore(0x0),
fRecoTrackStore(0x0),
+fRecoTriggerTrackStore(0x0),
+fGeometryTransformer(0x0),
+fTriggerCircuit(0x0),
fESDEventOwner(kTRUE)
{
/// Normal ctor
fCurrentEvent(0),
fTrackRefStore(0x0),
fRecoTrackRefStore(0x0),
+fRecoTriggerRefStore(0x0),
fRecoTrackStore(0x0),
+fRecoTriggerTrackStore(0x0),
+fGeometryTransformer(0x0),
+fTriggerCircuit(0x0),
fESDEventOwner(kFALSE)
{
/// Normal ctor
// ESD MUON Tracks
fESDEvent = esdEvent;
-
}
//_____________________________________________________________________________
if (fESDFile) fESDFile->Close();
}
ResetStores();
+ delete fGeometryTransformer;
+ delete fTriggerCircuit;
}
//_____________________________________________________________________________
/// Deletes all the store objects that have been created and resets the pointers to 0x0
delete fTrackRefStore; fTrackRefStore = 0x0;
delete fRecoTrackRefStore; fRecoTrackRefStore = 0x0;
+ delete fRecoTriggerRefStore; fRecoTriggerRefStore = 0x0;
delete fRecoTrackStore; fRecoTrackStore = 0x0;
+ delete fRecoTriggerTrackStore; fRecoTriggerTrackStore = 0x0;
}
+//_____________________________________________________________________________
+Bool_t AliMUONRecoCheck::InitCircuit()
+{
+
+ if ( fTriggerCircuit ) return kTRUE;
+
+ if ( !AliMUONCDB::CheckOCDB() ) return kFALSE;
+
+ if ( !AliGeomManager::GetGeometry() )
+ AliGeomManager::LoadGeometry();
+
+ if ( !AliMpDDLStore::Instance(false) )
+ AliMpCDB::LoadDDLStore();
+
+ fGeometryTransformer = new AliMUONGeometryTransformer();
+ fGeometryTransformer->LoadGeometryData();
+
+ fTriggerCircuit = new AliMUONTriggerCircuit(fGeometryTransformer);
+
+ // reset tracker for local trigger to trigger track conversion
+ if ( ! AliMUONESDInterface::GetTracker() )
+ AliMUONESDInterface::ResetTracker();
+
+ return kTRUE;
+}
+
+
//_____________________________________________________________________________
Int_t AliMUONRecoCheck::GetRunNumber()
{
/// Return the run number of the current ESD event
- if (fESDEventOwner && fRecoTrackStore == 0x0) {
+ if (fESDEventOwner && fRecoTrackStore == 0x0 && fRecoTriggerTrackStore == 0x0) {
if (!fESDTree || fESDTree->GetEvent(fCurrentEvent) <= 0) {
AliError(Form("fails to read ESD object for event %d: cannot get the run number",fCurrentEvent));
return -1;
}
}
+
+//_____________________________________________________________________________
+AliMUONVTriggerTrackStore* AliMUONRecoCheck::TriggeredTracks(Int_t event)
+{
+ /// Return a track store containing the reconstructed trigger tracks (converted into
+ /// MUONTriggerTrack objects) for a given event.
+
+ if (!fESDEventOwner) {
+ if (fRecoTriggerTrackStore == 0x0) MakeTriggeredTracks();
+ return fRecoTriggerTrackStore;
+ }
+
+ if (event != fCurrentEvent) {
+ ResetStores();
+ fCurrentEvent = event;
+ }
+
+ if (fRecoTriggerTrackStore != 0x0) return fRecoTriggerTrackStore;
+ else {
+ if (!fESDTree) return 0x0;
+ if (fESDTree->GetEvent(event) <= 0) {
+ AliError(Form("fails to read ESD object for event %d", event));
+ return 0x0;
+ }
+ MakeTriggeredTracks();
+ return fRecoTriggerTrackStore;
+ }
+}
+
+
//_____________________________________________________________________________
AliMUONVTrackStore* AliMUONRecoCheck::TrackRefs(Int_t event)
{
}
}
+//_____________________________________________________________________________
+AliMUONVTriggerTrackStore* AliMUONRecoCheck::TriggerableTracks(Int_t event)
+{
+ /// Return a trigger track store containing the triggerable track references (converted into
+ /// AliMUONTriggerTrack objects) for a given event
+
+ if (!fESDEventOwner) {
+ if (fRecoTriggerRefStore == 0x0) MakeTriggerableTracks();
+ return fRecoTriggerRefStore;
+ }
+
+ if (event != fCurrentEvent) {
+ ResetStores();
+ fCurrentEvent = event;
+ }
+
+ if (fRecoTriggerRefStore != 0x0) return fRecoTriggerRefStore;
+ else {
+ if (!fMCEventHandler->GetEvent(event)) {
+ AliError(Form("fails to read MC objects for event %d", event));
+ return 0x0;
+ }
+ MakeTriggerableTracks();
+ return fRecoTriggerRefStore;
+ }
+}
+
+
//_____________________________________________________________________________
AliMUONVTrackStore* AliMUONRecoCheck::ReconstructibleTracks(Int_t event, UInt_t requestedStationMask, Bool_t request2ChInSameSt45)
{
}
}
+
//_____________________________________________________________________________
void AliMUONRecoCheck::MakeReconstructedTracks(Bool_t refit)
{
}
+
+//_____________________________________________________________________________
+void AliMUONRecoCheck::MakeTriggeredTracks()
+{
+ /// Make reconstructed trigger tracks
+ if (!(fRecoTriggerTrackStore = AliMUONESDInterface::NewTriggerTrackStore())) return;
+
+ AliMUONVTriggerStore* tmpTriggerStore = AliMUONESDInterface::NewTriggerStore();
+ if ( ! tmpTriggerStore ) return;
+
+ // loop over all reconstructed tracks and add them to the store (include ghosts)
+ Int_t nTracks = (Int_t) fESDEvent->GetNumberOfMuonTracks();
+ for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
+ AliESDMuonTrack* esdTrack = fESDEvent->GetMuonTrack(iTrack);
+ if (esdTrack->ContainTriggerData()) AliMUONESDInterface::Add(*esdTrack, *tmpTriggerStore);
+ }
+
+ if ( ! InitCircuit() ) return;
+
+ AliMUONVTrackReconstructor* tracker = AliMUONESDInterface::GetTracker();
+ tracker->EventReconstructTrigger(*fTriggerCircuit, *tmpTriggerStore, *fRecoTriggerTrackStore);
+
+ delete tmpTriggerStore;
+}
+
+//_____________________________________________________________________________
+void AliMUONRecoCheck::TriggerToTrack(const AliMUONLocalTrigger& locTrg, AliMUONTriggerTrack& triggerTrack)
+{
+ /// Make trigger track from local trigger info
+ if ( ! InitCircuit() ) return;
+ AliMUONVTrackReconstructor* tracker = AliMUONESDInterface::GetTracker();
+ tracker->TriggerToTrack(*fTriggerCircuit, locTrg, triggerTrack);
+}
+
+
//_____________________________________________________________________________
void AliMUONRecoCheck::MakeTrackRefs()
{
delete tmpTrackRefStore;
}
+//_____________________________________________________________________________
+void AliMUONRecoCheck::MakeTriggerableTracks()
+{
+ /// Make triggerable tracks
+ if (!(fRecoTriggerRefStore = AliMUONESDInterface::NewTriggerTrackStore()))
+ return;
+
+ Double_t x, y, z, slopeX, slopeY, pZ;
+ TParticle* particle;
+ TClonesArray* trackRefs;
+ Int_t nTrackRef = fMCEventHandler->MCEvent()->GetNumberOfTracks();
+
+ // loop over simulated tracks
+ for (Int_t iTrackRef = 0; iTrackRef < nTrackRef; ++iTrackRef) {
+ Int_t nHits = fMCEventHandler->GetParticleAndTR(iTrackRef, particle, trackRefs);
+
+ // skip empty trackRefs
+ if (nHits < 1) continue;
+
+ AliMUONTriggerTrack track;
+ Int_t hitsOnTrigger = 0;
+ Int_t currCh = -1;
+
+ // loop over simulated track hits
+ for (Int_t iHit = 0; iHit < nHits; ++iHit) {
+ AliTrackReference* trackReference = static_cast<AliTrackReference*>(trackRefs->UncheckedAt(iHit));
+
+ // skip trackRefs not in MUON
+ if (trackReference->DetectorId() != AliTrackReference::kMUON) continue;
+
+ // check chamberId of current trackReference
+ Int_t detElemId = trackReference->UserId();
+ Int_t chamberId = detElemId / 100 - 1;
+ if (chamberId < AliMUONConstants::NTrackingCh() || chamberId >= AliMUONConstants::NCh() ) continue;
+
+
+ if ( hitsOnTrigger == 0 ) {
+ // Get track parameters of current hit
+ x = trackReference->X();
+ y = trackReference->Y();
+ z = trackReference->Z();
+ pZ = trackReference->Pz();
+ slopeX = ( pZ == 0. ) ? 99999. : trackReference->Px() / pZ;
+ slopeY = ( pZ == 0. ) ? 99999. : trackReference->Py() / pZ;
+
+ track.SetX11(x);
+ track.SetY11(y);
+ track.SetZ11(z);
+ track.SetSlopeX(slopeX);
+ track.SetSlopeY(slopeY);
+ }
+
+ if ( currCh != chamberId ) {
+ hitsOnTrigger++;
+ currCh = chamberId;
+ }
+
+ } // loop on hits
+
+ if ( hitsOnTrigger >= 3 ){
+ // store the track
+ track.SetUniqueID(iTrackRef);
+ fRecoTriggerRefStore->Add(track);
+ }
+ }
+}
+
+
//_____________________________________________________________________________
void AliMUONRecoCheck::CleanMuonTrackRef(const AliMUONVTrackStore *tmpTrackRefStore)
{
}
+
+//_____________________________________________________________________________
+AliMUONTriggerTrack* AliMUONRecoCheck::FindCompatibleTrack(AliMUONTriggerTrack &track, const AliMUONVTriggerTrackStore &triggerTrackStore,
+ Double_t sigmaCut)
+{
+ /// Return the trigger track from the store matched with the given track (or 0x0).
+ /// Matching is done by comparing cluster/TrackRef positions.
+
+ AliMUONTriggerTrack *matchedTrack = 0x0;
+
+ // look for the corresponding simulated track if any
+ TIter next(triggerTrackStore.CreateIterator());
+ AliMUONTriggerTrack* track2;
+ while ( ( track2 = static_cast<AliMUONTriggerTrack*>(next()) ) ) {
+
+ // check compatibility
+ if (track.Match(*track2, sigmaCut)) {
+ matchedTrack = track2;
+ break;
+ }
+ }
+
+ return matchedTrack;
+
+}
+