ac23f1c6f76bb9edc4684e21903d6ad55ff9a811
[u/mrichter/AliRoot.git] / MFT / AliMuonForwardTrackPair.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 //====================================================================================================================================================
17 //
18 //      Description of an ALICE muon forward track pair, i.e. a pair of AliMuonForwardTrack objects
19 //
20 //      Contact author: antonio.uras@cern.ch
21 //
22 //====================================================================================================================================================
23
24 #include "AliLog.h"
25 #include "AliMUONTrackParam.h"
26 #include "TParticle.h"
27 #include "AliMuonForwardTrack.h"
28 #include "AliMUONTrackExtrap.h"
29 #include "TClonesArray.h"
30 #include "TDatabasePDG.h"
31 #include "TLorentzVector.h"
32 #include "TRandom.h"
33 #include "AliMuonForwardTrackPair.h"
34
35 ClassImp(AliMuonForwardTrackPair)
36
37 //====================================================================================================================================================
38
39 AliMuonForwardTrackPair::AliMuonForwardTrackPair():
40   TObject(),
41   fMuonForwardTracks(0)
42 {
43
44   // default constructor
45
46   fMuonForwardTracks = new TClonesArray("AliMuonForwardTrack", 2);
47
48 }
49
50 //====================================================================================================================================================
51
52 AliMuonForwardTrackPair::AliMuonForwardTrackPair(AliMuonForwardTrack *track0, AliMuonForwardTrack *track1):
53   TObject(),
54   fMuonForwardTracks(0)
55 {
56
57   fMuonForwardTracks = new TClonesArray("AliMuonForwardTrack", 2);
58
59   new ((*fMuonForwardTracks)[0]) AliMuonForwardTrack(*track0);
60   new ((*fMuonForwardTracks)[1]) AliMuonForwardTrack(*track1);
61
62 }
63
64 //====================================================================================================================================================
65
66 AliMuonForwardTrackPair::AliMuonForwardTrackPair(const AliMuonForwardTrackPair& trackPair): 
67   TObject(trackPair),
68   fMuonForwardTracks(trackPair.fMuonForwardTracks)
69 {
70
71   // copy constructor
72   
73 }
74
75 //====================================================================================================================================================
76
77 AliMuonForwardTrackPair& AliMuonForwardTrackPair::operator=(const AliMuonForwardTrackPair& trackPair) {
78
79   // Asignment operator
80
81   // check assignement to self
82   if (this == &trackPair) return *this;
83
84   // base class assignement
85   AliMuonForwardTrackPair::operator=(trackPair);
86   
87   // clear memory
88   Clear();
89   
90   fMuonForwardTracks = trackPair.fMuonForwardTracks;
91
92   return *this;
93
94 }
95
96 //====================================================================================================================================================
97
98 void AliMuonForwardTrackPair::SetTrack(Int_t iTrack, AliMuonForwardTrack *track) {
99
100   if (iTrack==0 || iTrack==1) {
101     new ((*fMuonForwardTracks)[iTrack]) AliMuonForwardTrack(*track);
102   }
103
104 }
105
106 //====================================================================================================================================================
107
108 Double_t AliMuonForwardTrackPair::GetWeightedOffset(Double_t x, Double_t y, Double_t z) {
109
110   Double_t weightedOffset[2]={0};
111
112   weightedOffset[0] = ((AliMuonForwardTrack*) fMuonForwardTracks->At(0))->GetWeightedOffset(x, y, z);
113   weightedOffset[1] = ((AliMuonForwardTrack*) fMuonForwardTracks->At(1))->GetWeightedOffset(x, y, z);
114
115   Double_t weightedOffsetDimuon = TMath::Sqrt(0.5 * (weightedOffset[0]*weightedOffset[0] + weightedOffset[1]*weightedOffset[1]));
116
117   return weightedOffsetDimuon;
118
119 }
120
121 //====================================================================================================================================================
122
123 Double_t AliMuonForwardTrackPair::GetMass(Double_t z, Int_t nClusters) {
124
125   Int_t idCluster[2] = {0};
126   if (nClusters>0) {
127     idCluster[0] = ((AliMuonForwardTrack*) fMuonForwardTracks->At(0))->GetNMFTClusters() - nClusters;
128     idCluster[1] = ((AliMuonForwardTrack*) fMuonForwardTracks->At(1))->GetNMFTClusters() - nClusters;
129   }
130   if (idCluster[0]<0) idCluster[0] = 0;
131   if (idCluster[1]<0) idCluster[1] = 0;
132
133   Double_t momentum[2] = {0};
134   
135   AliMUONTrackParam *param0 = ((AliMuonForwardTrack*) fMuonForwardTracks->At(0))->GetTrackParamAtMFTCluster(idCluster[0]);
136   AliMUONTrackParam *param1 = ((AliMuonForwardTrack*) fMuonForwardTracks->At(1))->GetTrackParamAtMFTCluster(idCluster[1]);
137
138   if (TMath::Abs(z)<1e6) {
139     AliMUONTrackExtrap::ExtrapToZCov(param0, z);
140     AliMUONTrackExtrap::ExtrapToZCov(param1, z);
141   }
142
143   momentum[0] = (param0->P());
144   momentum[1] = (param1->P());
145
146   Double_t mMu = TDatabasePDG::Instance()->GetParticle("mu-")->Mass();
147
148   TLorentzVector dimu;
149
150   dimu.SetE(TMath::Sqrt(mMu*mMu + momentum[0]*momentum[0]) + TMath::Sqrt(mMu*mMu + momentum[1]*momentum[1]));
151
152   dimu.SetPx(((AliMuonForwardTrack*) fMuonForwardTracks->At(0))->GetTrackParamAtMFTCluster(idCluster[0])->Px()+
153              ((AliMuonForwardTrack*) fMuonForwardTracks->At(1))->GetTrackParamAtMFTCluster(idCluster[1])->Px());
154
155   dimu.SetPy(((AliMuonForwardTrack*) fMuonForwardTracks->At(0))->GetTrackParamAtMFTCluster(idCluster[0])->Py()+
156              ((AliMuonForwardTrack*) fMuonForwardTracks->At(1))->GetTrackParamAtMFTCluster(idCluster[1])->Py());
157
158   dimu.SetPz(((AliMuonForwardTrack*) fMuonForwardTracks->At(0))->GetTrackParamAtMFTCluster(idCluster[0])->Pz()+
159              ((AliMuonForwardTrack*) fMuonForwardTracks->At(1))->GetTrackParamAtMFTCluster(idCluster[1])->Pz());
160
161   return dimu.M();
162
163 }
164
165 //====================================================================================================================================================
166
167 Double_t AliMuonForwardTrackPair::GetMassWithoutMFT(Double_t x, Double_t y, Double_t z, Int_t nClusters) {
168
169   Int_t idCluster[2] = {0};
170   if (nClusters>0) {
171     idCluster[0] = ((AliMuonForwardTrack*) fMuonForwardTracks->At(0))->GetNMUONClusters() - nClusters;
172     idCluster[1] = ((AliMuonForwardTrack*) fMuonForwardTracks->At(1))->GetNMUONClusters() - nClusters;
173   }
174   if (idCluster[0]<0) idCluster[0] = 0;
175   if (idCluster[1]<0) idCluster[1] = 0;
176
177   AliMUONTrackParam *param0 = ((AliMuonForwardTrack*) fMuonForwardTracks->At(0))->GetTrackParamAtMUONCluster(idCluster[0]);
178   AliMUONTrackParam *param1 = ((AliMuonForwardTrack*) fMuonForwardTracks->At(1))->GetTrackParamAtMUONCluster(idCluster[1]);
179
180   AliMUONTrackExtrap::ExtrapToVertex(param0, x, y, z, 0., 0.);   // this should reproduce what is done in AliMUONESDInterface::MUONToESD(...) 
181   AliMUONTrackExtrap::ExtrapToVertex(param1, x, y, z, 0., 0.);   // this should reproduce what is done in AliMUONESDInterface::MUONToESD(...) 
182
183   Double_t momentum[2] = {0}; 
184
185   momentum[0] = param0->P();
186   momentum[1] = param1->P();
187
188   Double_t mMu = TDatabasePDG::Instance()->GetParticle("mu-")->Mass();
189
190   TLorentzVector dimu;
191
192   dimu.SetE(TMath::Sqrt(mMu*mMu + momentum[0]*momentum[0]) + TMath::Sqrt(mMu*mMu + momentum[1]*momentum[1]));
193
194   dimu.SetPx(param0->Px() + param1->Px());
195   dimu.SetPy(param0->Py() + param1->Py());
196   dimu.SetPz(param0->Pz() + param1->Pz());
197
198   return dimu.M();
199
200 }
201
202 //====================================================================================================================================================
203
204 Double_t AliMuonForwardTrackPair::GetMassMC() {
205
206   TLorentzVector dimu;
207
208   dimu.SetE(((AliMuonForwardTrack*) fMuonForwardTracks->At(0))->GetMCTrackRef()->Energy() +
209             ((AliMuonForwardTrack*) fMuonForwardTracks->At(1))->GetMCTrackRef()->Energy());
210
211   dimu.SetPx(((AliMuonForwardTrack*) fMuonForwardTracks->At(0))->GetMCTrackRef()->Px() +
212              ((AliMuonForwardTrack*) fMuonForwardTracks->At(1))->GetMCTrackRef()->Px());
213
214   dimu.SetPy(((AliMuonForwardTrack*) fMuonForwardTracks->At(0))->GetMCTrackRef()->Py() +
215              ((AliMuonForwardTrack*) fMuonForwardTracks->At(1))->GetMCTrackRef()->Py());
216
217   dimu.SetPz(((AliMuonForwardTrack*) fMuonForwardTracks->At(0))->GetMCTrackRef()->Pz() +
218              ((AliMuonForwardTrack*) fMuonForwardTracks->At(1))->GetMCTrackRef()->Pz());
219
220   return dimu.M();
221
222 }
223
224 //====================================================================================================================================================
225
226
227
228
229
230
231
232