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 "AliHeader.h"
28 #include "AliMCParticle.h"
29 #include "AliFMDStripIndex.h"
31 // This is the task to do the FMD sharing or hit merging.
32 // It reads the input ESDFMD data and posts an ESDFMD object to
33 // the tasks that must be performed after this task ie.
34 // Density, BackgroundCorrection and Dndeta.
35 // Author: Hans Hjersing Dalsgaard, hans.dalsgaard@cern.ch
38 ClassImp(AliFMDAnalysisTaskSharing)
40 //_____________________________________________________________________
41 AliFMDAnalysisTaskSharing::AliFMDAnalysisTaskSharing()
53 // Default constructor
54 DefineInput (0, AliESDEvent::Class());
55 DefineOutput(0, AliESDFMD::Class());
56 DefineOutput(1, AliESDVertex::Class());
57 DefineOutput(2, AliESDEvent::Class());
58 DefineOutput(3, TList::Class());
60 //_____________________________________________________________________
61 AliFMDAnalysisTaskSharing::AliFMDAnalysisTaskSharing(const char* name, Bool_t SE):
62 AliAnalysisTask(name, "AnalysisTaskFMD"),
77 DefineInput (0, AliESDEvent::Class());
78 DefineOutput(0, AliESDFMD::Class());
79 DefineOutput(1, AliESDVertex::Class());
80 DefineOutput(2, AliESDEvent::Class());
81 DefineOutput(3, TList::Class());
84 //_____________________________________________________________________
85 void AliFMDAnalysisTaskSharing::CreateOutputObjects()
87 // Create the output objects
89 foutputESDFMD = new AliESDFMD();
92 fEsdVertex = new AliESDVertex();
95 fDiagList = new TList();
97 fDiagList->SetName("Sharing diagnostics");
99 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
100 TH2F* hBg = pars->GetBackgroundCorrection(1, 'I', 0);
101 TH1F* hPrimary = new TH1F("hMultvsEtaNoCuts","hMultvsEtaNoCuts",
103 hBg->GetXaxis()->GetXmin(),
104 hBg->GetXaxis()->GetXmax());
106 fDiagList->Add(hPrimary);
107 TH1F* hZvtx = new TH1F("hZvtx","z vertex distribution",pars->GetNvtxBins(),-1*pars->GetVtxCutZ(),pars->GetVtxCutZ());
109 fDiagList->Add(hZvtx);
111 TH1F* hPrimVertexBin = 0;
113 for(Int_t i = 0; i< pars->GetNvtxBins(); i++) {
115 hPrimVertexBin = new TH1F(Form("primmult_NoCuts_vtxbin%d",i),
116 Form("primmult_NoCuts_vtxbin%d",i),
118 hBg->GetXaxis()->GetXmin(),
119 hBg->GetXaxis()->GetXmax());
120 hPrimVertexBin->Sumw2();
121 fDiagList->Add(hPrimVertexBin);
125 for(Int_t det = 1; det<=3; det++) {
126 Int_t nRings = (det==1 ? 1 : 2);
128 for(Int_t iring = 0;iring<nRings; iring++) {
129 Char_t ringChar = (iring == 0 ? 'I' : 'O');
130 TH1F* hEdist = new TH1F(Form("Edist_before_sharing_FMD%d%c", det, ringChar),
131 Form("Edist_before_sharing_FMD%d%c", det, ringChar),
133 TH1F* hEdistAfter = new TH1F(Form("Edist_after_sharing_FMD%d%c", det, ringChar),
134 Form("Edist_after_sharing_FMD%d%c", det, ringChar),
138 //TH1F* hNstripsHit = new TH1F(Form("N_strips_hit_FMD%d%c",det,ringChar),
139 // Form("N_strips_hit_FMD%d%c",det,ringChar),
141 fDiagList->Add(hEdist);
142 fDiagList->Add(hEdistAfter);
143 //fDiagList->Add(hNstripsHit);
145 for(Int_t i = 0; i< pars->GetNvtxBins(); i++) {
146 hHits = new TH1F(Form("hMCHits_nocuts_FMD%d%c_vtxbin%d",det,ringChar,i),Form("hMCHits_FMD%d%c_vtxbin%d",det,ringChar,i),
148 hBg->GetXaxis()->GetXmin(),
149 hBg->GetXaxis()->GetXmax());
151 fDiagList->Add(hHits);
157 TH1F* nMCevents = new TH1F("nMCEventsNoCuts","nMCEventsNoCuts",pars->GetNvtxBins(),0,pars->GetNvtxBins());
159 fDiagList->Add(nMCevents);
162 //_____________________________________________________________________
163 void AliFMDAnalysisTaskSharing::ConnectInputData(Option_t */*option*/)
165 // connect the input data
167 fESD = (AliESDEvent*)GetInputData(0);
169 //_____________________________________________________________________
170 void AliFMDAnalysisTaskSharing::Exec(Option_t */*option*/)
172 //perform analysis on one event
173 AliESD* old = fESD->GetAliESDOld();
175 fESD->CopyFromOldESD();
178 foutputESDFMD->Clear();
180 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
182 Bool_t vtxStatus = pars->GetVertex(fESD,vertex);
183 fEsdVertex->SetXYZ(vertex);
185 // Process primaries here to get true MC distribution
186 if(pars->GetProcessPrimary())
189 Bool_t isTriggered = pars->IsEventTriggered(fESD);
205 TH1F* hZvtx = (TH1F*)fDiagList->FindObject("hZvtx");
206 hZvtx->Fill(vertex[2]);
209 const AliMultiplicity* testmult = fESD->GetMultiplicity();
211 Int_t nTrackLets = testmult->GetNumberOfTracklets();
212 if(nTrackLets < 1000) foutputESDFMD->SetUniqueID(kTRUE);
213 else foutputESDFMD->SetUniqueID(kFALSE);
215 AliESDFMD* fmd = fESD->GetFMDData();
219 for(UShort_t det=1;det<=3;det++) {
220 Int_t nRings = (det==1 ? 1 : 2);
221 for (UShort_t ir = 0; ir < nRings; ir++) {
222 Char_t ring = (ir == 0 ? 'I' : 'O');
223 UShort_t nsec = (ir == 0 ? 20 : 40);
224 UShort_t nstr = (ir == 0 ? 512 : 256);
226 TH1F* hEdist = (TH1F*)fDiagList->FindObject(Form("Edist_before_sharing_FMD%d%c",det,ring));
228 for(UShort_t sec =0; sec < nsec; sec++) {
229 fSharedThis = kFALSE;
230 fSharedPrev = kFALSE;
232 for(UShort_t strip = 0; strip < nstr; strip++) {
233 foutputESDFMD->SetMultiplicity(det,ring,sec,strip,0.);
234 Float_t mult = fmd->Multiplicity(det,ring,sec,strip);
236 if(mult == AliESDFMD::kInvalidMult || mult == 0) continue;
238 //Double_t eta = EtaFromStrip(det,ring,sec,strip,vertex[2]);//fmd->Eta(det,ring,sec,strip);
239 //Double_t eta = fmd->Eta(det,ring,sec,strip);
240 Float_t eta = pars->GetEtaFromStrip(det,ring,sec,strip,vertex[2]);
241 //std::cout<<EtaFromStrip(det,ring,sec,strip,vertex[2]) <<" "<<fmd->Eta(det,ring,sec,strip)<<std::endl;
244 if(fmd->IsAngleCorrected())
245 mult = mult/TMath::Cos(Eta2Theta(eta));
249 if(fmd->Multiplicity(det,ring,sec,strip-1) != AliESDFMD::kInvalidMult) {
250 prevE = fmd->Multiplicity(det,ring,sec,strip-1);
251 if(fmd->IsAngleCorrected())
252 prevE = prevE/TMath::Cos(Eta2Theta(fmd->Eta(det,ring,sec,strip-1)));
254 if(strip != nstr - 1)
255 if(fmd->Multiplicity(det,ring,sec,strip+1) != AliESDFMD::kInvalidMult) {
256 nextE = fmd->Multiplicity(det,ring,sec,strip+1);
257 if(fmd->IsAngleCorrected())
258 nextE = nextE/TMath::Cos(Eta2Theta(fmd->Eta(det,ring,sec,strip+1)));
261 Float_t mergedEnergy = GetMultiplicityOfStrip(mult,eta,prevE,nextE,det,ring,sec,strip);
263 if(mergedEnergy > 0 )
265 foutputESDFMD->SetMultiplicity(det,ring,sec,strip,mergedEnergy);
266 foutputESDFMD->SetEta(det,ring,sec,strip,eta);
275 PostData(0, foutputESDFMD);
276 PostData(1, fEsdVertex);
278 PostData(3, fDiagList);
281 //_____________________________________________________________________
282 Float_t AliFMDAnalysisTaskSharing::GetMultiplicityOfStrip(Float_t mult,
289 UShort_t /*strip*/) {
290 //analyse and perform sharing on one strip
291 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
293 Float_t mergedEnergy = 0;
294 //Float_t nParticles = 0;
295 Float_t cutLow = 0.25;//0.15;
300 //AliFMDParameters* recopars = AliFMDParameters::Instance();
301 //cutLow = (5*recopars->GetPedestalWidth(det,ring,sec,strip))/(recopars->GetPulseGain(det,ring,sec,strip)*recopars->GetDACPerMIP());
305 Float_t cutHigh = pars->GetMPV(det,ring,eta) - 3*pars->GetSigma(det,ring,eta);
307 // Float_t cutPart = pars->GetMPV(det,ring,eta) - 5*pars->GetSigma(det,ring,eta);
308 Float_t totalE = mult;
311 //std::cout<<det<<ring<<" "<<sec<<" "<<strip<<" "<<cutLow<<std::endl;
313 fSharedThis = kFALSE;
318 /* if(mult < 0.33*pars->GetMPV(det,ring,eta)) {
319 fSharedThis = kFALSE;
320 fSharedPrev = kFALSE;
323 if(mult<nextE && nextE>cutHigh && foutputESDFMD->GetUniqueID() == kTRUE)
325 fSharedThis = kFALSE;
326 fSharedPrev = kFALSE;
331 // std::cout<<"rejecting hit in FMD "<<det<<" "<<ring<<std::endl;
332 fSharedThis = kFALSE;
333 fSharedPrev = kFALSE;
337 if(prevE > cutLow && prevE < cutHigh && !fSharedPrev ) {
341 if(nextE > cutLow && nextE < cutHigh ) {
345 TH1F* hEdist = (TH1F*)fDiagList->FindObject(Form("Edist_after_sharing_FMD%d%c",det,ring));
346 hEdist->Fill(totalE);
348 totalE = totalE*TMath::Cos(Eta2Theta(eta));
351 mergedEnergy = totalE;
353 // if(det == 1 && ring =='I')
354 // std::cout<<Form("Merged signals %f %f %f into %f , %f in strip %d, sec %d, ring %c, det %d",prevE, mult, nextE, totalE/TMath::Cos(Eta2Theta(eta)),totalE,strip,sec,ring,det )<<std::endl;
356 else{// if(totalE > 0) {
357 //if(det == 3 && ring =='I')
358 // std::cout<<Form("NO HIT for %f %f %f into %f , %f in strip %d, sec %d, ring %c, det %d, cuts %f , %f",prevE, mult, nextE, totalE/TMath::Cos(Eta2Theta(eta)),totalE,strip,sec,ring,det,cutPart,cutHigh )<<std::endl;
359 fSharedThis = kFALSE;
360 fSharedPrev = kFALSE;
362 // mergedEnergy = mult;
368 //_____________________________________________________________________
369 Float_t AliFMDAnalysisTaskSharing::Eta2Theta(Float_t eta) const{
370 //convert the eta of a strip to a theta
371 Float_t theta = 2*TMath::ATan(TMath::Exp(-1*eta));
374 theta = theta-TMath::Pi();
376 // std::cout<<"From eta2Theta: "<<theta<<" "<<eta<<std::endl;
385 //_____________________________________________________________________
386 void AliFMDAnalysisTaskSharing::ProcessPrimary() {
387 //Get the undspoiled MC dN/deta before event cuts
388 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
389 AliMCEvent* mcEvent = eventHandler->MCEvent();
392 fLastTrackByStrip.Reset(-1);
393 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
395 AliMCParticle* particle = 0;
397 AliStack* stack = mcEvent->Stack();
399 TH1F* hPrimary = (TH1F*)fDiagList->FindObject("hMultvsEtaNoCuts");
400 AliHeader* header = mcEvent->Header();
401 AliGenEventHeader* genHeader = header->GenEventHeader();
406 genHeader->PrimaryVertex(vertex);
408 if(TMath::Abs(vertex.At(2)) > pars->GetVtxCutZ())
411 Double_t delta = 2*pars->GetVtxCutZ()/pars->GetNvtxBins();
412 Double_t vertexBinDouble = (vertex.At(2) + pars->GetVtxCutZ()) / delta;
413 Int_t vertexBin = (Int_t)vertexBinDouble;
415 Bool_t firstTrack = kTRUE;
417 Int_t nTracks = stack->GetNprimary();
418 if(pars->GetProcessHits())
419 nTracks = stack->GetNtrack();
420 TH1F* nMCevents = (TH1F*)fDiagList->FindObject("nMCEventsNoCuts");
421 for(Int_t i = 0 ;i<nTracks;i++) {
422 particle = (AliMCParticle*) mcEvent->GetTrack(i);
426 if(stack->IsPhysicalPrimary(i) && particle->Charge() != 0) {
427 hPrimary->Fill(particle->Eta());
430 TH1F* hPrimVtxBin = (TH1F*)fDiagList->FindObject(Form("primmult_NoCuts_vtxbin%d",vertexBin));
431 hPrimVtxBin->Fill(particle->Eta());
434 nMCevents->Fill(vertexBin);
439 if(pars->GetProcessHits()) {
441 for(Int_t j=0; j<particle->GetNumberOfTrackReferences();j++) {
443 AliTrackReference* ref = particle->GetTrackReference(j);
444 UShort_t det,sec,strip;
446 if(ref->DetectorId() != AliTrackReference::kFMD)
448 AliFMDStripIndex::Unpack(ref->UserId(),det,ring,sec,strip);
449 Float_t thisStripTrack = fLastTrackByStrip(det,ring,sec,strip);
450 if(particle->Charge() != 0 && i != thisStripTrack ) {
453 Float_t eta = pars->GetEtaFromStrip(det,ring,sec,strip,vertex.At(2));//-1*TMath::Log(TMath::Tan(0.5*theta));
454 TH1F* hHits = (TH1F*)fDiagList->FindObject(Form("hMCHits_nocuts_FMD%d%c_vtxbin%d",det,ring,vertexBin));
459 Float_t nstrips = (ring =='O' ? 256 : 512);
461 fLastTrackByStrip(det,ring,sec,strip) = (Float_t)i;
464 fLastTrackByStrip(det,ring,sec,strip-1) = (Float_t)i;
465 if(strip < (nstrips - 1))
466 fLastTrackByStrip(det,ring,sec,strip+1) = (Float_t)i;
480 //_____________________________________________________________________