3 #include "AlidNdEtaTask.h"
14 #include <TParticle.h>
17 #include <TObjString.h>
22 #include <AliESDVertex.h>
23 #include <AliESDEvent.h>
25 #include <AliHeader.h>
26 #include <AliGenEventHeader.h>
27 #include <AliMultiplicity.h>
28 #include <AliAnalysisManager.h>
29 #include <AliMCEventHandler.h>
30 #include <AliMCEvent.h>
31 #include <AliESDInputHandler.h>
32 #include <AliESDHeader.h>
34 #include "AliESDtrackCuts.h"
35 #include "AliPWG0Helper.h"
36 #include "AliCorrection.h"
37 #include "AliCorrectionMatrix3D.h"
38 #include "dNdEta/dNdEtaAnalysis.h"
39 #include "AliTriggerAnalysis.h"
41 ClassImp(AlidNdEtaTask)
43 AlidNdEtaTask::AlidNdEtaTask(const char* opt) :
44 AliAnalysisTask("AlidNdEtaTask", ""),
48 fAnalysisMode((AliPWG0Helper::AnalysisMode) (AliPWG0Helper::kTPC | AliPWG0Helper::kFieldOn)),
49 fTrigger(AliTriggerAnalysis::kMB1),
54 fOnlyPrimaries(kFALSE),
57 fdNdEtaAnalysisESD(0),
64 fdNdEtaAnalysisNSD(0),
66 fdNdEtaAnalysisTrVtx(0),
67 fdNdEtaAnalysisTracks(0),
80 // Constructor. Initialization of pointers
83 // Define input and output slots here
84 DefineInput(0, TChain::Class());
85 DefineOutput(0, TList::Class());
90 AliLog::SetClassDebugLevel("AlidNdEtaTask", AliLog::kWarning);
93 AlidNdEtaTask::~AlidNdEtaTask()
99 // histograms are in the output list and deleted when the output
100 // list is deleted by the TSelector dtor
108 Bool_t AlidNdEtaTask::Notify()
110 static Int_t count = 0;
112 Printf("Processing %d. file: %s", count, ((TTree*) GetInputData(0))->GetCurrentFile()->GetName());
116 //________________________________________________________________________
117 void AlidNdEtaTask::ConnectInputData(Option_t *)
122 Printf("AlidNdEtaTask::ConnectInputData called");
124 AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
127 Printf("ERROR: Could not get ESDInputHandler");
129 fESD = esdH->GetEvent();
131 TString branches("AliESDHeader Vertex ");
133 if (fAnalysisMode & AliPWG0Helper::kSPD || fTrigger & AliTriggerAnalysis::kOfflineFlag)
134 branches += "AliMultiplicity ";
136 if (fAnalysisMode & AliPWG0Helper::kTPC || fAnalysisMode & AliPWG0Helper::kTPCITS)
137 branches += "Tracks ";
139 // Enable only the needed branches
140 esdH->SetActiveBranches(branches);
143 // disable info messages of AliMCEvent (per event)
144 AliLog::SetClassDebugLevel("AliMCEvent", AliLog::kWarning - AliLog::kDebug + 1);
147 void AlidNdEtaTask::CreateOutputObjects()
149 // create result objects and add to output list
151 Printf("AlidNdEtaTask::CreateOutputObjects");
154 Printf("WARNING: Processing only primaries (MC information used). This is for systematical checks only.");
157 Printf("WARNING: Using MC kine information. This is for systematical checks only.");
160 Printf("WARNING: Replacing vertex by MC vertex. This is for systematical checks only.");
165 fdNdEtaAnalysisESD = new dNdEtaAnalysis("fdNdEtaAnalysisESD", "fdNdEtaAnalysisESD", fAnalysisMode);
166 fOutput->Add(fdNdEtaAnalysisESD);
168 fMult = new TH1F("fMult", "fMult;Ntracks;Count", 201, -0.5, 200.5);
171 fMultVtx = new TH1F("fMultVtx", "fMultVtx;Ntracks;Count", 201, -0.5, 200.5);
172 fOutput->Add(fMultVtx);
174 for (Int_t i=0; i<3; ++i)
176 fPartEta[i] = new TH1F(Form("dndeta_check_%d", i), Form("dndeta_check_%d", i), 60, -6, 6);
177 fPartEta[i]->Sumw2();
178 fOutput->Add(fPartEta[i]);
181 fEvents = new TH1F("dndeta_check_vertex", "dndeta_check_vertex", 800, -40, 40);
182 fOutput->Add(fEvents);
184 Float_t resMax = (fAnalysisMode & AliPWG0Helper::kSPD) ? 0.2 : 2;
185 fVertexResolution = new TH1F("dndeta_vertex_resolution_z", "dndeta_vertex_resolution_z", 1000, 0, resMax);
186 fOutput->Add(fVertexResolution);
188 fPhi = new TH1F("fPhi", "fPhi;#phi in rad.;count", 720, 0, 2 * TMath::Pi());
191 fEtaPhi = new TH2F("fEtaPhi", "fEtaPhi;#eta;#phi in rad.;count", 80, -4, 4, 18*5, 0, 2 * TMath::Pi());
192 fOutput->Add(fEtaPhi);
194 fTriggerVsTime = new TGraph; //TH1F("fTriggerVsTime", "fTriggerVsTime;trigger time;count", 100, 0, 100);
195 fTriggerVsTime->SetName("fTriggerVsTime");
196 fTriggerVsTime->GetXaxis()->SetTitle("trigger time");
197 fTriggerVsTime->GetYaxis()->SetTitle("count");
198 fOutput->Add(fTriggerVsTime);
200 fStats = new TH1F("fStats", "fStats", 3, 0.5, 3.5);
201 fStats->GetXaxis()->SetBinLabel(1, "vertexer 3d");
202 fStats->GetXaxis()->SetBinLabel(2, "vertexer z");
203 fStats->GetXaxis()->SetBinLabel(3, "trigger");
204 fOutput->Add(fStats);
206 if (fAnalysisMode & AliPWG0Helper::kSPD)
208 fDeltaPhi = new TH1F("fDeltaPhi", "fDeltaPhi;#Delta #phi;Entries", 500, -0.2, 0.2);
209 fOutput->Add(fDeltaPhi);
210 fDeltaTheta = new TH1F("fDeltaTheta", "fDeltaTheta;#Delta #theta;Entries", 500, -0.2, 0.2);
211 fOutput->Add(fDeltaTheta);
212 fFiredChips = new TH2F("fFiredChips", "fFiredChips;Chips L1 + L2;tracklets", 1201, -0.5, 1201, 50, -0.5, 49.5);
213 fOutput->Add(fFiredChips);
214 for (Int_t i=0; i<2; i++)
216 fZPhi[i] = new TH2F(Form("fZPhi_%d", i), Form("fZPhi Layer %d;z (cm);#phi (rad.)", i), 200, -20, 20, 180, 0, TMath::Pi() * 2);
217 fOutput->Add(fZPhi[i]);
221 if (fAnalysisMode & AliPWG0Helper::kTPC || fAnalysisMode & AliPWG0Helper::kTPCITS)
223 fRawPt = new TH1F("fRawPt", "raw pt;p_{T};Count", 2000, 0, 100);
224 fOutput->Add(fRawPt);
227 fVertex = new TH3F("vertex_check", "vertex_check", 100, -1, 1, 100, -1, 1, 100, -30, 30);
228 fOutput->Add(fVertex);
232 fdNdEtaAnalysis = new dNdEtaAnalysis("dndeta", "dndeta", fAnalysisMode);
233 fOutput->Add(fdNdEtaAnalysis);
235 fdNdEtaAnalysisND = new dNdEtaAnalysis("dndetaND", "dndetaND", fAnalysisMode);
236 fOutput->Add(fdNdEtaAnalysisND);
238 fdNdEtaAnalysisNSD = new dNdEtaAnalysis("dndetaNSD", "dndetaNSD", fAnalysisMode);
239 fOutput->Add(fdNdEtaAnalysisNSD);
241 fdNdEtaAnalysisTr = new dNdEtaAnalysis("dndetaTr", "dndetaTr", fAnalysisMode);
242 fOutput->Add(fdNdEtaAnalysisTr);
244 fdNdEtaAnalysisTrVtx = new dNdEtaAnalysis("dndetaTrVtx", "dndetaTrVtx", fAnalysisMode);
245 fOutput->Add(fdNdEtaAnalysisTrVtx);
247 fdNdEtaAnalysisTracks = new dNdEtaAnalysis("dndetaTracks", "dndetaTracks", fAnalysisMode);
248 fOutput->Add(fdNdEtaAnalysisTracks);
250 fPartPt = new TH1F("dndeta_check_pt", "dndeta_check_pt", 1000, 0, 10);
252 fOutput->Add(fPartPt);
257 fEsdTrackCuts->SetName("fEsdTrackCuts");
258 fOutput->Add(fEsdTrackCuts);
262 void AlidNdEtaTask::Exec(Option_t*)
266 // these variables are also used in the MC section below; however, if ESD is off they stay with their default values
267 Bool_t eventTriggered = kFALSE;
268 const AliESDVertex* vtxESD = 0;
270 // post the data already here
271 PostData(0, fOutput);
276 // check event type (should be PHYSICS = 7)
277 AliESDHeader* esdHeader = fESD->GetHeader();
280 Printf("ERROR: esdHeader could not be retrieved");
284 Printf("Trigger classes: %s:", fESD->GetFiredTriggerClasses().Data());
286 // UInt_t eventType = esdHeader->GetEventType();
287 // if (eventType != 7)
289 // Printf("Skipping event because it is of type %d", eventType);
293 // trigger definition
294 static AliTriggerAnalysis* triggerAnalysis = new AliTriggerAnalysis;
295 eventTriggered = triggerAnalysis->IsTriggerFired(fESD, fTrigger);
299 // get the ESD vertex
300 vtxESD = AliPWG0Helper::GetVertex(fESD, fAnalysisMode);
302 //Printf("vertex is: %s", fESD->GetPrimaryVertex()->GetTitle());
306 // fill z vertex resolution
309 fVertexResolution->Fill(vtxESD->GetZRes());
310 fVertex->Fill(vtxESD->GetXv(), vtxESD->GetYv(), vtxESD->GetZv());
312 if (AliPWG0Helper::TestVertex(vtxESD, fAnalysisMode))
317 if (strcmp(vtxESD->GetTitle(), "vertexer: 3D") == 0)
321 else if (strcmp(vtxESD->GetTitle(), "vertexer: Z") == 0)
328 // needed for syst. studies
332 if (fUseMCVertex || fUseMCKine || fOnlyPrimaries || fReadMC) {
334 Printf("ERROR: fUseMCVertex or fUseMCKine or fOnlyPrimaries set without fReadMC set!");
338 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
340 Printf("ERROR: Could not retrieve MC event handler");
344 AliMCEvent* mcEvent = eventHandler->MCEvent();
346 Printf("ERROR: Could not retrieve MC event");
350 AliHeader* header = mcEvent->Header();
353 AliDebug(AliLog::kError, "Header not available");
358 AliGenEventHeader* genHeader = header->GenEventHeader();
361 AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
364 genHeader->PrimaryVertex(vtxMC);
369 stack = mcEvent->Stack();
372 AliDebug(AliLog::kError, "Stack not available");
377 // create list of (label, eta, pt) tuples
378 Int_t inputCount = 0;
381 Float_t* thirdDimArr = 0;
382 if (fAnalysisMode & AliPWG0Helper::kSPD)
385 const AliMultiplicity* mult = fESD->GetMultiplicity();
388 AliDebug(AliLog::kError, "AliMultiplicity not available");
392 labelArr = new Int_t[mult->GetNumberOfTracklets()];
393 etaArr = new Float_t[mult->GetNumberOfTracklets()];
394 thirdDimArr = new Float_t[mult->GetNumberOfTracklets()];
396 // get multiplicity from SPD tracklets
397 for (Int_t i=0; i<mult->GetNumberOfTracklets(); ++i)
399 //printf("%d %f %f %f\n", i, mult->GetTheta(i), mult->GetPhi(i), mult->GetDeltaPhi(i));
402 if (mult->GetLabel(i, 0) < 0 || mult->GetLabel(i, 0) != mult->GetLabel(i, 1) || !stack->IsPhysicalPrimary(mult->GetLabel(i, 0)))
405 Float_t deltaPhi = mult->GetDeltaPhi(i);
406 // prevent values to be shifted by 2 Pi()
407 if (deltaPhi < -TMath::Pi())
408 deltaPhi += TMath::Pi() * 2;
409 if (deltaPhi > TMath::Pi())
410 deltaPhi -= TMath::Pi() * 2;
412 if (TMath::Abs(deltaPhi) > 1)
413 printf("WARNING: Very high Delta Phi: %d %f %f %f\n", i, mult->GetTheta(i), mult->GetPhi(i), deltaPhi);
415 Int_t label = mult->GetLabel(i, 0);
416 Float_t eta = mult->GetEta(i);
418 // control histograms
419 Float_t phi = mult->GetPhi(i);
421 phi += TMath::Pi() * 2;
423 fEtaPhi->Fill(eta, phi);
428 Float_t z = vtx[2] + 3.9 / TMath::Tan(2 * TMath::ATan(TMath::Exp(- eta)));
429 fZPhi[0]->Fill(z, phi);
431 z = vtx[2] + 7.6 / TMath::Tan(2 * TMath::ATan(TMath::Exp(- eta)));
432 fZPhi[1]->Fill(z, phi);
435 fDeltaPhi->Fill(deltaPhi);
436 fDeltaTheta->Fill(mult->GetDeltaTheta(i));
438 if (fDeltaPhiCut > 0 && TMath::Abs(deltaPhi) > fDeltaPhiCut)
445 TParticle* particle = stack->Particle(label);
446 eta = particle->Eta();
447 phi = particle->Phi();
450 Printf("WARNING: fUseMCKine set without fOnlyPrimaries and no label found");
453 etaArr[inputCount] = eta;
454 labelArr[inputCount] = label;
455 thirdDimArr[inputCount] = phi;
461 // fill multiplicity in third axis
462 for (Int_t i=0; i<inputCount; ++i)
463 thirdDimArr[i] = inputCount;
466 Int_t firedChips = mult->GetNumberOfFiredChips(0) + mult->GetNumberOfFiredChips(1);
467 fFiredChips->Fill(firedChips, inputCount);
468 Printf("Accepted %d tracklets (%d fired chips)", inputCount, firedChips);
470 else if (fAnalysisMode & AliPWG0Helper::kTPC || fAnalysisMode & AliPWG0Helper::kTPCITS)
474 AliDebug(AliLog::kError, "fESDTrackCuts not available");
480 // get multiplicity from ESD tracks
481 TObjArray* list = fEsdTrackCuts->GetAcceptedTracks(fESD, fAnalysisMode & AliPWG0Helper::kTPC);
482 Int_t nGoodTracks = list->GetEntries();
483 Printf("Accepted %d tracks out of %d total ESD tracks", nGoodTracks, fESD->GetNumberOfTracks());
485 labelArr = new Int_t[nGoodTracks];
486 etaArr = new Float_t[nGoodTracks];
487 thirdDimArr = new Float_t[nGoodTracks];
489 // loop over esd tracks
490 for (Int_t i=0; i<nGoodTracks; i++)
492 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack*> (list->At(i));
495 AliDebug(AliLog::kError, Form("ERROR: Could not retrieve track %d.", i));
499 Float_t phi = esdTrack->Phi();
501 phi += TMath::Pi() * 2;
503 Float_t eta = esdTrack->Eta();
504 Int_t label = TMath::Abs(esdTrack->GetLabel());
505 Float_t pT = esdTrack->Pt();
507 // force pT to fixed value without B field
508 if (!(fAnalysisMode & AliPWG0Helper::kFieldOn))
512 fEtaPhi->Fill(eta, phi);
513 if (eventTriggered && vtxESD)
521 if (stack->IsPhysicalPrimary(label) == kFALSE)
529 TParticle* particle = stack->Particle(label);
530 eta = particle->Eta();
534 Printf("WARNING: fUseMCKine set without fOnlyPrimaries and no label found");
537 etaArr[inputCount] = eta;
538 labelArr[inputCount] = TMath::Abs(esdTrack->GetLabel());
539 thirdDimArr[inputCount] = pT;
543 // TODO restrict inputCount used as measure for the multiplicity to |eta| < 1
551 // Processing of ESD information (always)
555 fMult->Fill(inputCount);
556 fdNdEtaAnalysisESD->FillTriggeredEvent(inputCount);
558 fTriggerVsTime->SetPoint(fTriggerVsTime->GetN(), fESD->GetTimeStamp(), 1);
563 fMultVtx->Fill(inputCount);
565 for (Int_t i=0; i<inputCount; ++i)
567 Float_t eta = etaArr[i];
568 Float_t thirdDim = thirdDimArr[i];
570 fdNdEtaAnalysisESD->FillTrack(vtx[2], eta, thirdDim);
572 if (TMath::Abs(vtx[2]) < 10)
574 fPartEta[0]->Fill(eta);
577 fPartEta[1]->Fill(eta);
579 fPartEta[2]->Fill(eta);
583 // for event count per vertex
584 fdNdEtaAnalysisESD->FillEvent(vtx[2], inputCount);
587 fEvents->Fill(vtx[2]);
591 // from tracks is only done for triggered and vertex reconstructed events
592 for (Int_t i=0; i<inputCount; ++i)
594 Int_t label = labelArr[i];
599 //Printf("Getting particle of track %d", label);
600 TParticle* particle = stack->Particle(label);
604 AliDebug(AliLog::kError, Form("ERROR: Could not retrieve particle %d.", label));
608 Float_t thirdDim = -1;
609 if (fAnalysisMode & AliPWG0Helper::kSPD)
613 thirdDim = particle->Phi();
616 thirdDim = inputCount;
619 thirdDim = particle->Pt();
621 fdNdEtaAnalysisTracks->FillTrack(vtxMC[2], particle->Eta(), thirdDim);
622 } // end of track loop
624 // for event count per vertex
625 fdNdEtaAnalysisTracks->FillEvent(vtxMC[2], inputCount);
635 delete[] thirdDimArr;
638 if (fReadMC) // Processing of MC information (optional)
640 AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
642 Printf("ERROR: Could not retrieve MC event handler");
646 AliMCEvent* mcEvent = eventHandler->MCEvent();
648 Printf("ERROR: Could not retrieve MC event");
652 AliStack* stack = mcEvent->Stack();
655 AliDebug(AliLog::kError, "Stack not available");
659 AliHeader* header = mcEvent->Header();
662 AliDebug(AliLog::kError, "Header not available");
667 AliGenEventHeader* genHeader = header->GenEventHeader();
670 AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
675 genHeader->PrimaryVertex(vtxMC);
678 Int_t processType = AliPWG0Helper::GetEventProcessType(header);
679 AliDebug(AliLog::kDebug+1, Form("Found process type %d", processType));
681 if (processType==AliPWG0Helper::kInvalidProcess)
682 AliDebug(AliLog::kError, Form("Unknown process type %d.", processType));
684 // loop over mc particles
685 Int_t nPrim = stack->GetNprimary();
687 Int_t nAcceptedParticles = 0;
689 // count particles first, then fill
690 for (Int_t iMc = 0; iMc < nPrim; ++iMc)
692 if (!stack->IsPhysicalPrimary(iMc))
695 //Printf("Getting particle %d", iMc);
696 TParticle* particle = stack->Particle(iMc);
701 if (particle->GetPDG()->Charge() == 0)
704 //AliDebug(AliLog::kDebug+1, Form("Accepted primary %d, unique ID: %d", iMc, particle->GetUniqueID()));
705 Float_t eta = particle->Eta();
707 // make a rough eta cut (so that nAcceptedParticles is not too far off the true measured value (NB: this histograms are only gathered for comparison))
708 if (TMath::Abs(eta) < 1.5) // && pt > 0.3)
709 nAcceptedParticles++;
712 for (Int_t iMc = 0; iMc < nPrim; ++iMc)
714 if (!stack->IsPhysicalPrimary(iMc))
717 //Printf("Getting particle %d", iMc);
718 TParticle* particle = stack->Particle(iMc);
723 if (particle->GetPDG()->Charge() == 0)
726 Float_t eta = particle->Eta();
727 Float_t thirdDim = -1;
729 if (fAnalysisMode & AliPWG0Helper::kSPD)
733 thirdDim = particle->Phi();
736 thirdDim = nAcceptedParticles;
739 thirdDim = particle->Pt();
741 fdNdEtaAnalysis->FillTrack(vtxMC[2], eta, thirdDim);
743 if (processType != AliPWG0Helper::kSD)
744 fdNdEtaAnalysisNSD->FillTrack(vtxMC[2], eta, thirdDim);
746 if (processType == AliPWG0Helper::kND)
747 fdNdEtaAnalysisND->FillTrack(vtxMC[2], eta, thirdDim);
751 fdNdEtaAnalysisTr->FillTrack(vtxMC[2], eta, thirdDim);
753 fdNdEtaAnalysisTrVtx->FillTrack(vtxMC[2], eta, thirdDim);
756 if (TMath::Abs(eta) < 1.0 && particle->Pt() > 0 && particle->P() > 0)
758 Float_t value = 1. / TMath::TwoPi() / particle->Pt() * particle->Energy() / particle->P();
759 fPartPt->Fill(particle->Pt(), value);
763 fdNdEtaAnalysis->FillEvent(vtxMC[2], nAcceptedParticles);
764 if (processType != AliPWG0Helper::kSD)
765 fdNdEtaAnalysisNSD->FillEvent(vtxMC[2], nAcceptedParticles);
766 if (processType == AliPWG0Helper::kND)
767 fdNdEtaAnalysisND->FillEvent(vtxMC[2], nAcceptedParticles);
771 fdNdEtaAnalysisTr->FillEvent(vtxMC[2], nAcceptedParticles);
773 fdNdEtaAnalysisTrVtx->FillEvent(vtxMC[2], nAcceptedParticles);
778 void AlidNdEtaTask::Terminate(Option_t *)
780 // The Terminate() function is the last function to be called during
781 // a query. It always runs on the client, it can be used to present
782 // the results graphically or save the results to file.
784 fOutput = dynamic_cast<TList*> (GetOutputData(0));
786 Printf("ERROR: fOutput not available");
790 fdNdEtaAnalysisESD = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("fdNdEtaAnalysisESD"));
791 fMult = dynamic_cast<TH1F*> (fOutput->FindObject("fMult"));
792 fMultVtx = dynamic_cast<TH1F*> (fOutput->FindObject("fMultVtx"));
793 for (Int_t i=0; i<3; ++i)
794 fPartEta[i] = dynamic_cast<TH1F*> (fOutput->FindObject(Form("dndeta_check_%d", i)));
795 fEvents = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_check_vertex"));
796 fVertexResolution = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_vertex_resolution_z"));
798 fPhi = dynamic_cast<TH1F*> (fOutput->FindObject("fPhi"));
799 fRawPt = dynamic_cast<TH1F*> (fOutput->FindObject("fRawPt"));
800 fEtaPhi = dynamic_cast<TH2F*> (fOutput->FindObject("fEtaPhi"));
801 for (Int_t i=0; i<2; ++i)
802 fZPhi[i] = dynamic_cast<TH2F*> (fOutput->FindObject(Form("fZPhi_%d", i)));
803 fDeltaPhi = dynamic_cast<TH1F*> (fOutput->FindObject("fDeltaPhi"));
804 fDeltaTheta = dynamic_cast<TH1F*> (fOutput->FindObject("fDeltaTheta"));
805 fFiredChips = dynamic_cast<TH2F*> (fOutput->FindObject("fFiredChips"));
806 fTriggerVsTime = dynamic_cast<TGraph*> (fOutput->FindObject("fTriggerVsTime"));
807 fStats = dynamic_cast<TH1F*> (fOutput->FindObject("fStats"));
809 fEsdTrackCuts = dynamic_cast<AliESDtrackCuts*> (fOutput->FindObject("fEsdTrackCuts"));
812 if (!fdNdEtaAnalysisESD)
814 AliDebug(AliLog::kError, "ERROR: fdNdEtaAnalysisESD not available");
818 if (fMult && fMultVtx)
822 fMultVtx->SetLineColor(2);
823 fMultVtx->Draw("SAME");
829 fFiredChips->Draw("COLZ");
834 Int_t events1 = (Int_t) fEvents->Integral(fEvents->GetXaxis()->FindBin(-19.9), fEvents->GetXaxis()->FindBin(-0.001));
835 Int_t events2 = (Int_t) fEvents->Integral(fEvents->GetXaxis()->FindBin(0.001), fEvents->GetXaxis()->FindBin(19.9));
837 Printf("%d events with vertex used", events1 + events2);
839 if (events1 > 0 && events2 > 0)
841 fPartEta[0]->Scale(1.0 / (events1 + events2));
842 fPartEta[1]->Scale(1.0 / events1);
843 fPartEta[2]->Scale(1.0 / events2);
845 for (Int_t i=0; i<3; ++i)
846 fPartEta[i]->Scale(1.0 / fPartEta[i]->GetBinWidth(1));
848 new TCanvas("control", "control", 500, 500);
849 for (Int_t i=0; i<3; ++i)
851 fPartEta[i]->SetLineColor(i+1);
852 fPartEta[i]->Draw((i==0) ? "" : "SAME");
859 new TCanvas("control3", "control3", 500, 500);
863 TFile* fout = new TFile("analysis_esd_raw.root", "RECREATE");
865 if (fdNdEtaAnalysisESD)
866 fdNdEtaAnalysisESD->SaveHistograms();
869 fEsdTrackCuts->SaveHistograms("esd_track_cuts");
877 for (Int_t i=0; i<3; ++i)
879 fPartEta[i]->Write();
884 if (fVertexResolution)
885 fVertexResolution->Write();
891 fDeltaTheta->Write();
902 for (Int_t i=0; i<2; ++i)
907 fFiredChips->Write();
910 fTriggerVsTime->Write();
915 fVertex = dynamic_cast<TH3F*> (fOutput->FindObject("vertex_check"));
922 Printf("Writting result to analysis_esd_raw.root");
929 fdNdEtaAnalysis = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndeta"));
930 fdNdEtaAnalysisND = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaND"));
931 fdNdEtaAnalysisNSD = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaNSD"));
932 fdNdEtaAnalysisTr = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTr"));
933 fdNdEtaAnalysisTrVtx = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTrVtx"));
934 fdNdEtaAnalysisTracks = dynamic_cast<dNdEtaAnalysis*> (fOutput->FindObject("dndetaTracks"));
935 fPartPt = dynamic_cast<TH1F*> (fOutput->FindObject("dndeta_check_pt"));
938 if (!fdNdEtaAnalysis || !fdNdEtaAnalysisTr || !fdNdEtaAnalysisTrVtx || !fPartPt)
940 AliDebug(AliLog::kError, Form("ERROR: Histograms not available %p %p", (void*) fdNdEtaAnalysis, (void*) fPartPt));
944 fdNdEtaAnalysis->Finish(0, -1, AlidNdEtaCorrection::kNone);
945 fdNdEtaAnalysisND->Finish(0, -1, AlidNdEtaCorrection::kNone);
946 fdNdEtaAnalysisNSD->Finish(0, -1, AlidNdEtaCorrection::kNone);
947 fdNdEtaAnalysisTr->Finish(0, -1, AlidNdEtaCorrection::kNone);
948 fdNdEtaAnalysisTrVtx->Finish(0, -1, AlidNdEtaCorrection::kNone);
949 fdNdEtaAnalysisTracks->Finish(0, -1, AlidNdEtaCorrection::kNone);
951 Int_t events = (Int_t) fdNdEtaAnalysis->GetData()->GetEventCorrection()->GetMeasuredHistogram()->Integral();
952 fPartPt->Scale(1.0/events);
953 fPartPt->Scale(1.0/fPartPt->GetBinWidth(1));
955 TFile* fout = new TFile("analysis_mc.root","RECREATE");
957 fdNdEtaAnalysis->SaveHistograms();
958 fdNdEtaAnalysisND->SaveHistograms();
959 fdNdEtaAnalysisNSD->SaveHistograms();
960 fdNdEtaAnalysisTr->SaveHistograms();
961 fdNdEtaAnalysisTrVtx->SaveHistograms();
962 fdNdEtaAnalysisTracks->SaveHistograms();
970 Printf("Writting result to analysis_mc.root");
974 new TCanvas("control2", "control2", 500, 500);