ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, 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.                  *
 **************************************************************************/
// Container class for bad channels & bad runs identification
//
// By default, pileup events are not processed, use SetAvoidPileup()
// to change this.
//
// Clusters containing a bad cell can be rejected, use SetBadCells().
//
// The output can be directly saved into a file (see the class second
// constructor). Saving through AliAnalysisManager is always happen with
// TObject::kSingleKey option. In such case an output from different runs
// cannot be merged later, because here we have histograms which are
// run-dependent, i.e. not the same between every analysis instance.
//
// If you forget to initialize EMCAL/PHOS geometry, the class will do it
// for you.
//
// See AddTaskCaloCellsQA.C for usage example.
//
//----
//  Author: Olga Driga (SUBATECH)

// --- ROOT system ---
#include <TFile.h>
#include <TObjArray.h>

// --- AliRoot header files ---
#include <AliAnalysisTaskCaloCellsQA.h>
#include "AliAnalysisManager.h"
#include <AliVEvent.h>
#include <AliVCaloCells.h>
#include <AliVCluster.h>
#include <AliVVertex.h>
#include <AliEMCALGeometry.h>
#include <AliPHOSGeometry.h>
#include <AliLog.h>

ClassImp(AliAnalysisTaskCaloCellsQA)

//________________________________________________________________
AliAnalysisTaskCaloCellsQA::AliAnalysisTaskCaloCellsQA() : AliAnalysisTaskSE(),
  fkAvoidPileup(kTRUE),
  fCellsQA(0),
  fOutfile(""),
  fNBad(0),
  fBadCells(0)
{
  // Constructor for root I/O, do not use it
}

//________________________________________________________________
AliAnalysisTaskCaloCellsQA::AliAnalysisTaskCaloCellsQA(const char *name, Int_t nmods, Int_t det, char *outfile) :
  AliAnalysisTaskSE(name),
  fkAvoidPileup(kTRUE),
  fCellsQA(0),
  fOutfile(""),
  fNBad(0),
  fBadCells(0)
{
  // Main constructor.
  //
  // nmods -- number of supermodules + 1;
  // det -- detector;
  // outfile -- file name to write to; if NULL, write into output container;
  //   allows to avoid limitation of AliAnalysisManager, which always
  //   writes with TObject::kSingleKey option.


  if (det == kEMCAL)
    fCellsQA = new AliCaloCellsQA(nmods, AliCaloCellsQA::kEMCAL);
  else if (det == kPHOS)
    fCellsQA = new AliCaloCellsQA(nmods, AliCaloCellsQA::kPHOS);
  else
    AliFatal("Wrong detector provided");

  if (outfile) fOutfile = outfile;
  else
    DefineOutput(1, TObjArray::Class());
}

//________________________________________________________________
AliAnalysisTaskCaloCellsQA::~AliAnalysisTaskCaloCellsQA()
{
  if (!AliAnalysisManager::GetAnalysisManager()->IsProofMode()) delete fCellsQA;
  if (fBadCells) delete [] fBadCells;
}

//________________________________________________________________
void AliAnalysisTaskCaloCellsQA::UserCreateOutputObjects()
{
  // Per run histograms cannot be initialized here

  fCellsQA->InitSummaryHistograms();

  if (fOutfile.Length() == 0)
    PostData(1, fCellsQA->GetListOfHistos());
}

//________________________________________________________________
void AliAnalysisTaskCaloCellsQA::UserExec(Option_t *)
{
  // Does the job for one event

  // event
  AliVEvent *event = InputEvent();
  if (!event) {
    AliWarning("Could not get event");
    return;
  }

  fCellsQA->InitTransientFindCurrentRun(event->GetRunNumber());

  // check geometry
  if (fCellsQA->GetDetector() == AliCaloCellsQA::kEMCAL) {
    if (!AliEMCALGeometry::GetInstance()) {
      AliInfo("EMCAL geometry not initialized, initializing it for you");
      AliEMCALGeometry::GetInstance("EMCAL_COMPLETEV1");
    }
  } else {
    if (!AliPHOSGeometry::GetInstance()) {
      AliInfo("PHOS geometry not initialized, initializing it for you");
      AliPHOSGeometry::GetInstance("IHEP");
    }
  }

  // pileup;  FIXME: why AliVEvent does not allow a version without arguments?
  if (fkAvoidPileup && event->IsPileupFromSPD(3,0.8,3.,2.,5.))
    return;

  // cells
  AliVCaloCells *cells;
  if (fCellsQA->GetDetector() == AliCaloCellsQA::kEMCAL)
    cells = event->GetEMCALCells();
  else
    cells = event->GetPHOSCells();

  if (!cells) {
    AliWarning("Could not get cells");
    return;
  }

  // primary vertex
  AliVVertex *vertex = (AliVVertex*) event->GetPrimaryVertex();
  if (!vertex) {
    AliWarning("Could not get primary vertex");
    return;
  }

  // collect clusters
  TObjArray clusArray;
  for (Int_t i = 0; i < event->GetNumberOfCaloClusters(); i++) {
    AliVCluster *clus = event->GetCaloCluster(i);
    if (!clus) {
      AliWarning("Could not get cluster");
      return;
    }

    // basic filtering
    if (fCellsQA->GetDetector() == AliCaloCellsQA::kEMCAL && !clus->IsEMCAL()) continue;
    if (fCellsQA->GetDetector() == AliCaloCellsQA::kPHOS && !clus->IsPHOS()) continue;
    if (IsClusterBad(clus)) continue;

    clusArray.Add(clus);
  }

  Double_t vertexXYZ[3];
  vertex->GetXYZ(vertexXYZ);
  fCellsQA->Fill(event->GetRunNumber(), &clusArray, cells, vertexXYZ);

  if (fOutfile.Length() == 0)
    PostData(1, fCellsQA->GetListOfHistos());
}

//________________________________________________________________
void AliAnalysisTaskCaloCellsQA::Terminate(Option_t*)
{
  // Handle direct saving of the histograms into a file

  if (fOutfile.Length() > 0) {
    TFile f(fOutfile.Data(), "RECREATE");
    fCellsQA->GetListOfHistos()->Write();
  }
}

//____________________________________________________________
void AliAnalysisTaskCaloCellsQA::SetBadCells(Int_t badcells[], Int_t nbad)
{
  // Set absId numbers for bad cells;
  // clusters which contain a bad cell will be rejected.

  if (fBadCells) delete [] fBadCells;

  // switch off bad cells, if asked
  if (nbad <= 0) {
    fNBad = 0;
    return;
  }

  fNBad = nbad;
  fBadCells = new Int_t[nbad];

  for (Int_t i = 0; i < nbad; i++)
    fBadCells[i] = badcells[i];
}

//________________________________________________________________
Bool_t AliAnalysisTaskCaloCellsQA::IsClusterBad(AliVCluster *clus)
{
  // Returns true if cluster contains a bad cell

  for (Int_t b = 0; b < fNBad; b++)
    for (Int_t c = 0; c < clus->GetNCells(); c++)
      if (clus->GetCellAbsId(c) == fBadCells[b])
        return kTRUE;

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