4 #include <TInterpreter.h>
10 //#include "AliFMDDebug.h"
11 #include "AliFMDAnalysisTaskSharing.h"
12 #include "AliAnalysisManager.h"
13 #include "AliESDFMD.h"
14 //#include "AliFMDGeometry.h"
15 #include "AliMCEventHandler.h"
16 #include "AliMCEvent.h"
18 #include "AliESDVertex.h"
19 #include "AliMultiplicity.h"
20 #include "AliFMDAnaParameters.h"
22 #include "TObjString.h"
23 //#include "/home/canute/ALICE/AliRoot/PWG0/AliPWG0Helper.h"
24 //#include "AliFMDParameters.h"
25 #include "AliGenEventHeader.h"
26 #include "AliGenPythiaEventHeader.h"
27 #include "AliHeader.h"
29 #include "AliMCParticle.h"
30 #include "AliFMDStripIndex.h"
31 #include "AliESDVZERO.h"
32 #include "AliESDtrack.h"
34 // This is the task to do the FMD sharing or hit merging.
35 // It reads the input ESDFMD data and posts an ESDFMD object to
36 // the tasks that must be performed after this task ie.
37 // Density, BackgroundCorrection and Dndeta.
38 // Author: Hans Hjersing Dalsgaard, hans.dalsgaard@cern.ch
41 ClassImp(AliFMDAnalysisTaskSharing)
43 //_____________________________________________________________________
44 AliFMDAnalysisTaskSharing::AliFMDAnalysisTaskSharing()
57 // Default constructor
58 DefineInput (0, AliESDEvent::Class());
59 DefineOutput(0, AliESDFMD::Class());
60 DefineOutput(1, AliESDVertex::Class());
61 DefineOutput(2, AliESDEvent::Class());
62 DefineOutput(3, TList::Class());
64 //_____________________________________________________________________
65 AliFMDAnalysisTaskSharing::AliFMDAnalysisTaskSharing(const char* name, Bool_t SE):
66 AliAnalysisTask(name, "AnalysisTaskFMD"),
82 DefineInput (0, AliESDEvent::Class());
83 DefineOutput(0, AliESDFMD::Class());
84 DefineOutput(1, AliESDVertex::Class());
85 DefineOutput(2, AliESDEvent::Class());
86 DefineOutput(3, TList::Class());
89 //_____________________________________________________________________
90 Float_t AliFMDAnalysisTaskSharing::GetVtxEfficiencyFromData(){
92 TH1F* hEventsVtx = (TH1F*)fDiagList->FindObject("hEventsVtx");
93 TH1F* hEventsTr = (TH1F*)fDiagList->FindObject("hEventsTr");
95 if(hEventsTr->GetEntries() != 0 && hEventsVtx->GetEntries() !=0 && hEventsTr->GetEntries() != hEventsVtx->GetEntries())
96 return hEventsVtx->GetEntries() / hEventsTr->GetEntries();
100 //_____________________________________________________________________
101 Float_t AliFMDAnalysisTaskSharing::GetNSDVtxEfficiencyFromData(){
103 TH1F* hEventsNSDVtx = (TH1F*)fDiagList->FindObject("hEventsNSDVtx");
104 TH1F* hEventsNSD = (TH1F*)fDiagList->FindObject("hEventsNSD");
106 if(hEventsNSD->GetEntries() != 0 && hEventsNSDVtx->GetEntries() !=0 && hEventsNSD->GetEntries() != hEventsNSDVtx->GetEntries())
107 return hEventsNSDVtx->GetEntries() / hEventsNSD->GetEntries();
113 //_____________________________________________________________________
114 void AliFMDAnalysisTaskSharing::CreateOutputObjects()
116 // Create the output objects
118 foutputESDFMD = new AliESDFMD();
121 fEsdVertex = new AliESDVertex();
124 fDiagList = new TList();
126 fDiagList->SetName("Sharing diagnostics");
128 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
129 TH2F* hBg = pars->GetBackgroundCorrection(1, 'I', 0);
130 TH1F* hPrimary = new TH1F("hMultvsEtaNoCuts","hMultvsEtaNoCuts",
132 hBg->GetXaxis()->GetXmin(),
133 hBg->GetXaxis()->GetXmax());
135 fDiagList->Add(hPrimary);
137 TH1F* hPrimaryNSD = new TH1F("hMultvsEtaNSDNoCuts","hMultvsEtaNSDNoCuts",
139 hBg->GetXaxis()->GetXmin(),
140 hBg->GetXaxis()->GetXmax());
141 hPrimaryNSD->Sumw2();
142 fDiagList->Add(hPrimaryNSD);
144 TH1F* hXvtx = new TH1F("hXvtx","x vertex distribution",100,-2,2);
145 TH1F* hYvtx = new TH1F("hYvtx","y vertex distribution",100,-2,2);
146 TH1F* hZvtx = new TH1F("hZvtx","z vertex distribution",4*pars->GetNvtxBins(),-4*pars->GetVtxCutZ(),4*pars->GetVtxCutZ());
148 fDiagList->Add(hXvtx);
149 fDiagList->Add(hYvtx);
150 fDiagList->Add(hZvtx);
152 TH1F* hPrimVertexBin = 0;
154 for(Int_t i = 0; i< pars->GetNvtxBins(); i++) {
156 hPrimVertexBin = new TH1F(Form("primmult_NoCuts_vtxbin%d",i),
157 Form("primmult_NoCuts_vtxbin%d",i),
159 hBg->GetXaxis()->GetXmin(),
160 hBg->GetXaxis()->GetXmax());
161 hPrimVertexBin->Sumw2();
162 fDiagList->Add(hPrimVertexBin);
166 for(Int_t det = 1; det<=3; det++) {
167 Int_t nRings = (det==1 ? 1 : 2);
169 for(Int_t iring = 0;iring<nRings; iring++) {
170 Char_t ringChar = (iring == 0 ? 'I' : 'O');
171 TH1F* hEdist = new TH1F(Form("Edist_before_sharing_FMD%d%c", det, ringChar),
172 Form("Edist_before_sharing_FMD%d%c", det, ringChar),
174 TH1F* hEdistAfter = new TH1F(Form("Edist_after_sharing_FMD%d%c", det, ringChar),
175 Form("Edist_after_sharing_FMD%d%c", det, ringChar),
179 //TH1F* hNstripsHit = new TH1F(Form("N_strips_hit_FMD%d%c",det,ringChar),
180 // Form("N_strips_hit_FMD%d%c",det,ringChar),
182 fDiagList->Add(hEdist);
183 fDiagList->Add(hEdistAfter);
184 //fDiagList->Add(hNstripsHit);
186 for(Int_t i = 0; i< pars->GetNvtxBins(); i++) {
187 hHits = new TH1F(Form("hMCHits_nocuts_FMD%d%c_vtxbin%d",det,ringChar,i),Form("hMCHits_FMD%d%c_vtxbin%d",det,ringChar,i),
189 hBg->GetXaxis()->GetXmin(),
190 hBg->GetXaxis()->GetXmax());
192 fDiagList->Add(hHits);
198 TH2F* hCorrelationFMDSPDhits = new TH2F("hCorrelationFMDSPDhits","hCorrelationFMDSPDhits;SPD;FMD ",100,0,200,100,0,500);
199 TH2F* hCorrelationFMDSPD = new TH2F("hCorrelationFMDSPD","hCorrelationFMDSPD;SPD;FMD ",100,0,200,100,0,500);
200 TH2F* hCorrelationFMD1SPD = new TH2F("hCorrelationFMD1SPD","hCorrelationFMD1SPD;SPD;FMD1 ",100,0,200,100,0,200);
201 TH2F* hCorrelationFMD2ISPD = new TH2F("hCorrelationFMD2ISPD","hCorrelationFMD2ISPD;SPD;FMD2I ",100,0,200,100,0,200);
202 TH2F* hCorrelationFMD2OSPD = new TH2F("hCorrelationFMD2OSPD","hCorrelationFMD2OSPD;SPD;FMD2O ",100,0,200,100,0,200);
203 TH2F* hCorrelationFMD3ISPD = new TH2F("hCorrelationFMD3ISPD","hCorrelationFMD3ISPD;SPD;FMD3I ",100,0,200,100,0,200);
204 TH2F* hCorrelationFMD3OSPD = new TH2F("hCorrelationFMD3OSPD","hCorrelationFMD3OSPD;SPD;FMD3O ",100,0,200,100,0,200);
205 TH2F* hCorrelationFMDGoodtracks = new TH2F("hCorrelationFMDGoodtracks","hCorrelationGoodtracks;good tracks;FMD ",100,0,200,100,0,200);
206 TH2F* hCorrelationFMDBadtracks = new TH2F("hCorrelationFMDBadtracks","hCorrelationBadtracks;bad tracks;FMD ",100,0,200,100,0,200);
207 TH2F* hCorrelationGoodbadtracks = new TH2F("hCorrelationGoodbadtracks","hCorrelationGoodbadtracks;good tracks;bad tracks ",100,0,200,100,0,200);
208 TH2F* hCorrelationSPDTracklets = new TH2F("hCorrelationSPDTracklets","hCorrelationSPDTracklets;hits ; tracklets ",100,0,500,100,0,200);
209 TH2F* hCorrelationClustersTracklets = new TH2F("hCorrelationClustersTracklets","hCorrelationClustersTracklets;clusters ; tracklets ",500,0,500,100,0,100);
210 TH2F* hCorrelationHitsRadius = new TH2F("hCorrelationHitsRadius","hCorrelationHitsRadius;hits ; radius ",100,0,500,100,0,10);
211 TH2F* hCorrelationHitsX = new TH2F("hCorrelationHitsX","hCorrelationHitsX;hits ; X ",100,0,500,100,-5,5);
212 TH2F* hCorrelationHitsY = new TH2F("hCorrelationHitsY","hCorrelationHitsY;hits ; Y ",100,0,500,100,-5,5);
213 fDiagList->Add(hCorrelationHitsRadius);
214 fDiagList->Add(hCorrelationHitsX);
215 fDiagList->Add(hCorrelationHitsY);
216 fDiagList->Add(hCorrelationFMDSPD);
217 fDiagList->Add(hCorrelationFMD1SPD);
218 fDiagList->Add(hCorrelationFMD2ISPD);
219 fDiagList->Add(hCorrelationFMD2OSPD);
220 fDiagList->Add(hCorrelationFMD3ISPD);
221 fDiagList->Add(hCorrelationFMD3OSPD);
222 fDiagList->Add(hCorrelationFMDGoodtracks);
223 fDiagList->Add(hCorrelationFMDBadtracks);
224 fDiagList->Add(hCorrelationGoodbadtracks);
225 fDiagList->Add(hCorrelationFMDSPDhits);
226 fDiagList->Add(hCorrelationClustersTracklets);
227 fDiagList->Add(hCorrelationSPDTracklets);
228 TH2F* hCorrelationFMD23 = new TH2F("hCorrelationFMD23","hCorrelationFMD23;FMD2 ;FMD3 ",100,0,500,100,0,500);
229 TH2F* hCorrelationFMD2diff23 = new TH2F("hCorrelationFMD2diff23","hCorrelationFMD2diff23;FMD2 ;diff FMD23 ",100,0,100,100,0,100);
230 TH2F* hCorrelationFMD3diff23 = new TH2F("hCorrelationFMD3diff23","hCorrelationFMD3diff23;FMD3 ;diff FMD23 ",100,0,100,100,0,100);
231 TH2F* hCorrelationFMD1diff13 = new TH2F("hCorrelationFMD1diff13","hCorrelationFMD1diff13;FMD1 ;diff FMD13 ",100,0,100,100,0,100);
232 TH2F* hCorrelationFMD1diff12 = new TH2F("hCorrelationFMD1diff12","hCorrelationFMD1diff12;FMD1 ;diff FMD12 ",100,0,100,100,0,100);
233 TH2F* hCorrelationFMD12 = new TH2F("hCorrelationFMD12","hCorrelationFMD12;FMD1 ;FMD2 ",100,0,500,100,0,500);
234 TH2F* hCorrelationFMDBgCand = new TH2F("hCorrelationFMDBgCand","hCorrelationFMDBgCand;Bg Tr ;FMD ",100,0,100,500,0,500);
236 TH2F* hCorrelationFMDFlatTr = new TH2F("hCorrelationFMDFlatTr","hCorrelationFMDFlatTr;Bg Tr ;FMD ",100,0,100,500,0,500);
237 TH2F* hCorrelationFMDRatioFlatTr = new TH2F("hCorrelationFMDRatioFlatTr","hCorrelationFMDRatioFlatTr;Bg Tr ;FMD ",100,0,1,500,0,500);
238 fDiagList->Add(hCorrelationFMDBgCand);
239 fDiagList->Add(hCorrelationFMDFlatTr);
240 fDiagList->Add(hCorrelationFMDRatioFlatTr);
241 TH2F* hCorrelationFMDBgCandRelative = new TH2F("hCorrelationFMDBgCandRelative","hCorrelationFMDBgCandRelative;Bg Tr ;FMD ",100,0,2,500,0,500);
242 fDiagList->Add(hCorrelationFMDBgCandRelative);
243 fDiagList->Add(hCorrelationFMD2diff23);
244 fDiagList->Add(hCorrelationFMD3diff23);
245 fDiagList->Add(hCorrelationFMD1diff13);
246 fDiagList->Add(hCorrelationFMD1diff12);
247 fDiagList->Add(hCorrelationFMD23);
248 fDiagList->Add(hCorrelationFMD12);
249 TH2F* hTimeCorrelation = new TH2F("hCorrelationTime","hCorrelationTime ; time ; FMD hits",500,0,500,100,0,200);
250 fDiagList->Add(hTimeCorrelation);
251 TH1F* hHitDistribution = new TH1F("hFMDHitDistribution","hFMDHitDistribution ; FMD hits",500,0,500);
253 TH1F* hHitDistributionFMD1 = new TH1F("hFMDHitDistributionFMD1","hFMDHitDistributionFMD1 ; FMD1 hits",500,0,500);
254 TH1F* hHitDistributionFMD2I = new TH1F("hFMDHitDistributionFMD2I","hFMDHitDistributionFMD2I ; FMD2I hits",500,0,500);
255 TH1F* hHitDistributionFMD2O = new TH1F("hFMDHitDistributionFMD2O","hFMDHitDistributionFMD2O ; FMD2O hits",500,0,500);
256 TH1F* hHitDistributionFMD3I = new TH1F("hFMDHitDistributionFMD3I","hFMDHitDistributionFMD3I ; FMD3I hits",500,0,500);
257 TH1F* hHitDistributionFMD3O = new TH1F("hFMDHitDistributionFMD3O","hFMDHitDistributionFMD3O ; FMD3O hits",500,0,500);
258 TH1F* hTrVtxDistribution = new TH1F("hTrVtxDistribution","hTrVtxDistribution ; TrVtx",200,-500,500);
259 TH1F* hTrEtaDistribution = new TH1F("hTrEtaDistribution","hTrEtaDistribution ; TrEta",200,-9,9);
260 TH1F* hTrEtaDistribution2 = new TH1F("hTrEtaDistribution2","hTrEtaDistribution2 ; TrEta",200,-9,9);
262 TH1F* hFlatTracks = new TH1F("hFlatTracks","hFlatTracks ; Horizontal tracks",100,0,100);
264 TH1F* hEnergyOfParticles = new TH1F("hEnergyOfParticles","hEnergyOfParticles",1000000,0,10);
265 fDiagList->Add(hEnergyOfParticles);
266 fDiagList->Add(hTrVtxDistribution);
267 fDiagList->Add(hTrEtaDistribution);
268 fDiagList->Add(hTrEtaDistribution2);
269 fDiagList->Add(hFlatTracks);
270 fDiagList->Add(hHitDistribution);
271 fDiagList->Add(hHitDistributionFMD1);
272 fDiagList->Add(hHitDistributionFMD2I);
273 fDiagList->Add(hHitDistributionFMD2O);
274 fDiagList->Add(hHitDistributionFMD3I);
275 fDiagList->Add(hHitDistributionFMD3O);
276 TH1F* nMCevents = new TH1F("nMCEventsNoCuts","nMCEventsNoCuts",pars->GetNvtxBins(),0,pars->GetNvtxBins());
277 TH1F* nMCeventsNSD= new TH1F("nMCEventsNSDNoCuts","nMCEventsNSDNoCuts",pars->GetNvtxBins(),0,pars->GetNvtxBins());
278 fDiagList->Add(nMCevents);
279 fDiagList->Add(nMCeventsNSD);
281 TH1F* hEventsVtx = new TH1F("hEventsVtx","hEventsVtx",pars->GetNvtxBins(),0,pars->GetNvtxBins());
282 TH1F* hEventsTr = new TH1F("hEventsTr","hEventsTr",pars->GetNvtxBins(),0,pars->GetNvtxBins());
283 TH1F* hEventsNSD = new TH1F("hEventsNSD","hEventsNSD",pars->GetNvtxBins(),0,pars->GetNvtxBins());
284 TH1F* hEventsNSDVtx = new TH1F("hEventsNSDVtx","hEventsNSDVtx",pars->GetNvtxBins(),0,pars->GetNvtxBins());
285 fDiagList->Add(hEventsVtx);
286 fDiagList->Add(hEventsTr);
287 fDiagList->Add(hEventsNSD);
288 fDiagList->Add(hEventsNSDVtx);
291 //_____________________________________________________________________
292 void AliFMDAnalysisTaskSharing::ConnectInputData(Option_t */*option*/)
294 // connect the input data
296 fESD = (AliESDEvent*)GetInputData(0);
298 //_____________________________________________________________________
299 void AliFMDAnalysisTaskSharing::Exec(Option_t */*option*/)
301 //perform analysis on one event
302 AliESD* old = fESD->GetAliESDOld();
304 fESD->CopyFromOldESD();
307 foutputESDFMD->Clear();
309 Int_t delta = fESD->GetOrbitNumber() - fLastOrbit;
310 fLastOrbit = fESD->GetOrbitNumber();
313 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
314 Double_t vertex[3]={0,0,0};
315 Bool_t vtxStatus = pars->GetVertex(fESD,vertex);
316 fEsdVertex->SetXYZ(vertex);
318 // std::cout<<vtxStatus<<" "<<vertex[0]<<" "<<vertex[1]<<" "<<vertex[2]<<std::endl;
320 // Process primaries here to get true MC distribution
321 if(pars->GetProcessPrimary())
323 const AliMultiplicity* testmult = fESD->GetMultiplicity();
324 Int_t nTrackLets = testmult->GetNumberOfTracklets();
325 TH2F* hCorrelationClustersTracklets = (TH2F*)fDiagList->FindObject("hCorrelationClustersTracklets");
326 hCorrelationClustersTracklets->Fill(testmult->GetNumberOfSingleClusters(),nTrackLets);
330 Bool_t isTriggered = pars->IsEventTriggered(AliFMDAnaParameters::kMB1);
331 Bool_t nsd = pars->IsEventTriggered(AliFMDAnaParameters::kNSD);
333 Double_t delta2 = 2*pars->GetVtxCutZ()/pars->GetNvtxBins();
334 Double_t vertexBinDouble = (vertex[2] + pars->GetVtxCutZ()) / delta2;
335 Int_t vtxbin = (Int_t)vertexBinDouble;
336 TH1F* hEventsVtx = (TH1F*)fDiagList->FindObject("hEventsVtx");
337 TH1F* hEventsTr = (TH1F*)fDiagList->FindObject("hEventsTr");
338 TH1F* hEventsNSD = (TH1F*)fDiagList->FindObject("hEventsNSD");
339 TH1F* hEventsNSDVtx = (TH1F*)fDiagList->FindObject("hEventsNSDVtx");
341 if( TMath::Abs(vertex[2]) > pars->GetVtxCutZ()) {
346 if(vtxStatus) hEventsVtx->Fill(vtxbin);
347 if(isTriggered) hEventsTr->Fill(vtxbin);
349 if(vtxStatus && nsd) hEventsNSDVtx->Fill(vtxbin);
350 if(nsd) hEventsNSD->Fill(vtxbin);
352 if(!isTriggered || !vtxStatus ) {
359 TH1F* hXvtx = (TH1F*)fDiagList->FindObject("hXvtx");
360 if(vtxStatus ) hXvtx->Fill(vertex[0]);
361 TH1F* hYvtx = (TH1F*)fDiagList->FindObject("hYvtx");
362 if(vtxStatus ) hYvtx->Fill(vertex[1]);
363 TH1F* hZvtx = (TH1F*)fDiagList->FindObject("hZvtx");
364 hZvtx->Fill(vertex[2]);
365 //const AliMultiplicity* testmult = fESD->GetMultiplicity();
366 //std::cout<<vertex[2]<<std::endl;
367 //Int_t nTrackLets = testmult->GetNumberOfTracklets();
369 // if( TMath::Abs(vertex[2]) > pars->GetVtxCutZ()) {
374 if(nTrackLets < 1000) foutputESDFMD->SetUniqueID(kTRUE);
375 else foutputESDFMD->SetUniqueID(kFALSE);
377 AliESDFMD* fmd = fESD->GetFMDData();
380 Int_t nHits[3][2] = {{0,0},{0,0},{0,0}};
382 for(UShort_t det=1;det<=3;det++) {
383 Int_t nRings = (det==1 ? 1 : 2);
384 for (UShort_t ir = 0; ir < nRings; ir++) {
385 Char_t ring = (ir == 0 ? 'I' : 'O');
386 UShort_t nsec = (ir == 0 ? 20 : 40);
387 UShort_t nstr = (ir == 0 ? 512 : 256);
389 TH1F* hEdist = (TH1F*)fDiagList->FindObject(Form("Edist_before_sharing_FMD%d%c",det,ring));
391 for(UShort_t sec =0; sec < nsec; sec++) {
392 fSharedThis = kFALSE;
393 fSharedPrev = kFALSE;
395 for(UShort_t strip = 0; strip < nstr; strip++) {
396 foutputESDFMD->SetMultiplicity(det,ring,sec,strip,0.);
397 Float_t mult = fmd->Multiplicity(det,ring,sec,strip);
399 if(mult == AliESDFMD::kInvalidMult || mult == 0) continue;
402 //Double_t eta = fmd->Eta(det,ring,sec,strip);
403 Float_t eta = pars->GetEtaFromStrip(det,ring,sec,strip,vertex[2]);
406 if(fmd->IsAngleCorrected())
407 mult = mult/TMath::Cos(Eta2Theta(eta));
411 if(fmd->Multiplicity(det,ring,sec,strip-1) != AliESDFMD::kInvalidMult) {
412 prevE = fmd->Multiplicity(det,ring,sec,strip-1);
413 if(fmd->IsAngleCorrected())
414 prevE = prevE/TMath::Cos(Eta2Theta(fmd->Eta(det,ring,sec,strip-1)));
416 if(strip != nstr - 1)
417 if(fmd->Multiplicity(det,ring,sec,strip+1) != AliESDFMD::kInvalidMult) {
418 nextE = fmd->Multiplicity(det,ring,sec,strip+1);
419 if(fmd->IsAngleCorrected())
420 nextE = nextE/TMath::Cos(Eta2Theta(fmd->Eta(det,ring,sec,strip+1)));
423 Float_t mergedEnergy = GetMultiplicityOfStrip(mult,eta,prevE,nextE,det,ring,sec,strip);
424 //if(mult> (pars->GetMPV(det,ring,eta) - pars->GetSigma(det,ring,eta)))
425 // mergedEnergy = mult;
426 //else mergedEnergy = 0;
427 if(mergedEnergy > 0.3 )
429 foutputESDFMD->SetMultiplicity(det,ring,sec,strip,mergedEnergy);
430 foutputESDFMD->SetEta(det,ring,sec,strip,eta);
437 //if(testmult->GetNumberOfSingleClusters() > 15 + nTrackLets)
438 // {fStatus = kFALSE; std::cout<<"FMD : "<<nHits[0][0]<<" "<<nHits[1][0]<<" "<<nHits[1][1]<<" "<<nHits[2][0]<<" "<<nHits[2][1]<<" tracks "<<testmult->GetNumberOfSingleClusters()<<" "<<nTrackLets<<std::endl; return;}
440 TH2F* hCorrelationFMD23 = (TH2F*)fDiagList->FindObject("hCorrelationFMD23");
441 TH2F* hCorrelationFMD12 = (TH2F*)fDiagList->FindObject("hCorrelationFMD12");
442 TH2F* hCorrelationFMD2diff23 = (TH2F*)fDiagList->FindObject("hCorrelationFMD2diff23");
443 TH2F* hCorrelationFMD3diff23 = (TH2F*)fDiagList->FindObject("hCorrelationFMD3diff23");
444 TH2F* hCorrelationFMD1diff13 = (TH2F*)fDiagList->FindObject("hCorrelationFMD1diff13");
445 TH2F* hCorrelationFMD1diff12 = (TH2F*)fDiagList->FindObject("hCorrelationFMD1diff12");
447 TH2F* hCorrelationFMDSPD = (TH2F*)fDiagList->FindObject("hCorrelationFMDSPD");
448 TH2F* hCorrelationFMD1SPD = (TH2F*)fDiagList->FindObject("hCorrelationFMD1SPD");
449 TH2F* hCorrelationFMD2ISPD = (TH2F*)fDiagList->FindObject("hCorrelationFMD2ISPD");
450 TH2F* hCorrelationFMD2OSPD = (TH2F*)fDiagList->FindObject("hCorrelationFMD2OSPD");
451 TH2F* hCorrelationFMD3ISPD = (TH2F*)fDiagList->FindObject("hCorrelationFMD3ISPD");
452 TH2F* hCorrelationFMD3OSPD = (TH2F*)fDiagList->FindObject("hCorrelationFMD3OSPD");
454 TH2F* hCorrelationFMDSPDhits = (TH2F*)fDiagList->FindObject("hCorrelationFMDSPDhits");
456 TH2F* hCorrelationSPDTracklets = (TH2F*)fDiagList->FindObject("hCorrelationSPDTracklets");
457 TH2F* hTimeCorrelation = (TH2F*)fDiagList->FindObject("hCorrelationTime");
458 TH2F* hHitsRadius = (TH2F*)fDiagList->FindObject("hCorrelationHitsRadius");
459 TH2F* hHitsX = (TH2F*)fDiagList->FindObject("hCorrelationHitsX");
460 TH2F* hHitsY = (TH2F*)fDiagList->FindObject("hCorrelationHitsY");
461 TH1F* hFMDHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistribution");
462 TH1F* hFMD1HitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD1");
463 TH1F* hFMD2IHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD2I");
464 TH1F* hFMD2OHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD2O");
465 TH1F* hFMD3IHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD3I");
466 TH1F* hFMD3OHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD3O");
467 TH1F* hCorrelationFMDGoodtracks = (TH1F*)fDiagList->FindObject("hCorrelationFMDGoodtracks");
468 TH1F* hCorrelationFMDBadtracks = (TH1F*)fDiagList->FindObject("hCorrelationFMDBadtracks");
469 TH1F* hCorrelationGoodbadtracks = (TH1F*)fDiagList->FindObject("hCorrelationGoodbadtracks");
470 TH2F* hCorrelationFMDBgCand = (TH2F*)fDiagList->FindObject("hCorrelationFMDBgCand");
471 TH2F* hCorrelationFMDBgCandRelative = (TH2F*)fDiagList->FindObject("hCorrelationFMDBgCandRelative");
473 TH2F* hCorrelationFMDFlatTr = (TH2F*)fDiagList->FindObject("hCorrelationFMDFlatTr");
474 TH2F* hCorrelationFMDRatioFlatTr = (TH2F*)fDiagList->FindObject("hCorrelationFMDRatioFlatTr");
475 TH1F* hTrVtxDistribution = (TH1F*)fDiagList->FindObject("hTrVtxDistribution");
476 TH1F* hTrEtaDistribution = (TH1F*)fDiagList->FindObject("hTrEtaDistribution");
477 TH1F* hTrEtaDistribution2 = (TH1F*)fDiagList->FindObject("hTrEtaDistribution2");
478 hCorrelationFMDSPD->Fill(nTrackLets,nHits[0][0]+nHits[1][0]+nHits[1][1]+nHits[2][0]+nHits[2][1]);
479 TH1F* hFlatTracks = (TH1F*)fDiagList->FindObject("hFlatTracks");
480 hCorrelationFMD1SPD->Fill(nTrackLets,nHits[0][0]);
481 hCorrelationFMD2ISPD->Fill(nTrackLets,nHits[1][0]);
482 hCorrelationFMD2OSPD->Fill(nTrackLets,nHits[1][1]);
483 hCorrelationFMD3ISPD->Fill(nTrackLets,nHits[2][0]);
484 hCorrelationFMD3OSPD->Fill(nTrackLets,nHits[2][1]);
485 hCorrelationFMDSPDhits->Fill(testmult->GetNumberOfFiredChips(0),nHits[0][0]+nHits[1][0]+nHits[1][1]+nHits[2][0]+nHits[2][1]);
486 hCorrelationSPDTracklets->Fill(testmult->GetNumberOfFiredChips(0),nTrackLets);
488 hTimeCorrelation->Fill(delta,nHits[0][0]+nHits[1][0]+nHits[1][1]+nHits[2][0]+nHits[2][1]);
489 hCorrelationFMD23->Fill(nHits[1][0]+nHits[1][1],nHits[2][0]+nHits[2][1]);
490 hCorrelationFMD12->Fill(nHits[0][0],nHits[1][0]+nHits[1][1]);
492 // if(TMath::Abs(nHits[1]-nHits[2]) > 15 && (nHits[1]+nHits[2]) > 35) {fStatus = kFALSE; std::cout<<"difference : "<<TMath::Abs(nHits[1]-nHits[2])<<std::endl; return;}
494 // if(testmult->GetNumberOfFiredChips(0))
495 // if(testmult->GetNumberOfFiredChips(0) > 15 && ((Float_t)nTrackLets / (Float_t)testmult->GetNumberOfFiredChips(0)) < 0.4)
496 // {fStatus = kFALSE; std::cout<<nTrackLets<<" "<<testmult->GetNumberOfFiredChips(0)<<" "<<nHits[0]<<" "<<nHits[1]<<" "<<nHits[2]<<std::endl; return;}
499 Float_t diff23 = (Float_t)TMath::Abs(nHits[2][1] + nHits[2][0] - nHits[1][1] - nHits[1][0]);
501 Float_t diff13 = TMath::Abs(nHits[2][1] + nHits[2][0] - nHits[1][1] - nHits[1][0] - nHits[0][0]);
502 Float_t diff12 = TMath::Abs(nHits[1][0] - nHits[0][0]);
504 hCorrelationFMD1diff12->Fill(nHits[0][0], diff12);
505 hCorrelationFMD1diff13->Fill(nHits[0][0], diff13);
506 hCorrelationFMD2diff23->Fill(nHits[1][1], diff23);
507 hCorrelationFMD3diff23->Fill(nHits[2][1], diff23);
510 Float_t nTotalFMDhits = nHits[0][0]+nHits[1][0]+nHits[1][1]+nHits[2][0]+nHits[2][1] ;
511 Float_t radius = TMath::Sqrt(TMath::Power(vertex[0] + 0.03715,2) + TMath::Power(vertex[1] - 0.1659,2));
513 if(vertex[1] !=0 || vertex[1] !=0) {
514 hHitsRadius->Fill(nTotalFMDhits,radius);
515 hHitsX->Fill(nTotalFMDhits,vertex[0]);
516 hHitsY->Fill(nTotalFMDhits,vertex[1]); }
518 hFMDHitDistribution->Fill(nTotalFMDhits);
519 hFMD1HitDistribution->Fill(nHits[0][0]);
520 hFMD2IHitDistribution->Fill(nHits[1][0]);
521 hFMD2OHitDistribution->Fill(nHits[1][1]);
522 hFMD3IHitDistribution->Fill(nHits[2][0]);
523 hFMD3OHitDistribution->Fill(nHits[2][0]);
525 // if(radius > 0.5) {fStatus = kFALSE; std::cout<<"FMD : "<<nTotalFMDhits<<std::endl; foutputESDFMD->Clear(); return;}
526 //if(TMath::Abs(vertex[1] - 0.1659) > 0.1 ) {fStatus = kFALSE; std::cout<<"FMD : "<<nTotalFMDhits<<std::endl; foutputESDFMD->Clear(); return;}
528 if(nTrackLets < pars->GetLowSPDLimit() || nTrackLets > pars->GetHighSPDLimit())
529 {fStatus = kFALSE; std::cout<<nTrackLets<<" "<<" "<<nHits[0][0]<<" "<<nHits[1][0]<<" "<<nHits[1][1]<<" "<<nHits[2][0]<<" "<<nHits[2][1]<<std::endl; return;}
532 AliESDtrack* track = 0;
533 Int_t ntracks = fESD->GetNumberOfTracks();
534 Float_t ngood =0, nbad = 0;
535 //std::cout<<" Primary vtx : "<<vertex[0]<<" "<<vertex[1]<<" "<<vertex[2]<<" "<<nTotalFMDhits<<std::endl;
536 Int_t nBgCandidates = 0;
538 for(Int_t i=0;i<ntracks;i++) {
539 track = fESD->GetTrack(i);
540 //std::cout<<track->GetX()-vertex[0]<<" "<<track->GetY()-vertex[1]<<" "<<track->GetZ()-vertex[2]<<std::endl;
541 //std::cout<<track->GetX()<<" "<<track->GetY()<<" "<<track->GetZ()<<std::endl;
542 hTrVtxDistribution->Fill(track->GetZ());
544 if(TMath::Abs( track->GetZ()) > 50 && TMath::Abs(track->GetZ()) < 300) { // && TMath::Abs( track->GetY()) < 1)
546 hTrEtaDistribution->Fill(track->Eta());
551 if(TMath::Abs(track->GetX()-vertex[0]) > 0.3 || TMath::Abs(track->GetY()-vertex[1]) > 0.3 || TMath::Abs(track->GetZ()-vertex[2]) > 0.3) {
553 hTrEtaDistribution2->Fill(track->Eta()); }
556 if(TMath::Abs(track->Pt()) < 0.1)
560 Float_t ratioFlat = 0;
561 if(fESD->GetNumberOfTracks())
562 ratioFlat = nFlat/(Float_t)fESD->GetNumberOfTracks();
563 hCorrelationFMDFlatTr->Fill(nFlat,nTotalFMDhits);
564 hCorrelationFMDRatioFlatTr->Fill(ratioFlat,nTotalFMDhits);
565 hFlatTracks->Fill(nFlat);
567 // std::cout<<fESD->GetT0zVertex()<<" "<<vertex[2]<<std::endl;
569 //if(fESD->GetNumberOfTracks() > 0)
571 if(fESD->GetNumberOfTracks() > 0)
572 ratioBg = (Float_t)nBgCandidates/(Float_t)fESD->GetNumberOfTracks();
573 hCorrelationFMDBgCand->Fill(nBgCandidates,nTotalFMDhits);
574 hCorrelationFMDBgCandRelative->Fill(ratioBg,nTotalFMDhits);
577 // Float_t ratio = (nbad > 0 ? ngood / nbad : 0);
579 hCorrelationFMDGoodtracks->Fill(ngood,nTotalFMDhits);
580 hCorrelationFMDBadtracks->Fill(nbad,nTotalFMDhits);
581 hCorrelationGoodbadtracks->Fill(ngood,nbad);
584 PostData(0, foutputESDFMD);
585 PostData(1, fEsdVertex);
587 PostData(3, fDiagList);
591 //_____________________________________________________________________
592 Float_t AliFMDAnalysisTaskSharing::GetMultiplicityOfStrip(Float_t mult,
599 UShort_t /*strip*/) {
600 //analyse and perform sharing on one strip
601 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
603 Float_t mergedEnergy = 0;
604 //Float_t nParticles = 0;
605 Float_t cutLow = 0.3;//0.15;
607 Float_t cutHigh = pars->GetMPV(det,ring,eta) - 2*pars->GetSigma(det,ring,eta);
613 //AliFMDParameters* recopars = AliFMDParameters::Instance();
614 //cutLow = (5*recopars->GetPedestalWidth(det,ring,sec,strip))/(recopars->GetPulseGain(det,ring,sec,strip)*recopars->GetDACPerMIP());
615 //if(foutputESDFMD->GetUniqueID() == kFALSE ) {
617 if(mult > 12 || mult < cutLow)
619 // std::cout<<"rejecting hit in FMD "<<det<<" "<<ring<<std::endl;
620 fSharedThis = kFALSE;
621 fSharedPrev = kFALSE;
628 // Float_t cutPart = pars->GetMPV(det,ring,eta) - 5*pars->GetSigma(det,ring,eta);
629 Float_t totalE = mult;
632 //std::cout<<det<<ring<<" "<<sec<<" "<<strip<<" "<<cutLow<<std::endl;
634 fSharedThis = kFALSE;
639 /* if(mult < 0.33*pars->GetMPV(det,ring,eta)) {
640 fSharedThis = kFALSE;
641 fSharedPrev = kFALSE;
644 if(mult<nextE && nextE>cutHigh && foutputESDFMD->GetUniqueID() == kTRUE)
646 fSharedThis = kFALSE;
647 fSharedPrev = kFALSE;
652 if(prevE > cutLow && prevE < cutHigh && !fSharedPrev ) {
656 if(nextE > cutLow && nextE < cutHigh ) {
660 totalE = totalE*TMath::Cos(Eta2Theta(eta));
661 TH1F* hEdist = (TH1F*)fDiagList->FindObject(Form("Edist_after_sharing_FMD%d%c",det,ring));
663 hEdist->Fill(totalE);
668 mergedEnergy = totalE;
670 // if(det == 1 && ring =='I')
673 fSharedThis = kFALSE;
674 fSharedPrev = kFALSE;
677 // mergedEnergy = mult;
682 TH1F* hEdist = (TH1F*)fDiagList->FindObject(Form("Edist_after_sharing_FMD%d%c",det,ring));
686 mergedEnergy = fEtotal;
688 hEdist->Fill(mergedEnergy);
697 //_____________________________________________________________________
698 void AliFMDAnalysisTaskSharing::Terminate(Option_t* /* option*/) {
700 TH1F* hFMDHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistribution");
701 TH1F* hFMD1HitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD1");
702 TH1F* hFMD2IHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD2I");
703 TH1F* hFMD2OHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD2O");
704 TH1F* hFMD3IHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD3I");
705 TH1F* hFMD3OHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD3O");
707 TH1F* hZvtx = (TH1F*)fDiagList->FindObject("hZvtx");
708 for(UShort_t det=1;det<=3;det++) {
709 Int_t nRings = (det==1 ? 1 : 2);
710 for (UShort_t ir = 0; ir < nRings; ir++) {
711 Char_t ring = (ir == 0 ? 'I' : 'O');
713 TH1F* hEdist = (TH1F*)fDiagList->FindObject(Form("Edist_before_sharing_FMD%d%c",det,ring));
714 TH1F* hEdistAfter = (TH1F*)fDiagList->FindObject(Form("Edist_after_sharing_FMD%d%c",det,ring));
715 if(hZvtx->GetEntries()) {
716 hEdist->Scale(1./(Float_t)hZvtx->GetEntries());
717 hEdistAfter->Scale(1./(Float_t)hZvtx->GetEntries());
723 TH1F* hFlatTracks = (TH1F*)fDiagList->FindObject("hFlatTracks");
724 TH1F* hTrVtxDistribution = (TH1F*)fDiagList->FindObject("hTrVtxDistribution");
725 TH1F* hTrEtaDistribution = (TH1F*)fDiagList->FindObject("hTrEtaDistribution");
726 TH1F* hTrEtaDistribution2 = (TH1F*)fDiagList->FindObject("hTrEtaDistribution2");
727 if(hZvtx->GetEntries()) {
728 hFMDHitDistribution->Scale(1./(Float_t)hZvtx->GetEntries());
729 hFMD1HitDistribution->Scale(1./(Float_t)hZvtx->GetEntries());
730 hFMD2IHitDistribution->Scale(1./(Float_t)hZvtx->GetEntries());
731 hFMD2OHitDistribution->Scale(1./(Float_t)hZvtx->GetEntries());
732 hFMD3IHitDistribution->Scale(1./(Float_t)hZvtx->GetEntries());
733 hFMD3OHitDistribution->Scale(1./(Float_t)hZvtx->GetEntries());
734 hFlatTracks->Scale(1./(Float_t)hZvtx->GetEntries());
735 hTrVtxDistribution->Scale(1./(Float_t)hZvtx->GetEntries());
736 hTrEtaDistribution->Scale(1./(Float_t)hZvtx->GetEntries());
737 hTrEtaDistribution2->Scale(1./(Float_t)hZvtx->GetEntries());
740 //TH1F* hEventsVtx = (TH1F*)fDiagList->FindObject("hEventsVtx");
741 //TH1F* hEventsTr = (TH1F*)fDiagList->FindObject("hEventsTr");
742 //hEventsVtx->Divide(hEventsTr);
746 //_____________________________________________________________________
747 Float_t AliFMDAnalysisTaskSharing::Eta2Theta(Float_t eta) const{
748 //convert the eta of a strip to a theta
749 Float_t theta = 2*TMath::ATan(TMath::Exp(-1*eta));
752 theta = theta-TMath::Pi();
754 // std::cout<<"From eta2Theta: "<<theta<<" "<<eta<<std::endl;
763 //_____________________________________________________________________
764 void AliFMDAnalysisTaskSharing::ProcessPrimary() {
765 //Get the unspoiled MC dN/deta before event cuts
766 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
767 AliMCEvent* mcEvent = eventHandler->MCEvent();
770 fLastTrackByStrip.Reset(-1);
771 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
773 AliMCParticle* particle = 0;
775 AliStack* stack = mcEvent->Stack();
777 TH1F* hPrimary = (TH1F*)fDiagList->FindObject("hMultvsEtaNoCuts");
778 TH1F* hPrimaryNSD = (TH1F*)fDiagList->FindObject("hMultvsEtaNSDNoCuts");
779 TH1F* hEnergyOfParticles = (TH1F*)fDiagList->FindObject("hEnergyOfParticles");
780 AliHeader* header = mcEvent->Header();
781 AliGenEventHeader* genHeader = header->GenEventHeader();
783 AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
785 if (!pythiaGenHeader) {
786 std::cout<<" no pythia header!"<<std::endl;
791 Int_t pythiaType = pythiaGenHeader->ProcessType();
793 if(pythiaType==92||pythiaType==93)
797 /*if(pythiaType==92||pythiaType==93){
798 std::cout<<"single diffractive"<<std::endl;
802 std::cout<<"double diffractive"<<std::endl;
806 //std::cout<<pythiaType<<std::endl;
810 genHeader->PrimaryVertex(vertex);
812 if(TMath::Abs(vertex.At(2)) > pars->GetVtxCutZ())
815 Double_t delta = 2*pars->GetVtxCutZ()/pars->GetNvtxBins();
816 Double_t vertexBinDouble = (vertex.At(2) + pars->GetVtxCutZ()) / delta;
817 Int_t vertexBin = (Int_t)vertexBinDouble;
819 Bool_t firstTrack = kTRUE;
820 Bool_t firstTrackNSD = kTRUE;
822 Int_t nTracks = stack->GetNprimary();
823 if(pars->GetProcessHits())
824 nTracks = stack->GetNtrack();
825 TH1F* nMCevents = (TH1F*)fDiagList->FindObject("nMCEventsNoCuts");
826 TH1F* nMCeventsNSD = (TH1F*)fDiagList->FindObject("nMCEventsNSDNoCuts");
827 for(Int_t i = 0 ;i<nTracks;i++) {
828 particle = (AliMCParticle*) mcEvent->GetTrack(i);
832 if(stack->IsPhysicalPrimary(i) && particle->Charge() != 0) {
833 hPrimary->Fill(particle->Eta());
835 hPrimaryNSD->Fill(particle->Eta());
838 nMCeventsNSD->Fill(vertexBin);
839 firstTrackNSD = kFALSE;
843 TH1F* hPrimVtxBin = (TH1F*)fDiagList->FindObject(Form("primmult_NoCuts_vtxbin%d",vertexBin));
844 hPrimVtxBin->Fill(particle->Eta());
847 nMCevents->Fill(vertexBin);
852 if(pars->GetProcessHits()) {
854 for(Int_t j=0; j<particle->GetNumberOfTrackReferences();j++) {
856 AliTrackReference* ref = particle->GetTrackReference(j);
857 UShort_t det,sec,strip;
859 if(ref->DetectorId() != AliTrackReference::kFMD)
861 if(particle->Charge() != 0)
862 hEnergyOfParticles->Fill(particle->E());
864 AliFMDStripIndex::Unpack(ref->UserId(),det,ring,sec,strip);
865 Float_t thisStripTrack = fLastTrackByStrip(det,ring,sec,strip);
866 if(particle->Charge() != 0 && i != thisStripTrack ) {
869 Float_t eta = pars->GetEtaFromStrip(det,ring,sec,strip,vertex.At(2));//-1*TMath::Log(TMath::Tan(0.5*theta));
870 TH1F* hHits = (TH1F*)fDiagList->FindObject(Form("hMCHits_nocuts_FMD%d%c_vtxbin%d",det,ring,vertexBin));
875 Float_t nstrips = (ring =='O' ? 256 : 512);
877 fLastTrackByStrip(det,ring,sec,strip) = (Float_t)i;
880 fLastTrackByStrip(det,ring,sec,strip-1) = (Float_t)i;
881 if(strip < (nstrips - 1))
882 fLastTrackByStrip(det,ring,sec,strip+1) = (Float_t)i;
896 //_____________________________________________________________________