}
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);
// 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();
// 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);
//
///////////////////////////////////////////////////
-#include <Riostream.h>
-#include <TMath.h>
-#include <TMatrixD.h>
-
#include "AliMUONTrackParam.h"
+#include "AliMUONHitForRec.h"
+
#include "AliESDMuonTrack.h"
#include "AliLog.h"
-#include "AliMUONHitForRec.h"
+
+#include <Riostream.h>
+#include <TMath.h>
+#include <TMatrixD.h>
/// \cond CLASSIMP
ClassImp(AliMUONTrackParam) // Class implementation in ROOT context
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 )
//__________________________________________________________________________
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 )
//__________________________________________________________________________
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 )
//__________________________________________________________________________
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 )
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)
fBendingVertexDispersion(fgkDefaultBendingVertexDispersion),
fNonBendingVertexDispersion(fgkDefaultNonBendingVertexDispersion),
fMaxNormChi2MatchTrigger(fgkDefaultMaxNormChi2MatchTrigger),
- fSegmentMaxDistBending(0x0),
- fSegmentMaxDistNonBending(0x0),
fHitsForRecPtr(0x0),
fNHitsForRec(0),
fNHitsForRecPerChamber(0x0),
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);
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();
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;
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;
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();
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
TClonesArray* fTriggerCircuit; //!< trigger circuit array
// Functions
- void SetReconstructionParametersToDefaults(void);
-
void ResetTracks(void);
void ResetHitsForRec(void);
#include <AliRunLoader.h>
#include "AliMUONTrackLight.h"
#include "AliMUONPairLight.h"
+#include "AliMUONTrackExtrap.h"
void DecodeRecoCocktail(char* dirname=".", char* outFileName = "MuonLight.root"){
const char *startingDir = gSystem->pwd();
// 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);
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;
// 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
}
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();
// 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)
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
// 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
}
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();
// 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;
// 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();
// 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)
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++) {
// 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();
if ((ch2 < Chi2Cut) && (pt2 > PtCutMin) && (pt2 < PtCutMax)) {
// condition for opposite charges
- if ((fCharge * fCharge2) == -1) {
+ if ((fCharge1 * fCharge2) == -1) {
// invariant mass
fVtot = fV1 + fV2;
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++)