ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2008, 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.                  *
 **************************************************************************/

//*****************************************************
//   Class AliVZEROEPSelectionTask
//   author: Cvetan Cheshkov
//   30/01/2012
//   This analysis task reads the OADB and
//   provides the parameters needed to flatten
//   the VZERO event plane in AliEventplane
//*****************************************************

#include "AliVZEROEPSelectionTask.h"

#include <TList.h>
#include <TProfile.h>
#include <TFile.h>
#include <TString.h>
#include <TDirectory.h>

#include "AliLog.h"
#include "AliVEvent.h"
#include "AliAnalysisManager.h"
#include "AliOADBContainer.h"
#include "AliEventplane.h"
#include "AliCentrality.h"

ClassImp(AliVZEROEPSelectionTask)

//________________________________________________________________________
AliVZEROEPSelectionTask::AliVZEROEPSelectionTask():
AliAnalysisTaskSE(),
  fRunNumber(-1),
  fUserParams(kFALSE),
  fUseVZEROCentrality(kFALSE),
  fVZEROEPContainer(0)
{   
  // Default constructor
  // Initialize pointers
  AliInfo("VZERO Event Plane Selection enabled.");
  for(Int_t i = 0; i < 11; ++i) fX2In[i] = fY2In[i] = fX2Y2In[i] = fCos8PsiIn[i] = NULL;
}   

//________________________________________________________________________
AliVZEROEPSelectionTask::AliVZEROEPSelectionTask(const char *name):
  AliAnalysisTaskSE(name),
  fRunNumber(-1),
  fUserParams(kFALSE),
  fUseVZEROCentrality(kFALSE),
  fVZEROEPContainer(0)
{
  // Default constructor
  // Initialize pointers
  AliInfo("Event Plane Selection enabled.");
  for(Int_t i = 0; i < 11; ++i) fX2In[i] = fY2In[i] = fX2Y2In[i] = fCos8PsiIn[i] = NULL;
}
 
//________________________________________________________________________
AliVZEROEPSelectionTask::~AliVZEROEPSelectionTask()
{
  // Destructor
  // ...
  if (fUserParams) {
    for(Int_t i = 0; i < 11; ++i) {
      delete fX2In[i];
      fX2In[i] = NULL;
      delete fY2In[i];
      fY2In[i] = NULL;
      delete fX2Y2In[i];
      fX2Y2In[i] = NULL;
      delete fCos8PsiIn[i];
      fCos8PsiIn[i] = NULL;
    }
  }
  if (fVZEROEPContainer){
    delete fVZEROEPContainer;
    fVZEROEPContainer = NULL;
  }
}  

//________________________________________________________________________
void AliVZEROEPSelectionTask::UserCreateOutputObjects()
{  
  // Create the output containers (none in this case)
  // Open the OADB file
  
  if(!fUserParams) {
    TString oadbFileName = Form("%s/COMMON/EVENTPLANE/data/vzero.root", AliAnalysisManager::GetOADBPath());
    TFile *fOADB = TFile::Open(oadbFileName); 
    if(!fOADB->IsOpen()) AliFatal(Form("Cannot open OADB file %s", oadbFileName.Data()));

    AliInfo("Using Standard OADB");
    AliOADBContainer *cont = (AliOADBContainer*)fOADB->Get("vzeroEP");
    if (!cont) AliFatal("Cannot fetch OADB container for VZERO EP selection");
    fVZEROEPContainer = new AliOADBContainer(*cont);
    fOADB->Close();
    delete fOADB;
  }
}

//________________________________________________________________________
void AliVZEROEPSelectionTask::UserExec(Option_t */*option*/)
{ 
  // Execute analysis for current event:
  // Fill the flatenning parameters in
  // AliEventplane object

  AliVEvent* event = InputEvent();
  if (!(fRunNumber == event->GetRunNumber())) {
    fRunNumber = event->GetRunNumber();
    SetParamsFromOADB();
  }

  AliCentrality *centrality = event->GetCentrality();
  Float_t percentile = (fUseVZEROCentrality) ? centrality->GetCentralityPercentile("V0M") : centrality->GetCentralityPercentile("CL1");
  AliEventplane *esdEP = event->GetEventplane();
  if(esdEP) SetEventplaneParams(esdEP,percentile);
}

//________________________________________________________________________
void AliVZEROEPSelectionTask::Terminate(Option_t */*option*/)
{
  // Terminate analysis
  // Nothing here
}

//________________________________________________________________________
void AliVZEROEPSelectionTask::SetEventplaneParams(AliEventplane *esdEP,Float_t percentile)
{
  // Read the OADB histograms and
  // prepare parameters used in order to
  // flatten the event-plane
  if(!esdEP)
    AliFatal("No event plane received");

  if (percentile < 0 || percentile > 100) {
    for(Int_t ring = 0; ring < 11; ++ring) esdEP->SetVZEROEPParams(ring,0.,0.,1.,1.,0.,0.,0.);
    return;
  }

  for(Int_t ring = 0; ring < 11; ++ring) {
    Int_t ibin = fX2In[ring]->FindBin(percentile);
    if (fX2In[ring]->GetBinEntries(ibin) == 0) {
      esdEP->SetVZEROEPParams(ring,0.,0.,1.,1.,0.,0.,0.);
      continue;
    }
    Double_t meanX2 = fX2In[ring]->GetBinContent(ibin);
    Double_t meanY2 = fY2In[ring]->GetBinContent(ibin);
    Double_t sigmaX2 = fX2In[ring]->GetBinError(ibin);
    Double_t sigmaY2 = fY2In[ring]->GetBinError(ibin);
    Double_t rho = (fX2Y2In[ring]->GetBinContent(ibin)-meanX2*meanY2)/sigmaX2/sigmaY2;
  
    Double_t b = rho*sigmaX2*sigmaY2*
      TMath::Sqrt(2.*(sigmaX2*sigmaX2+sigmaY2*sigmaY2-2.*sigmaX2*sigmaY2*TMath::Sqrt(1.-rho*rho))/
		  ((sigmaX2*sigmaX2-sigmaY2*sigmaY2)*(sigmaX2*sigmaX2-sigmaY2*sigmaY2)+
		   4.*sigmaX2*sigmaX2*sigmaY2*sigmaY2*rho*rho));
    Double_t aPlus = TMath::Sqrt(2.*sigmaX2*sigmaX2-b*b);
    Double_t aMinus= TMath::Sqrt(2.*sigmaY2*sigmaY2-b*b);

    Double_t lambdaPlus = b/aPlus;
    Double_t lambdaMinus = b/aMinus;

    Double_t cos8Psi = fCos8PsiIn[ring]->GetBinContent(ibin);
    esdEP->SetVZEROEPParams(ring,meanX2,meanY2,aPlus,aMinus,lambdaPlus,lambdaMinus,cos8Psi);
  }
}

//__________________________________________________________________________
void AliVZEROEPSelectionTask::SetParamsFromOADB() 
{
  if(!fUserParams) {
    TList *list = (TList*)fVZEROEPContainer->GetObject(fRunNumber, "Default");
    if (!list) AliFatal(Form("Cannot find VZERO OADB list for run %d", fRunNumber));
    SetHistograms(list);
  }
  else
    AliInfo("Using custom VZERO event-plane params");
}

//__________________________________________________________________________
void AliVZEROEPSelectionTask::SetUserParams(const char* inFileName, const char* listName)
{
  
  fUserParams = kTRUE;
  
  TFile f(inFileName);
  TList* list = (TList*)f.Get(listName);
  if (!list) AliFatal(Form("Cannot find list %s in file %s", listName, inFileName));
  SetHistograms(list);
  f.Close();
} 

//__________________________________________________________________________
void AliVZEROEPSelectionTask::SetHistograms(TList *list)
{
  // Set the flatenning parameters
  // histograms from a given list

  for(Int_t i = 0; i < 11; ++i) {
    if (fX2In[i]) delete fX2In[i];
    fX2In[i] = (TProfile*)list->FindObject(Form("fX2_%d",i))->Clone(Form("fX2In_%d",i));
    fX2In[i]->SetDirectory(0);
    if (fY2In[i]) delete fY2In[i];
    fY2In[i] = (TProfile*)list->FindObject(Form("fY2_%d",i))->Clone(Form("fY2In_%d",i));
    fY2In[i]->SetDirectory(0);
    if (fX2Y2In[i]) delete fX2Y2In[i];
    fX2Y2In[i] = (TProfile*)list->FindObject(Form("fX2Y2_%d",i))->Clone(Form("fX2Y2In_%d",i));
    fX2Y2In[i]->SetDirectory(0);
    if (fCos8PsiIn[i]) delete fCos8PsiIn[i];
    fCos8PsiIn[i] = (TProfile*)list->FindObject(Form("fCos8Psi_%d",i))->Clone(Form("fCos8PsiIn_%d",i));
    fCos8PsiIn[i]->SetDirectory(0);
  }
}
 AliVZEROEPSelectionTask.cxx:1
 AliVZEROEPSelectionTask.cxx:2
 AliVZEROEPSelectionTask.cxx:3
 AliVZEROEPSelectionTask.cxx:4
 AliVZEROEPSelectionTask.cxx:5
 AliVZEROEPSelectionTask.cxx:6
 AliVZEROEPSelectionTask.cxx:7
 AliVZEROEPSelectionTask.cxx:8
 AliVZEROEPSelectionTask.cxx:9
 AliVZEROEPSelectionTask.cxx:10
 AliVZEROEPSelectionTask.cxx:11
 AliVZEROEPSelectionTask.cxx:12
 AliVZEROEPSelectionTask.cxx:13
 AliVZEROEPSelectionTask.cxx:14
 AliVZEROEPSelectionTask.cxx:15
 AliVZEROEPSelectionTask.cxx:16
 AliVZEROEPSelectionTask.cxx:17
 AliVZEROEPSelectionTask.cxx:18
 AliVZEROEPSelectionTask.cxx:19
 AliVZEROEPSelectionTask.cxx:20
 AliVZEROEPSelectionTask.cxx:21
 AliVZEROEPSelectionTask.cxx:22
 AliVZEROEPSelectionTask.cxx:23
 AliVZEROEPSelectionTask.cxx:24
 AliVZEROEPSelectionTask.cxx:25
 AliVZEROEPSelectionTask.cxx:26
 AliVZEROEPSelectionTask.cxx:27
 AliVZEROEPSelectionTask.cxx:28
 AliVZEROEPSelectionTask.cxx:29
 AliVZEROEPSelectionTask.cxx:30
 AliVZEROEPSelectionTask.cxx:31
 AliVZEROEPSelectionTask.cxx:32
 AliVZEROEPSelectionTask.cxx:33
 AliVZEROEPSelectionTask.cxx:34
 AliVZEROEPSelectionTask.cxx:35
 AliVZEROEPSelectionTask.cxx:36
 AliVZEROEPSelectionTask.cxx:37
 AliVZEROEPSelectionTask.cxx:38
 AliVZEROEPSelectionTask.cxx:39
 AliVZEROEPSelectionTask.cxx:40
 AliVZEROEPSelectionTask.cxx:41
 AliVZEROEPSelectionTask.cxx:42
 AliVZEROEPSelectionTask.cxx:43
 AliVZEROEPSelectionTask.cxx:44
 AliVZEROEPSelectionTask.cxx:45
 AliVZEROEPSelectionTask.cxx:46
 AliVZEROEPSelectionTask.cxx:47
 AliVZEROEPSelectionTask.cxx:48
 AliVZEROEPSelectionTask.cxx:49
 AliVZEROEPSelectionTask.cxx:50
 AliVZEROEPSelectionTask.cxx:51
 AliVZEROEPSelectionTask.cxx:52
 AliVZEROEPSelectionTask.cxx:53
 AliVZEROEPSelectionTask.cxx:54
 AliVZEROEPSelectionTask.cxx:55
 AliVZEROEPSelectionTask.cxx:56
 AliVZEROEPSelectionTask.cxx:57
 AliVZEROEPSelectionTask.cxx:58
 AliVZEROEPSelectionTask.cxx:59
 AliVZEROEPSelectionTask.cxx:60
 AliVZEROEPSelectionTask.cxx:61
 AliVZEROEPSelectionTask.cxx:62
 AliVZEROEPSelectionTask.cxx:63
 AliVZEROEPSelectionTask.cxx:64
 AliVZEROEPSelectionTask.cxx:65
 AliVZEROEPSelectionTask.cxx:66
 AliVZEROEPSelectionTask.cxx:67
 AliVZEROEPSelectionTask.cxx:68
 AliVZEROEPSelectionTask.cxx:69
 AliVZEROEPSelectionTask.cxx:70
 AliVZEROEPSelectionTask.cxx:71
 AliVZEROEPSelectionTask.cxx:72
 AliVZEROEPSelectionTask.cxx:73
 AliVZEROEPSelectionTask.cxx:74
 AliVZEROEPSelectionTask.cxx:75
 AliVZEROEPSelectionTask.cxx:76
 AliVZEROEPSelectionTask.cxx:77
 AliVZEROEPSelectionTask.cxx:78
 AliVZEROEPSelectionTask.cxx:79
 AliVZEROEPSelectionTask.cxx:80
 AliVZEROEPSelectionTask.cxx:81
 AliVZEROEPSelectionTask.cxx:82
 AliVZEROEPSelectionTask.cxx:83
 AliVZEROEPSelectionTask.cxx:84
 AliVZEROEPSelectionTask.cxx:85
 AliVZEROEPSelectionTask.cxx:86
 AliVZEROEPSelectionTask.cxx:87
 AliVZEROEPSelectionTask.cxx:88
 AliVZEROEPSelectionTask.cxx:89
 AliVZEROEPSelectionTask.cxx:90
 AliVZEROEPSelectionTask.cxx:91
 AliVZEROEPSelectionTask.cxx:92
 AliVZEROEPSelectionTask.cxx:93
 AliVZEROEPSelectionTask.cxx:94
 AliVZEROEPSelectionTask.cxx:95
 AliVZEROEPSelectionTask.cxx:96
 AliVZEROEPSelectionTask.cxx:97
 AliVZEROEPSelectionTask.cxx:98
 AliVZEROEPSelectionTask.cxx:99
 AliVZEROEPSelectionTask.cxx:100
 AliVZEROEPSelectionTask.cxx:101
 AliVZEROEPSelectionTask.cxx:102
 AliVZEROEPSelectionTask.cxx:103
 AliVZEROEPSelectionTask.cxx:104
 AliVZEROEPSelectionTask.cxx:105
 AliVZEROEPSelectionTask.cxx:106
 AliVZEROEPSelectionTask.cxx:107
 AliVZEROEPSelectionTask.cxx:108
 AliVZEROEPSelectionTask.cxx:109
 AliVZEROEPSelectionTask.cxx:110
 AliVZEROEPSelectionTask.cxx:111
 AliVZEROEPSelectionTask.cxx:112
 AliVZEROEPSelectionTask.cxx:113
 AliVZEROEPSelectionTask.cxx:114
 AliVZEROEPSelectionTask.cxx:115
 AliVZEROEPSelectionTask.cxx:116
 AliVZEROEPSelectionTask.cxx:117
 AliVZEROEPSelectionTask.cxx:118
 AliVZEROEPSelectionTask.cxx:119
 AliVZEROEPSelectionTask.cxx:120
 AliVZEROEPSelectionTask.cxx:121
 AliVZEROEPSelectionTask.cxx:122
 AliVZEROEPSelectionTask.cxx:123
 AliVZEROEPSelectionTask.cxx:124
 AliVZEROEPSelectionTask.cxx:125
 AliVZEROEPSelectionTask.cxx:126
 AliVZEROEPSelectionTask.cxx:127
 AliVZEROEPSelectionTask.cxx:128
 AliVZEROEPSelectionTask.cxx:129
 AliVZEROEPSelectionTask.cxx:130
 AliVZEROEPSelectionTask.cxx:131
 AliVZEROEPSelectionTask.cxx:132
 AliVZEROEPSelectionTask.cxx:133
 AliVZEROEPSelectionTask.cxx:134
 AliVZEROEPSelectionTask.cxx:135
 AliVZEROEPSelectionTask.cxx:136
 AliVZEROEPSelectionTask.cxx:137
 AliVZEROEPSelectionTask.cxx:138
 AliVZEROEPSelectionTask.cxx:139
 AliVZEROEPSelectionTask.cxx:140
 AliVZEROEPSelectionTask.cxx:141
 AliVZEROEPSelectionTask.cxx:142
 AliVZEROEPSelectionTask.cxx:143
 AliVZEROEPSelectionTask.cxx:144
 AliVZEROEPSelectionTask.cxx:145
 AliVZEROEPSelectionTask.cxx:146
 AliVZEROEPSelectionTask.cxx:147
 AliVZEROEPSelectionTask.cxx:148
 AliVZEROEPSelectionTask.cxx:149
 AliVZEROEPSelectionTask.cxx:150
 AliVZEROEPSelectionTask.cxx:151
 AliVZEROEPSelectionTask.cxx:152
 AliVZEROEPSelectionTask.cxx:153
 AliVZEROEPSelectionTask.cxx:154
 AliVZEROEPSelectionTask.cxx:155
 AliVZEROEPSelectionTask.cxx:156
 AliVZEROEPSelectionTask.cxx:157
 AliVZEROEPSelectionTask.cxx:158
 AliVZEROEPSelectionTask.cxx:159
 AliVZEROEPSelectionTask.cxx:160
 AliVZEROEPSelectionTask.cxx:161
 AliVZEROEPSelectionTask.cxx:162
 AliVZEROEPSelectionTask.cxx:163
 AliVZEROEPSelectionTask.cxx:164
 AliVZEROEPSelectionTask.cxx:165
 AliVZEROEPSelectionTask.cxx:166
 AliVZEROEPSelectionTask.cxx:167
 AliVZEROEPSelectionTask.cxx:168
 AliVZEROEPSelectionTask.cxx:169
 AliVZEROEPSelectionTask.cxx:170
 AliVZEROEPSelectionTask.cxx:171
 AliVZEROEPSelectionTask.cxx:172
 AliVZEROEPSelectionTask.cxx:173
 AliVZEROEPSelectionTask.cxx:174
 AliVZEROEPSelectionTask.cxx:175
 AliVZEROEPSelectionTask.cxx:176
 AliVZEROEPSelectionTask.cxx:177
 AliVZEROEPSelectionTask.cxx:178
 AliVZEROEPSelectionTask.cxx:179
 AliVZEROEPSelectionTask.cxx:180
 AliVZEROEPSelectionTask.cxx:181
 AliVZEROEPSelectionTask.cxx:182
 AliVZEROEPSelectionTask.cxx:183
 AliVZEROEPSelectionTask.cxx:184
 AliVZEROEPSelectionTask.cxx:185
 AliVZEROEPSelectionTask.cxx:186
 AliVZEROEPSelectionTask.cxx:187
 AliVZEROEPSelectionTask.cxx:188
 AliVZEROEPSelectionTask.cxx:189
 AliVZEROEPSelectionTask.cxx:190
 AliVZEROEPSelectionTask.cxx:191
 AliVZEROEPSelectionTask.cxx:192
 AliVZEROEPSelectionTask.cxx:193
 AliVZEROEPSelectionTask.cxx:194
 AliVZEROEPSelectionTask.cxx:195
 AliVZEROEPSelectionTask.cxx:196
 AliVZEROEPSelectionTask.cxx:197
 AliVZEROEPSelectionTask.cxx:198
 AliVZEROEPSelectionTask.cxx:199
 AliVZEROEPSelectionTask.cxx:200
 AliVZEROEPSelectionTask.cxx:201
 AliVZEROEPSelectionTask.cxx:202
 AliVZEROEPSelectionTask.cxx:203
 AliVZEROEPSelectionTask.cxx:204
 AliVZEROEPSelectionTask.cxx:205
 AliVZEROEPSelectionTask.cxx:206
 AliVZEROEPSelectionTask.cxx:207
 AliVZEROEPSelectionTask.cxx:208
 AliVZEROEPSelectionTask.cxx:209
 AliVZEROEPSelectionTask.cxx:210
 AliVZEROEPSelectionTask.cxx:211
 AliVZEROEPSelectionTask.cxx:212
 AliVZEROEPSelectionTask.cxx:213
 AliVZEROEPSelectionTask.cxx:214
 AliVZEROEPSelectionTask.cxx:215
 AliVZEROEPSelectionTask.cxx:216
 AliVZEROEPSelectionTask.cxx:217
 AliVZEROEPSelectionTask.cxx:218
 AliVZEROEPSelectionTask.cxx:219
 AliVZEROEPSelectionTask.cxx:220
 AliVZEROEPSelectionTask.cxx:221
 AliVZEROEPSelectionTask.cxx:222
 AliVZEROEPSelectionTask.cxx:223
 AliVZEROEPSelectionTask.cxx:224
 AliVZEROEPSelectionTask.cxx:225