First commit.
[u/mrichter/AliRoot.git] / FASTSIM / AliFastMuonTrackingRes.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 $Log$
18 */
19
20 #include "AliFastMuonTrackingRes.h"
21 #include "AliMUONFastTracking.h"
22 #include <TRandom.h>
23 #include <TF1.h>
24
25 ClassImp(AliFastMuonTrackingRes)
26
27
28 AliFastMuonTrackingRes::AliFastMuonTrackingRes() :
29     AliFastResponse("Resolution", "Muon Tracking Resolution")
30 {
31     SetBackground();
32 }
33
34 void AliFastMuonTrackingRes::Init()
35 {
36     fFastTracking = AliMUONFastTracking::Instance();
37     fFastTracking->Init(fBackground);
38 }
39
40
41
42 void AliFastMuonTrackingRes::Evaluate(Float_t   p,  Float_t  theta , Float_t   phi,
43                                          Float_t& pS,  Float_t& thetaS, Float_t&  phiS)
44 {
45
46     Double_t meanp    = fFastTracking->MeanP  (p, theta, phi, Int_t(fCharge));
47     Double_t sigmap   = fFastTracking->SigmaP (p, theta, phi, Int_t(fCharge));
48     Double_t sigma1p  = fFastTracking->Sigma1P(p, theta, phi, Int_t(fCharge));
49     Double_t normg2   = fFastTracking->NormG2 (p, theta, phi, Int_t(fCharge));
50     Double_t meang2   = fFastTracking->MeanG2 (p, theta, phi, Int_t(fCharge));
51     Double_t sigmag2  = fFastTracking->SigmaG2(p, theta, phi, Int_t(fCharge));
52     
53     Int_t ip,itheta,iphi;
54     TF1* fitp = fFastTracking->GetFitP();
55     
56     fFastTracking->GetIpIthetaIphi(p, theta, phi, Int_t(fCharge), ip, itheta, iphi);
57     if (sigmap == 0) {
58         printf ("WARNING!!! sigmap=0:    ");
59         printf ("ip= %d itheta = %d iphi = %d   ", ip, itheta, iphi);  
60         printf ("p= %f theta = %f phi = %f\n", p, theta, phi);  
61     }
62
63     fitp->SetParameters(meanp,sigmap,sigma1p,normg2,meang2,sigmag2);
64   
65     Double_t meantheta  = fFastTracking->MeanTheta (p, theta, phi, Int_t(fCharge));
66     Double_t sigmatheta = fFastTracking->SigmaTheta(p, theta, phi, Int_t(fCharge));
67     Double_t meanphi    = fFastTracking->MeanPhi   (p, theta, phi, Int_t(fCharge));
68     Double_t sigmaphi   = fFastTracking->SigmaPhi  (p, theta, phi, Int_t(fCharge));
69   
70     // Components different from ip=0 have the RMS bigger than mean
71     Float_t ptp[3]  =  { 1.219576,-0.354764,-0.690117 };
72     Float_t ptph[3] =  { 0.977522, 0.016269, 0.023158 }; 
73     Float_t pphp[3] =  { 1.303256,-0.464847,-0.869322 };
74
75     // Smeared momentum
76     pS   = p + fitp->GetRandom();
77     Float_t dp = pS - p; 
78
79     // Smeared phi
80     if (ip==0) sigmaphi *= pphp[0] + pphp[1] * dp + pphp[2] * dp*dp; 
81     phiS = phi + gRandom->Gaus(meanphi, sigmaphi);
82     Float_t dphi = phiS - phi; 
83     // Smeared theta
84     if (ip==0) sigmatheta *= ptp[0] + ptp[1] * dp + ptp[2] * dp*dp; 
85     if (ip==0) sigmatheta *= ptph[0] + ptph[1] * dphi + ptph[2] * dphi*dphi; 
86     thetaS = theta + gRandom->Gaus(meantheta,sigmatheta);
87 }
88
89
90
91
92
93