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 void AliFMDAnalysisTaskSharing::CreateOutputObjects()
92 // Create the output objects
94 foutputESDFMD = new AliESDFMD();
97 fEsdVertex = new AliESDVertex();
100 fDiagList = new TList();
102 fDiagList->SetName("Sharing diagnostics");
104 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
105 TH2F* hBg = pars->GetBackgroundCorrection(1, 'I', 0);
106 TH1F* hPrimary = new TH1F("hMultvsEtaNoCuts","hMultvsEtaNoCuts",
108 hBg->GetXaxis()->GetXmin(),
109 hBg->GetXaxis()->GetXmax());
111 fDiagList->Add(hPrimary);
112 TH1F* hXvtx = new TH1F("hXvtx","x vertex distribution",100,-2,2);
113 TH1F* hYvtx = new TH1F("hYvtx","y vertex distribution",100,-2,2);
114 TH1F* hZvtx = new TH1F("hZvtx","z vertex distribution",4*pars->GetNvtxBins(),-4*pars->GetVtxCutZ(),4*pars->GetVtxCutZ());
116 fDiagList->Add(hXvtx);
117 fDiagList->Add(hYvtx);
118 fDiagList->Add(hZvtx);
120 TH1F* hPrimVertexBin = 0;
122 for(Int_t i = 0; i< pars->GetNvtxBins(); i++) {
124 hPrimVertexBin = new TH1F(Form("primmult_NoCuts_vtxbin%d",i),
125 Form("primmult_NoCuts_vtxbin%d",i),
127 hBg->GetXaxis()->GetXmin(),
128 hBg->GetXaxis()->GetXmax());
129 hPrimVertexBin->Sumw2();
130 fDiagList->Add(hPrimVertexBin);
134 for(Int_t det = 1; det<=3; det++) {
135 Int_t nRings = (det==1 ? 1 : 2);
137 for(Int_t iring = 0;iring<nRings; iring++) {
138 Char_t ringChar = (iring == 0 ? 'I' : 'O');
139 TH1F* hEdist = new TH1F(Form("Edist_before_sharing_FMD%d%c", det, ringChar),
140 Form("Edist_before_sharing_FMD%d%c", det, ringChar),
142 TH1F* hEdistAfter = new TH1F(Form("Edist_after_sharing_FMD%d%c", det, ringChar),
143 Form("Edist_after_sharing_FMD%d%c", det, ringChar),
147 //TH1F* hNstripsHit = new TH1F(Form("N_strips_hit_FMD%d%c",det,ringChar),
148 // Form("N_strips_hit_FMD%d%c",det,ringChar),
150 fDiagList->Add(hEdist);
151 fDiagList->Add(hEdistAfter);
152 //fDiagList->Add(hNstripsHit);
154 for(Int_t i = 0; i< pars->GetNvtxBins(); i++) {
155 hHits = new TH1F(Form("hMCHits_nocuts_FMD%d%c_vtxbin%d",det,ringChar,i),Form("hMCHits_FMD%d%c_vtxbin%d",det,ringChar,i),
157 hBg->GetXaxis()->GetXmin(),
158 hBg->GetXaxis()->GetXmax());
160 fDiagList->Add(hHits);
166 TH2F* hCorrelationFMDSPDhits = new TH2F("hCorrelationFMDSPDhits","hCorrelationFMDSPDhits;SPD;FMD ",100,0,200,100,0,500);
167 TH2F* hCorrelationFMDSPD = new TH2F("hCorrelationFMDSPD","hCorrelationFMDSPD;SPD;FMD ",100,0,200,100,0,500);
168 TH2F* hCorrelationFMD1SPD = new TH2F("hCorrelationFMD1SPD","hCorrelationFMD1SPD;SPD;FMD1 ",100,0,200,100,0,200);
169 TH2F* hCorrelationFMD2ISPD = new TH2F("hCorrelationFMD2ISPD","hCorrelationFMD2ISPD;SPD;FMD2I ",100,0,200,100,0,200);
170 TH2F* hCorrelationFMD2OSPD = new TH2F("hCorrelationFMD2OSPD","hCorrelationFMD2OSPD;SPD;FMD2O ",100,0,200,100,0,200);
171 TH2F* hCorrelationFMD3ISPD = new TH2F("hCorrelationFMD3ISPD","hCorrelationFMD3ISPD;SPD;FMD3I ",100,0,200,100,0,200);
172 TH2F* hCorrelationFMD3OSPD = new TH2F("hCorrelationFMD3OSPD","hCorrelationFMD3OSPD;SPD;FMD3O ",100,0,200,100,0,200);
173 TH2F* hCorrelationFMDGoodtracks = new TH2F("hCorrelationFMDGoodtracks","hCorrelationGoodtracks;good tracks;FMD ",100,0,200,100,0,200);
174 TH2F* hCorrelationFMDBadtracks = new TH2F("hCorrelationFMDBadtracks","hCorrelationBadtracks;bad tracks;FMD ",100,0,200,100,0,200);
175 TH2F* hCorrelationGoodbadtracks = new TH2F("hCorrelationGoodbadtracks","hCorrelationGoodbadtracks;good tracks;bad tracks ",100,0,200,100,0,200);
176 TH2F* hCorrelationSPDTracklets = new TH2F("hCorrelationSPDTracklets","hCorrelationSPDTracklets;hits ; tracklets ",100,0,500,100,0,200);
177 TH2F* hCorrelationClustersTracklets = new TH2F("hCorrelationClustersTracklets","hCorrelationClustersTracklets;clusters ; tracklets ",500,0,500,100,0,100);
178 TH2F* hCorrelationHitsRadius = new TH2F("hCorrelationHitsRadius","hCorrelationHitsRadius;hits ; radius ",100,0,500,100,0,10);
179 TH2F* hCorrelationHitsX = new TH2F("hCorrelationHitsX","hCorrelationHitsX;hits ; X ",100,0,500,100,-5,5);
180 TH2F* hCorrelationHitsY = new TH2F("hCorrelationHitsY","hCorrelationHitsY;hits ; Y ",100,0,500,100,-5,5);
181 fDiagList->Add(hCorrelationHitsRadius);
182 fDiagList->Add(hCorrelationHitsX);
183 fDiagList->Add(hCorrelationHitsY);
184 fDiagList->Add(hCorrelationFMDSPD);
185 fDiagList->Add(hCorrelationFMD1SPD);
186 fDiagList->Add(hCorrelationFMD2ISPD);
187 fDiagList->Add(hCorrelationFMD2OSPD);
188 fDiagList->Add(hCorrelationFMD3ISPD);
189 fDiagList->Add(hCorrelationFMD3OSPD);
190 fDiagList->Add(hCorrelationFMDGoodtracks);
191 fDiagList->Add(hCorrelationFMDBadtracks);
192 fDiagList->Add(hCorrelationGoodbadtracks);
193 fDiagList->Add(hCorrelationFMDSPDhits);
194 fDiagList->Add(hCorrelationClustersTracklets);
195 fDiagList->Add(hCorrelationSPDTracklets);
196 TH2F* hCorrelationFMD23 = new TH2F("hCorrelationFMD23","hCorrelationFMD23;FMD2 ;FMD3 ",100,0,500,100,0,500);
197 TH2F* hCorrelationFMD2diff23 = new TH2F("hCorrelationFMD2diff23","hCorrelationFMD2diff23;FMD2 ;diff FMD23 ",100,0,100,100,0,100);
198 TH2F* hCorrelationFMD3diff23 = new TH2F("hCorrelationFMD3diff23","hCorrelationFMD3diff23;FMD3 ;diff FMD23 ",100,0,100,100,0,100);
199 TH2F* hCorrelationFMD1diff13 = new TH2F("hCorrelationFMD1diff13","hCorrelationFMD1diff13;FMD1 ;diff FMD13 ",100,0,100,100,0,100);
200 TH2F* hCorrelationFMD1diff12 = new TH2F("hCorrelationFMD1diff12","hCorrelationFMD1diff12;FMD1 ;diff FMD12 ",100,0,100,100,0,100);
201 TH2F* hCorrelationFMD12 = new TH2F("hCorrelationFMD12","hCorrelationFMD12;FMD1 ;FMD2 ",100,0,500,100,0,500);
202 TH2F* hCorrelationFMDBgCand = new TH2F("hCorrelationFMDBgCand","hCorrelationFMDBgCand;Bg Tr ;FMD ",100,0,100,500,0,500);
204 TH2F* hCorrelationFMDFlatTr = new TH2F("hCorrelationFMDFlatTr","hCorrelationFMDFlatTr;Bg Tr ;FMD ",100,0,100,500,0,500);
205 TH2F* hCorrelationFMDRatioFlatTr = new TH2F("hCorrelationFMDRatioFlatTr","hCorrelationFMDRatioFlatTr;Bg Tr ;FMD ",100,0,1,500,0,500);
206 fDiagList->Add(hCorrelationFMDBgCand);
207 fDiagList->Add(hCorrelationFMDFlatTr);
208 fDiagList->Add(hCorrelationFMDRatioFlatTr);
209 TH2F* hCorrelationFMDBgCandRelative = new TH2F("hCorrelationFMDBgCandRelative","hCorrelationFMDBgCandRelative;Bg Tr ;FMD ",100,0,2,500,0,500);
210 fDiagList->Add(hCorrelationFMDBgCandRelative);
211 fDiagList->Add(hCorrelationFMD2diff23);
212 fDiagList->Add(hCorrelationFMD3diff23);
213 fDiagList->Add(hCorrelationFMD1diff13);
214 fDiagList->Add(hCorrelationFMD1diff12);
215 fDiagList->Add(hCorrelationFMD23);
216 fDiagList->Add(hCorrelationFMD12);
217 TH2F* hTimeCorrelation = new TH2F("hCorrelationTime","hCorrelationTime ; time ; FMD hits",500,0,500,100,0,200);
218 fDiagList->Add(hTimeCorrelation);
219 TH1F* hHitDistribution = new TH1F("hFMDHitDistribution","hFMDHitDistribution ; FMD hits",500,0,500);
221 TH1F* hHitDistributionFMD1 = new TH1F("hFMDHitDistributionFMD1","hFMDHitDistributionFMD1 ; FMD1 hits",500,0,500);
222 TH1F* hHitDistributionFMD2I = new TH1F("hFMDHitDistributionFMD2I","hFMDHitDistributionFMD2I ; FMD2I hits",500,0,500);
223 TH1F* hHitDistributionFMD2O = new TH1F("hFMDHitDistributionFMD2O","hFMDHitDistributionFMD2O ; FMD2O hits",500,0,500);
224 TH1F* hHitDistributionFMD3I = new TH1F("hFMDHitDistributionFMD3I","hFMDHitDistributionFMD3I ; FMD3I hits",500,0,500);
225 TH1F* hHitDistributionFMD3O = new TH1F("hFMDHitDistributionFMD3O","hFMDHitDistributionFMD3O ; FMD3O hits",500,0,500);
226 TH1F* hTrVtxDistribution = new TH1F("hTrVtxDistribution","hTrVtxDistribution ; TrVtx",200,-500,500);
227 TH1F* hTrEtaDistribution = new TH1F("hTrEtaDistribution","hTrEtaDistribution ; TrEta",200,-9,9);
228 TH1F* hTrEtaDistribution2 = new TH1F("hTrEtaDistribution2","hTrEtaDistribution2 ; TrEta",200,-9,9);
230 TH1F* hFlatTracks = new TH1F("hFlatTracks","hFlatTracks ; Horizontal tracks",100,0,100);
232 TH1F* hEnergyOfParticles = new TH1F("hEnergyOfParticles","hEnergyOfParticles",1000000,0,10);
233 fDiagList->Add(hEnergyOfParticles);
234 fDiagList->Add(hTrVtxDistribution);
235 fDiagList->Add(hTrEtaDistribution);
236 fDiagList->Add(hTrEtaDistribution2);
237 fDiagList->Add(hFlatTracks);
238 fDiagList->Add(hHitDistribution);
239 fDiagList->Add(hHitDistributionFMD1);
240 fDiagList->Add(hHitDistributionFMD2I);
241 fDiagList->Add(hHitDistributionFMD2O);
242 fDiagList->Add(hHitDistributionFMD3I);
243 fDiagList->Add(hHitDistributionFMD3O);
244 TH1F* nMCevents = new TH1F("nMCEventsNoCuts","nMCEventsNoCuts",pars->GetNvtxBins(),0,pars->GetNvtxBins());
246 fDiagList->Add(nMCevents);
251 //_____________________________________________________________________
252 void AliFMDAnalysisTaskSharing::ConnectInputData(Option_t */*option*/)
254 // connect the input data
256 fESD = (AliESDEvent*)GetInputData(0);
258 //_____________________________________________________________________
259 void AliFMDAnalysisTaskSharing::Exec(Option_t */*option*/)
261 //perform analysis on one event
262 AliESD* old = fESD->GetAliESDOld();
264 fESD->CopyFromOldESD();
267 foutputESDFMD->Clear();
269 Int_t delta = fESD->GetOrbitNumber() - fLastOrbit;
270 fLastOrbit = fESD->GetOrbitNumber();
273 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
275 Bool_t vtxStatus = pars->GetVertex(fESD,vertex);
276 fEsdVertex->SetXYZ(vertex);
278 // Process primaries here to get true MC distribution
279 if(pars->GetProcessPrimary())
281 const AliMultiplicity* testmult = fESD->GetMultiplicity();
282 Int_t nTrackLets = testmult->GetNumberOfTracklets();
283 TH2F* hCorrelationClustersTracklets = (TH2F*)fDiagList->FindObject("hCorrelationClustersTracklets");
284 hCorrelationClustersTracklets->Fill(testmult->GetNumberOfSingleClusters(),nTrackLets);
288 Bool_t isTriggered = pars->IsEventTriggered(fESD);
290 if(!isTriggered || !vtxStatus ) {
297 TH1F* hXvtx = (TH1F*)fDiagList->FindObject("hXvtx");
298 if(vertex[0] != 0) hXvtx->Fill(vertex[0]);
299 TH1F* hYvtx = (TH1F*)fDiagList->FindObject("hYvtx");
300 if(vertex[1] != 0) hYvtx->Fill(vertex[1]);
301 TH1F* hZvtx = (TH1F*)fDiagList->FindObject("hZvtx");
302 hZvtx->Fill(vertex[2]);
303 //const AliMultiplicity* testmult = fESD->GetMultiplicity();
304 //std::cout<<vertex[2]<<std::endl;
305 //Int_t nTrackLets = testmult->GetNumberOfTracklets();
307 if( TMath::Abs(vertex[2]) > pars->GetVtxCutZ()) {
312 if(nTrackLets < 1000) foutputESDFMD->SetUniqueID(kTRUE);
313 else foutputESDFMD->SetUniqueID(kFALSE);
315 AliESDFMD* fmd = fESD->GetFMDData();
318 Int_t nHits[3][2] = {{0,0},{0,0},{0,0}};
320 for(UShort_t det=1;det<=3;det++) {
321 Int_t nRings = (det==1 ? 1 : 2);
322 for (UShort_t ir = 0; ir < nRings; ir++) {
323 Char_t ring = (ir == 0 ? 'I' : 'O');
324 UShort_t nsec = (ir == 0 ? 20 : 40);
325 UShort_t nstr = (ir == 0 ? 512 : 256);
327 TH1F* hEdist = (TH1F*)fDiagList->FindObject(Form("Edist_before_sharing_FMD%d%c",det,ring));
329 for(UShort_t sec =0; sec < nsec; sec++) {
330 fSharedThis = kFALSE;
331 fSharedPrev = kFALSE;
333 for(UShort_t strip = 0; strip < nstr; strip++) {
334 foutputESDFMD->SetMultiplicity(det,ring,sec,strip,0.);
335 Float_t mult = fmd->Multiplicity(det,ring,sec,strip);
337 if(mult == AliESDFMD::kInvalidMult || mult == 0) continue;
340 //Double_t eta = fmd->Eta(det,ring,sec,strip);
341 Float_t eta = pars->GetEtaFromStrip(det,ring,sec,strip,vertex[2]);
344 if(fmd->IsAngleCorrected())
345 mult = mult/TMath::Cos(Eta2Theta(eta));
349 if(fmd->Multiplicity(det,ring,sec,strip-1) != AliESDFMD::kInvalidMult) {
350 prevE = fmd->Multiplicity(det,ring,sec,strip-1);
351 if(fmd->IsAngleCorrected())
352 prevE = prevE/TMath::Cos(Eta2Theta(fmd->Eta(det,ring,sec,strip-1)));
354 if(strip != nstr - 1)
355 if(fmd->Multiplicity(det,ring,sec,strip+1) != AliESDFMD::kInvalidMult) {
356 nextE = fmd->Multiplicity(det,ring,sec,strip+1);
357 if(fmd->IsAngleCorrected())
358 nextE = nextE/TMath::Cos(Eta2Theta(fmd->Eta(det,ring,sec,strip+1)));
361 Float_t mergedEnergy = GetMultiplicityOfStrip(mult,eta,prevE,nextE,det,ring,sec,strip);
362 //if(mult> (pars->GetMPV(det,ring,eta) - pars->GetSigma(det,ring,eta)))
363 // mergedEnergy = mult;
364 //else mergedEnergy = 0;
365 if(mergedEnergy > 0.3 )
367 foutputESDFMD->SetMultiplicity(det,ring,sec,strip,mergedEnergy);
368 foutputESDFMD->SetEta(det,ring,sec,strip,eta);
375 //if(testmult->GetNumberOfSingleClusters() > 15 + nTrackLets)
376 // {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;}
378 TH2F* hCorrelationFMD23 = (TH2F*)fDiagList->FindObject("hCorrelationFMD23");
379 TH2F* hCorrelationFMD12 = (TH2F*)fDiagList->FindObject("hCorrelationFMD12");
380 TH2F* hCorrelationFMD2diff23 = (TH2F*)fDiagList->FindObject("hCorrelationFMD2diff23");
381 TH2F* hCorrelationFMD3diff23 = (TH2F*)fDiagList->FindObject("hCorrelationFMD3diff23");
382 TH2F* hCorrelationFMD1diff13 = (TH2F*)fDiagList->FindObject("hCorrelationFMD1diff13");
383 TH2F* hCorrelationFMD1diff12 = (TH2F*)fDiagList->FindObject("hCorrelationFMD1diff12");
385 TH2F* hCorrelationFMDSPD = (TH2F*)fDiagList->FindObject("hCorrelationFMDSPD");
386 TH2F* hCorrelationFMD1SPD = (TH2F*)fDiagList->FindObject("hCorrelationFMD1SPD");
387 TH2F* hCorrelationFMD2ISPD = (TH2F*)fDiagList->FindObject("hCorrelationFMD2ISPD");
388 TH2F* hCorrelationFMD2OSPD = (TH2F*)fDiagList->FindObject("hCorrelationFMD2OSPD");
389 TH2F* hCorrelationFMD3ISPD = (TH2F*)fDiagList->FindObject("hCorrelationFMD3ISPD");
390 TH2F* hCorrelationFMD3OSPD = (TH2F*)fDiagList->FindObject("hCorrelationFMD3OSPD");
392 TH2F* hCorrelationFMDSPDhits = (TH2F*)fDiagList->FindObject("hCorrelationFMDSPDhits");
394 TH2F* hCorrelationSPDTracklets = (TH2F*)fDiagList->FindObject("hCorrelationSPDTracklets");
395 TH2F* hTimeCorrelation = (TH2F*)fDiagList->FindObject("hCorrelationTime");
396 TH2F* hHitsRadius = (TH2F*)fDiagList->FindObject("hCorrelationHitsRadius");
397 TH2F* hHitsX = (TH2F*)fDiagList->FindObject("hCorrelationHitsX");
398 TH2F* hHitsY = (TH2F*)fDiagList->FindObject("hCorrelationHitsY");
399 TH1F* hFMDHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistribution");
400 TH1F* hFMD1HitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD1");
401 TH1F* hFMD2IHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD2I");
402 TH1F* hFMD2OHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD2O");
403 TH1F* hFMD3IHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD3I");
404 TH1F* hFMD3OHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD3O");
405 TH1F* hCorrelationFMDGoodtracks = (TH1F*)fDiagList->FindObject("hCorrelationFMDGoodtracks");
406 TH1F* hCorrelationFMDBadtracks = (TH1F*)fDiagList->FindObject("hCorrelationFMDBadtracks");
407 TH1F* hCorrelationGoodbadtracks = (TH1F*)fDiagList->FindObject("hCorrelationGoodbadtracks");
408 TH2F* hCorrelationFMDBgCand = (TH2F*)fDiagList->FindObject("hCorrelationFMDBgCand");
409 TH2F* hCorrelationFMDBgCandRelative = (TH2F*)fDiagList->FindObject("hCorrelationFMDBgCandRelative");
411 TH2F* hCorrelationFMDFlatTr = (TH2F*)fDiagList->FindObject("hCorrelationFMDFlatTr");
412 TH2F* hCorrelationFMDRatioFlatTr = (TH2F*)fDiagList->FindObject("hCorrelationFMDRatioFlatTr");
413 TH1F* hTrVtxDistribution = (TH1F*)fDiagList->FindObject("hTrVtxDistribution");
414 TH1F* hTrEtaDistribution = (TH1F*)fDiagList->FindObject("hTrEtaDistribution");
415 TH1F* hTrEtaDistribution2 = (TH1F*)fDiagList->FindObject("hTrEtaDistribution2");
416 hCorrelationFMDSPD->Fill(nTrackLets,nHits[0][0]+nHits[1][0]+nHits[1][1]+nHits[2][0]+nHits[2][1]);
417 TH1F* hFlatTracks = (TH1F*)fDiagList->FindObject("hFlatTracks");
418 hCorrelationFMD1SPD->Fill(nTrackLets,nHits[0][0]);
419 hCorrelationFMD2ISPD->Fill(nTrackLets,nHits[1][0]);
420 hCorrelationFMD2OSPD->Fill(nTrackLets,nHits[1][1]);
421 hCorrelationFMD3ISPD->Fill(nTrackLets,nHits[2][0]);
422 hCorrelationFMD3OSPD->Fill(nTrackLets,nHits[2][1]);
423 hCorrelationFMDSPDhits->Fill(testmult->GetNumberOfFiredChips(0),nHits[0][0]+nHits[1][0]+nHits[1][1]+nHits[2][0]+nHits[2][1]);
424 hCorrelationSPDTracklets->Fill(testmult->GetNumberOfFiredChips(0),nTrackLets);
426 hTimeCorrelation->Fill(delta,nHits[0][0]+nHits[1][0]+nHits[1][1]+nHits[2][0]+nHits[2][1]);
427 hCorrelationFMD23->Fill(nHits[1][0]+nHits[1][1],nHits[2][0]+nHits[2][1]);
428 hCorrelationFMD12->Fill(nHits[0][0],nHits[1][0]+nHits[1][1]);
430 // 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;}
432 // if(testmult->GetNumberOfFiredChips(0))
433 // if(testmult->GetNumberOfFiredChips(0) > 15 && ((Float_t)nTrackLets / (Float_t)testmult->GetNumberOfFiredChips(0)) < 0.4)
434 // {fStatus = kFALSE; std::cout<<nTrackLets<<" "<<testmult->GetNumberOfFiredChips(0)<<" "<<nHits[0]<<" "<<nHits[1]<<" "<<nHits[2]<<std::endl; return;}
437 Float_t diff23 = (Float_t)TMath::Abs(nHits[2][1] + nHits[2][0] - nHits[1][1] - nHits[1][0]);
439 Float_t diff13 = TMath::Abs(nHits[2][1] + nHits[2][0] - nHits[1][1] - nHits[1][0] - nHits[0][0]);
440 Float_t diff12 = TMath::Abs(nHits[1][0] - nHits[0][0]);
442 hCorrelationFMD1diff12->Fill(nHits[0][0], diff12);
443 hCorrelationFMD1diff13->Fill(nHits[0][0], diff13);
444 hCorrelationFMD2diff23->Fill(nHits[1][1], diff23);
445 hCorrelationFMD3diff23->Fill(nHits[2][1], diff23);
448 Float_t nTotalFMDhits = nHits[0][0]+nHits[1][0]+nHits[1][1]+nHits[2][0]+nHits[2][1] ;
449 Float_t radius = TMath::Sqrt(TMath::Power(vertex[0] + 0.03715,2) + TMath::Power(vertex[1] - 0.1659,2));
451 if(vertex[1] !=0 || vertex[1] !=0) {
452 hHitsRadius->Fill(nTotalFMDhits,radius);
453 hHitsX->Fill(nTotalFMDhits,vertex[0]);
454 hHitsY->Fill(nTotalFMDhits,vertex[1]); }
456 hFMDHitDistribution->Fill(nTotalFMDhits);
457 hFMD1HitDistribution->Fill(nHits[0][0]);
458 hFMD2IHitDistribution->Fill(nHits[1][0]);
459 hFMD2OHitDistribution->Fill(nHits[1][1]);
460 hFMD3IHitDistribution->Fill(nHits[2][0]);
461 hFMD3OHitDistribution->Fill(nHits[2][0]);
463 // if(radius > 0.5) {fStatus = kFALSE; std::cout<<"FMD : "<<nTotalFMDhits<<std::endl; foutputESDFMD->Clear(); return;}
464 //if(TMath::Abs(vertex[1] - 0.1659) > 0.1 ) {fStatus = kFALSE; std::cout<<"FMD : "<<nTotalFMDhits<<std::endl; foutputESDFMD->Clear(); return;}
466 if(nTrackLets < pars->GetLowSPDLimit() || nTrackLets > pars->GetHighSPDLimit())
467 {fStatus = kFALSE; std::cout<<nTrackLets<<" "<<" "<<nHits[0][0]<<" "<<nHits[1][0]<<" "<<nHits[1][1]<<" "<<nHits[2][0]<<" "<<nHits[2][1]<<std::endl; return;}
470 AliESDtrack* track = 0;
471 Int_t ntracks = fESD->GetNumberOfTracks();
472 Float_t ngood =0, nbad = 0;
473 //std::cout<<" Primary vtx : "<<vertex[0]<<" "<<vertex[1]<<" "<<vertex[2]<<" "<<nTotalFMDhits<<std::endl;
474 Int_t nBgCandidates = 0;
476 for(Int_t i=0;i<ntracks;i++) {
477 track = fESD->GetTrack(i);
478 //std::cout<<track->GetX()-vertex[0]<<" "<<track->GetY()-vertex[1]<<" "<<track->GetZ()-vertex[2]<<std::endl;
479 //std::cout<<track->GetX()<<" "<<track->GetY()<<" "<<track->GetZ()<<std::endl;
480 hTrVtxDistribution->Fill(track->GetZ());
482 if(TMath::Abs( track->GetZ()) > 50 && TMath::Abs(track->GetZ()) < 300) { // && TMath::Abs( track->GetY()) < 1)
484 hTrEtaDistribution->Fill(track->Eta());
489 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) {
491 hTrEtaDistribution2->Fill(track->Eta()); }
494 if(TMath::Abs(track->Pt()) < 0.1)
498 Float_t ratioFlat = 0;
499 if(fESD->GetNumberOfTracks())
500 ratioFlat = nFlat/(Float_t)fESD->GetNumberOfTracks();
501 hCorrelationFMDFlatTr->Fill(nFlat,nTotalFMDhits);
502 hCorrelationFMDRatioFlatTr->Fill(ratioFlat,nTotalFMDhits);
503 hFlatTracks->Fill(nFlat);
505 // std::cout<<fESD->GetT0zVertex()<<" "<<vertex[2]<<std::endl;
507 //if(fESD->GetNumberOfTracks() > 0)
509 if(fESD->GetNumberOfTracks() > 0)
510 ratioBg = (Float_t)nBgCandidates/(Float_t)fESD->GetNumberOfTracks();
511 hCorrelationFMDBgCand->Fill(nBgCandidates,nTotalFMDhits);
512 hCorrelationFMDBgCandRelative->Fill(ratioBg,nTotalFMDhits);
515 // Float_t ratio = (nbad > 0 ? ngood / nbad : 0);
517 hCorrelationFMDGoodtracks->Fill(ngood,nTotalFMDhits);
518 hCorrelationFMDBadtracks->Fill(nbad,nTotalFMDhits);
519 hCorrelationGoodbadtracks->Fill(ngood,nbad);
522 PostData(0, foutputESDFMD);
523 PostData(1, fEsdVertex);
525 PostData(3, fDiagList);
528 //_____________________________________________________________________
529 Float_t AliFMDAnalysisTaskSharing::GetMultiplicityOfStrip(Float_t mult,
536 UShort_t /*strip*/) {
537 //analyse and perform sharing on one strip
538 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
540 Float_t mergedEnergy = 0;
541 //Float_t nParticles = 0;
542 Float_t cutLow = 0.3;//0.15;
544 Float_t cutHigh = pars->GetMPV(det,ring,eta) - 2*pars->GetSigma(det,ring,eta);
550 //AliFMDParameters* recopars = AliFMDParameters::Instance();
551 //cutLow = (5*recopars->GetPedestalWidth(det,ring,sec,strip))/(recopars->GetPulseGain(det,ring,sec,strip)*recopars->GetDACPerMIP());
552 //if(foutputESDFMD->GetUniqueID() == kFALSE ) {
554 if(mult > 12 || mult < cutLow)
556 // std::cout<<"rejecting hit in FMD "<<det<<" "<<ring<<std::endl;
557 fSharedThis = kFALSE;
558 fSharedPrev = kFALSE;
565 // Float_t cutPart = pars->GetMPV(det,ring,eta) - 5*pars->GetSigma(det,ring,eta);
566 Float_t totalE = mult;
569 //std::cout<<det<<ring<<" "<<sec<<" "<<strip<<" "<<cutLow<<std::endl;
571 fSharedThis = kFALSE;
576 /* if(mult < 0.33*pars->GetMPV(det,ring,eta)) {
577 fSharedThis = kFALSE;
578 fSharedPrev = kFALSE;
581 if(mult<nextE && nextE>cutHigh && foutputESDFMD->GetUniqueID() == kTRUE)
583 fSharedThis = kFALSE;
584 fSharedPrev = kFALSE;
589 if(prevE > cutLow && prevE < cutHigh && !fSharedPrev ) {
593 if(nextE > cutLow && nextE < cutHigh ) {
597 totalE = totalE*TMath::Cos(Eta2Theta(eta));
598 TH1F* hEdist = (TH1F*)fDiagList->FindObject(Form("Edist_after_sharing_FMD%d%c",det,ring));
600 hEdist->Fill(totalE);
605 mergedEnergy = totalE;
607 // if(det == 1 && ring =='I')
610 fSharedThis = kFALSE;
611 fSharedPrev = kFALSE;
614 // mergedEnergy = mult;
619 TH1F* hEdist = (TH1F*)fDiagList->FindObject(Form("Edist_after_sharing_FMD%d%c",det,ring));
623 mergedEnergy = fEtotal;
625 hEdist->Fill(mergedEnergy);
634 //_____________________________________________________________________
635 void AliFMDAnalysisTaskSharing::Terminate(Option_t* /* option*/) {
637 TH1F* hFMDHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistribution");
638 TH1F* hFMD1HitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD1");
639 TH1F* hFMD2IHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD2I");
640 TH1F* hFMD2OHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD2O");
641 TH1F* hFMD3IHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD3I");
642 TH1F* hFMD3OHitDistribution = (TH1F*)fDiagList->FindObject("hFMDHitDistributionFMD3O");
644 TH1F* hZvtx = (TH1F*)fDiagList->FindObject("hZvtx");
645 for(UShort_t det=1;det<=3;det++) {
646 Int_t nRings = (det==1 ? 1 : 2);
647 for (UShort_t ir = 0; ir < nRings; ir++) {
648 Char_t ring = (ir == 0 ? 'I' : 'O');
650 TH1F* hEdist = (TH1F*)fDiagList->FindObject(Form("Edist_before_sharing_FMD%d%c",det,ring));
651 TH1F* hEdistAfter = (TH1F*)fDiagList->FindObject(Form("Edist_after_sharing_FMD%d%c",det,ring));
652 if(hZvtx->GetEntries()) {
653 hEdist->Scale(1./(Float_t)hZvtx->GetEntries());
654 hEdistAfter->Scale(1./(Float_t)hZvtx->GetEntries());
660 TH1F* hFlatTracks = (TH1F*)fDiagList->FindObject("hFlatTracks");
661 TH1F* hTrVtxDistribution = (TH1F*)fDiagList->FindObject("hTrVtxDistribution");
662 TH1F* hTrEtaDistribution = (TH1F*)fDiagList->FindObject("hTrEtaDistribution");
663 TH1F* hTrEtaDistribution2 = (TH1F*)fDiagList->FindObject("hTrEtaDistribution2");
664 if(hZvtx->GetEntries()) {
665 hFMDHitDistribution->Scale(1./(Float_t)hZvtx->GetEntries());
666 hFMD1HitDistribution->Scale(1./(Float_t)hZvtx->GetEntries());
667 hFMD2IHitDistribution->Scale(1./(Float_t)hZvtx->GetEntries());
668 hFMD2OHitDistribution->Scale(1./(Float_t)hZvtx->GetEntries());
669 hFMD3IHitDistribution->Scale(1./(Float_t)hZvtx->GetEntries());
670 hFMD3OHitDistribution->Scale(1./(Float_t)hZvtx->GetEntries());
671 hFlatTracks->Scale(1./(Float_t)hZvtx->GetEntries());
672 hTrVtxDistribution->Scale(1./(Float_t)hZvtx->GetEntries());
673 hTrEtaDistribution->Scale(1./(Float_t)hZvtx->GetEntries());
674 hTrEtaDistribution2->Scale(1./(Float_t)hZvtx->GetEntries());
681 //_____________________________________________________________________
682 Float_t AliFMDAnalysisTaskSharing::Eta2Theta(Float_t eta) const{
683 //convert the eta of a strip to a theta
684 Float_t theta = 2*TMath::ATan(TMath::Exp(-1*eta));
687 theta = theta-TMath::Pi();
689 // std::cout<<"From eta2Theta: "<<theta<<" "<<eta<<std::endl;
698 //_____________________________________________________________________
699 void AliFMDAnalysisTaskSharing::ProcessPrimary() {
700 //Get the unspoiled MC dN/deta before event cuts
701 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
702 AliMCEvent* mcEvent = eventHandler->MCEvent();
705 fLastTrackByStrip.Reset(-1);
706 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
708 AliMCParticle* particle = 0;
710 AliStack* stack = mcEvent->Stack();
712 TH1F* hPrimary = (TH1F*)fDiagList->FindObject("hMultvsEtaNoCuts");
713 TH1F* hEnergyOfParticles = (TH1F*)fDiagList->FindObject("hEnergyOfParticles");
714 AliHeader* header = mcEvent->Header();
715 AliGenEventHeader* genHeader = header->GenEventHeader();
717 AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
719 if (!pythiaGenHeader) {
720 std::cout<<" no pythia header!"<<std::endl;
725 Int_t pythiaType = pythiaGenHeader->ProcessType();
727 /*if(pythiaType==92||pythiaType==93){
728 std::cout<<"single diffractive"<<std::endl;
732 std::cout<<"double diffractive"<<std::endl;
736 std::cout<<pythiaType<<" "<<stack->GetNprimary()<<std::endl;
740 genHeader->PrimaryVertex(vertex);
742 if(TMath::Abs(vertex.At(2)) > pars->GetVtxCutZ())
745 Double_t delta = 2*pars->GetVtxCutZ()/pars->GetNvtxBins();
746 Double_t vertexBinDouble = (vertex.At(2) + pars->GetVtxCutZ()) / delta;
747 Int_t vertexBin = (Int_t)vertexBinDouble;
749 Bool_t firstTrack = kTRUE;
751 Int_t nTracks = stack->GetNprimary();
752 if(pars->GetProcessHits())
753 nTracks = stack->GetNtrack();
754 TH1F* nMCevents = (TH1F*)fDiagList->FindObject("nMCEventsNoCuts");
755 for(Int_t i = 0 ;i<nTracks;i++) {
756 particle = (AliMCParticle*) mcEvent->GetTrack(i);
760 if(stack->IsPhysicalPrimary(i) && particle->Charge() != 0) {
761 hPrimary->Fill(particle->Eta());
764 TH1F* hPrimVtxBin = (TH1F*)fDiagList->FindObject(Form("primmult_NoCuts_vtxbin%d",vertexBin));
765 hPrimVtxBin->Fill(particle->Eta());
768 nMCevents->Fill(vertexBin);
773 if(pars->GetProcessHits()) {
775 for(Int_t j=0; j<particle->GetNumberOfTrackReferences();j++) {
777 AliTrackReference* ref = particle->GetTrackReference(j);
778 UShort_t det,sec,strip;
780 if(ref->DetectorId() != AliTrackReference::kFMD)
782 if(particle->Charge() != 0)
783 hEnergyOfParticles->Fill(particle->E());
785 AliFMDStripIndex::Unpack(ref->UserId(),det,ring,sec,strip);
786 Float_t thisStripTrack = fLastTrackByStrip(det,ring,sec,strip);
787 if(particle->Charge() != 0 && i != thisStripTrack ) {
790 Float_t eta = pars->GetEtaFromStrip(det,ring,sec,strip,vertex.At(2));//-1*TMath::Log(TMath::Tan(0.5*theta));
791 TH1F* hHits = (TH1F*)fDiagList->FindObject(Form("hMCHits_nocuts_FMD%d%c_vtxbin%d",det,ring,vertexBin));
796 Float_t nstrips = (ring =='O' ? 256 : 512);
798 fLastTrackByStrip(det,ring,sec,strip) = (Float_t)i;
801 fLastTrackByStrip(det,ring,sec,strip-1) = (Float_t)i;
802 if(strip < (nstrips - 1))
803 fLastTrackByStrip(det,ring,sec,strip+1) = (Float_t)i;
817 //_____________________________________________________________________