ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

//--------------------------------------------------------------------------
//    Implementation of the beam interaction spot location and size estimate
//    via VertexerTracksNoConstraint resolution extrapolation
//    to the infinit multiplicity alias zero resolution
//
// Origin: AliAnalysisTaskVtXY
//         A. Jacholkowski, Catania 
//         adam.jacholkowski@cern.ch
//-----------------------------------------------------------------
#include "TChain.h"
#include "TTree.h"
#include "TStyle.h"
#include "TH2F.h"
#include "TProfile.h"
#include "TCanvas.h"

#include "AliAnalysisTask.h"
#include "AliAnalysisManager.h"

#include "AliESDEvent.h"
#include "AliESDInputHandler.h"

#include "AliAnalysisTaskVtXY.h"

#include "AliESDVertex.h"
#include "AliVertexerTracks.h"
ClassImp(AliAnalysisTaskVtXY)

//________________________________________________________________________
AliAnalysisTaskVtXY::AliAnalysisTaskVtXY(const char *name) 
  : AliAnalysisTask(name, ""),
  fESD(0), 
  fList(0),
  fHistVtx(0),
  fHistVty(0)
{
  // Constructor

  // Define input and output slots here
  // Input slot #0 works with a TChain
  DefineInput(0, TChain::Class());
  DefineOutput(0, TList::Class());
  // Output slot #0 writes into a TList container
}

//________________________________________________________________________
void AliAnalysisTaskVtXY::ConnectInputData(Option_t *) 
{
  // Connect ESD or AOD here
  // Called once

  TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
  if (!tree) {
    Printf("ERROR: Could not read chain from input slot 0");
  } else {
    // Disable all branches and enable only the needed ones
    // The next two lines are different when data produced as AliESDEvent is read
    //tree->SetBranchStatus("*", kFALSE);
    //tree->SetBranchStatus("Tracks.*", kTRUE);

    AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());

    if (!esdH) {
      Printf("ERROR: Could not get ESDInputHandler");
    } else
      fESD = esdH->GetEvent();
  }
}

//________________________________________________________________________
void AliAnalysisTaskVtXY::CreateOutputObjects()
{
  // Create histograms
  // Called once

   fHistVtx = new TProfile("fHistVtx","Xvert-RMS vs sigmaX(NC)",100,0.,0.05,-1.,1.,"s");
   fHistVty = new TProfile("fHistVty","Yvert-RMS vs sigmaY(NC)",100,0.,0.05,-1.,1.,"s");
   fHistVtx->GetXaxis()->SetTitle("sigmaX(NContributors)");
   fHistVtx->GetYaxis()->SetTitle("Xv-av&spread");
   fHistVty->GetXaxis()->SetTitle("sigmaY(NContributors)");
   fHistVty->GetYaxis()->SetTitle("Yv-av&spread");
   fHistVtx->SetMarkerStyle(kFullCircle);
   fHistVty->SetMarkerStyle(kOpenCircle);
   //
   fList = new TList();
   fList->Add(fHistVtx);
   fList->Add(fHistVty);
}

//________________________________________________________________________
void AliAnalysisTaskVtXY::Exec(Option_t *) 
{
  // Main loop
  // Called for each event
  // 0 condition / existence of ESD
  if (!fESD) {
    Printf("ERROR: fESD not available");
    return;
  }
  Printf("There are %d tracks in this event", fESD->GetNumberOfTracks());
  Int_t Ngood = 0;
  // Track loop kept in case of need
  for (Int_t iTracks = 0; iTracks < fESD->GetNumberOfTracks(); iTracks++) {
    AliESDtrack* track = fESD->GetTrack(iTracks);
    if (!track) {
      Printf("ERROR: Could not receive track %d", iTracks);
      continue;
    }
    Ngood++;
  } //end track loop 
  // redo the ESD vertex withour constraint
  AliVertexerTracks vertexer(fESD->GetMagneticField());
  vertexer.SetITSMode();
  AliESDVertex *vertex = vertexer.FindPrimaryVertex(fESD);
  // ***************************************************
  //  const AliESDVertex *vtxESD = 0;
  // if(fESD) {vtxESD = fESD->GetPrimaryVertexTracks();}
  Double_t ESDvtx[3] ={999.,999.,9999.};
  Double_t XRes,YRes ;
  Double_t sig[3];
  // Cond 1.vertex has to exist 
   if (!vertex) {
     Printf("ERROR: vertex not available");
     return;
    }
   // Cond 2 - vertexer has not failed
   if(!vertex->GetStatus()){
     Printf("WARNING: vertexer has failed");
       return;
   }
     TString vtitle = vertex->GetTitle();
   // Cond 3 --> vertexer type check
     if(!vtitle.Contains("VertexerTracksNoConstraint")){
       Printf("WARNING: not VertexerTracksNoConstraint");
      return;
   }
   ULong64_t TrigMask=0;
   TrigMask = fESD->GetTriggerMask();
   // Cond.4 Trigger mask eventually - not activated
   if(TrigMask==0){
     Printf("Trigger Mask = 0");
     // return;
    }
    if(vertex){
    vertex->GetXYZ(ESDvtx);
    XRes = vertex->GetXRes();
    YRes = vertex->GetYRes();
    vertex->GetSigmaXYZ(sig);
    fHistVtx->Fill(XRes,ESDvtx[0]);
    fHistVty->Fill(YRes,ESDvtx[1]);
    PostData(0,fList);
    }
  //
}      

//________________________________________________________________________
void AliAnalysisTaskVtXY::Terminate(Option_t *) 
{
  // Draw result to the screen
  // Called once at the end of the query
  fList = dynamic_cast<TList*>(GetOutputData(0));
  if(!fList){
    Printf("ERROR: fList not available");
    return;
  }
  fHistVtx = (TProfile *)fList->At(0);
  fHistVty = (TProfile *)fList->At(1);
  TCanvas *c1 = new TCanvas("AliAnalysisTaskVtXY","Vtx analysis",10,10,800,800);
  c1->SetFillColor(10); c1->SetHighLightColor(10);
  c1->Divide(1,2);
  c1->cd(1);
  fHistVtx->DrawCopy("");
  c1->cd(2);
  fHistVty->DrawCopy("");
  // derive histos with fits from the above profiles
  Double_t spread = 0.;
  Double_t content = 0.;
  Double_t entries = 0.;
  Double_t error = 0.;
  TH1D * hsx = new TH1D("hsx","Xvtx spreads",100,0.,0.050);
  //fill
  for(Int_t i=0; i<100; i++){
    spread = fHistVtx->GetBinError(i);
    content = fHistVtx->GetBinContent(i);
    entries = fHistVtx->GetBinEntries(i);
    error = 0.;
    if(entries<10){content = 0.; spread = 0.;}
    if(entries>0){error = 0.0005 + spread/TMath::Sqrt(entries);}
    hsx->SetBinContent(i,spread);
    hsx->SetBinError(i,error);
  }
  hsx->GetXaxis()->SetTitle("sigma-Xvert");
  hsx->GetYaxis()->SetTitle("RMS(Xv) [cm]");
  hsx->GetYaxis()->SetTitleOffset(-0.3);
  hsx->GetYaxis()->SetRangeUser(0.,0.15);
  hsx->SetMarkerColor(3);
  hsx->SetMarkerStyle(20);
  /*TCanvas *cx = */new TCanvas("cx","",50,50,800,800);
  gStyle->SetOptFit(111);
  TPad *px = new TPad("px","",0,0,1,1);
  px->Draw();
  px->cd();
  px->SetFillColor(42);
  px->SetFrameFillColor(10);
  hsx->Fit("pol3","R","",0.001,0.02);
  hsx->Draw();
  // VtY
  TH1D * hsy = new TH1D("hsy","Yvtx spreads",100,0.,0.050);
  //fill
  for(Int_t i=0; i<100; i++){
    spread = fHistVty->GetBinError(i);
    content = fHistVty->GetBinContent(i);
    entries = fHistVty->GetBinEntries(i);
    error = 0.;
    if(entries<10){content = 0.; spread = 0.;}
    if(entries>0){error = 0.0005 + spread/TMath::Sqrt(entries);}
    hsy->SetBinContent(i,spread);
    hsy->SetBinError(i,error);
  }
  hsy->GetXaxis()->SetTitle("sigma-Yvert");
  hsy->GetYaxis()->SetTitle("RMS(Yv) [cm]");
  hsy->GetYaxis()->SetTitleOffset(-0.3);
  hsy->GetYaxis()->SetRangeUser(0.,0.15);
  hsy->SetMarkerColor(2);
  hsy->SetMarkerStyle(20);
  /*TCanvas *cy = */new TCanvas("cy","",100,100,800,800);
  TPad *py = new TPad("py","",0,0,1,1);
  py->Draw();
  py->cd();
  py->SetFillColor(42);
  py->SetFrameFillColor(10);
  hsy->Fit("pol3","R","",0.001,0.02);
  hsy->Draw();
}
 AliAnalysisTaskVtXY.cxx:1
 AliAnalysisTaskVtXY.cxx:2
 AliAnalysisTaskVtXY.cxx:3
 AliAnalysisTaskVtXY.cxx:4
 AliAnalysisTaskVtXY.cxx:5
 AliAnalysisTaskVtXY.cxx:6
 AliAnalysisTaskVtXY.cxx:7
 AliAnalysisTaskVtXY.cxx:8
 AliAnalysisTaskVtXY.cxx:9
 AliAnalysisTaskVtXY.cxx:10
 AliAnalysisTaskVtXY.cxx:11
 AliAnalysisTaskVtXY.cxx:12
 AliAnalysisTaskVtXY.cxx:13
 AliAnalysisTaskVtXY.cxx:14
 AliAnalysisTaskVtXY.cxx:15
 AliAnalysisTaskVtXY.cxx:16
 AliAnalysisTaskVtXY.cxx:17
 AliAnalysisTaskVtXY.cxx:18
 AliAnalysisTaskVtXY.cxx:19
 AliAnalysisTaskVtXY.cxx:20
 AliAnalysisTaskVtXY.cxx:21
 AliAnalysisTaskVtXY.cxx:22
 AliAnalysisTaskVtXY.cxx:23
 AliAnalysisTaskVtXY.cxx:24
 AliAnalysisTaskVtXY.cxx:25
 AliAnalysisTaskVtXY.cxx:26
 AliAnalysisTaskVtXY.cxx:27
 AliAnalysisTaskVtXY.cxx:28
 AliAnalysisTaskVtXY.cxx:29
 AliAnalysisTaskVtXY.cxx:30
 AliAnalysisTaskVtXY.cxx:31
 AliAnalysisTaskVtXY.cxx:32
 AliAnalysisTaskVtXY.cxx:33
 AliAnalysisTaskVtXY.cxx:34
 AliAnalysisTaskVtXY.cxx:35
 AliAnalysisTaskVtXY.cxx:36
 AliAnalysisTaskVtXY.cxx:37
 AliAnalysisTaskVtXY.cxx:38
 AliAnalysisTaskVtXY.cxx:39
 AliAnalysisTaskVtXY.cxx:40
 AliAnalysisTaskVtXY.cxx:41
 AliAnalysisTaskVtXY.cxx:42
 AliAnalysisTaskVtXY.cxx:43
 AliAnalysisTaskVtXY.cxx:44
 AliAnalysisTaskVtXY.cxx:45
 AliAnalysisTaskVtXY.cxx:46
 AliAnalysisTaskVtXY.cxx:47
 AliAnalysisTaskVtXY.cxx:48
 AliAnalysisTaskVtXY.cxx:49
 AliAnalysisTaskVtXY.cxx:50
 AliAnalysisTaskVtXY.cxx:51
 AliAnalysisTaskVtXY.cxx:52
 AliAnalysisTaskVtXY.cxx:53
 AliAnalysisTaskVtXY.cxx:54
 AliAnalysisTaskVtXY.cxx:55
 AliAnalysisTaskVtXY.cxx:56
 AliAnalysisTaskVtXY.cxx:57
 AliAnalysisTaskVtXY.cxx:58
 AliAnalysisTaskVtXY.cxx:59
 AliAnalysisTaskVtXY.cxx:60
 AliAnalysisTaskVtXY.cxx:61
 AliAnalysisTaskVtXY.cxx:62
 AliAnalysisTaskVtXY.cxx:63
 AliAnalysisTaskVtXY.cxx:64
 AliAnalysisTaskVtXY.cxx:65
 AliAnalysisTaskVtXY.cxx:66
 AliAnalysisTaskVtXY.cxx:67
 AliAnalysisTaskVtXY.cxx:68
 AliAnalysisTaskVtXY.cxx:69
 AliAnalysisTaskVtXY.cxx:70
 AliAnalysisTaskVtXY.cxx:71
 AliAnalysisTaskVtXY.cxx:72
 AliAnalysisTaskVtXY.cxx:73
 AliAnalysisTaskVtXY.cxx:74
 AliAnalysisTaskVtXY.cxx:75
 AliAnalysisTaskVtXY.cxx:76
 AliAnalysisTaskVtXY.cxx:77
 AliAnalysisTaskVtXY.cxx:78
 AliAnalysisTaskVtXY.cxx:79
 AliAnalysisTaskVtXY.cxx:80
 AliAnalysisTaskVtXY.cxx:81
 AliAnalysisTaskVtXY.cxx:82
 AliAnalysisTaskVtXY.cxx:83
 AliAnalysisTaskVtXY.cxx:84
 AliAnalysisTaskVtXY.cxx:85
 AliAnalysisTaskVtXY.cxx:86
 AliAnalysisTaskVtXY.cxx:87
 AliAnalysisTaskVtXY.cxx:88
 AliAnalysisTaskVtXY.cxx:89
 AliAnalysisTaskVtXY.cxx:90
 AliAnalysisTaskVtXY.cxx:91
 AliAnalysisTaskVtXY.cxx:92
 AliAnalysisTaskVtXY.cxx:93
 AliAnalysisTaskVtXY.cxx:94
 AliAnalysisTaskVtXY.cxx:95
 AliAnalysisTaskVtXY.cxx:96
 AliAnalysisTaskVtXY.cxx:97
 AliAnalysisTaskVtXY.cxx:98
 AliAnalysisTaskVtXY.cxx:99
 AliAnalysisTaskVtXY.cxx:100
 AliAnalysisTaskVtXY.cxx:101
 AliAnalysisTaskVtXY.cxx:102
 AliAnalysisTaskVtXY.cxx:103
 AliAnalysisTaskVtXY.cxx:104
 AliAnalysisTaskVtXY.cxx:105
 AliAnalysisTaskVtXY.cxx:106
 AliAnalysisTaskVtXY.cxx:107
 AliAnalysisTaskVtXY.cxx:108
 AliAnalysisTaskVtXY.cxx:109
 AliAnalysisTaskVtXY.cxx:110
 AliAnalysisTaskVtXY.cxx:111
 AliAnalysisTaskVtXY.cxx:112
 AliAnalysisTaskVtXY.cxx:113
 AliAnalysisTaskVtXY.cxx:114
 AliAnalysisTaskVtXY.cxx:115
 AliAnalysisTaskVtXY.cxx:116
 AliAnalysisTaskVtXY.cxx:117
 AliAnalysisTaskVtXY.cxx:118
 AliAnalysisTaskVtXY.cxx:119
 AliAnalysisTaskVtXY.cxx:120
 AliAnalysisTaskVtXY.cxx:121
 AliAnalysisTaskVtXY.cxx:122
 AliAnalysisTaskVtXY.cxx:123
 AliAnalysisTaskVtXY.cxx:124
 AliAnalysisTaskVtXY.cxx:125
 AliAnalysisTaskVtXY.cxx:126
 AliAnalysisTaskVtXY.cxx:127
 AliAnalysisTaskVtXY.cxx:128
 AliAnalysisTaskVtXY.cxx:129
 AliAnalysisTaskVtXY.cxx:130
 AliAnalysisTaskVtXY.cxx:131
 AliAnalysisTaskVtXY.cxx:132
 AliAnalysisTaskVtXY.cxx:133
 AliAnalysisTaskVtXY.cxx:134
 AliAnalysisTaskVtXY.cxx:135
 AliAnalysisTaskVtXY.cxx:136
 AliAnalysisTaskVtXY.cxx:137
 AliAnalysisTaskVtXY.cxx:138
 AliAnalysisTaskVtXY.cxx:139
 AliAnalysisTaskVtXY.cxx:140
 AliAnalysisTaskVtXY.cxx:141
 AliAnalysisTaskVtXY.cxx:142
 AliAnalysisTaskVtXY.cxx:143
 AliAnalysisTaskVtXY.cxx:144
 AliAnalysisTaskVtXY.cxx:145
 AliAnalysisTaskVtXY.cxx:146
 AliAnalysisTaskVtXY.cxx:147
 AliAnalysisTaskVtXY.cxx:148
 AliAnalysisTaskVtXY.cxx:149
 AliAnalysisTaskVtXY.cxx:150
 AliAnalysisTaskVtXY.cxx:151
 AliAnalysisTaskVtXY.cxx:152
 AliAnalysisTaskVtXY.cxx:153
 AliAnalysisTaskVtXY.cxx:154
 AliAnalysisTaskVtXY.cxx:155
 AliAnalysisTaskVtXY.cxx:156
 AliAnalysisTaskVtXY.cxx:157
 AliAnalysisTaskVtXY.cxx:158
 AliAnalysisTaskVtXY.cxx:159
 AliAnalysisTaskVtXY.cxx:160
 AliAnalysisTaskVtXY.cxx:161
 AliAnalysisTaskVtXY.cxx:162
 AliAnalysisTaskVtXY.cxx:163
 AliAnalysisTaskVtXY.cxx:164
 AliAnalysisTaskVtXY.cxx:165
 AliAnalysisTaskVtXY.cxx:166
 AliAnalysisTaskVtXY.cxx:167
 AliAnalysisTaskVtXY.cxx:168
 AliAnalysisTaskVtXY.cxx:169
 AliAnalysisTaskVtXY.cxx:170
 AliAnalysisTaskVtXY.cxx:171
 AliAnalysisTaskVtXY.cxx:172
 AliAnalysisTaskVtXY.cxx:173
 AliAnalysisTaskVtXY.cxx:174
 AliAnalysisTaskVtXY.cxx:175
 AliAnalysisTaskVtXY.cxx:176
 AliAnalysisTaskVtXY.cxx:177
 AliAnalysisTaskVtXY.cxx:178
 AliAnalysisTaskVtXY.cxx:179
 AliAnalysisTaskVtXY.cxx:180
 AliAnalysisTaskVtXY.cxx:181
 AliAnalysisTaskVtXY.cxx:182
 AliAnalysisTaskVtXY.cxx:183
 AliAnalysisTaskVtXY.cxx:184
 AliAnalysisTaskVtXY.cxx:185
 AliAnalysisTaskVtXY.cxx:186
 AliAnalysisTaskVtXY.cxx:187
 AliAnalysisTaskVtXY.cxx:188
 AliAnalysisTaskVtXY.cxx:189
 AliAnalysisTaskVtXY.cxx:190
 AliAnalysisTaskVtXY.cxx:191
 AliAnalysisTaskVtXY.cxx:192
 AliAnalysisTaskVtXY.cxx:193
 AliAnalysisTaskVtXY.cxx:194
 AliAnalysisTaskVtXY.cxx:195
 AliAnalysisTaskVtXY.cxx:196
 AliAnalysisTaskVtXY.cxx:197
 AliAnalysisTaskVtXY.cxx:198
 AliAnalysisTaskVtXY.cxx:199
 AliAnalysisTaskVtXY.cxx:200
 AliAnalysisTaskVtXY.cxx:201
 AliAnalysisTaskVtXY.cxx:202
 AliAnalysisTaskVtXY.cxx:203
 AliAnalysisTaskVtXY.cxx:204
 AliAnalysisTaskVtXY.cxx:205
 AliAnalysisTaskVtXY.cxx:206
 AliAnalysisTaskVtXY.cxx:207
 AliAnalysisTaskVtXY.cxx:208
 AliAnalysisTaskVtXY.cxx:209
 AliAnalysisTaskVtXY.cxx:210
 AliAnalysisTaskVtXY.cxx:211
 AliAnalysisTaskVtXY.cxx:212
 AliAnalysisTaskVtXY.cxx:213
 AliAnalysisTaskVtXY.cxx:214
 AliAnalysisTaskVtXY.cxx:215
 AliAnalysisTaskVtXY.cxx:216
 AliAnalysisTaskVtXY.cxx:217
 AliAnalysisTaskVtXY.cxx:218
 AliAnalysisTaskVtXY.cxx:219
 AliAnalysisTaskVtXY.cxx:220
 AliAnalysisTaskVtXY.cxx:221
 AliAnalysisTaskVtXY.cxx:222
 AliAnalysisTaskVtXY.cxx:223
 AliAnalysisTaskVtXY.cxx:224
 AliAnalysisTaskVtXY.cxx:225
 AliAnalysisTaskVtXY.cxx:226
 AliAnalysisTaskVtXY.cxx:227
 AliAnalysisTaskVtXY.cxx:228
 AliAnalysisTaskVtXY.cxx:229
 AliAnalysisTaskVtXY.cxx:230
 AliAnalysisTaskVtXY.cxx:231
 AliAnalysisTaskVtXY.cxx:232
 AliAnalysisTaskVtXY.cxx:233
 AliAnalysisTaskVtXY.cxx:234
 AliAnalysisTaskVtXY.cxx:235
 AliAnalysisTaskVtXY.cxx:236
 AliAnalysisTaskVtXY.cxx:237
 AliAnalysisTaskVtXY.cxx:238
 AliAnalysisTaskVtXY.cxx:239
 AliAnalysisTaskVtXY.cxx:240
 AliAnalysisTaskVtXY.cxx:241
 AliAnalysisTaskVtXY.cxx:242
 AliAnalysisTaskVtXY.cxx:243
 AliAnalysisTaskVtXY.cxx:244
 AliAnalysisTaskVtXY.cxx:245
 AliAnalysisTaskVtXY.cxx:246
 AliAnalysisTaskVtXY.cxx:247
 AliAnalysisTaskVtXY.cxx:248
 AliAnalysisTaskVtXY.cxx:249