From: ivana Date: Wed, 14 Mar 2007 08:32:56 +0000 (+0000) Subject: - We now save in MUON ESD both track parameters extrapolated to vertex X-Git-Url: http://git.uio.no/git/?a=commitdiff_plain;ds=sidebyside;h=22ccc301830030c79561e58f6a0cf62f073b8d05;p=u%2Fmrichter%2FAliRoot.git - We now save in MUON ESD both track parameters extrapolated to vertex (corrected for multiple scattering and energy loss in absorber) and track parameters at first station (uncorrected). - Useless constraints in the search for track candidates have been removed. - Warning from AliMUONDigitizerV3 have been fixed. (Philippe P.) --- diff --git a/MUON/AliMUONDigitizerV3.cxx b/MUON/AliMUONDigitizerV3.cxx index bab54b33a7d..8a9132471f5 100644 --- a/MUON/AliMUONDigitizerV3.cxx +++ b/MUON/AliMUONDigitizerV3.cxx @@ -708,8 +708,6 @@ AliMUONDigitizerV3::Init() } AliDebug(2,Form("fOutputData=%p",fOutputData)); - AliRunLoader* runLoader = fOutputData->GetLoader()->GetRunLoader(); - AliRun* galice = runLoader->GetAliRun(); Int_t runnumber = AliCDBManager::Instance()->GetRun(); fCalibrationData = new AliMUONCalibrationData(runnumber); diff --git a/MUON/AliMUONReconstructor.cxx b/MUON/AliMUONReconstructor.cxx index 6c01d109252..7bf15bebf07 100644 --- a/MUON/AliMUONReconstructor.cxx +++ b/MUON/AliMUONReconstructor.cxx @@ -475,15 +475,14 @@ void AliMUONReconstructor::FillESD(AliRunLoader* runLoader, AliESD* esd) const // declaration Int_t iEvent;// nPart; Int_t nTrackHits;// nPrimary; - Double_t fitFmin; - - Double_t bendingSlope, nonBendingSlope, inverseBendingMomentum; - Double_t xRec, yRec, zRec, chi2MatchTrigger; + Double_t fitFmin, chi2MatchTrigger; + Double_t xRec, yRec, zRec, bendingSlope, nonBendingSlope, inverseBendingMomentum; + Double_t xVtx, yVtx, zVtx, bendingSlopeAtVtx, nonBendingSlopeAtVtx, inverseBendingMomentumAtVtx; Bool_t matchTrigger; // setting pointer for tracks, triggertracks & trackparam at vertex AliMUONTrack* recTrack = 0; - AliMUONTrackParam trackParam; + AliMUONTrackParam trackParamAtVtx; AliMUONTriggerTrack* recTriggerTrack = 0; iEvent = runLoader->GetEventNumber(); @@ -526,37 +525,53 @@ void AliMUONReconstructor::FillESD(AliRunLoader* runLoader, AliESD* esd) const // reading info from tracks recTrack = (AliMUONTrack*) recTracksArray->At(iRecTracks); - - trackParam = *((AliMUONTrackParam*) (recTrack->GetTrackParamAtHit())->First()); + AliMUONTrackParam *trackParam = (AliMUONTrackParam*) (recTrack->GetTrackParamAtHit())->First(); + trackParamAtVtx = *trackParam; - // extrapolate to the vertex if required - // if the vertex is not available, extrapolate to (0,0,0) - if (!strstr(GetOption(),"NoExtrapToVtx")) { - if (esdVert->GetNContributors()) - AliMUONTrackExtrap::ExtrapToVertex(&trackParam, vertex[0],vertex[1],vertex[2]); - else - AliMUONTrackExtrap::ExtrapToVertex(&trackParam, 0.,0.,0.); - } + // extrapolate to the vertex if available, else to (0,0,0) + if (esdVert->GetNContributors()) + AliMUONTrackExtrap::ExtrapToVertex(&trackParamAtVtx, vertex[0],vertex[1],vertex[2]); + else + AliMUONTrackExtrap::ExtrapToVertex(&trackParamAtVtx, 0.,0.,0.); - bendingSlope = trackParam.GetBendingSlope(); - nonBendingSlope = trackParam.GetNonBendingSlope(); - inverseBendingMomentum = trackParam.GetInverseBendingMomentum(); - xRec = trackParam.GetNonBendingCoor(); - yRec = trackParam.GetBendingCoor(); - zRec = trackParam.GetZ(); - + // Track parameters at first station + bendingSlope = trackParam->GetBendingSlope(); + nonBendingSlope = trackParam->GetNonBendingSlope(); + inverseBendingMomentum = trackParam->GetInverseBendingMomentum(); + xRec = trackParam->GetNonBendingCoor(); + yRec = trackParam->GetBendingCoor(); + zRec = trackParam->GetZ(); + + // Track parameters at vertex + bendingSlopeAtVtx = trackParamAtVtx.GetBendingSlope(); + nonBendingSlopeAtVtx = trackParamAtVtx.GetNonBendingSlope(); + inverseBendingMomentumAtVtx = trackParamAtVtx.GetInverseBendingMomentum(); + xVtx = trackParamAtVtx.GetNonBendingCoor(); + yVtx = trackParamAtVtx.GetBendingCoor(); + zVtx = trackParamAtVtx.GetZ(); + + // Global info nTrackHits = recTrack->GetNTrackHits(); fitFmin = recTrack->GetFitFMin(); matchTrigger = recTrack->GetMatchTrigger(); chi2MatchTrigger = recTrack->GetChi2MatchTrigger(); // setting data member of ESD MUON - theESDTrack->SetInverseBendingMomentum(inverseBendingMomentum); - theESDTrack->SetThetaX(TMath::ATan(nonBendingSlope)); - theESDTrack->SetThetaY(TMath::ATan(bendingSlope)); - theESDTrack->SetZ(zRec); - theESDTrack->SetBendingCoor(yRec); // calculate vertex at ESD or Tracking level ? - theESDTrack->SetNonBendingCoor(xRec); + // at first station + theESDTrack->SetInverseBendingMomentumUncorrected(inverseBendingMomentum); + theESDTrack->SetThetaXUncorrected(TMath::ATan(nonBendingSlope)); + theESDTrack->SetThetaYUncorrected(TMath::ATan(bendingSlope)); + theESDTrack->SetZUncorrected(zRec); + theESDTrack->SetBendingCoorUncorrected(yRec); + theESDTrack->SetNonBendingCoorUncorrected(xRec); + // at vertex + theESDTrack->SetInverseBendingMomentum(inverseBendingMomentumAtVtx); + theESDTrack->SetThetaX(TMath::ATan(nonBendingSlopeAtVtx)); + theESDTrack->SetThetaY(TMath::ATan(bendingSlopeAtVtx)); + theESDTrack->SetZ(zVtx); + theESDTrack->SetBendingCoor(yVtx); + theESDTrack->SetNonBendingCoor(xVtx); + // global info theESDTrack->SetChi2(fitFmin); theESDTrack->SetNHit(nTrackHits); theESDTrack->SetMatchTrigger(matchTrigger); diff --git a/MUON/AliMUONTrackParam.cxx b/MUON/AliMUONTrackParam.cxx index 5e96a4dbe61..b11809ed58b 100644 --- a/MUON/AliMUONTrackParam.cxx +++ b/MUON/AliMUONTrackParam.cxx @@ -25,14 +25,15 @@ // /////////////////////////////////////////////////// -#include -#include -#include - #include "AliMUONTrackParam.h" +#include "AliMUONHitForRec.h" + #include "AliESDMuonTrack.h" #include "AliLog.h" -#include "AliMUONHitForRec.h" + +#include +#include +#include /// \cond CLASSIMP ClassImp(AliMUONTrackParam) // Class implementation in ROOT context @@ -149,10 +150,34 @@ void AliMUONTrackParam::SetParamFor(AliESDMuonTrack& esdMuonTrack) esdMuonTrack.SetNonBendingCoor(fNonBendingCoor); } + //_________________________________________________________________________ +void AliMUONTrackParam::GetParamFromUncorrected(const AliESDMuonTrack& esdMuonTrack) +{ + /// assigned value form ESD track. + fInverseBendingMomentum = esdMuonTrack.GetInverseBendingMomentumUncorrected(); + fBendingSlope = TMath::Tan(esdMuonTrack.GetThetaYUncorrected()); + fNonBendingSlope = TMath::Tan(esdMuonTrack.GetThetaXUncorrected()); + fZ = esdMuonTrack.GetZUncorrected(); + fBendingCoor = esdMuonTrack.GetBendingCoorUncorrected(); + fNonBendingCoor = esdMuonTrack.GetNonBendingCoorUncorrected(); +} + + //_________________________________________________________________________ +void AliMUONTrackParam::SetParamForUncorrected(AliESDMuonTrack& esdMuonTrack) +{ + /// assigned value form ESD track. + esdMuonTrack.SetInverseBendingMomentumUncorrected(fInverseBendingMomentum); + esdMuonTrack.SetThetaXUncorrected(TMath::ATan(fNonBendingSlope)); + esdMuonTrack.SetThetaYUncorrected(TMath::ATan(fBendingSlope)); + esdMuonTrack.SetZUncorrected(fZ); + esdMuonTrack.SetBendingCoorUncorrected(fBendingCoor); + esdMuonTrack.SetNonBendingCoorUncorrected(fNonBendingCoor); +} + //__________________________________________________________________________ Double_t AliMUONTrackParam::Px() const { - /// return px from track paramaters + /// return p_x from track parameters Double_t pYZ, pZ, pX; pYZ = 0; if ( TMath::Abs(fInverseBendingMomentum) > 0 ) @@ -165,7 +190,7 @@ Double_t AliMUONTrackParam::Px() const //__________________________________________________________________________ Double_t AliMUONTrackParam::Py() const { - /// return px from track paramaters + /// return p_y from track parameters Double_t pYZ, pZ, pY; pYZ = 0; if ( TMath::Abs(fInverseBendingMomentum) > 0 ) @@ -178,7 +203,7 @@ Double_t AliMUONTrackParam::Py() const //__________________________________________________________________________ Double_t AliMUONTrackParam::Pz() const { - /// return px from track paramaters + /// return p_z from track parameters Double_t pYZ, pZ; pYZ = 0; if ( TMath::Abs(fInverseBendingMomentum) > 0 ) @@ -190,7 +215,7 @@ Double_t AliMUONTrackParam::Pz() const //__________________________________________________________________________ Double_t AliMUONTrackParam::P() const { - /// return p from track paramaters + /// return p from track parameters Double_t pYZ, pZ, p; pYZ = 0; if ( TMath::Abs(fInverseBendingMomentum) > 0 ) diff --git a/MUON/AliMUONTrackParam.h b/MUON/AliMUONTrackParam.h index bbf082efdf1..9707985e9b0 100644 --- a/MUON/AliMUONTrackParam.h +++ b/MUON/AliMUONTrackParam.h @@ -31,6 +31,8 @@ class AliMUONTrackParam : public TObject void GetParamFrom(const AliESDMuonTrack& esdMuonTrack); void SetParamFor(AliESDMuonTrack& esdMuonTrack); + void GetParamFromUncorrected(const AliESDMuonTrack& esdMuonTrack); + void SetParamForUncorrected(AliESDMuonTrack& esdMuonTrack); // Get and Set methods for data /// return inverse bending momentum (GeV/c ** -1) times the charge (assumed forward motion) diff --git a/MUON/AliMUONVTrackReconstructor.cxx b/MUON/AliMUONVTrackReconstructor.cxx index cc925a26102..c9525125d3f 100644 --- a/MUON/AliMUONVTrackReconstructor.cxx +++ b/MUON/AliMUONVTrackReconstructor.cxx @@ -74,8 +74,6 @@ AliMUONVTrackReconstructor::AliMUONVTrackReconstructor(AliMUONData* data) fBendingVertexDispersion(fgkDefaultBendingVertexDispersion), fNonBendingVertexDispersion(fgkDefaultNonBendingVertexDispersion), fMaxNormChi2MatchTrigger(fgkDefaultMaxNormChi2MatchTrigger), - fSegmentMaxDistBending(0x0), - fSegmentMaxDistNonBending(0x0), fHitsForRecPtr(0x0), fNHitsForRec(0), fNHitsForRecPerChamber(0x0), @@ -87,13 +85,9 @@ AliMUONVTrackReconstructor::AliMUONVTrackReconstructor(AliMUONData* data) fTriggerCircuit(0x0) { /// Constructor for class AliMUONVTrackReconstructor - fSegmentMaxDistBending = new Double_t[AliMUONConstants::NTrackingSt()]; - fSegmentMaxDistNonBending = new Double_t[AliMUONConstants::NTrackingSt()]; fNHitsForRecPerChamber = new Int_t[AliMUONConstants::NTrackingCh()]; fIndexOfFirstHitForRecPerChamber = new Int_t[AliMUONConstants::NTrackingCh()]; - SetReconstructionParametersToDefaults(); - // Memory allocation for the TClonesArray of hits for reconstruction // Is 10000 the right size ???? fHitsForRecPtr = new TClonesArray("AliMUONHitForRec", 10000); @@ -108,50 +102,18 @@ AliMUONVTrackReconstructor::AliMUONVTrackReconstructor(AliMUONData* data) AliMUONVTrackReconstructor::~AliMUONVTrackReconstructor(void) { /// Destructor for class AliMUONVTrackReconstructor - delete [] fSegmentMaxDistBending; - delete [] fSegmentMaxDistNonBending; delete [] fNHitsForRecPerChamber; delete [] fIndexOfFirstHitForRecPerChamber; delete fTriggerTrack; delete fHitsForRecPtr; } - //__________________________________________________________________________ -void AliMUONVTrackReconstructor::SetReconstructionParametersToDefaults(void) -{ - /// Set reconstruction parameters for making segments to default values - // Would be much more convenient with a structure (or class) ???? - - // ******** Parameters for making segments - // should be parametrized ???? - // according to interval between chambers in a station ???? - // Maximum distance in non bending plane - // 5 * 0.22 just to remember the way it was made in TRACKF_STAT - // SIGCUT*DYMAX(IZ) - for (Int_t st = 0; st < AliMUONConstants::NTrackingSt(); st++) - fSegmentMaxDistNonBending[st] = 5. * 0.22; - // Maximum distance in bending plane: - // values from TRACKF_STAT, corresponding to (J psi 20cm), - // scaled to the real distance between chambers in a station - fSegmentMaxDistBending[0] = TMath::Abs( 1.5 * - (AliMUONConstants::DefaultChamberZ(1) - AliMUONConstants::DefaultChamberZ(0)) / 20.0); - fSegmentMaxDistBending[1] = TMath::Abs( 1.5 * - (AliMUONConstants::DefaultChamberZ(3) - AliMUONConstants::DefaultChamberZ(2)) / 20.0); - fSegmentMaxDistBending[2] = TMath::Abs( 3.0 * - (AliMUONConstants::DefaultChamberZ(5) - AliMUONConstants::DefaultChamberZ(4)) / 20.0); - fSegmentMaxDistBending[3] = TMath::Abs( 6.0 * - (AliMUONConstants::DefaultChamberZ(7) - AliMUONConstants::DefaultChamberZ(6)) / 20.0); - fSegmentMaxDistBending[4] = TMath::Abs( 6.0 * - (AliMUONConstants::DefaultChamberZ(9) - AliMUONConstants::DefaultChamberZ(8)) / 20.0); - - return; -} - //__________________________________________________________________________ void AliMUONVTrackReconstructor::EventReconstruct(void) { - // To reconstruct one event + /// To reconstruct one event AliDebug(1,"Enter EventReconstruct"); + ResetTracks(); //AZ ResetHitsForRec(); //AZ AddHitsForRecFromRawClusters(); @@ -230,8 +192,7 @@ TClonesArray* AliMUONVTrackReconstructor::MakeSegmentsInStation(Int_t station) AliMUONHitForRec *hit1Ptr, *hit2Ptr; AliMUONObjectPair *segment; - Double_t bendingSlope, distBend, distNonBend, extBendCoor, extNonBendCoor, extrapFact; - Double_t impactParam = 0., bendingMomentum = 0.; // to avoid compilation warning + Double_t bendingSlope = 0, impactParam = 0., bendingMomentum = 0.; // to avoid compilation warning // first and second chambers (0...) in the station Int_t ch1 = 2 * station; Int_t ch2 = ch1 + 1; @@ -243,24 +204,14 @@ TClonesArray* AliMUONVTrackReconstructor::MakeSegmentsInStation(Int_t station) hit1++) { // pointer to the HitForRec hit1Ptr = (AliMUONHitForRec*) ((*fHitsForRecPtr)[hit1]); - // extrapolation, on the straight line joining the HitForRec to the vertex (0,0,0), - // to the Z of the HitForRec in the second chamber of the station // Loop over HitsForRec's in the second chamber of the station for (Int_t hit2 = fIndexOfFirstHitForRecPerChamber[ch2]; hit2 < fIndexOfFirstHitForRecPerChamber[ch2] + fNHitsForRecPerChamber[ch2]; hit2++) { // pointer to the HitForRec hit2Ptr = (AliMUONHitForRec*) ((*fHitsForRecPtr)[hit2]); - // absolute values of distances, in bending and non bending planes, - // between the HitForRec in the second chamber - // and the previous extrapolation - extrapFact = hit2Ptr->GetZ()/ hit1Ptr->GetZ(); - extBendCoor = extrapFact * hit1Ptr->GetBendingCoor(); - extNonBendCoor = extrapFact * hit1Ptr->GetNonBendingCoor(); - distBend = TMath::Abs(hit2Ptr->GetBendingCoor() - extBendCoor); - distNonBend = TMath::Abs(hit2Ptr->GetNonBendingCoor() - extNonBendCoor); - // bending slope if ( hit1Ptr->GetZ() - hit2Ptr->GetZ() != 0. ) { + // bending slope bendingSlope = (hit1Ptr->GetBendingCoor() - hit2Ptr->GetBendingCoor()) / (hit1Ptr->GetZ() - hit2Ptr->GetZ()); // impact parameter impactParam = hit1Ptr->GetBendingCoor() - hit1Ptr->GetZ() * bendingSlope; @@ -270,18 +221,12 @@ TClonesArray* AliMUONVTrackReconstructor::MakeSegmentsInStation(Int_t station) AliWarning("hit1Ptr->GetZ() = hit2Ptr->GetZ(): no segment created"); continue; } - // check for distances not too large, - // and impact parameter not too big if stations downstream of the dipole. - // Conditions "distBend" and "impactParam" correlated for these stations ???? - if ((distBend < fSegmentMaxDistBending[station]) && (distNonBend < fSegmentMaxDistNonBending[station]) && - (bendingMomentum < fMaxBendingMomentum) && (bendingMomentum > fMinBendingMomentum)) { + // check for bending momentum within tolerances + if ((bendingMomentum < fMaxBendingMomentum) && (bendingMomentum > fMinBendingMomentum)) { // make new segment segment = new ((*segments)[segments->GetLast()+1]) AliMUONObjectPair(hit1Ptr, hit2Ptr, kFALSE, kFALSE); if (AliLog::GetGlobalDebugLevel() > 1) { - cout << "segmentIndex(0...): " << segments->GetLast() - << " distBend: " << distBend - << " distNonBend: " << distNonBend - << endl; + cout << "segmentIndex(0...): " << segments->GetLast() << endl; segment->Dump(); cout << "HitForRec in first chamber" << endl; hit1Ptr->Dump(); diff --git a/MUON/AliMUONVTrackReconstructor.h b/MUON/AliMUONVTrackReconstructor.h index 6b645123e21..280894a5207 100644 --- a/MUON/AliMUONVTrackReconstructor.h +++ b/MUON/AliMUONVTrackReconstructor.h @@ -76,9 +76,6 @@ class AliMUONVTrackReconstructor : public TObject { Double_t fNonBendingVertexDispersion; ///< vextex dispersion (cm) in non bending plane Double_t fMaxNormChi2MatchTrigger; ///< maximum normalized chi2 of tracking/trigger track matching - Double_t* fSegmentMaxDistBending; ///< maximum distance (cm) for segments in bending plane - Double_t* fSegmentMaxDistNonBending; ///< maximum distance (cm) for segments in non bending plane - TClonesArray* fHitsForRecPtr; ///< pointer to the array of hits for reconstruction Int_t fNHitsForRec; ///< number of hits for reconstruction Int_t* fNHitsForRecPerChamber; ///< number of HitsForRec @@ -112,8 +109,6 @@ class AliMUONVTrackReconstructor : public TObject { TClonesArray* fTriggerCircuit; //!< trigger circuit array // Functions - void SetReconstructionParametersToDefaults(void); - void ResetTracks(void); void ResetHitsForRec(void); diff --git a/MUON/DecodeRecoCocktail.C b/MUON/DecodeRecoCocktail.C index 28bc28bea0e..063d3637e14 100644 --- a/MUON/DecodeRecoCocktail.C +++ b/MUON/DecodeRecoCocktail.C @@ -38,6 +38,7 @@ #include #include "AliMUONTrackLight.h" #include "AliMUONPairLight.h" +#include "AliMUONTrackExtrap.h" void DecodeRecoCocktail(char* dirname=".", char* outFileName = "MuonLight.root"){ const char *startingDir = gSystem->pwd(); @@ -75,13 +76,14 @@ void DecodeRecoCocktail(char* dirname=".", char* outFileName = "MuonLight.root") // assign parameters concerning the reconstructed tracks AliMUONTrack *trackReco = (AliMUONTrack *)trackRecoArray->At(itrRec); AliMUONTrackLight muLight; - AliMUONTrackParam *trPar = trackReco->GetTrackParamAtVertex(); - muLight.SetCharge(Int_t(TMath::Sign(1.,trPar->GetInverseBendingMomentum()))); - muLight.SetPxPyPz(trPar->Px(),trPar->Py(), trPar->Pz()); + AliMUONTrackParam trPar(*((AliMUONTrackParam*) (trackReco->GetTrackParamAtHit()->First()))); + AliMUONTrackExtrap::ExtrapToVertex(&trPar,0.,0.,0.); + muLight.SetCharge(Int_t(TMath::Sign(1.,trPar.GetInverseBendingMomentum()))); + muLight.SetPxPyPz(trPar.Px(),trPar.Py(), trPar.Pz()); muLight.SetTriggered(trackReco->GetMatchTrigger()); - Double_t xyz[3] = { trPar->GetNonBendingCoor(), - trPar->GetBendingCoor(), - trPar->GetZ()}; + Double_t xyz[3] = { trPar.GetNonBendingCoor(), + trPar.GetBendingCoor(), + trPar.GetZ()}; muLight.SetVertex(xyz); // find the reference track and store further information TParticle *part = muLight.FindRefTrack(trackReco,trackRefArray,runLoader); diff --git a/MUON/MUONefficiency.C b/MUON/MUONefficiency.C index 16cb5763571..609b1ac1b59 100644 --- a/MUON/MUONefficiency.C +++ b/MUON/MUONefficiency.C @@ -175,7 +175,6 @@ Bool_t MUONefficiency( Int_t ExtrapToVertex = -1, Int_t ResType = 553, Int_t Fir Double_t fYVertex=0; Double_t fZVertex=0; - Double_t thetaX, thetaY, pYZ; Double_t fPxRec1, fPyRec1, fPzRec1, fE1; Double_t fPxRec2, fPyRec2, fPzRec2, fE2; Int_t fCharge1, fCharge2; @@ -342,11 +341,11 @@ Bool_t MUONefficiency( Int_t ExtrapToVertex = -1, Int_t ResType = 553, Int_t Fir // extrapolate to vertex if required and available if (ExtrapToVertex > 0 && Vertex->GetNContributors()) { - trackParam.GetParamFrom(*muonTrack); + trackParam.GetParamFromUncorrected(*muonTrack); AliMUONTrackExtrap::ExtrapToVertex(&trackParam, fXVertex, fYVertex, fZVertex); trackParam.SetParamFor(*muonTrack); // put the new parameters in this copy of AliESDMuonTrack } else if ((ExtrapToVertex > 0 && !Vertex->GetNContributors()) || ExtrapToVertex == 0){ - trackParam.GetParamFrom(*muonTrack); + trackParam.GetParamFromUncorrected(*muonTrack); AliMUONTrackExtrap::ExtrapToVertex(&trackParam, 0., 0., 0.); trackParam.SetParamFor(*muonTrack); // put the new parameters in this copy of AliESDMuonTrack } @@ -359,17 +358,9 @@ Bool_t MUONefficiency( Int_t ExtrapToVertex = -1, Int_t ResType = 553, Int_t Fir else track1TriggerChi2 = 0. ; - thetaX = muonTrack->GetThetaX(); - thetaY = muonTrack->GetThetaY(); - - pYZ = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum()); - fPzRec1 = - pYZ / TMath::Sqrt(1.0 + TMath::Tan(thetaY)*TMath::Tan(thetaY)); - fPxRec1 = fPzRec1 * TMath::Tan(thetaX); - fPyRec1 = fPzRec1 * TMath::Tan(thetaY); fCharge1 = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum())); - fE1 = TMath::Sqrt(MUON_MASS * MUON_MASS + fPxRec1 * fPxRec1 + fPyRec1 * fPyRec1 + fPzRec1 * fPzRec1); - fV1.SetPxPyPzE(fPxRec1, fPyRec1, fPzRec1, fE1); + muonTrack->LorentzP(fV1); ntrackhits = muonTrack->GetNHit(); fitfmin = muonTrack->GetChi2(); @@ -386,7 +377,7 @@ Bool_t MUONefficiency( Int_t ExtrapToVertex = -1, Int_t ResType = 553, Int_t Fir // chi2 per d.o.f. Float_t ch1 = fitfmin / (2.0 * ntrackhits - 5); - if (PRINTLEVEL > 5 ) printf(" px %f py %f pz %f pt %f NHits %d Norm.chi2 %f charge %d\n",fPxRec1, fPyRec1, fPzRec1, pt1, ntrackhits, ch1, fCharge1); + if (PRINTLEVEL > 5 ) printf(" px %f py %f pz %f pt %f NHits %d Norm.chi2 %f charge %d\n",fV1.Px(), fV1.Py(), fV1.Pz(), pt1, ntrackhits, ch1, fCharge1); if ((ch1 < Chi2Cut) && (pt1 > PtCutMin) && (pt1 < PtCutMax)) { // condition for good track (Chi2Cut and PtCut) @@ -400,10 +391,10 @@ Bool_t MUONefficiency( Int_t ExtrapToVertex = -1, Int_t ResType = 553, Int_t Fir if (fCharge1 > 0) { hPtMuonPlus->Fill(pt1); - hThetaPhiPlus->Fill(TMath::ATan2(fPyRec1,fPxRec1)*180./TMath::Pi(),TMath::ATan2(pt1,fPzRec1)*180./3.1415); + hThetaPhiPlus->Fill(fV1.Phi()*180./TMath::Pi(),fV1.Theta()*180./TMath::Pi()); } else { hPtMuonMinus->Fill(pt1); - hThetaPhiMinus->Fill(TMath::ATan2(fPyRec1,fPxRec1)*180./TMath::Pi(),TMath::ATan2(pt1,fPzRec1)*180./3.1415); + hThetaPhiMinus->Fill(fV1.Phi()*180./TMath::Pi(),fV1.Theta()*180./TMath::Pi()); } // loop over second track of combination @@ -413,11 +404,11 @@ Bool_t MUONefficiency( Int_t ExtrapToVertex = -1, Int_t ResType = 553, Int_t Fir // extrapolate to vertex if required and available if (ExtrapToVertex > 0 && Vertex->GetNContributors()) { - trackParam.GetParamFrom(*muonTrack2); + trackParam.GetParamFromUncorrected(*muonTrack2); AliMUONTrackExtrap::ExtrapToVertex(&trackParam, fXVertex, fYVertex, fZVertex); trackParam.SetParamFor(*muonTrack2); // put the new parameters in this copy of AliESDMuonTrack } else if ((ExtrapToVertex > 0 && !Vertex->GetNContributors()) || ExtrapToVertex == 0){ - trackParam.GetParamFrom(*muonTrack2); + trackParam.GetParamFromUncorrected(*muonTrack2); AliMUONTrackExtrap::ExtrapToVertex(&trackParam, 0., 0., 0.); trackParam.SetParamFor(*muonTrack2); // put the new parameters in this copy of AliESDMuonTrack } @@ -428,17 +419,9 @@ Bool_t MUONefficiency( Int_t ExtrapToVertex = -1, Int_t ResType = 553, Int_t Fir else track2TriggerChi2 = 0. ; - thetaX = muonTrack2->GetThetaX(); - thetaY = muonTrack2->GetThetaY(); - - pYZ = 1./TMath::Abs(muonTrack2->GetInverseBendingMomentum()); - fPzRec2 = - pYZ / TMath::Sqrt(1.0 + TMath::Tan(thetaY)*TMath::Tan(thetaY)); - fPxRec2 = fPzRec2 * TMath::Tan(thetaX); - fPyRec2 = fPzRec2 * TMath::Tan(thetaY); fCharge2 = Int_t(TMath::Sign(1.,muonTrack2->GetInverseBendingMomentum())); - fE2 = TMath::Sqrt(MUON_MASS * MUON_MASS + fPxRec2 * fPxRec2 + fPyRec2 * fPyRec2 + fPzRec2 * fPzRec2); - fV2.SetPxPyPzE(fPxRec2, fPyRec2, fPzRec2, fE2); + muonTrack2->LorentzP(fV2); ntrackhits = muonTrack2->GetNHit(); fitfmin = muonTrack2->GetChi2(); diff --git a/MUON/MUONmassPlot_ESD.C b/MUON/MUONmassPlot_ESD.C index 36a0766a78a..dfecc1d6a0e 100644 --- a/MUON/MUONmassPlot_ESD.C +++ b/MUON/MUONmassPlot_ESD.C @@ -118,10 +118,9 @@ Bool_t MUONmassPlot(Int_t ExtrapToVertex = -1, char* geoFilename = "geometry.roo // Float_t UpsilonMass = 9.46037; // Float_t JPsiMass = 3.097; - Double_t thetaX, thetaY, pYZ; + Int_t fCharge1, fCharge2; Double_t fPxRec1, fPyRec1, fPzRec1, fE1; Double_t fPxRec2, fPyRec2, fPzRec2, fE2; - Int_t fCharge, fCharge2; Int_t ntrackhits, nevents; Double_t fitfmin; @@ -217,27 +216,19 @@ Bool_t MUONmassPlot(Int_t ExtrapToVertex = -1, char* geoFilename = "geometry.roo // extrapolate to vertex if required and available if (ExtrapToVertex > 0 && Vertex->GetNContributors()) { - trackParam.GetParamFrom(*muonTrack); + trackParam.GetParamFromUncorrected(*muonTrack); AliMUONTrackExtrap::ExtrapToVertex(&trackParam, fXVertex, fYVertex, fZVertex); trackParam.SetParamFor(*muonTrack); // put the new parameters in this copy of AliESDMuonTrack } else if ((ExtrapToVertex > 0 && !Vertex->GetNContributors()) || ExtrapToVertex == 0){ - trackParam.GetParamFrom(*muonTrack); + trackParam.GetParamFromUncorrected(*muonTrack); AliMUONTrackExtrap::ExtrapToVertex(&trackParam, 0., 0., 0.); trackParam.SetParamFor(*muonTrack); // put the new parameters in this copy of AliESDMuonTrack } - thetaX = muonTrack->GetThetaX(); - thetaY = muonTrack->GetThetaY(); + fCharge1 = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum())); + + muonTrack->LorentzP(fV1); - pYZ = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum()); - fPzRec1 = - pYZ / TMath::Sqrt(1.0 + TMath::Tan(thetaY)*TMath::Tan(thetaY)); - fPxRec1 = fPzRec1 * TMath::Tan(thetaX); - fPyRec1 = fPzRec1 * TMath::Tan(thetaY); - fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum())); - - fE1 = TMath::Sqrt(muonMass * muonMass + fPxRec1 * fPxRec1 + fPyRec1 * fPyRec1 + fPzRec1 * fPzRec1); - fV1.SetPxPyPzE(fPxRec1, fPyRec1, fPzRec1, fE1); - ntrackhits = muonTrack->GetNHit(); fitfmin = muonTrack->GetChi2(); @@ -253,7 +244,7 @@ Bool_t MUONmassPlot(Int_t ExtrapToVertex = -1, char* geoFilename = "geometry.roo // chi2 per d.o.f. Float_t ch1 = fitfmin / (2.0 * ntrackhits - 5); // printf(" px %f py %f pz %f NHits %d Norm.chi2 %f charge %d\n", -// fPxRec1, fPyRec1, fPzRec1, ntrackhits, ch1, fCharge); +// fPxRec1, fPyRec1, fPzRec1, ntrackhits, ch1, fCharge1); // condition for good track (Chi2Cut and PtCut) @@ -264,12 +255,12 @@ Bool_t MUONmassPlot(Int_t ExtrapToVertex = -1, char* geoFilename = "geometry.roo hPMuon->Fill(p1); hChi2PerDof->Fill(ch1); hRapMuon->Fill(rapMuon1); - if (fCharge > 0) { + if (fCharge1 > 0) { hPtMuonPlus->Fill(pt1); - hThetaPhiPlus->Fill(TMath::ATan2(fPyRec1,fPxRec1)*180./TMath::Pi(),TMath::ATan2(pt1,fPzRec1)*180./3.1415); + hThetaPhiPlus->Fill(fV1.Phi()*180./TMath::Pi(),fV1.Theta()*180./TMath::Pi()); } else { hPtMuonMinus->Fill(pt1); - hThetaPhiMinus->Fill(TMath::ATan2(fPyRec1,fPxRec1)*180./TMath::Pi(),TMath::ATan2(pt1,fPzRec1)*180./3.1415); + hThetaPhiMinus->Fill(fV1.Phi()*180./TMath::Pi(),fV1.Theta()*180./TMath::Pi()); } // loop over second track of combination for (Int_t iTrack2 = iTrack + 1; iTrack2 < nTracks; iTrack2++) { @@ -278,26 +269,18 @@ Bool_t MUONmassPlot(Int_t ExtrapToVertex = -1, char* geoFilename = "geometry.roo // extrapolate to vertex if required and available if (ExtrapToVertex > 0 && Vertex->GetNContributors()) { - trackParam.GetParamFrom(*muonTrack2); + trackParam.GetParamFromUncorrected(*muonTrack2); AliMUONTrackExtrap::ExtrapToVertex(&trackParam, fXVertex, fYVertex, fZVertex); trackParam.SetParamFor(*muonTrack2); // put the new parameters in this copy of AliESDMuonTrack } else if ((ExtrapToVertex > 0 && !Vertex->GetNContributors()) || ExtrapToVertex == 0){ - trackParam.GetParamFrom(*muonTrack2); + trackParam.GetParamFromUncorrected(*muonTrack2); AliMUONTrackExtrap::ExtrapToVertex(&trackParam, 0., 0., 0.); trackParam.SetParamFor(*muonTrack2); // put the new parameters in this copy of AliESDMuonTrack } - thetaX = muonTrack2->GetThetaX(); - thetaY = muonTrack2->GetThetaY(); - - pYZ = 1./TMath::Abs(muonTrack2->GetInverseBendingMomentum()); - fPzRec2 = - pYZ / TMath::Sqrt(1.0 + TMath::Tan(thetaY)*TMath::Tan(thetaY)); - fPxRec2 = fPzRec2 * TMath::Tan(thetaX); - fPyRec2 = fPzRec2 * TMath::Tan(thetaY); fCharge2 = Int_t(TMath::Sign(1.,muonTrack2->GetInverseBendingMomentum())); - fE2 = TMath::Sqrt(muonMass * muonMass + fPxRec2 * fPxRec2 + fPyRec2 * fPyRec2 + fPzRec2 * fPzRec2); - fV2.SetPxPyPzE(fPxRec2, fPyRec2, fPzRec2, fE2); + muonTrack2->LorentzP(fV2); ntrackhits = muonTrack2->GetNHit(); fitfmin = muonTrack2->GetChi2(); @@ -312,7 +295,7 @@ Bool_t MUONmassPlot(Int_t ExtrapToVertex = -1, char* geoFilename = "geometry.roo if ((ch2 < Chi2Cut) && (pt2 > PtCutMin) && (pt2 < PtCutMax)) { // condition for opposite charges - if ((fCharge * fCharge2) == -1) { + if ((fCharge1 * fCharge2) == -1) { // invariant mass fVtot = fV1 + fV2; @@ -338,7 +321,7 @@ Bool_t MUONmassPlot(Int_t ExtrapToVertex = -1, char* geoFilename = "geometry.roo hPtResonance->Fill(fVtot.Pt()); } - } // if (fCharge * fCharge2) == -1) + } // if (fCharge1 * fCharge2) == -1) } // if ((ch2 < Chi2Cut) && (pt2 > PtCutMin) && (pt2 < PtCutMax)) delete muonTrack2; } // for (Int_t iTrack2 = iTrack + 1; iTrack2 < iTrack; iTrack2++)