40 #include <AliAnalysisTaskSE.h>
41 #include <AliESDEvent.h>
43 #include <AliMultiplicity.h>
48 #include <TGraphErrors.h>
50 #include <TObjArray.h>
74 struct VtxBin :
public TNamed
87 n = (Form(
"vtx%+05.1f_%+05.1f", low, high));
88 n.ReplaceAll(
"+",
"p");
89 n.ReplaceAll(
"-",
"m");
90 n.ReplaceAll(
".",
"d");
100 :
TNamed(BinName(low,high),
""),
108 VtxBin() :
TNamed(), fClusters(0), fTracklets(0) {}
114 VtxBin(
const VtxBin& o) :
115 TNamed(o), fClusters(o.fClusters), fTracklets(o.fTracklets)
124 VtxBin& operator=(
const VtxBin& o)
126 TNamed::operator=(o);
127 fClusters = o.fClusters;
128 fTracklets = o.fTracklets;
140 ll->SetName(GetName());
144 fClusters =
new TH1D(
"clusters",
"Clusters",
148 fClusters->SetXTitle(
"#eta");
149 fClusters->SetYTitle(
"dN/d#eta");
150 fClusters->SetDirectory(0);
154 fTracklets =
static_cast<TH1D*
>(fClusters->Clone(
"tracklets"));
155 fTracklets->SetTitle(
"Tracklets");
156 fTracklets->SetDirectory(0);
164 void Process(
const AliMultiplicity* spdmult)
167 for(
Int_t j = 0; j< spdmult->GetNumberOfTracklets();j++) {
169 fClusters->Fill(eta);
170 fTracklets->Fill(eta);
174 for(
Int_t j = 0; j< spdmult->GetNumberOfSingleClusters();j++) {
175 Double_t eta = -TMath::Log(TMath::Tan(spdmult->GetThetaSingle(j)/2.));
176 fClusters->Fill(eta);
187 TList* ll =
static_cast<TList*
>(l->FindObject(GetName()));
188 fClusters =
static_cast<TH1D*
>(ll->FindObject(
"clusters"));
189 fTracklets =
static_cast<TH1D*
>(ll->FindObject(
"tracklets"));
190 fClusters->Scale(1. / nEvents,
"width");
191 fTracklets->Scale(1. / nEvents,
"width");
192 TH1* ratio =
static_cast<TH1D*
>(fClusters->Clone(
"ratio"));
193 ratio->SetDirectory(0);
194 ratio->SetTitle(
"Clusters/Tracklets");
195 ratio->Divide(fTracklets);
213 fVertexAxis(20, -20, 20)
218 SPDComparisonTask(
const char*)
220 fInspector(
"eventInspector"),
225 fVertexAxis(20, -20, 20)
228 DefineOutput(1,TList::Class());
235 SPDComparisonTask(
const SPDComparisonTask& o)
237 fInspector(o.fInspector),
241 fFirstEvent(o.fFirstEvent),
242 fVertexAxis(20, -20, 20)
244 SetVertexAxis(o.fVertexAxis);
253 SPDComparisonTask& operator=(
const SPDComparisonTask& o)
255 AliAnalysisTaskSE::operator=(o);
256 fInspector = o.fInspector;
259 fFirstEvent = o.fFirstEvent;
260 SetVertexAxis(o.fVertexAxis);
266 ~SPDComparisonTask() {}
272 void SetVertexAxis(
const TAxis& a)
274 SetVertexAxis(a.GetNbins(),
287 fVertexAxis.Set(n, xmin, xmax);
293 void UserCreateOutputObjects()
296 fList->SetName(GetName());
300 fEvents =
new TH1D(
"events",
"Events",
301 fVertexAxis.GetNbins(),
302 fVertexAxis.GetXmin(),
303 fVertexAxis.GetXmax());
304 fEvents->SetDirectory(0);
305 fEvents->SetXTitle(
"v_{z} [cm]");
308 TAxis& vtxAxis = fVertexAxis;
309 fBins =
new TObjArray(vtxAxis.GetNbins(),1);
311 TAxis etaAxis(120, -3, 3);
312 for (
Int_t i = 1; i <= vtxAxis.GetNbins(); i++) {
313 VtxBin* bin =
new VtxBin(vtxAxis.GetBinLowEdge(i),
314 vtxAxis.GetBinUpEdge(i));
315 bin->DefineOutput(fList, etaAxis);
320 fInspector.DefineOutput(fList);
321 fInspector.Init(*(fEvents->GetXaxis()));
335 AliWarning(
"No ESD event found for input event");
340 if (fFirstEvent && esd->GetESDRun()) {
341 fInspector.ReadRunDetails(esd);
343 AliInfo(Form(
"Initializing with parameters from the ESD:\n"
344 " AliESDEvent::GetBeamEnergy() ->%f\n"
345 " AliESDEvent::GetBeamType() ->%s\n"
346 " AliESDEvent::GetCurrentL3() ->%f\n"
347 " AliESDEvent::GetMagneticField()->%f\n"
348 " AliESDEvent::GetRunNumber() ->%d\n",
349 esd->GetBeamEnergy(),
352 esd->GetMagneticField(),
353 esd->GetRunNumber()));
367 UInt_t retESD = fInspector.Process(esd, triggers, lowFlux, iVz, vZ,
372 if (!isInel || !hasVtx)
return;
375 const AliMultiplicity* spdmult = esd->GetMultiplicity();
377 VtxBin* bin =
static_cast<VtxBin*
>(fBins->At(iVz));
379 AliError(Form(
"No bin @ %d (%fcm)", iVz, vZ));
382 bin->Process(spdmult);
394 fList =
dynamic_cast<TList*
>(GetOutputData(1));
396 AliError(
"No output list defined");
400 fEvents =
static_cast<TH1D*
>(fList->FindObject(
"events"));
402 Int_t nEvents = fEvents->GetEntries();
403 AliInfo(Form(
"Got a total of %d events", nEvents));
410 while ((bin = static_cast<VtxBin*>(next()))) {
411 bin->Finish(fList, fEvents->GetBinContent(i++));
412 if (!clusters) clusters =
static_cast<TH1D*
>(bin->fClusters->Clone());
413 else clusters->Add(bin->fClusters);
414 if (!tracklets) tracklets =
static_cast<TH1D*
>(bin->fTracklets->Clone());
415 else tracklets->Add(bin->fTracklets);
417 clusters->SetDirectory(0);
418 tracklets->SetDirectory(0);
419 clusters->Scale(1. / i);
420 tracklets->Scale(1. / i);
423 TH1D* ratio =
static_cast<TH1D*
>(clusters->Clone(
"ratio"));
424 ratio->SetDirectory(0);
425 ratio->SetTitle(
"Clusters/Tracklets");
426 ratio->Divide(tracklets);
428 fList->Add(clusters);
429 fList->Add(tracklets);
440 ClassDef(SPDComparisonTask,1);
455 gROOT->Macro(
"$ALICE_PHYSICS/PWGLF/FORWARD/analysis2/scripts/LoadLibs.C");
458 gROOT->LoadMacro(
"$ALICE_PHYSICS/PWGLF/FORWARD/analysis2/scripts/MakeChain.C");
461 if (nEvents <= 0) nEvents = chain->GetEntries();
465 AliAnalysisManager::SetCommonFileName(
"spd_comps.root");
468 AliESDInputHandler *inputHandler =
new AliESDInputHandler();
469 mgr->SetInputEventHandler(inputHandler);
472 gSystem->AddIncludePath(
"-I${ALICE_PHYSICS}/PWGLF/FORWARD/analysis2 "
473 "-I${ALICE_PHYSICS}/include "
474 "-I${ALICE_ROOT}/ANALYSIS "
475 "-I${ALICE_ROOT}/include -DBUILD=1");
476 gROOT->LoadMacro(
"./SPDComparison.C++g");
479 SPDComparisonTask* task =
new SPDComparisonTask(
"SPD_COMP");
480 task->SetVertexAxis(10, -10, 10);
484 AliAnalysisDataContainer *sums =
485 mgr->CreateContainer(
"spdComp", TList::Class(),
486 AliAnalysisManager::kOutputContainer,
487 AliAnalysisManager::GetCommonFileName());
489 mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
490 mgr->ConnectOutput(task, 1, sums);
494 if (!mgr->InitAnalysis()) {
495 Error(
"SPDComparison",
"Failed to initialize analysis train!");
501 if (mgr->GetDebugLevel() < 1) mgr->SetUseProgressBar(kTRUE,100);
505 Printf(
"=== RUNNING ANALYSIS on %9d events ==================", nEvents);
506 mgr->StartAnalysis(
"local", chain, nEvents);
525 Error(
"DrawSPDComparison",
"Failed to open file %s",
filename);
530 TList* spd =
static_cast<TList*
>(file->Get(
"spdComp"));
532 Error(
"DrawSPDComparison",
"Failed to get list SPD_COMP from file %s",
538 TH1* clusters =
static_cast<TH1*
>(spd->FindObject(
"clusters"));
539 TH1* tracklets =
static_cast<TH1*
>(spd->FindObject(
"tracklets"));
540 TH1* ratio =
static_cast<TH1*
>(spd->FindObject(
"ratio"));
541 TH1* events =
static_cast<TH1*
>(spd->FindObject(
"events"));
544 gStyle->SetPalette(1);
545 gStyle->SetTitleFillColor(0);
546 gStyle->SetTitleStyle(0);
547 gStyle->SetTitleBorderSize(0);
548 gStyle->SetOptStat(0);
549 gStyle->SetTitleX(0.69);
550 gStyle->SetTitleY(0.99);
551 gStyle->SetTitleW(0.30);
552 gStyle->SetTitleH(0.10);
555 TCanvas* c1 =
new TCanvas(
"c1",
"c1", 900, 600);
556 c1->SetTopMargin(0.05);
557 c1->SetRightMargin(0.05);
560 c1->SetBorderSize(0);
561 c1->SetBorderMode(0);
564 TPad* p1 =
new TPad(
"p1",
"p1", 0.0, 0.3, 1.0, 1.0, 0, 0, 0);
567 p1->SetBorderSize(0);
568 p1->SetBorderMode(0);
569 p1->SetTopMargin(0.05);
570 p1->SetBottomMargin(0.001);
571 p1->SetRightMargin(0.05);
574 clusters->SetMarkerStyle(20);
575 clusters->SetMarkerColor(kRed+1);
578 tracklets->SetMarkerStyle(20);
579 tracklets->SetMarkerColor(kBlue+1);
580 tracklets->Draw(
"same");
582 TString v(Form(
"%+5.1f<|v_{z}|<%+5.1f",
583 events->GetXaxis()->GetXmin(),
584 events->GetXaxis()->GetXmax()));
585 TLatex* ltx =
new TLatex(.2,.80, v.Data());
588 TLegend* l = p1->BuildLegend(.6,.6,.94,.94);
594 TPad* p2 =
new TPad(
"p2",
"p2", 0.0, 0.0, 1.0, 0.3, 0, 0, 0);
597 p2->SetBorderSize(0);
598 p2->SetBorderMode(0);
599 p2->SetTopMargin(0.001);
600 p2->SetBottomMargin(0.2);
601 p2->SetRightMargin(0.05);
604 ratio->SetMarkerStyle(20);
605 ratio->SetMarkerColor(kGray+1);
607 ratio->GetYaxis()->SetRangeUser(0,2);
609 c1->SaveAs(
"SPDComparison.png");
610 c1->SaveAs(
"SPDComparison.root");
void Print(std::ostream &o, const char *name, Double_t dT, Double_t dVM, Double_t alldT, Double_t alldVM)
TChain * MakeChain(const char *what, const char *datadir, bool recursive=false)
void SPDComparison(const char *esddir, Int_t nEvents=-1)
void DrawSPDComparison(const char *filename="spd_comps.root")
void Process(Int_t *pflag[23040][7], TH1 *inhisto, Double_t Nsigma=4., Int_t dnbins=200, Double_t dmaxval=-1., Int_t compteur=1)