// ESD data. This is necessary since the track objects that are actually created
// during offline reconstruction are no longer stored to disk.
// - Artur Szostak <artursz@iafrica.com>
+// 25 Jan 2008:
+// Use the new ESDInterface to create MUON objects from ESD data
+// - Philippe Pillot
+//
#include "AliMUONRecoCheck.h"
-#include "AliMUONRawClusterV2.h"
#include "AliMUONTrack.h"
+#include "AliMUONVTrackStore.h"
+#include "AliMUONVCluster.h"
+#include "AliMUONVClusterStore.h"
#include "AliMUONConstants.h"
-#include "AliMUONTrackStoreV1.h"
-
+#include "AliMUONESDInterface.h"
+#include "AliMUONTrackParam.h"
#include "AliMCEventHandler.h"
#include "AliMCEvent.h"
#include "AliStack.h"
/// \endcond
//_____________________________________________________________________________
-AliMUONRecoCheck::AliMUONRecoCheck(Char_t *esdFileName, Char_t *pathSim)
+AliMUONRecoCheck::AliMUONRecoCheck(const Char_t *esdFileName, const Char_t *pathSim)
: TObject(),
fMCEventHandler(new AliMCEventHandler()),
fESDEvent(new AliESDEvent()),
fCurrentEvent(0),
fTrackRefStore(0x0),
fRecoTrackRefStore(0x0),
-fRecoTrackStore(0x0)
+fRecoTrackStore(0x0),
+fESDEventOwner(kTRUE)
{
/// Normal ctor
fESDEvent->ReadFromTree(fESDTree); // link fESDEvent to the tree
}
+//_____________________________________________________________________________
+AliMUONRecoCheck::AliMUONRecoCheck(AliESDEvent *esdEvent, AliMCEventHandler *mcEventHandler)
+: TObject(),
+fMCEventHandler(0),
+fESDEvent(0),
+fESDTree (0x0),
+fESDFile (0x0),
+fCurrentEvent(0),
+fTrackRefStore(0x0),
+fRecoTrackRefStore(0x0),
+fRecoTrackStore(0x0),
+fESDEventOwner(kFALSE)
+{
+ /// Normal ctor
+
+ // TrackRefs and Particules
+ fMCEventHandler = mcEventHandler;
+
+ // ESD MUON Tracks
+ fESDEvent = esdEvent;
+
+}
+
//_____________________________________________________________________________
AliMUONRecoCheck::~AliMUONRecoCheck()
{
/// Destructor
- delete fMCEventHandler;
- delete fESDEvent;
- if (fESDFile) fESDFile->Close();
+ if (fESDEventOwner) {
+ delete fMCEventHandler;
+ delete fESDEvent;
+ if (fESDFile) fESDFile->Close();
+ }
ResetStores();
}
Int_t AliMUONRecoCheck::NumberOfEvents() const
{
/// Return the number of events
- if (fESDTree) return fESDTree->GetEntries();
+ if (fESDEventOwner && fESDTree) return fESDTree->GetEntries();
return 0;
}
{
/// Return a track store containing the reconstructed tracks (converted into
/// MUONTrack objects) for a given event
+
+ if (!fESDEventOwner) {
+ MakeReconstructedTracks();
+ return fRecoTrackStore;
+ }
+
if (event != fCurrentEvent) {
ResetStores();
fCurrentEvent = event;
{
/// Return a track store containing the track references (converted into
/// MUONTrack objects) for a given event
+
+ if (!fESDEventOwner) {
+ MakeTrackRefs();
+ return fTrackRefStore;
+ }
+
if (event != fCurrentEvent) {
ResetStores();
fCurrentEvent = event;
AliMUONVTrackStore* AliMUONRecoCheck::ReconstructibleTracks(Int_t event)
{
/// Return a track store containing the reconstructible tracks for a given event
+
+ if (!fESDEventOwner) {
+ if (TrackRefs(event) == 0x0) return 0x0;
+ MakeReconstructibleTracks();
+ return fRecoTrackRefStore;
+ }
+
if (event != fCurrentEvent) {
ResetStores();
fCurrentEvent = event;
void AliMUONRecoCheck::MakeReconstructedTracks()
{
/// Make reconstructed tracks
- fRecoTrackStore = new AliMUONTrackStoreV1();
-
- Int_t nTracks = Int_t(fESDEvent->GetNumberOfMuonTracks());
+ if (!(fRecoTrackStore = AliMUONESDInterface::NewTrackStore())) return;
- // loop over all reconstructed tracks
+ // 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++) {
AliESDMuonTrack* esdTrack = fESDEvent->GetMuonTrack(iTrack);
-
- // copy ESD MUON track into standard MUON track
- AliMUONTrack track(*esdTrack);
-
- // add track to the store
- fRecoTrackStore->Add(track);
+ if (esdTrack->ContainTrackerData()) AliMUONESDInterface::Add(*esdTrack, *fRecoTrackStore);
}
}
void AliMUONRecoCheck::MakeTrackRefs()
{
/// Make reconstructible tracks
- AliMUONVTrackStore *tmpTrackRefStore = new AliMUONTrackStoreV1();
+ AliMUONVTrackStore *tmpTrackRefStore = AliMUONESDInterface::NewTrackStore();
+ if (!tmpTrackRefStore) return;
Double_t x, y, z, pX, pY, pZ, bendingSlope, nonBendingSlope, inverseBendingMomentum;
TParticle* particle;
TClonesArray* trackRefs;
Int_t nTrackRef = fMCEventHandler->MCEvent()->GetNumberOfTracks();
+ AliMUONVClusterStore* cStore = AliMUONESDInterface::NewClusterStore();
+ if (!cStore) return;
+ AliMUONVCluster* hit = cStore->CreateCluster(0,0,0);
// loop over simulated tracks
for (Int_t iTrackRef = 0; iTrackRef < nTrackRef; ++iTrackRef) {
// get the particle charge for further calculation
TParticlePDG* ppdg = particle->GetPDG();
- Int_t charge = (Int_t)(ppdg->Charge()/3.0);
+ Int_t charge = ppdg != NULL ? (Int_t)(ppdg->Charge()/3.0) : 0;
AliMUONTrack track;
pZ = trackReference->Pz();
// check chamberId of current trackReference
- Int_t chamberId = AliMUONConstants::ChamberNumber(z);
+ Int_t detElemId = trackReference->UserId();
+ Int_t chamberId = detElemId / 100 - 1;
if (chamberId < 0 || chamberId >= AliMUONConstants::NTrackingCh()) continue;
// set hit parameters
- AliMUONRawClusterV2 hit(chamberId, 0, 0);
- hit.SetXYZ(x,y,z);
- hit.SetErrXY(0.,0.);
+ hit->SetUniqueID(AliMUONVCluster::BuildUniqueID(chamberId, detElemId, iHit));
+ hit->SetXYZ(x,y,z);
+ hit->SetErrXY(0.,0.);
// compute track parameters at hit
- Double_t bendingSlope = 0;
- Double_t nonBendingSlope = 0;
- Double_t inverseBendingMomentum = 0;
+ bendingSlope = 0;
+ nonBendingSlope = 0;
+ inverseBendingMomentum = 0;
if (TMath::Abs(pZ) > 0) {
bendingSlope = pY/pZ;
nonBendingSlope = pX/pZ;
trackParam.SetInverseBendingMomentum(inverseBendingMomentum);
// add track parameters at current hit to the track
- track.AddTrackParamAtCluster(trackParam,hit,kTRUE);
+ track.AddTrackParamAtCluster(trackParam, *hit, kTRUE);
}
// if none of the track hits was in MUON, goto the next track
// add track parameters at vertex
track.SetTrackParamAtVertex(&trackParamAtVertex);
- // sort trackParamAtCluster and store the track
- track.GetTrackParamAtCluster()->Sort();
- track.SetTrackID(iTrackRef);
+ // store the track
+ track.SetUniqueID(iTrackRef);
tmpTrackRefStore->Add(track);
}
CleanMuonTrackRef(tmpTrackRefStore);
+ delete hit;
+ delete cStore;
delete tmpTrackRefStore;
}
/// Re-calculate hits parameters because two AliTrackReferences are recorded for
/// each chamber (one when particle is entering + one when particle is leaving
/// the sensitive volume)
- fTrackRefStore = new AliMUONTrackStoreV1();
+ if (!(fTrackRefStore = AliMUONESDInterface::NewTrackStore())) return;
Double_t maxGasGap = 1.; // cm
Double_t x, y, z, pX, pY, pZ, x1, y1, z1, pX1, pY1, pZ1, z2;
Double_t bendingSlope,nonBendingSlope,inverseBendingMomentum;
+ AliMUONVClusterStore* cStore = AliMUONESDInterface::NewClusterStore();
+ if (!cStore) return;
+ AliMUONVCluster* hit = cStore->CreateCluster(0,0,0);
// create iterator
TIter next(tmpTrackRefStore->CreateIterator());
inverseBendingMomentum *= trackParam1->GetCharge();
// set hit parameters
- AliMUONRawClusterV2 hit(trackParam1->GetClusterPtr()->GetChamberId(), 0, 0);
- hit.SetXYZ(x,y,z);
- hit.SetErrXY(0.,0.);
+ hit->SetUniqueID(trackParam1->GetClusterPtr()->GetUniqueID());
+ hit->SetXYZ(x,y,z);
+ hit->SetErrXY(0.,0.);
// set new track parameters at new hit
AliMUONTrackParam trackParam;
trackParam.SetInverseBendingMomentum(inverseBendingMomentum);
// add track parameters at current hit to the track
- newTrack.AddTrackParamAtCluster(trackParam,hit,kTRUE);
+ newTrack.AddTrackParamAtCluster(trackParam, *hit, kTRUE);
iHit1++;
}
- newTrack.GetTrackParamAtCluster()->Sort();
- newTrack.SetTrackID(track->GetTrackID());
+ newTrack.SetUniqueID(track->GetUniqueID());
newTrack.SetTrackParamAtVertex(track->GetTrackParamAtVertex());
fTrackRefStore->Add(newTrack);
}
+ delete hit;
+ delete cStore;
}
//_____________________________________________________________________________
void AliMUONRecoCheck::MakeReconstructibleTracks()
{
/// Isolate the reconstructible tracks
- fRecoTrackRefStore = new AliMUONTrackStoreV1();
+ if (!(fRecoTrackRefStore = AliMUONESDInterface::NewTrackStore())) return;
// create iterator on trackRef
TIter next(fTrackRefStore->CreateIterator());