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"
21 //#include "/home/canute/ALICE/AliRoot/PWG0/AliPWG0Helper.h"
22 //#include "AliFMDParameters.h"
23 #include "AliGenEventHeader.h"
24 #include "AliHeader.h"
26 #include "AliMCParticle.h"
27 #include "AliFMDStripIndex.h"
29 ClassImp(AliFMDAnalysisTaskSharing)
31 //_____________________________________________________________________
32 AliFMDAnalysisTaskSharing::AliFMDAnalysisTaskSharing()
46 // Default constructor
47 DefineInput (0, AliESDEvent::Class());
48 DefineOutput(0, AliESDFMD::Class());
49 DefineOutput(1, AliESDVertex::Class());
50 DefineOutput(2, AliESDEvent::Class());
51 DefineOutput(3, TList::Class());
53 //_____________________________________________________________________
54 AliFMDAnalysisTaskSharing::AliFMDAnalysisTaskSharing(const char* name, Bool_t SE):
55 AliAnalysisTask(name, "AnalysisTaskFMD"),
71 DefineInput (0, AliESDEvent::Class());
72 DefineOutput(0, AliESDFMD::Class());
73 DefineOutput(1, AliESDVertex::Class());
74 DefineOutput(2, AliESDEvent::Class());
75 DefineOutput(3, TList::Class());
78 //_____________________________________________________________________
79 void AliFMDAnalysisTaskSharing::CreateOutputObjects()
82 foutputESDFMD = new AliESDFMD();
85 fEsdVertex = new AliESDVertex();
88 fDiagList = new TList();
90 fDiagList->SetName("Sharing diagnostics");
92 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
93 TH2F* hBg = pars->GetBackgroundCorrection(1, 'I', 0);
94 TH1F* hPrimary = new TH1F("hMultvsEtaNoCuts","hMultvsEtaNoCuts",
96 hBg->GetXaxis()->GetXmin(),
97 hBg->GetXaxis()->GetXmax());
99 fDiagList->Add(hPrimary);
100 TH1F* hPrimVertexBin = 0;
102 for(Int_t i = 0; i< pars->GetNvtxBins(); i++) {
104 hPrimVertexBin = new TH1F(Form("primmult_NoCuts_vtxbin%d",i),
105 Form("primmult_NoCuts_vtxbin%d",i),
107 hBg->GetXaxis()->GetXmin(),
108 hBg->GetXaxis()->GetXmax());
109 hPrimVertexBin->Sumw2();
110 fDiagList->Add(hPrimVertexBin);
114 for(Int_t det = 1; det<=3; det++) {
115 Int_t nRings = (det==1 ? 1 : 2);
117 for(Int_t iring = 0;iring<nRings; iring++) {
118 Char_t ringChar = (iring == 0 ? 'I' : 'O');
119 TH1F* hEdist = new TH1F(Form("Edist_before_sharing_FMD%d%c", det, ringChar),
120 Form("Edist_before_sharing_FMD%d%c", det, ringChar),
122 TH1F* hEdist_after = new TH1F(Form("Edist_after_sharing_FMD%d%c", det, ringChar),
123 Form("Edist_after_sharing_FMD%d%c", det, ringChar),
127 //TH1F* hNstripsHit = new TH1F(Form("N_strips_hit_FMD%d%c",det,ringChar),
128 // Form("N_strips_hit_FMD%d%c",det,ringChar),
130 fDiagList->Add(hEdist);
131 fDiagList->Add(hEdist_after);
132 //fDiagList->Add(hNstripsHit);
134 for(Int_t i = 0; i< pars->GetNvtxBins(); i++) {
135 hHits = new TH1F(Form("hMCHits_nocuts_FMD%d%c_vtxbin%d",det,ringChar,i),Form("hMCHits_FMD%d%c_vtxbin%d",det,ringChar,i),
137 hBg->GetXaxis()->GetXmin(),
138 hBg->GetXaxis()->GetXmax());
140 fDiagList->Add(hHits);
146 TH1F* nMCevents = new TH1F("nMCEventsNoCuts","nMCEventsNoCuts",pars->GetNvtxBins(),0,pars->GetNvtxBins());
148 fDiagList->Add(nMCevents);
151 //_____________________________________________________________________
152 void AliFMDAnalysisTaskSharing::ConnectInputData(Option_t */*option*/)
155 fESD = (AliESDEvent*)GetInputData(0);
157 //_____________________________________________________________________
158 void AliFMDAnalysisTaskSharing::Exec(Option_t */*option*/)
161 AliESD* old = fESD->GetAliESDOld();
163 fESD->CopyFromOldESD();
166 foutputESDFMD->Clear();
168 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
170 pars->GetVertex(fESD,vertex);
171 fEsdVertex->SetXYZ(vertex);
173 // Process primaries here to get true MC distribution
174 if(pars->GetProcessPrimary())
177 Bool_t isTriggered = pars->IsEventTriggered(fESD);
186 if(vertex[0] == 0 && vertex[1] == 0 && vertex[2] == 0) {
195 const AliMultiplicity* testmult = fESD->GetMultiplicity();
197 Int_t nTrackLets = testmult->GetNumberOfTracklets();
198 if(nTrackLets < 1000) foutputESDFMD->SetUniqueID(kTRUE);
199 else foutputESDFMD->SetUniqueID(kFALSE);
201 AliESDFMD* fmd = fESD->GetFMDData();
205 for(UShort_t det=1;det<=3;det++) {
206 Int_t nRings = (det==1 ? 1 : 2);
207 for (UShort_t ir = 0; ir < nRings; ir++) {
208 Char_t ring = (ir == 0 ? 'I' : 'O');
209 UShort_t nsec = (ir == 0 ? 20 : 40);
210 UShort_t nstr = (ir == 0 ? 512 : 256);
212 TH1F* hEdist = (TH1F*)fDiagList->FindObject(Form("Edist_before_sharing_FMD%d%c",det,ring));
214 for(UShort_t sec =0; sec < nsec; sec++) {
215 fSharedThis = kFALSE;
216 fSharedPrev = kFALSE;
219 for(UShort_t strip = 0; strip < nstr; strip++) {
220 foutputESDFMD->SetMultiplicity(det,ring,sec,strip,0.);
221 Float_t mult = fmd->Multiplicity(det,ring,sec,strip);
223 if(mult == AliESDFMD::kInvalidMult || mult == 0) continue;
225 //Double_t eta = EtaFromStrip(det,ring,sec,strip,vertex[2]);//fmd->Eta(det,ring,sec,strip);
226 //Double_t eta = fmd->Eta(det,ring,sec,strip);
227 Float_t eta = pars->GetEtaFromStrip(det,ring,sec,strip,vertex[2]);
228 //std::cout<<EtaFromStrip(det,ring,sec,strip,vertex[2]) <<" "<<fmd->Eta(det,ring,sec,strip)<<std::endl;
231 if(fmd->IsAngleCorrected())
232 mult = mult/TMath::Cos(Eta2Theta(eta));
236 if(fmd->Multiplicity(det,ring,sec,strip-1) != AliESDFMD::kInvalidMult) {
237 Eprev = fmd->Multiplicity(det,ring,sec,strip-1);
238 if(fmd->IsAngleCorrected())
239 Eprev = Eprev/TMath::Cos(Eta2Theta(fmd->Eta(det,ring,sec,strip-1)));
241 if(strip != nstr - 1)
242 if(fmd->Multiplicity(det,ring,sec,strip+1) != AliESDFMD::kInvalidMult) {
243 Enext = fmd->Multiplicity(det,ring,sec,strip+1);
244 if(fmd->IsAngleCorrected())
245 Enext = Enext/TMath::Cos(Eta2Theta(fmd->Eta(det,ring,sec,strip+1)));
248 Float_t merged_energy = GetMultiplicityOfStrip(mult,eta,Eprev,Enext,det,ring,sec,strip);
250 if(merged_energy > 0 )
252 foutputESDFMD->SetMultiplicity(det,ring,sec,strip,merged_energy);
253 foutputESDFMD->SetEta(det,ring,sec,strip,eta);
262 PostData(0, foutputESDFMD);
263 PostData(1, fEsdVertex);
265 PostData(3, fDiagList);
268 //_____________________________________________________________________
269 Float_t AliFMDAnalysisTaskSharing::GetMultiplicityOfStrip(Float_t mult,
276 UShort_t /*strip*/) {
277 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
279 Float_t merged_energy = 0;
280 //Float_t nParticles = 0;
281 Float_t cutLow = 0.15;
286 //AliFMDParameters* recopars = AliFMDParameters::Instance();
287 //cutLow = (5*recopars->GetPedestalWidth(det,ring,sec,strip))/(recopars->GetPulseGain(det,ring,sec,strip)*recopars->GetDACPerMIP());
291 Float_t cutHigh = pars->GetMPV(det,ring,eta) - 3*pars->GetSigma(det,ring,eta);
293 // Float_t cutPart = pars->GetMPV(det,ring,eta) - 5*pars->GetSigma(det,ring,eta);
294 Float_t Etotal = mult;
297 //std::cout<<det<<ring<<" "<<sec<<" "<<strip<<" "<<cutLow<<std::endl;
299 fSharedThis = kFALSE;
304 /* if(mult < 0.33*pars->GetMPV(det,ring,eta)) {
305 fSharedThis = kFALSE;
306 fSharedPrev = kFALSE;
309 if(mult<Enext && Enext>cutHigh && foutputESDFMD->GetUniqueID() == kTRUE)
311 fSharedThis = kFALSE;
312 fSharedPrev = kFALSE;
317 // std::cout<<"rejecting hit in FMD "<<det<<" "<<ring<<std::endl;
318 fSharedThis = kFALSE;
319 fSharedPrev = kFALSE;
323 if(Eprev > cutLow && Eprev < cutHigh && !fSharedPrev ) {
327 if(Enext > cutLow && Enext < cutHigh ) {
331 TH1F* hEdist = (TH1F*)fDiagList->FindObject(Form("Edist_after_sharing_FMD%d%c",det,ring));
332 hEdist->Fill(Etotal);
334 Etotal = Etotal*TMath::Cos(Eta2Theta(eta));
337 merged_energy = Etotal;
339 // if(det == 1 && ring =='I')
340 // 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;
342 else{// if(Etotal > 0) {
343 //if(det == 3 && ring =='I')
344 // 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;
345 fSharedThis = kFALSE;
346 fSharedPrev = kFALSE;
348 // merged_energy = mult;
350 return merged_energy;
354 //_____________________________________________________________________
355 Float_t AliFMDAnalysisTaskSharing::Eta2Theta(Float_t eta) {
357 Float_t theta = 2*TMath::ATan(TMath::Exp(-1*eta));
360 theta = theta-TMath::Pi();
362 // std::cout<<"From eta2Theta: "<<theta<<" "<<eta<<std::endl;
371 //_____________________________________________________________________
372 void AliFMDAnalysisTaskSharing::ProcessPrimary() {
374 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
375 AliMCEvent* mcEvent = eventHandler->MCEvent();
378 fLastTrackByStrip.Reset(-1);
379 AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
381 AliMCParticle* particle = 0;
383 AliStack* stack = mcEvent->Stack();
385 TH1F* hPrimary = (TH1F*)fDiagList->FindObject("hMultvsEtaNoCuts");
386 AliHeader* header = mcEvent->Header();
387 AliGenEventHeader* genHeader = header->GenEventHeader();
392 genHeader->PrimaryVertex(vertex);
394 if(TMath::Abs(vertex.At(2)) > pars->GetVtxCutZ())
397 Double_t delta = 2*pars->GetVtxCutZ()/pars->GetNvtxBins();
398 Double_t vertexBinDouble = (vertex.At(2) + pars->GetVtxCutZ()) / delta;
399 Int_t vertexBin = (Int_t)vertexBinDouble;
401 Bool_t firstTrack = kTRUE;
403 Int_t nTracks = stack->GetNprimary();
404 if(pars->GetProcessHits())
405 nTracks = stack->GetNtrack();
406 TH1F* nMCevents = (TH1F*)fDiagList->FindObject("nMCEventsNoCuts");
407 for(Int_t i = 0 ;i<nTracks;i++) {
408 particle = (AliMCParticle*) mcEvent->GetTrack(i);
412 if(stack->IsPhysicalPrimary(i) && particle->Charge() != 0) {
413 hPrimary->Fill(particle->Eta());
416 TH1F* hPrimVtxBin = (TH1F*)fDiagList->FindObject(Form("primmult_NoCuts_vtxbin%d",vertexBin));
417 hPrimVtxBin->Fill(particle->Eta());
420 nMCevents->Fill(vertexBin);
425 if(pars->GetProcessHits()) {
427 for(Int_t j=0; j<particle->GetNumberOfTrackReferences();j++) {
429 AliTrackReference* ref = particle->GetTrackReference(j);
430 UShort_t det,sec,strip;
432 if(ref->DetectorId() != AliTrackReference::kFMD)
434 AliFMDStripIndex::Unpack(ref->UserId(),det,ring,sec,strip);
435 Float_t thisStripTrack = fLastTrackByStrip(det,ring,sec,strip);
436 if(particle->Charge() != 0 && i != thisStripTrack ) {
439 Float_t eta = pars->GetEtaFromStrip(det,ring,sec,strip,vertex.At(2));//-1*TMath::Log(TMath::Tan(0.5*theta));
440 TH1F* hHits = (TH1F*)fDiagList->FindObject(Form("hMCHits_nocuts_FMD%d%c_vtxbin%d",det,ring,vertexBin));
445 Float_t nstrips = (ring =='O' ? 256 : 512);
447 fLastTrackByStrip(det,ring,sec,strip) = (Float_t)i;
450 fLastTrackByStrip(det,ring,sec,strip-1) = (Float_t)i;
451 if(strip < (nstrips - 1))
452 fLastTrackByStrip(det,ring,sec,strip+1) = (Float_t)i;
466 //_____________________________________________________________________