- We now save in MUON ESD both track parameters extrapolated to vertex
authorivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 14 Mar 2007 08:32:56 +0000 (08:32 +0000)
committerivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 14 Mar 2007 08:32:56 +0000 (08:32 +0000)
  (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.)

MUON/AliMUONDigitizerV3.cxx
MUON/AliMUONReconstructor.cxx
MUON/AliMUONTrackParam.cxx
MUON/AliMUONTrackParam.h
MUON/AliMUONVTrackReconstructor.cxx
MUON/AliMUONVTrackReconstructor.h
MUON/DecodeRecoCocktail.C
MUON/MUONefficiency.C
MUON/MUONmassPlot_ESD.C

index bab54b3..8a91324 100644 (file)
@@ -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);
index 6c01d10..7bf15be 100644 (file)
@@ -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);
index 5e96a4d..b11809e 100644 (file)
 //
 ///////////////////////////////////////////////////
 
-#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
@@ -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 )
index bbf082e..9707985 100644 (file)
@@ -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)
index cc925a2..c952512 100644 (file)
@@ -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,8 +102,6 @@ AliMUONVTrackReconstructor::AliMUONVTrackReconstructor(AliMUONData* data)
 AliMUONVTrackReconstructor::~AliMUONVTrackReconstructor(void)
 {
   /// Destructor for class AliMUONVTrackReconstructor
-  delete [] fSegmentMaxDistBending;
-  delete [] fSegmentMaxDistNonBending;
   delete [] fNHitsForRecPerChamber;
   delete [] fIndexOfFirstHitForRecPerChamber;
   delete fTriggerTrack;
@@ -117,41 +109,11 @@ AliMUONVTrackReconstructor::~AliMUONVTrackReconstructor(void)
 }
 
   //__________________________________________________________________________
-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();
index 6b64512..280894a 100644 (file)
@@ -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);
   
index 28bc28b..063d363 100644 (file)
@@ -38,6 +38,7 @@
 #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(); 
@@ -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); 
index 16cb576..609b1ac 100644 (file)
@@ -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();
index 36a0766..dfecc1d 100644 (file)
@@ -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++)