]> git.uio.no Git - u/mrichter/AliRoot.git/blame - FMD/analysis/AliFMDAnalysisTaskSharing.cxx
This is rather large upgrade of the analysis. The sharing correction has been improve...
[u/mrichter/AliRoot.git] / FMD / analysis / AliFMDAnalysisTaskSharing.cxx
CommitLineData
3bb122c7 1
2#include <TROOT.h>
3#include <TSystem.h>
4#include <TInterpreter.h>
5#include <TChain.h>
6#include <TFile.h>
7#include <TList.h>
8#include <iostream>
bb8a464f 9#include <TMath.h>
10#include "AliFMDDebug.h"
3bb122c7 11#include "AliFMDAnalysisTaskSharing.h"
12#include "AliAnalysisManager.h"
13#include "AliESDFMD.h"
bb8a464f 14#include "AliFMDGeometry.h"
3bb122c7 15#include "AliMCEventHandler.h"
16#include "AliStack.h"
17#include "AliESDVertex.h"
18#include "AliFMDAnaParameters.h"
bb8a464f 19#include "AliFMDParameters.h"
3bb122c7 20
21ClassImp(AliFMDAnalysisTaskSharing)
22
23//_____________________________________________________________________
24AliFMDAnalysisTaskSharing::AliFMDAnalysisTaskSharing()
25: fDebug(0),
26 fESD(0x0),
8dc7c4c2 27 foutputESDFMD(),
c78bc12b 28 fSharedThis(kFALSE),
7c3e5162 29 fSharedPrev(kFALSE),
30 fDiagList(),
31 fStandalone(kTRUE),
bb8a464f 32 fEsdVertex(0),
33 fStatus(kTRUE)
3bb122c7 34{
35 // Default constructor
36 DefineInput (0, AliESDEvent::Class());
7c3e5162 37 DefineOutput(0, AliESDFMD::Class());
38 DefineOutput(1, AliESDVertex::Class());
39 DefineOutput(2, AliESDEvent::Class());
40 DefineOutput(3, TList::Class());
3bb122c7 41}
42//_____________________________________________________________________
7c3e5162 43AliFMDAnalysisTaskSharing::AliFMDAnalysisTaskSharing(const char* name, Bool_t SE):
3bb122c7 44 AliAnalysisTask(name, "AnalysisTaskFMD"),
45 fDebug(0),
46 fESD(0x0),
8dc7c4c2 47 foutputESDFMD(),
bb8a464f 48 fEnergy(0),
49 fNstrips(0),
c78bc12b 50 fSharedThis(kFALSE),
7c3e5162 51 fSharedPrev(kFALSE),
52 fDiagList(),
53 fStandalone(kTRUE),
bb8a464f 54 fEsdVertex(0),
55 fStatus(kTRUE)
3bb122c7 56{
7c3e5162 57 fStandalone = SE;
58 if(fStandalone) {
59 DefineInput (0, AliESDEvent::Class());
60 DefineOutput(0, AliESDFMD::Class());
61 DefineOutput(1, AliESDVertex::Class());
62 DefineOutput(2, AliESDEvent::Class());
63 DefineOutput(3, TList::Class());
64 }
3bb122c7 65}
66//_____________________________________________________________________
67void AliFMDAnalysisTaskSharing::CreateOutputObjects()
68{
7c3e5162 69 if(!foutputESDFMD)
70 foutputESDFMD = new AliESDFMD();
71
72 if(!fEsdVertex)
73 fEsdVertex = new AliESDVertex();
74 //Diagnostics
75 fDiagList.SetName("Sharing diagnostics");
76 for(Int_t det = 1; det<=3; det++) {
77 Int_t nRings = (det==1 ? 1 : 2);
78
79 for(Int_t iring = 0;iring<nRings; iring++) {
80 Char_t ringChar = (iring == 0 ? 'I' : 'O');
81 TH1F* hEdist = new TH1F(Form("Edist_before_sharing_FMD%d%c", det, ringChar),
82 Form("Edist_before_sharing_FMD%d%c", det, ringChar),
bb8a464f 83 1000,0,25);
7c3e5162 84 TH1F* hEdist_after = new TH1F(Form("Edist_after_sharing_FMD%d%c", det, ringChar),
85 Form("Edist_after_sharing_FMD%d%c", det, ringChar),
bb8a464f 86 1000,0,25);
87
88
89 TH1F* hNstripsHit = new TH1F(Form("N_strips_hit_FMD%d%c",det,ringChar),
90 Form("N_strips_hit_FMD%d%c",det,ringChar),
91 25,0,25);
7c3e5162 92 fDiagList.Add(hEdist);
93 fDiagList.Add(hEdist_after);
bb8a464f 94 fDiagList.Add(hNstripsHit);
7c3e5162 95
96 }
97 }
3bb122c7 98}
99//_____________________________________________________________________
100void AliFMDAnalysisTaskSharing::ConnectInputData(Option_t */*option*/)
101{
7c3e5162 102 if(fStandalone)
103 fESD = (AliESDEvent*)GetInputData(0);
3bb122c7 104}
105//_____________________________________________________________________
106void AliFMDAnalysisTaskSharing::Exec(Option_t */*option*/)
107{
bb8a464f 108
3bb122c7 109 AliESD* old = fESD->GetAliESDOld();
110 if (old) {
111 fESD->CopyFromOldESD();
112 }
113
7c3e5162 114 foutputESDFMD->Clear();
3bb122c7 115
bb8a464f 116 Double_t vertex[3];
117 GetVertex(vertex);
118 fEsdVertex->SetXYZ(vertex);
119
120 if(vertex[0] == 0 && vertex[1] == 0 && vertex[2] == 0) {
121 fStatus = kFALSE;
122 return;
123 }
124 else
125 fStatus = kTRUE;
126
3bb122c7 127 AliESDFMD* fmd = fESD->GetFMDData();
128
129 if (!fmd) return;
bb8a464f 130 Int_t nHits = 0;
3bb122c7 131 for(UShort_t det=1;det<=3;det++) {
132 Int_t nRings = (det==1 ? 1 : 2);
133 for (UShort_t ir = 0; ir < nRings; ir++) {
134 Char_t ring = (ir == 0 ? 'I' : 'O');
135 UShort_t nsec = (ir == 0 ? 20 : 40);
136 UShort_t nstr = (ir == 0 ? 512 : 256);
7c3e5162 137
138 TH1F* hEdist = (TH1F*)fDiagList.FindObject(Form("Edist_before_sharing_FMD%d%c",det,ring));
139
8dc7c4c2 140 for(UShort_t sec =0; sec < nsec; sec++) {
141 fSharedThis = kFALSE;
142 fSharedPrev = kFALSE;
bb8a464f 143 fEnergy = 0;
144 fNstrips = 0;
3bb122c7 145 for(UShort_t strip = 0; strip < nstr; strip++) {
7c3e5162 146 foutputESDFMD->SetMultiplicity(det,ring,sec,strip,0.);
3bb122c7 147 Float_t mult = fmd->Multiplicity(det,ring,sec,strip);
bb8a464f 148
149
8dc7c4c2 150 if(mult == AliESDFMD::kInvalidMult || mult == 0) continue;
7c3e5162 151
bb8a464f 152 Double_t eta = fmd->Eta(det,ring,sec,strip);//EtaFromStrip(det,ring,sec,strip,vertex[2]);
153 //std::cout<<EtaFromStrip(det,ring,sec,strip,vertex[2]) <<" "<<fmd->Eta(det,ring,sec,strip)<<std::endl;
7c3e5162 154 hEdist->Fill(mult);
bb8a464f 155 if(fmd->IsAngleCorrected())
156 mult = mult/TMath::Cos(Eta2Theta(fmd->Eta(det,ring,sec,strip)));
8dc823cc 157 Float_t Eprev = 0;
158 Float_t Enext = 0;
159 if(strip != 0)
bb8a464f 160 if(fmd->Multiplicity(det,ring,sec,strip-1) != AliESDFMD::kInvalidMult) {
8dc823cc 161 Eprev = fmd->Multiplicity(det,ring,sec,strip-1);
bb8a464f 162 if(fmd->IsAngleCorrected())
163 Eprev = Eprev/TMath::Cos(Eta2Theta(fmd->Eta(det,ring,sec,strip-1)));
164 }
8dc823cc 165 if(strip != nstr - 1)
bb8a464f 166 if(fmd->Multiplicity(det,ring,sec,strip+1) != AliESDFMD::kInvalidMult) {
167 Enext = fmd->Multiplicity(det,ring,sec,strip+1);
168 if(fmd->IsAngleCorrected())
169 Enext = Enext/TMath::Cos(Eta2Theta(fmd->Eta(det,ring,sec,strip+1)));
170 }
8dc823cc 171
bb8a464f 172 Float_t merged_energy = GetMultiplicityOfStrip(mult,eta,Eprev,Enext,det,ring,sec,strip);
173 if(merged_energy > 0 )
174 nHits++;
175 foutputESDFMD->SetMultiplicity(det,ring,sec,strip,merged_energy);
176 foutputESDFMD->SetEta(det,ring,sec,strip,eta);
7c3e5162 177
3bb122c7 178 }
179 }
180 }
181 }
3bb122c7 182
bb8a464f 183 //std::cout<<fESD->GetEventNumberInFile()<<" "<<nHits<<" "<<vertex[2]<<std::endl;
184
7c3e5162 185 if(fStandalone) {
186 PostData(0, foutputESDFMD);
187 PostData(1, fEsdVertex);
188 PostData(2, fESD);
189 PostData(3, &fDiagList);
190 }
3bb122c7 191}
8dc823cc 192//_____________________________________________________________________
193Float_t AliFMDAnalysisTaskSharing::GetMultiplicityOfStrip(Float_t mult,
bb8a464f 194 Float_t eta,
8dc823cc 195 Float_t Eprev,
196 Float_t Enext,
bb8a464f 197 UShort_t det,
198 Char_t ring,
199 UShort_t sec,
200 UShort_t strip) {
8dc823cc 201 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
bb8a464f 202 AliFMDParameters* recopars = AliFMDParameters::Instance();
203 Float_t merged_energy = 0;
8dc823cc 204 Float_t nParticles = 0;
8dc7c4c2 205 Float_t cutLow = 0.2;
bb8a464f 206 // Float_t gain = recopars->GetPulseGain(det,ring,sec,strip);
207 //Float_t pw = recopars->GetPedestalWidth(det,ring,sec,strip);
208 //Float_t cutLow = (4*pw)/(gain*recopars->GetDACPerMIP());
209 //std::cout<<cutLow<<" "<<gain<<" "<<recopars->GetEdepMip()<<std::endl;
210 Float_t cutHigh = pars->GetMPV(det,ring) -pars->GetSigma(det,ring);
211 Float_t cutPart = pars->GetMPV(det,ring) - 5*pars->GetSigma(det,ring);
212 // Float_t cutPart = cutLow;//0.33*pars->GetMPV(det,ring);
213
214 // if(ring == 'O')
215 // cutPart = pars->GetMPV(det,ring) - 2*pars->GetSigma(det,ring);
216 Float_t Etotal = mult;
217 //std::cout<<mult<<" "<<strip<<std::endl;
218
219 if(mult > 0 ) {
220 fEnergy = fEnergy + mult;
221 fNstrips++;
222 }
223 if((Enext <0.01 && fEnergy >0) || fNstrips >4 ) {
224
225
226 if((fEnergy*TMath::Cos(Eta2Theta(eta))) > cutPart || fNstrips > 1) {
227 nParticles = 1;
228 merged_energy = fEnergy*TMath::Cos(Eta2Theta(eta));
229 TH1F* hEdist = (TH1F*)fDiagList.FindObject(Form("Edist_after_sharing_FMD%d%c",det,ring));
230 hEdist->Fill(fEnergy);
231 TH1F* hNstrips = (TH1F*)fDiagList.FindObject(Form("N_strips_hit_FMD%d%c",det,ring));
232 hNstrips->Fill(fNstrips);
233 // std::cout<<Form("Merged signals %f %f %f into %f , %f in strip %d, sec %d, ring %c, det %d",Eprev, mult, Enext, fEnergy/TMath::Cos(Eta2Theta(eta)),fEnergy,strip,sec,ring,det )<<std::endl;
234
235 }
236 // else
237 //std::cout<<Form("NO HIT for %f %f %f into %f , %f in strip %d, sec %d, ring %c, det %d, cuts %f , %f",Eprev, mult, Enext, fEnergy/TMath::Cos(Eta2Theta(eta)),fEnergy,strip,sec,ring,det,cutPart,cutHigh )<<std::endl;
238
239 fEnergy = 0;
240 fNstrips = 0;
241 return merged_energy;
242 }
243
244 return 0;
245
246
247 /*
c78bc12b 248 if(fSharedThis) {
249 fSharedThis = kFALSE;
250 fSharedPrev = kTRUE;
8dc823cc 251 return 0.;
252 }
253
bb8a464f 254 if(mult < cutLow)
255 return 0;
256
257
258 //if(Etotal < 0.33*pars->GetMPV(det,ring)) {
259 // fSharedThis = kFALSE;
260 // fSharedPrev = kFALSE;
261 // return 0.;
262 // }
263
264 //Experimental cut
265 if(mult<Enext && Enext>cutHigh)
266 {
267 fSharedThis = kFALSE;
268 fSharedPrev = kFALSE;
269 return 0;
270 }
271 //Experimental cut 2
272 if(mult>Enext && mult > cutHigh)
273 {
274 fSharedThis = kTRUE;
275 fSharedPrev = kFALSE;
276 nParticles = 1;
277 }
278
8dc823cc 279
bb8a464f 280
281 if(Eprev > cutLow && Eprev < cutHigh && !fSharedPrev ) {
8dc823cc 282 Etotal += Eprev;
283 }
284
285 if(Enext > cutLow && Enext < cutHigh ) {
286 Etotal += Enext;
c78bc12b 287 fSharedThis = kTRUE;
8dc823cc 288 }
bb8a464f 289 TH1F* hEdist = (TH1F*)fDiagList.FindObject(Form("Edist_after_sharing_FMD%d%c",det,ring));
290 hEdist->Fill(Etotal);
291
292 Etotal = Etotal*TMath::Cos(Eta2Theta(eta));
293 if(Etotal > cutPart) {
8dc823cc 294 nParticles = 1;
c78bc12b 295 fSharedPrev = kTRUE;
bb8a464f 296 // std::cout<<Form("Merged signals %f %f %f into %f , %f in strip %d, sec %d, ring %c, det %d",Eprev, mult, Enext, Etotal/TMath::Cos(Eta2Theta(eta)),Etotal,strip,sec,ring,det )<<std::endl;
c78bc12b 297 }
298 else {
bb8a464f 299 if(Etotal > 0)
300 //std::cout<<Form("NO HIT for %f %f %f into %f , %f in strip %d, sec %d, ring %c, det %d, cuts %f , %f",Eprev, mult, Enext, Etotal/TMath::Cos(Eta2Theta(eta)),Etotal,strip,sec,ring,det,cutPart,cutHigh )<<std::endl;
c78bc12b 301 fSharedThis = kFALSE;
302 fSharedPrev = kFALSE;
303 }
8dc823cc 304
bb8a464f 305 return nParticles;
306 */
8dc823cc 307}
1282ce49 308//_____________________________________________________________________
309void AliFMDAnalysisTaskSharing::GetVertex(Double_t* vertexXYZ)
310{
311 const AliESDVertex* vertex = 0;
312 vertex = fESD->GetPrimaryVertex();
bb8a464f 313 if(!vertex || (vertexXYZ[0] == 0 && vertexXYZ[1] == 0 && vertexXYZ[2] == 0))
314 vertex = fESD->GetPrimaryVertexSPD();
315 if(!vertex || (vertexXYZ[0] == 0 && vertexXYZ[1] == 0 && vertexXYZ[2] == 0))
316 vertex = fESD->GetPrimaryVertexTPC();
317 if(!vertex || (vertexXYZ[0] == 0 && vertexXYZ[1] == 0 && vertexXYZ[2] == 0))
318 vertex = fESD->GetVertex();
319 if (vertex && (vertexXYZ[0] != 0 || vertexXYZ[1] != 0 || vertexXYZ[2] != 0)) {
1282ce49 320 vertex->GetXYZ(vertexXYZ);
bb8a464f 321 //std::cout<<vertex->GetName()<<" "<< vertex->GetTitle() <<" "<< vertex->GetZv()<<std::endl;
1282ce49 322 return;
323 }
324 else if (fESD->GetESDTZERO()) {
325 vertexXYZ[0] = 0;
326 vertexXYZ[1] = 0;
327 vertexXYZ[2] = fESD->GetT0zVertex();
bb8a464f 328
1282ce49 329 return;
330 }
331
332 return;
bb8a464f 333
334}
335//_____________________________________________________________________
336Float_t AliFMDAnalysisTaskSharing::Eta2Theta(Float_t eta) {
337
338 Float_t theta = 2*TMath::ATan(TMath::Exp(-1*eta));
339
340 if(eta < 0)
341 theta = theta-TMath::Pi();
342
343 // std::cout<<"From eta2Theta: "<<theta<<std::endl;
344 return theta;
345
346
347
348}
349//_____________________________________________________________________
350Double_t AliFMDAnalysisTaskSharing::EtaFromStrip(UShort_t det,
351 Char_t ring,
352 UShort_t sector,
353 UShort_t strip,
354 Double_t zvtx)
355{
356
357 AliFMDGeometry* geo = AliFMDGeometry::Instance();
358
359 Double_t x,y,z;
360 geo->Detector2XYZ(det,ring,sector,strip,x,y,z);
361
362 Double_t r = TMath::Sqrt(x*x+y*y);
363
364 Double_t z_real = z-zvtx;
365 Double_t theta = TMath::ATan2(r,z_real);
366 // std::cout<<"From EtaFromStrip "<<theta<<std::endl;
367 Double_t eta = -1*TMath::Log(TMath::Tan(0.5*theta));
368
369 // std::cout<<det<<" "<<ring<<" "<<sector<<" "<<strip<<" "<<r<<" "<<z_real<<" "<<theta<<" "<<eta<<std::endl;
370
371 return eta;
1282ce49 372}
3bb122c7 373//_____________________________________________________________________
374//
375// EOF
376//