ROOT logo
// MyAnalysis.C 
#ifndef __CINT__
# include <AliAnalysisManager.h>
# include <AliESDEvent.h>
# include <AliMultiplicity.h>
# include <AliVEventHandler.h>
# include <AliESDVertex.h>
# include <AliProdInfo.h>
# include <TH1D.h>
# include <TH2D.h>
#else 
class TH1D;
class TH2D;
class AliProdInfo;
#endif 
#include <AliAnalysisTaskSE.h>
class MyAnalysis : public AliAnalysisTaskSE
{
public:
  MyAnalysis() 
    : AliAnalysisTaskSE(), fList(0), fMult(0), fVz(0), fProd(0)
  {}
  MyAnalysis(const char* name) 
    : AliAnalysisTaskSE(name), fList(0), fMult(0), fVz(0), fProd(0)
  {
    DefineOutput(1, TList::Class());
    DefineOutput(2, TList::Class()); // For output from Terminate
    fBranchNames = "AliMultiplicity.,SPDVertex.,PrimaryVertex.";
  }
  MyAnalysis(const MyAnalysis& o) 
  : AliAnalysisTaskSE(o), fList(o.fList), fMult(o.fMult), fVz(o.fVz)
  {}
  virtual ~MyAnalysis() {}
  MyAnalysis& operator=(const MyAnalysis&) { return *this; }
  virtual void UserCreateOutputObjects()
  {
    fList = new TList();
    fList->SetName("Sums");
    fList->SetOwner();

    fMult = new TH2D("mult", "SPD tracklets", 80, -2, 2, 10, -10, 10);
    fMult->SetXTitle("#eta");
    fMult->SetYTitle("v_{z} [cm]");
    fMult->Sumw2();
    fMult->SetDirectory(0); // Disassociate from file 
    
    fVz = new TH1D("vz", "Interaction point", 10, -10, 10);
    fVz->SetXTitle("v_{z} [cm]");
    fVz->Sumw2();
    fVz->SetDirectory(0); // Disassociate from file 

    fList->Add(fMult);
    fList->Add(fVz);

    PostData(1, fList);
  }
  virtual void UserExec(Option_t* )
  {
    if (!fProd) { 
      AliAnalysisManager *mgr=AliAnalysisManager::GetAnalysisManager();
      AliVEventHandler *inputHandler=mgr->GetInputEventHandler();
      if (inputHandler) {
        Info("", "Got input handler");
        TList *uiList = inputHandler->GetUserInfo();
        if (uiList) {
          Info("", "Got user list:");
          uiList->ls();
        
          fProd = new AliProdInfo(uiList);
          Info("", "Lising production information");
          fProd->List();
        }
      }
    }

    AliESDEvent* event = dynamic_cast<AliESDEvent*>(InputEvent());
    if (!event) return;
    if (event->IsPileupFromSPD(3,0.8))   return;

    const AliESDVertex* vtx = event->GetPrimaryVertexSPD();
    if (!vtx || !vtx->GetStatus()) return;
    if (vtx->IsFromVertexerZ() && 
        (vtx->GetDispersion() > 0.2 ||  vtx->GetZRes() > 1.25 * 0.2))
      return;

    const AliMultiplicity* mult = event->GetMultiplicity();
    if (!mult) return;
    
    Double_t vz = vtx->GetZ();
    fVz->Fill(vz);

    Int_t nTracklets = mult->GetNumberOfTracklets();
    for (Int_t i = 0; i < nTracklets; i++) 
      fMult->Fill(mult->GetEta(i), vz);

    PostData(1, fList);
  }
  void  Terminate(Option_t *)
  {
    TList* l = dynamic_cast<TList*>(GetOutputData(1));
    if (!l) {
      Warning("Terminate", "No out data # 1 found");
      return;
    }
 
    TH2D* mult = static_cast<TH2D*>(l->FindObject("mult"));
    TH1D* vz   = static_cast<TH1D*>(l->FindObject("vz"));
    if (!mult || !vz) {
      Warning("Terminate", "Either 'mult' (%p) or 'vz' (%p) or both not found",
              mult, vz);
      return;
    }

    TList* output = new TList;   // Needed for new output from Terminate
    output->SetName("Results");  // 1st output re-opened read-only
    output->SetOwner();

    TH2D* out = static_cast<TH2D*>(mult->Clone("dndeta"));
    out->SetTitle("dN_{ch}/d#eta from SPD tracklets per vertex bin");
    out->SetZTitle("#frac{1}{N}#frac{dN_{ch}}{d#eta}");
    out->SetDirectory(0); // Disassociate from file 
    Int_t    nVz  = mult->GetNbinsY();
    Int_t    nEta = mult->GetNbinsX();
    for (Int_t iVz = 1; iVz <= nVz; iVz++) { 
      Double_t nEv = vz->GetBinContent(iVz);
      Double_t e1  = vz->GetBinError(iVz);
      Double_t sca = (nEv == 0 ? 0 : 1. / nEv);
      for (Int_t iEta = 1; iEta <= nEta; iEta++) { 
        Double_t c  = mult->GetBinContent(iEta,iVz);
        Double_t e  = mult->GetBinError(iEta,iVz);
        Double_t ee = TMath::Sqrt(c*c * e1*e1 + nEv*nEv * e*e) * sca*sca;
        out->SetBinContent(iEta, iVz, sca * c);
        out->SetBinError(iEta, iVz, ee);
      }
    }
    Double_t etaMin = mult->GetXaxis()->GetXmin();
    Double_t etaMax = mult->GetXaxis()->GetXmax();
    out->Scale(Double_t(nEta) / (etaMax-etaMin));

    output->Add(out);
    PostData(2, output);
  }
protected:
  TList*  fList;
  TH2D*   fMult;
  TH1D*   fVz;
  AliProdInfo* fProd;
  ClassDef(MyAnalysis, 1);  
};
//
// EOF
//

 MyAnalysis.C:1
 MyAnalysis.C:2
 MyAnalysis.C:3
 MyAnalysis.C:4
 MyAnalysis.C:5
 MyAnalysis.C:6
 MyAnalysis.C:7
 MyAnalysis.C:8
 MyAnalysis.C:9
 MyAnalysis.C:10
 MyAnalysis.C:11
 MyAnalysis.C:12
 MyAnalysis.C:13
 MyAnalysis.C:14
 MyAnalysis.C:15
 MyAnalysis.C:16
 MyAnalysis.C:17
 MyAnalysis.C:18
 MyAnalysis.C:19
 MyAnalysis.C:20
 MyAnalysis.C:21
 MyAnalysis.C:22
 MyAnalysis.C:23
 MyAnalysis.C:24
 MyAnalysis.C:25
 MyAnalysis.C:26
 MyAnalysis.C:27
 MyAnalysis.C:28
 MyAnalysis.C:29
 MyAnalysis.C:30
 MyAnalysis.C:31
 MyAnalysis.C:32
 MyAnalysis.C:33
 MyAnalysis.C:34
 MyAnalysis.C:35
 MyAnalysis.C:36
 MyAnalysis.C:37
 MyAnalysis.C:38
 MyAnalysis.C:39
 MyAnalysis.C:40
 MyAnalysis.C:41
 MyAnalysis.C:42
 MyAnalysis.C:43
 MyAnalysis.C:44
 MyAnalysis.C:45
 MyAnalysis.C:46
 MyAnalysis.C:47
 MyAnalysis.C:48
 MyAnalysis.C:49
 MyAnalysis.C:50
 MyAnalysis.C:51
 MyAnalysis.C:52
 MyAnalysis.C:53
 MyAnalysis.C:54
 MyAnalysis.C:55
 MyAnalysis.C:56
 MyAnalysis.C:57
 MyAnalysis.C:58
 MyAnalysis.C:59
 MyAnalysis.C:60
 MyAnalysis.C:61
 MyAnalysis.C:62
 MyAnalysis.C:63
 MyAnalysis.C:64
 MyAnalysis.C:65
 MyAnalysis.C:66
 MyAnalysis.C:67
 MyAnalysis.C:68
 MyAnalysis.C:69
 MyAnalysis.C:70
 MyAnalysis.C:71
 MyAnalysis.C:72
 MyAnalysis.C:73
 MyAnalysis.C:74
 MyAnalysis.C:75
 MyAnalysis.C:76
 MyAnalysis.C:77
 MyAnalysis.C:78
 MyAnalysis.C:79
 MyAnalysis.C:80
 MyAnalysis.C:81
 MyAnalysis.C:82
 MyAnalysis.C:83
 MyAnalysis.C:84
 MyAnalysis.C:85
 MyAnalysis.C:86
 MyAnalysis.C:87
 MyAnalysis.C:88
 MyAnalysis.C:89
 MyAnalysis.C:90
 MyAnalysis.C:91
 MyAnalysis.C:92
 MyAnalysis.C:93
 MyAnalysis.C:94
 MyAnalysis.C:95
 MyAnalysis.C:96
 MyAnalysis.C:97
 MyAnalysis.C:98
 MyAnalysis.C:99
 MyAnalysis.C:100
 MyAnalysis.C:101
 MyAnalysis.C:102
 MyAnalysis.C:103
 MyAnalysis.C:104
 MyAnalysis.C:105
 MyAnalysis.C:106
 MyAnalysis.C:107
 MyAnalysis.C:108
 MyAnalysis.C:109
 MyAnalysis.C:110
 MyAnalysis.C:111
 MyAnalysis.C:112
 MyAnalysis.C:113
 MyAnalysis.C:114
 MyAnalysis.C:115
 MyAnalysis.C:116
 MyAnalysis.C:117
 MyAnalysis.C:118
 MyAnalysis.C:119
 MyAnalysis.C:120
 MyAnalysis.C:121
 MyAnalysis.C:122
 MyAnalysis.C:123
 MyAnalysis.C:124
 MyAnalysis.C:125
 MyAnalysis.C:126
 MyAnalysis.C:127
 MyAnalysis.C:128
 MyAnalysis.C:129
 MyAnalysis.C:130
 MyAnalysis.C:131
 MyAnalysis.C:132
 MyAnalysis.C:133
 MyAnalysis.C:134
 MyAnalysis.C:135
 MyAnalysis.C:136
 MyAnalysis.C:137
 MyAnalysis.C:138
 MyAnalysis.C:139
 MyAnalysis.C:140
 MyAnalysis.C:141
 MyAnalysis.C:142
 MyAnalysis.C:143
 MyAnalysis.C:144
 MyAnalysis.C:145
 MyAnalysis.C:146
 MyAnalysis.C:147
 MyAnalysis.C:148
 MyAnalysis.C:149
 MyAnalysis.C:150
 MyAnalysis.C:151
 MyAnalysis.C:152
 MyAnalysis.C:153
 MyAnalysis.C:154