]>
Commit | Line | Data |
---|---|---|
04a7657f | 1 | /* $Id$ */ |
2 | ||
3 | #include <AliPWG0Helper.h> | |
4 | ||
5 | #include <TParticle.h> | |
6 | #include <TParticlePDG.h> | |
847489f7 | 7 | #include <TH1.h> |
25db2d85 | 8 | #include <TH3.h> |
04a7657f | 9 | |
10 | #include <AliLog.h> | |
11 | #include <AliESD.h> | |
12 | #include <AliESDVertex.h> | |
13 | ||
14 | //____________________________________________________________________ | |
15 | ClassImp(AliPWG0Helper) | |
16 | ||
17 | //____________________________________________________________________ | |
18 | Bool_t AliPWG0Helper::IsEventTriggered(AliESD* aEsd) | |
19 | { | |
20 | // check if the event was triggered | |
21 | // | |
5c495d37 | 22 | // this function needs the branch fTriggerMask |
23 | // | |
04a7657f | 24 | // MB should be |
25 | // ITS_SPD_GFO_L0 : 32 | |
26 | // VZERO_OR_LEFT : 1 | |
27 | // VZERO_OR_RIGHT : 2 | |
28 | ||
29 | ULong64_t triggerMask = aEsd->GetTriggerMask(); | |
30 | ||
31 | if (triggerMask&32 && ((triggerMask&1) || (triggerMask&2))) | |
32 | return kTRUE; | |
33 | ||
34 | return kFALSE; | |
35 | } | |
36 | ||
37 | //____________________________________________________________________ | |
38 | Bool_t AliPWG0Helper::IsVertexReconstructed(AliESD* aEsd) | |
39 | { | |
40 | // checks if the vertex is reasonable | |
5c495d37 | 41 | // |
42 | // this function needs the branches fSPDVertex* | |
43 | ||
04a7657f | 44 | |
45 | const AliESDVertex* vtxESD = aEsd->GetVertex(); | |
46 | ||
47 | // the vertex should be reconstructed | |
48 | if (strcmp(vtxESD->GetName(), "default")==0) | |
49 | return kFALSE; | |
50 | ||
51 | Double_t vtx_res[3]; | |
52 | vtx_res[0] = vtxESD->GetXRes(); | |
53 | vtx_res[1] = vtxESD->GetYRes(); | |
54 | vtx_res[2] = vtxESD->GetZRes(); | |
55 | ||
56 | if (vtx_res[2]==0 || vtx_res[2]>0.1) | |
57 | return kFALSE; | |
58 | ||
59 | return kTRUE; | |
60 | } | |
61 | ||
62 | //____________________________________________________________________ | |
25db2d85 | 63 | Bool_t AliPWG0Helper::IsPrimaryCharged(TParticle* aParticle, Int_t aTotalPrimaries, Bool_t debug) |
04a7657f | 64 | { |
65 | // | |
25db2d85 | 66 | // this function checks if a particle from the event generator (i.e. among the nPrim particles in the stack) |
67 | // shall be counted as a primary particle | |
68 | // | |
04a7657f | 69 | // This function or a equivalent should be available in some common place of AliRoot |
70 | // | |
71 | ||
72 | // if the particle has a daughter primary, we do not want to count it | |
73 | if (aParticle->GetFirstDaughter() != -1 && aParticle->GetFirstDaughter() < aTotalPrimaries) | |
74 | { | |
25db2d85 | 75 | if (debug) |
76 | printf("Dropping particle because it has a daughter among the primaries.\n"); | |
04a7657f | 77 | return kFALSE; |
78 | } | |
79 | ||
80 | Int_t pdgCode = TMath::Abs(aParticle->GetPdgCode()); | |
81 | ||
82 | // skip quarks and gluon | |
83 | if (pdgCode <= 10 || pdgCode == 21) | |
84 | { | |
25db2d85 | 85 | if (debug) |
86 | printf("Dropping particle because it is a quark or gluon.\n"); | |
04a7657f | 87 | return kFALSE; |
88 | } | |
89 | ||
90 | if (strcmp(aParticle->GetName(),"XXX") == 0) | |
91 | { | |
25db2d85 | 92 | if (debug) |
93 | printf("WARNING: There is a particle named XXX.\n"); | |
04a7657f | 94 | return kFALSE; |
95 | } | |
96 | ||
97 | TParticlePDG* pdgPart = aParticle->GetPDG(); | |
98 | ||
99 | if (strcmp(pdgPart->ParticleClass(),"Unknown") == 0) | |
100 | { | |
25db2d85 | 101 | if (debug) |
102 | printf("WARNING: There is a particle with an unknown particle class (pdg code %d).\n", pdgCode); | |
04a7657f | 103 | return kFALSE; |
104 | } | |
105 | ||
106 | if (pdgPart->Charge() == 0) | |
107 | { | |
25db2d85 | 108 | if (debug) |
109 | printf("Dropping particle because it is not charged.\n"); | |
04a7657f | 110 | return kFALSE; |
111 | } | |
112 | ||
113 | return kTRUE; | |
114 | } | |
847489f7 | 115 | |
116 | //____________________________________________________________________ | |
25db2d85 | 117 | void AliPWG0Helper::CreateProjections(TH3* hist) |
847489f7 | 118 | { |
119 | // create projections of 3d hists to all 2d combinations | |
120 | // the histograms are not returned, just use them from memory or use this to create them in a file | |
121 | ||
122 | TH1* proj = hist->Project3D("yx"); | |
123 | proj->SetXTitle(hist->GetXaxis()->GetTitle()); | |
124 | proj->SetYTitle(hist->GetYaxis()->GetTitle()); | |
125 | ||
126 | proj = hist->Project3D("zx"); | |
127 | proj->SetXTitle(hist->GetXaxis()->GetTitle()); | |
128 | proj->SetYTitle(hist->GetZaxis()->GetTitle()); | |
129 | ||
130 | proj = hist->Project3D("zy"); | |
131 | proj->SetXTitle(hist->GetYaxis()->GetTitle()); | |
132 | proj->SetYTitle(hist->GetZaxis()->GetTitle()); | |
133 | } | |
1afae8ff | 134 | |
135 | //____________________________________________________________________ | |
0ab29cfa | 136 | void AliPWG0Helper::CreateDividedProjections(TH3* hist, TH3* hist2, const char* axis, Bool_t putErrors) |
1afae8ff | 137 | { |
138 | // create projections of the 3d hists divides them | |
139 | // axis decides to which plane, if axis is 0 to all planes | |
140 | // the histograms are not returned, just use them from memory or use this to create them in a file | |
141 | ||
142 | if (axis == 0) | |
143 | { | |
0ab29cfa | 144 | CreateDividedProjections(hist, hist2, "yx", putErrors); |
145 | CreateDividedProjections(hist, hist2, "zx", putErrors); | |
146 | CreateDividedProjections(hist, hist2, "zy", putErrors); | |
1afae8ff | 147 | |
148 | return; | |
149 | } | |
150 | ||
151 | TH1* proj = hist->Project3D(axis); | |
0ab29cfa | 152 | |
153 | if (strlen(axis) == 2) | |
154 | { | |
155 | proj->SetYTitle(GetAxisTitle(hist, axis[0])); | |
156 | proj->SetXTitle(GetAxisTitle(hist, axis[1])); | |
157 | } | |
158 | else if (strlen(axis) == 1) | |
159 | proj->SetXTitle(GetAxisTitle(hist, axis[0])); | |
1afae8ff | 160 | |
161 | TH1* proj2 = hist2->Project3D(axis); | |
0ab29cfa | 162 | if (strlen(axis) == 2) |
163 | { | |
164 | proj2->SetYTitle(GetAxisTitle(hist2, axis[0])); | |
165 | proj2->SetXTitle(GetAxisTitle(hist2, axis[1])); | |
166 | } | |
167 | else if (strlen(axis) == 1) | |
168 | proj2->SetXTitle(GetAxisTitle(hist2, axis[0])); | |
1afae8ff | 169 | |
170 | TH1* division = dynamic_cast<TH1*> (proj->Clone(Form("%s_div_%s", proj->GetName(), proj2->GetName()))); | |
171 | division->Divide(proj2); | |
0ab29cfa | 172 | |
173 | if (putErrors) | |
174 | { | |
175 | division->Sumw2(); | |
176 | if (division->GetDimension() == 1) | |
177 | { | |
178 | Int_t nBins = division->GetNbinsX(); | |
179 | for (Int_t i = 0; i <= nBins; ++i) | |
180 | if (proj2->GetBinContent(i) != 0) | |
181 | division->SetBinError(i, TMath::Sqrt(proj->GetBinContent(i)) / proj2->GetBinContent(i)); | |
182 | } | |
183 | else if (division->GetDimension() == 2) | |
184 | { | |
185 | Int_t nBinsX = division->GetNbinsX(); | |
186 | Int_t nBinsY = division->GetNbinsY(); | |
187 | for (Int_t i = 0; i <= nBinsX; ++i) | |
188 | for (Int_t j = 0; j <= nBinsY; ++j) | |
189 | if (proj2->GetBinContent(i, j) != 0) | |
190 | division->SetBinError(i, j, TMath::Sqrt(proj->GetBinContent(i, j)) / proj2->GetBinContent(i, j)); | |
191 | } | |
192 | } | |
1afae8ff | 193 | } |
194 | ||
92d2d8ad | 195 | //____________________________________________________________________ |
25db2d85 | 196 | const char* AliPWG0Helper::GetAxisTitle(TH3* hist, const char axis) |
92d2d8ad | 197 | { |
198 | // returns the title of the axis given in axis (x, y, z) | |
199 | ||
200 | if (axis == 'x') | |
201 | return hist->GetXaxis()->GetTitle(); | |
202 | else if (axis == 'y') | |
203 | return hist->GetYaxis()->GetTitle(); | |
204 | else if (axis == 'z') | |
205 | return hist->GetZaxis()->GetTitle(); | |
206 | ||
207 | return 0; | |
208 | } |