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.                  *
 **************************************************************************/

/* $Id$ */
// Author: Andrei Gheata, 20/12/2010

//==============================================================================
// AliAnalysisStatistics - basic class for storing statistics for the processed
//   events. The object is mergeable and can be used for general purpose. In case
//   a AliAnalysisTaskStat is used, this will set the global statistics object
//   to the analysis manager and will update it for the accepted events.
//==============================================================================

#include "AliAnalysisStatistics.h"

#include "Riostream.h"
#include "TObjArray.h"
#include "TStopwatch.h"

#include "AliVEvent.h"

using std::cout;
using std::endl;
ClassImp(AliAnalysisStatistics)

//______________________________________________________________________________
AliAnalysisStatistics::AliAnalysisStatistics(const AliAnalysisStatistics &other)
      :TNamed(other),
       fNinput(other.fNinput),
       fNprocessed(other.fNprocessed),
       fNfailed(other.fNfailed),
       fNaccepted(other.fNaccepted),
       fOfflineMask(other.fOfflineMask),
       fMaxTasks(other.fMaxTasks),
       fNtasks(other.fNtasks),
       fCurrentTask(other.fCurrentTask),
       fTaskTimeReal(0),
       fTaskTimeCPU(0),
       fTaskNames(0),
       fTaskTimer(0)
{
// Copy constructor.
  if (fNtasks) {
    fTaskTimer = new TStopwatch();
    fTaskTimeReal = new Double_t[fMaxTasks];
    memset(fTaskTimeReal, 0, fMaxTasks*sizeof(Double_t));
    memcpy(fTaskTimeReal, other.fTaskTimeReal, fNtasks*sizeof(Double_t));
    fTaskTimeCPU = new Double_t[fMaxTasks];
    memset(fTaskTimeCPU, 0, fMaxTasks*sizeof(Double_t));
    memcpy(fTaskTimeCPU, other.fTaskTimeCPU, fNtasks*sizeof(Double_t));
    fTaskNames = new TObjArray(fMaxTasks);
    for (Int_t i=0; i<fNtasks; i++) fTaskNames->AddAt(new TObjString(other.GetTaskName(i)), i);
  }
}

//______________________________________________________________________________
AliAnalysisStatistics &AliAnalysisStatistics::operator=(const AliAnalysisStatistics &other)
{
// Assignment.
  if (&other == this) return *this;
  fNinput       = other.fNinput;
  fNprocessed   = other.fNprocessed;
  fNfailed      = other.fNfailed;
  fNaccepted    = other.fNaccepted;
  fOfflineMask  = other.fOfflineMask;
  fMaxTasks     = other.fMaxTasks;
  fNtasks       = other.fNtasks;
  fCurrentTask  = other.fCurrentTask;
  fTaskTimeReal = 0;
  fTaskTimeCPU  = 0;
  fTaskNames    = 0;
  fTaskTimer   = 0;
  if (fNtasks) {
    fTaskTimer = new TStopwatch();
    fTaskTimeReal = new Double_t[fMaxTasks];
    memset(fTaskTimeReal, 0, fMaxTasks*sizeof(Double_t));
    memcpy(fTaskTimeReal, other.fTaskTimeReal, fNtasks*sizeof(Double_t));
    fTaskTimeCPU = new Double_t[fMaxTasks];
    memset(fTaskTimeCPU, 0, fMaxTasks*sizeof(Double_t));
    memcpy(fTaskTimeCPU, other.fTaskTimeCPU, fNtasks*sizeof(Double_t));
    fTaskNames = new TObjArray(fMaxTasks);
    for (Int_t i=0; i<fNtasks; i++) fTaskNames->AddAt(new TObjString(other.GetTaskName(i)), i);
  }  
  return *this;
}

//______________________________________________________________________________
void AliAnalysisStatistics::StartTimer(Int_t itask, const char *name, const char *classname)
{
// Measure the CPU time done by this task in the interval
  if (!fTaskTimer) {
    // Create the arrays with timings with the initial size
    if (!fMaxTasks) fMaxTasks = 100;
    fTaskTimer = new TStopwatch();
    fTaskTimeReal = new Double_t[fMaxTasks];
    memset(fTaskTimeReal, 0, fMaxTasks*sizeof(Double_t));
    fTaskTimeCPU = new Double_t[fMaxTasks];
    memset(fTaskTimeCPU, 0, fMaxTasks*sizeof(Double_t));
    fTaskNames = new TObjArray(fMaxTasks);
  } else {
  // Stop the timer if it was timing some task
    StopTimer();
  }  
  
  if (fNtasks<itask+1) {
  // Double the array size
    if (itask>=fMaxTasks) {
      Int_t newsize = TMath::Max(2*fMaxTasks, itask+1);
      Double_t *taskTimeReal = new Double_t[newsize];
      memset(taskTimeReal, 0, newsize*sizeof(Double_t));
      memcpy(taskTimeReal, fTaskTimeReal, fMaxTasks*sizeof(Double_t));
      delete [] fTaskTimeReal;
      fTaskTimeReal = taskTimeReal;
      Double_t *taskTimeCPU = new Double_t[newsize];
      memset(taskTimeCPU, 0, newsize*sizeof(Double_t));
      memcpy(taskTimeCPU, fTaskTimeCPU, fMaxTasks*sizeof(Double_t));
      delete [] fTaskTimeCPU;
      fTaskTimeCPU = taskTimeCPU;
      fMaxTasks = newsize;
    }  
    fNtasks = itask+1;
  }
  // Start the timer for the new task
  fCurrentTask = itask;
  if (!fTaskNames->At(fCurrentTask)) {
    TString sname = name;
    if (strlen(classname)) sname += Form("(%s)", classname);
    fTaskNames->AddAt(new TObjString(sname), fCurrentTask);
  }  
  fTaskTimer->Start(kTRUE);  
}   

//______________________________________________________________________________
void AliAnalysisStatistics::StopTimer()
{
// Stop the current task timing.
  if (fCurrentTask>=0) {
    fTaskTimer->Stop();
    fTaskTimeReal[fCurrentTask] += fTaskTimer->RealTime();
    fTaskTimeCPU[fCurrentTask]  += fTaskTimer->CpuTime();
    fCurrentTask = -1;
  }
}  

//______________________________________________________________________________
Long64_t AliAnalysisStatistics::Merge(TCollection* list)
{
// Merge statistics objets from list on top of this.
  TIter next(list);
  AliAnalysisStatistics *current;
  Long64_t count = 1;
  while ((current = (AliAnalysisStatistics*)next())) {
    fNinput     += current->GetNinput();
    fNprocessed += current->GetNprocessed();
    fNfailed    += current->GetNfailed();
    fNaccepted  += current->GetNaccepted();
    for (Int_t i=0; i<fNtasks; i++) {
      fTaskTimeReal[i] += current->GetRealTime(i);
      fTaskTimeCPU[i] += current->GetCPUTime(i);
    }   
  }
  return count;
}

//______________________________________________________________________________
void AliAnalysisStatistics::Print(const Option_t *) const
{
// Print info about the processed statistics.
  cout << "### Input events                 : " << fNinput << endl;
  cout << "### Processed events w/o errors  : " << fNprocessed << endl;
  cout << "### Failed events                : " << fNfailed << endl;
  cout << "### Accepted events for mask: " << GetMaskAsString(fOfflineMask) << ": " << fNaccepted << endl;
  if (fNtasks) {
    cout << "Timing per task:" <<endl;
    TString s;
    for (Int_t i=0; i<fNtasks; i++) {
      s = Form("%03d:  real: %9.2f   cpu: %9.2f   => %s", i,fTaskTimeReal[i], fTaskTimeCPU[i], GetTaskName(i));
      cout << s << endl;
    }
  }  
}

//______________________________________________________________________________
const char *AliAnalysisStatistics::GetMaskAsString(UInt_t mask)
{
// Returns a string corresponding to the offline mask.
   static TString smask;
   smask = "ALL EVT.";
   if (!mask) return smask.Data();
   smask.Clear();
   if (mask & AliVEvent::kMB)   smask = "MB";
   if (mask & AliVEvent::kMUON) {
      if (!smask.IsNull()) smask += " | ";
      smask += "MUON";
   }
   if (mask & AliVEvent::kHighMult) {
      if (!smask.IsNull()) smask += " | ";
      smask += "HighMult";
   }
   if (mask & AliVEvent::kUserDefined) {
      if (!smask.IsNull()) smask += " | ";
      smask += "UserDefined";
   }
   if (mask ==  AliVEvent::kAny) smask = "ANY";
   return smask.Data();
}

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