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