X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MFT%2FAliMFTTrackerMU.cxx;h=40554a24050b278ff49db245fe0c2d06a66ee74d;hb=30bb0890ceab68d7517dd001d68c8b0578ef35cd;hp=80d794af88a989c3d410ce639290977731892945;hpb=e21f8bf58cea0e64959fdc655b5098da4e729d57;p=u%2Fmrichter%2FAliRoot.git diff --git a/MFT/AliMFTTrackerMU.cxx b/MFT/AliMFTTrackerMU.cxx index 80d794af88a..40554a24050 100644 --- a/MFT/AliMFTTrackerMU.cxx +++ b/MFT/AliMFTTrackerMU.cxx @@ -1,4 +1,4 @@ -/************************************************************************** +/************************************************************************* * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * @@ -29,15 +29,20 @@ #include "AliGeomManager.h" #include "AliESDEvent.h" #include "AliESDMuonTrack.h" -// #include "AliESDMuonGlobalTrack.h" +#include "AliESDMuonGlobalTrack.h" #include "AliMFTTrackerMU.h" #include "TMath.h" #include "AliRun.h" +#include "AliRunLoader.h" +#include "AliHeader.h" +#include "AliGenEventHeader.h" +#include "TArrayF.h" #include "AliMFT.h" #include "AliMUONTrackExtrap.h" #include "AliMUONTrack.h" #include "AliMUONESDInterface.h" #include "AliMuonForwardTrack.h" +#include "AliMUONConstants.h" ClassImp(AliMFTTrackerMU) @@ -60,9 +65,11 @@ AliMFTTrackerMU::AliMFTTrackerMU() : fMUONTrack(0), fCurrentTrack(0), fFinalBestCandidate(0), - fVertexErrorX(0.015), - fVertexErrorY(0.015), - fVertexErrorZ(0.010), + fXExtrapVertex(0), + fYExtrapVertex(0), + fZExtrapVertex(0), + fXExtrapVertexError(0), + fYExtrapVertexError(0), fBransonCorrection(kFALSE) { @@ -135,9 +142,9 @@ Int_t AliMFTTrackerMU::LoadClusters(TTree *cTree) { void AliMFTTrackerMU::UnloadClusters() { -// //-------------------------------------------------------------------- -// // This function unloads MFT clusters -// //-------------------------------------------------------------------- + //-------------------------------------------------------------------- + // This function unloads MFT clusters + //-------------------------------------------------------------------- for (Int_t iPlane=0; iPlane Clear("C"); @@ -167,15 +174,26 @@ Int_t AliMFTTrackerMU::Clusters2Tracks(AliESDEvent *event) { fESD = event; - // get the ITS primary vertex + fXExtrapVertex = 0; + fYExtrapVertex = 0; + fZExtrapVertex = 0; + fXExtrapVertexError = AliMFTConstants::fXVertexTolerance; + fYExtrapVertexError = AliMFTConstants::fYVertexTolerance; - Double_t vertex[3] = {0., 0., 0.}; + // Imposing a fixed primary vertex, in order to keep memory of its position. Taking the primary vertex would imply the risk + // of loosing memory of its position when passing from ESD to AOD, due to possible refitting const AliESDVertex* esdVert = fESD->GetVertex(); if (esdVert->GetNContributors() > 0 || !strcmp(esdVert->GetTitle(),"vertexer: smearMC")) { - esdVert->GetXYZ(vertex); - AliDebug(1,Form("found vertex (%e,%e,%e)",vertex[0],vertex[1],vertex[2])); + fXExtrapVertex = esdVert->GetX(); + fYExtrapVertex = esdVert->GetY(); + fZExtrapVertex = esdVert->GetZ(); + fXExtrapVertexError = TMath::Max(AliMFTConstants::fXVertexTolerance, esdVert->GetXRes()); + fYExtrapVertexError = TMath::Max(AliMFTConstants::fYVertexTolerance, esdVert->GetYRes()); + AliInfo(Form("Found ESD vertex from %d contributors (%f +/- %f, %f +/- %f, %f)", + esdVert->GetNContributors(),fXExtrapVertex,fXExtrapVertexError,fYExtrapVertex,fYExtrapVertexError,fZExtrapVertex)); } - + else GetVertexFromMC(); + //----------- Read ESD MUON tracks ------------------- Int_t nTracksMUON = event->GetNumberOfMuonTracks(); @@ -199,7 +217,13 @@ Int_t AliMFTTrackerMU::Clusters2Tracks(AliESDEvent *event) { if (fMUONTrack) delete fMUONTrack; fMUONTrack = new AliMUONTrack(); - AliMUONESDInterface::ESDToMUON(*esdTrack, *fMUONTrack, kTRUE); // last arguments should be kTRUE or kFALSE?? + AliMUONESDInterface::ESDToMUON(*esdTrack, *fMUONTrack, kFALSE); + + if (!fMUONTrack->GetTrackParamAtCluster()->First()) { + AliInfo("Skipping track, no parameters available!!!"); + iTrack++; + continue; + } // the track we are going to build, starting from fMUONTrack and adding the MFT clusters AliMuonForwardTrack *track = new ((*fCandidateTracks)[0]) AliMuonForwardTrack(); @@ -207,6 +231,14 @@ Int_t AliMFTTrackerMU::Clusters2Tracks(AliESDEvent *event) { track -> SetMCLabel(fMUONTrack->GetMCLabel()); track -> SetMatchTrigger(fMUONTrack->GetMatchTrigger()); + // track parameters linearly extrapolated from the first tracking station to the end of the absorber + AliMUONTrackParam trackParamEndOfAbsorber(*((AliMUONTrackParam*)(fMUONTrack->GetTrackParamAtCluster()->First()))); + AliMUONTrackExtrap::ExtrapToZCov(&trackParamEndOfAbsorber, AliMUONConstants::AbsZEnd()); // absorber extends from -90 to -503 cm + Double_t xEndOfAbsorber = trackParamEndOfAbsorber.GetNonBendingCoor(); + Double_t yEndOfAbsorber = trackParamEndOfAbsorber.GetBendingCoor(); + Double_t rAbsorber = TMath::Sqrt(xEndOfAbsorber*xEndOfAbsorber + yEndOfAbsorber*yEndOfAbsorber); + track -> SetRAtAbsorberEnd(rAbsorber); + //------------------------- NOW THE CYCLE OVER THE MFT PLANES STARTS --------------------------------------- for (Int_t iPlane=fNPlanesMFT-1; iPlane>=0; iPlane--) { /* *** do not reverse the order of this cycle!!! @@ -289,16 +321,20 @@ Int_t AliMFTTrackerMU::Clusters2Tracks(AliESDEvent *event) { //----------------------- Save the information to the AliESDMuonGlobalTrack object - newTrack -> EvalKinem(vertex[2]); // we evaluate the kinematics at the primary vertex + newTrack -> EvalKinem(AliMFTConstants::fZEvalKinem); AliDebug(2,"Creating a new Muon Global Track"); AliESDMuonGlobalTrack *myESDTrack = event->NewMuonGlobalTrack(); myESDTrack -> SetPxPyPz(newTrack->Px(), newTrack->Py(), newTrack->Pz()); + + myESDTrack -> SetLabel(newTrack->GetMCLabel()); myESDTrack -> SetChi2OverNdf(newTrack->GetChi2OverNdf()); myESDTrack -> SetCharge(newTrack->GetCharge()); myESDTrack -> SetMatchTrigger(newTrack->GetMatchTrigger()); + myESDTrack -> SetNMFTClusters(newTrack->GetNMFTClusters()); + myESDTrack -> SetNWrongMFTClustersMC(newTrack->GetNWrongClustersMC()); myESDTrack -> SetFirstTrackingPoint(newTrack->GetMFTCluster(0)->GetX(), newTrack->GetMFTCluster(0)->GetY(), newTrack->GetMFTCluster(0)->GetZ()); - myESDTrack -> SetXYAtVertex(newTrack->GetOffsetX(vertex[0], vertex[2]), newTrack->GetOffsetX(vertex[1], vertex[2])); + myESDTrack -> SetXYAtVertex(newTrack->GetOffsetX(0., AliMFTConstants::fZEvalKinem), newTrack->GetOffsetY(0., AliMFTConstants::fZEvalKinem)); myESDTrack -> SetRAtAbsorberEnd(newTrack->GetRAtAbsorberEnd()); myESDTrack -> SetChi2MatchTrigger(esdTrack->GetChi2MatchTrigger()); myESDTrack -> SetMuonClusterMap(esdTrack->GetMuonClusterMap()); @@ -306,6 +342,14 @@ Int_t AliMFTTrackerMU::Clusters2Tracks(AliESDEvent *event) { myESDTrack -> SetHitsPatternInTrigChTrk(esdTrack->GetHitsPatternInTrigChTrk()); myESDTrack -> Connected(esdTrack->IsConnected()); + ULong_t mftClusterPattern = 0; + for (Int_t iCluster=0; iClusterGetNMFTClusters(); iCluster++) { + AliMFTCluster *localCluster = newTrack->GetMFTCluster(iCluster); + mftClusterPattern |= 1 << localCluster->GetPlane(); + mftClusterPattern |= IsCorrectMatch(localCluster, newTrack->GetMCLabel()) << fNMaxPlanes+localCluster->GetPlane(); + } + myESDTrack -> SetMFTClusterPattern(mftClusterPattern); + //--------------------------------------------------------------------------------- } @@ -367,19 +411,16 @@ Int_t AliMFTTrackerMU::FindClusterInPlane(Int_t planeId) { currentParamBack = (*((AliMUONTrackParam*)(fMUONTrack->GetTrackParamAtCluster()->First()))); currentParamForResearchFront = currentParamFront; currentParamForResearchBack = currentParamBack; - Double_t xExtrap = gRandom->Gaus(0,fVertexErrorX); - Double_t yExtrap = gRandom->Gaus(0,fVertexErrorY); - Double_t zExtrap = gRandom->Gaus(0,fVertexErrorZ); if (fBransonCorrection) { - AliMUONTrackExtrap::ExtrapToVertex(¤tParamFront, xExtrap, yExtrap, zExtrap, fVertexErrorX, fVertexErrorY); - AliMUONTrackExtrap::ExtrapToVertex(¤tParamBack, xExtrap, yExtrap, zExtrap, fVertexErrorX, fVertexErrorY); + AliMUONTrackExtrap::ExtrapToVertex(¤tParamFront, fXExtrapVertex, fYExtrapVertex, fZExtrapVertex, fXExtrapVertexError, fYExtrapVertexError); + AliMUONTrackExtrap::ExtrapToVertex(¤tParamBack, fXExtrapVertex, fYExtrapVertex, fZExtrapVertex, fXExtrapVertexError, fYExtrapVertexError); } else { - AliMUONTrackExtrap::ExtrapToVertexWithoutBranson(¤tParamFront, zExtrap); - AliMUONTrackExtrap::ExtrapToVertexWithoutBranson(¤tParamBack, zExtrap); + AliMUONTrackExtrap::ExtrapToVertexWithoutBranson(¤tParamFront, fZExtrapVertex); + AliMUONTrackExtrap::ExtrapToVertexWithoutBranson(¤tParamBack, fZExtrapVertex); } - AliMUONTrackExtrap::ExtrapToVertex(¤tParamForResearchFront, xExtrap, yExtrap, zExtrap, fVertexErrorX, fVertexErrorY); - AliMUONTrackExtrap::ExtrapToVertex(¤tParamForResearchBack, xExtrap, yExtrap, zExtrap, fVertexErrorX, fVertexErrorY); + AliMUONTrackExtrap::ExtrapToVertex(¤tParamForResearchFront, fXExtrapVertex, fYExtrapVertex, fZExtrapVertex, fXExtrapVertexError, fYExtrapVertexError); + AliMUONTrackExtrap::ExtrapToVertex(¤tParamForResearchBack, fXExtrapVertex, fYExtrapVertex, fZExtrapVertex, fXExtrapVertexError, fYExtrapVertexError); } else { // MFT planes others than the last one: mult. scattering correction because of the upstream MFT planes is performed currentParamFront = (*((AliMUONTrackParam*)(fCurrentTrack->GetTrackParamAtCluster()->First()))); @@ -510,3 +551,50 @@ Double_t AliMFTTrackerMU::TryOneCluster(const AliMUONTrackParam &trackParam, Ali //========================================================================================================================================= +Bool_t AliMFTTrackerMU::IsCorrectMatch(AliMFTCluster *cluster, Int_t labelMC) { + + Bool_t result = kFALSE; + + // check if the cluster belongs to the correct MC track + + for (Int_t iTrack=0; iTrackGetNMCTracks(); iTrack++) { + if (cluster->GetMCLabel(iTrack)==labelMC) { + result = kTRUE; + break; + } + } + + return result; + +} + +//====================================================================================================================================== + +void AliMFTTrackerMU::GetVertexFromMC() { + + AliRunLoader *fRunLoader = AliRunLoader::Open("galice.root"); + if (!fRunLoader) { + AliError("no run loader found in file galice.root"); + return; + } + + fRunLoader->CdGAFile(); + fRunLoader->LoadgAlice(); + fRunLoader->LoadHeader(); + fRunLoader->GetEvent(gAlice->GetEvNumber()); + + TArrayF vtx(3); + fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(vtx); + + fXExtrapVertex = gRandom->Gaus(vtx[0], AliMFTConstants::fPrimaryVertexResX); + fYExtrapVertex = gRandom->Gaus(vtx[1], AliMFTConstants::fPrimaryVertexResY); + fZExtrapVertex = gRandom->Gaus(vtx[2], AliMFTConstants::fPrimaryVertexResZ); + fXExtrapVertexError = AliMFTConstants::fXVertexTolerance; + fYExtrapVertexError = AliMFTConstants::fYVertexTolerance; + AliInfo(Form("Set ESD vertex from MC (%f +/- %f, %f +/- %f, %f)", + fXExtrapVertex,fXExtrapVertexError,fYExtrapVertex,fYExtrapVertexError,fZExtrapVertex)); + +} + +//====================================================================================================================================== +