ROOT logo
/* $Id: AliTriggerTask.cxx 35782 2009-10-22 11:54:31Z jgrosseo $ */

#include "AliTriggerTask.h"

#include <TCanvas.h>
#include <TFile.h>
#include <TChain.h>
#include <TH1F.h>
#include <TH2F.h>
#include <TH3F.h>

#include <AliLog.h>
#include <AliESDEvent.h>
#include <AliHeader.h>
#include <AliAnalysisManager.h>
#include <AliESDInputHandler.h>
#include <AliESDHeader.h>
#include <AliPhysicsSelection.h>

ClassImp(AliTriggerTask)

AliTriggerTask::AliTriggerTask(const char* opt) :
  AliAnalysisTask("AliTriggerTask", ""),
  fESD(0),
  fOutput(0),
  fOption(opt),
  fStartTime(0),
  fEndTime(0),
  fUseOrbits(kFALSE),
  fFirstOrbit(0),
  fLastOrbit(0),
  fNTriggers(0),
  fTriggerList(0),
  fNTriggerClasses(0),
  fTriggerClassesList(0),
  fStats(0),
  fPhysicsSelection(0)
{
  //
  // Constructor. Initialization of pointers
  //

  // Define input and output slots here
  DefineInput(0, TChain::Class());
  DefineOutput(0, TList::Class());
  
  fNTriggers = 14;
  
  static AliTriggerAnalysis::Trigger triggerList[] = { AliTriggerAnalysis::kAcceptAll, AliTriggerAnalysis::kFPANY, AliTriggerAnalysis::kMB1, AliTriggerAnalysis::kMB2, AliTriggerAnalysis::kMB3, AliTriggerAnalysis::kSPDGFO, AliTriggerAnalysis::kSPDGFOBits, AliTriggerAnalysis::kV0A, AliTriggerAnalysis::kV0C, AliTriggerAnalysis::kZDC, AliTriggerAnalysis::kZDCA, AliTriggerAnalysis::kZDCC, AliTriggerAnalysis::kFMDA, AliTriggerAnalysis::kFMDC };
  fTriggerList = triggerList;
  
  fNTriggerClasses = 4;
  static const char* triggerClassesList[] = { "CINT1B-ABCE-NOPF-ALL", "CINT1C-ABCE-NOPF-ALL", "CINT1A-ABCE-NOPF-ALL", "CINT1-E-NOPF-ALL" };
  fTriggerClassesList = triggerClassesList;
  
  fStats = new TH1**[fNTriggerClasses];
  for (Int_t i=0; i<fNTriggerClasses; i++)
    fStats[i] = new TH1*[fNTriggers];
}

AliTriggerTask::~AliTriggerTask()
{
  //
  // Destructor
  //

  // histograms are in the output list and deleted when the output
  // list is deleted by the TSelector dtor

  if (fOutput) {
    delete fOutput;
    fOutput = 0;
  }
}

//________________________________________________________________________
void AliTriggerTask::ConnectInputData(Option_t *)
{
  // Connect ESD
  // Called once

  Printf("AliTriggerTask::ConnectInputData called");

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

  if (!esdH) {
    Printf("ERROR: Could not get ESDInputHandler");
  } else {
    fESD = esdH->GetEvent();
    
    TString branches("AliESDHeader Vertex AliMultiplicity ALIESDVZERO ALIESDZDC FMD");

    // Enable only the needed branches
    esdH->SetActiveBranches(branches);
  }
}

void AliTriggerTask::CreateOutputObjects()
{
  // create result objects and add to output list

  Printf("AliTriggerTask::CreateOutputObjects");

  fOutput = new TList;
  fOutput->SetOwner();
  
  if (fStartTime == fEndTime)
    AliWarning("Start and endtime not set. Automatic binning will be used. This does not work in parallel systems");

  Int_t nBins = 1000;
  if (fEndTime - fStartTime > 0)
    nBins = fEndTime - fStartTime + 1;
  if (nBins > 10000)
    nBins = 10000;
  
  Int_t start = 0;
  Int_t end = fEndTime - fStartTime;
  
  if (fUseOrbits)
  {
    start = fStartTime;
    end = fEndTime;
  }
  
  for (Int_t j=0; j<fNTriggerClasses; j++)
  {
    for (Int_t i=0; i<fNTriggers; i++)
    {
      fStats[j][i] = new TH1F(Form("fStats_%d_%d", j, i), Form("%s %s;%s;counts", fTriggerClassesList[j], AliTriggerAnalysis::GetTriggerName(fTriggerList[i]), (fUseOrbits) ? "orbit number" : "time"), nBins, start - 0.5, end + 0.5);
      fOutput->Add(fStats[j][i]);
    }
  }
    
  fFirstOrbit = new TParameter<Long_t> ("fFirstOrbit", 0);
  fLastOrbit = new TParameter<Long_t> ("fLastOrbit", 0);
  fOutput->Add(fFirstOrbit);
  fOutput->Add(fLastOrbit);
  
  fOutput->Add(fPhysicsSelection);
  
  AliLog::SetClassDebugLevel("AliPhysicsSelection", AliLog::kDebug);
}

void AliTriggerTask::Exec(Option_t*)
{
  // process the event

  // post the data already here
  PostData(0, fOutput);

  if (!fESD)
  {
    AliError("ESD branch not available");
    return;
  }
  
  // fill histograms
  fPhysicsSelection->IsCollisionCandidate(fESD);
  
  // check event type (should be PHYSICS = 7)
  AliESDHeader* esdHeader = fESD->GetHeader();
  if (!esdHeader)
  {
    Printf("ERROR: esdHeader could not be retrieved");
    return;
  }
  
  UInt_t eventType = esdHeader->GetEventType();
  if (eventType != 7)
  {
    Printf("Skipping event because it is of type %d", eventType);
    return;
  }
  
  // TODO select on hardware trigger for histograms...
  Int_t triggerClass = 0;
  while (triggerClass < fNTriggerClasses && !fESD->IsTriggerClassFired(fTriggerClassesList[triggerClass]))
    triggerClass++;
  if (triggerClass == fNTriggerClasses)
  {
    Printf("Unknown trigger class %s. Skipping event", fESD->GetFiredTriggerClasses().Data());
    return;
  }
  
  Long64_t timeStamp = 0;
  if (fUseOrbits)
  {
    timeStamp = fESD->GetBunchCrossNumber();
    timeStamp += (Long64_t) 3564 * (fESD->GetOrbitNumber() + fESD->GetPeriodNumber() * 16777215);
    timeStamp = (Long64_t) (25e-9 * timeStamp);
    timeStamp -= fStartTime;
  }
  else
    timeStamp = fESD->GetTimeStamp() - fStartTime;
    
  //Printf("%d", timeStamp);
  
  //Annalisa Time (s) = 1440*period + 88*10-6 * orbit + 25*10-9 *bc
  
  for (Int_t i = 0; i < fNTriggers; i++)
  {
    Bool_t triggered = fPhysicsSelection->GetTriggerAnalysis()->IsOfflineTriggerFired(fESD, fTriggerList[i]);
    if (triggered)
      fStats[triggerClass][i]->Fill(timeStamp);
    //Printf("%s: %d", AliTriggerAnalysis::GetTriggerName(fTriggerList[i]), triggered);
  }
  
  if (fFirstOrbit->GetVal() == 0)
    fFirstOrbit->SetVal(timeStamp);
  else
    fFirstOrbit->SetVal(TMath::Min(fFirstOrbit->GetVal(), (Long_t) timeStamp));
  
  fLastOrbit->SetVal(TMath::Max(fLastOrbit->GetVal(), (Long_t) timeStamp));
}

void AliTriggerTask::Terminate(Option_t *)
{
  // The Terminate() function is the last function to be called during
  // a query. It always runs on the client, it can be used to present
  // the results graphically or save the results to file.

  fOutput = dynamic_cast<TList*> (GetOutputData(0));
  if (!fOutput)
    Printf("ERROR: fOutput not available");
    
  //fOutput->Print();

  if (fOutput)
  {
    for (Int_t j=0; j<fNTriggerClasses; j++)
      for (Int_t i=0; i<fNTriggers; i++)
        fStats[j][i] = dynamic_cast<TH1*> (fOutput->FindObject(Form("fStats_%d_%d", j, i)));
    fPhysicsSelection = dynamic_cast<AliPhysicsSelection*> (fOutput->FindObject("AliPhysicsSelection"));
  }

  TFile* fout = new TFile("trigger.root", "RECREATE");

  for (Int_t j=0; j<fNTriggerClasses; j++)
    for (Int_t i=0; i<fNTriggers; i++)
      if (fStats[j][i])
        fStats[j][i]->Write();
        
  if (fPhysicsSelection)
  {
    fPhysicsSelection->SaveHistograms("physics_selection");
    fPhysicsSelection->Print();
  }
    
  if (fFirstOrbit)
    fFirstOrbit->Dump();
  if (fLastOrbit)
    fLastOrbit->Dump();
    
  fout->Write();
  fout->Close();
  
  Int_t nX = (Int_t) TMath::Sqrt(fNTriggers);
  Int_t nY = nX;
  
  while (nX * nY < fNTriggers)
  {
    if (nX == nY)
      nX++;
    else
      nY++;
  }
  
  TCanvas* c = new TCanvas("c", "c", 800, 800);
  c->Divide(nX, nY);
  
  Printf("+++++++++ TRIGGER STATS:");

  Int_t triggerClass = 0;

  Int_t base = 1;
  if (fStats[triggerClass][0])
    base = (Int_t) fStats[triggerClass][0]->Integral();

  Int_t length = fEndTime - fStartTime;
  
  for (Int_t i=0; i<fNTriggers; i++)
    if (fStats[triggerClass][i])
    {
      c->cd(i+1);
      fStats[triggerClass][i]->Draw();
      Printf("%s: %d triggers | %f %% of all triggered | Rate: %f Hz", AliTriggerAnalysis::GetTriggerName(fTriggerList[i]), (UInt_t) fStats[triggerClass][i]->Integral(), 100.0 * fStats[triggerClass][i]->Integral() / base, (length > 0) ? (fStats[triggerClass][i]->Integral() / length) : -1);
    }

  Printf("Writting result to trigger.root");
}
 AliTriggerTask.cxx:1
 AliTriggerTask.cxx:2
 AliTriggerTask.cxx:3
 AliTriggerTask.cxx:4
 AliTriggerTask.cxx:5
 AliTriggerTask.cxx:6
 AliTriggerTask.cxx:7
 AliTriggerTask.cxx:8
 AliTriggerTask.cxx:9
 AliTriggerTask.cxx:10
 AliTriggerTask.cxx:11
 AliTriggerTask.cxx:12
 AliTriggerTask.cxx:13
 AliTriggerTask.cxx:14
 AliTriggerTask.cxx:15
 AliTriggerTask.cxx:16
 AliTriggerTask.cxx:17
 AliTriggerTask.cxx:18
 AliTriggerTask.cxx:19
 AliTriggerTask.cxx:20
 AliTriggerTask.cxx:21
 AliTriggerTask.cxx:22
 AliTriggerTask.cxx:23
 AliTriggerTask.cxx:24
 AliTriggerTask.cxx:25
 AliTriggerTask.cxx:26
 AliTriggerTask.cxx:27
 AliTriggerTask.cxx:28
 AliTriggerTask.cxx:29
 AliTriggerTask.cxx:30
 AliTriggerTask.cxx:31
 AliTriggerTask.cxx:32
 AliTriggerTask.cxx:33
 AliTriggerTask.cxx:34
 AliTriggerTask.cxx:35
 AliTriggerTask.cxx:36
 AliTriggerTask.cxx:37
 AliTriggerTask.cxx:38
 AliTriggerTask.cxx:39
 AliTriggerTask.cxx:40
 AliTriggerTask.cxx:41
 AliTriggerTask.cxx:42
 AliTriggerTask.cxx:43
 AliTriggerTask.cxx:44
 AliTriggerTask.cxx:45
 AliTriggerTask.cxx:46
 AliTriggerTask.cxx:47
 AliTriggerTask.cxx:48
 AliTriggerTask.cxx:49
 AliTriggerTask.cxx:50
 AliTriggerTask.cxx:51
 AliTriggerTask.cxx:52
 AliTriggerTask.cxx:53
 AliTriggerTask.cxx:54
 AliTriggerTask.cxx:55
 AliTriggerTask.cxx:56
 AliTriggerTask.cxx:57
 AliTriggerTask.cxx:58
 AliTriggerTask.cxx:59
 AliTriggerTask.cxx:60
 AliTriggerTask.cxx:61
 AliTriggerTask.cxx:62
 AliTriggerTask.cxx:63
 AliTriggerTask.cxx:64
 AliTriggerTask.cxx:65
 AliTriggerTask.cxx:66
 AliTriggerTask.cxx:67
 AliTriggerTask.cxx:68
 AliTriggerTask.cxx:69
 AliTriggerTask.cxx:70
 AliTriggerTask.cxx:71
 AliTriggerTask.cxx:72
 AliTriggerTask.cxx:73
 AliTriggerTask.cxx:74
 AliTriggerTask.cxx:75
 AliTriggerTask.cxx:76
 AliTriggerTask.cxx:77
 AliTriggerTask.cxx:78
 AliTriggerTask.cxx:79
 AliTriggerTask.cxx:80
 AliTriggerTask.cxx:81
 AliTriggerTask.cxx:82
 AliTriggerTask.cxx:83
 AliTriggerTask.cxx:84
 AliTriggerTask.cxx:85
 AliTriggerTask.cxx:86
 AliTriggerTask.cxx:87
 AliTriggerTask.cxx:88
 AliTriggerTask.cxx:89
 AliTriggerTask.cxx:90
 AliTriggerTask.cxx:91
 AliTriggerTask.cxx:92
 AliTriggerTask.cxx:93
 AliTriggerTask.cxx:94
 AliTriggerTask.cxx:95
 AliTriggerTask.cxx:96
 AliTriggerTask.cxx:97
 AliTriggerTask.cxx:98
 AliTriggerTask.cxx:99
 AliTriggerTask.cxx:100
 AliTriggerTask.cxx:101
 AliTriggerTask.cxx:102
 AliTriggerTask.cxx:103
 AliTriggerTask.cxx:104
 AliTriggerTask.cxx:105
 AliTriggerTask.cxx:106
 AliTriggerTask.cxx:107
 AliTriggerTask.cxx:108
 AliTriggerTask.cxx:109
 AliTriggerTask.cxx:110
 AliTriggerTask.cxx:111
 AliTriggerTask.cxx:112
 AliTriggerTask.cxx:113
 AliTriggerTask.cxx:114
 AliTriggerTask.cxx:115
 AliTriggerTask.cxx:116
 AliTriggerTask.cxx:117
 AliTriggerTask.cxx:118
 AliTriggerTask.cxx:119
 AliTriggerTask.cxx:120
 AliTriggerTask.cxx:121
 AliTriggerTask.cxx:122
 AliTriggerTask.cxx:123
 AliTriggerTask.cxx:124
 AliTriggerTask.cxx:125
 AliTriggerTask.cxx:126
 AliTriggerTask.cxx:127
 AliTriggerTask.cxx:128
 AliTriggerTask.cxx:129
 AliTriggerTask.cxx:130
 AliTriggerTask.cxx:131
 AliTriggerTask.cxx:132
 AliTriggerTask.cxx:133
 AliTriggerTask.cxx:134
 AliTriggerTask.cxx:135
 AliTriggerTask.cxx:136
 AliTriggerTask.cxx:137
 AliTriggerTask.cxx:138
 AliTriggerTask.cxx:139
 AliTriggerTask.cxx:140
 AliTriggerTask.cxx:141
 AliTriggerTask.cxx:142
 AliTriggerTask.cxx:143
 AliTriggerTask.cxx:144
 AliTriggerTask.cxx:145
 AliTriggerTask.cxx:146
 AliTriggerTask.cxx:147
 AliTriggerTask.cxx:148
 AliTriggerTask.cxx:149
 AliTriggerTask.cxx:150
 AliTriggerTask.cxx:151
 AliTriggerTask.cxx:152
 AliTriggerTask.cxx:153
 AliTriggerTask.cxx:154
 AliTriggerTask.cxx:155
 AliTriggerTask.cxx:156
 AliTriggerTask.cxx:157
 AliTriggerTask.cxx:158
 AliTriggerTask.cxx:159
 AliTriggerTask.cxx:160
 AliTriggerTask.cxx:161
 AliTriggerTask.cxx:162
 AliTriggerTask.cxx:163
 AliTriggerTask.cxx:164
 AliTriggerTask.cxx:165
 AliTriggerTask.cxx:166
 AliTriggerTask.cxx:167
 AliTriggerTask.cxx:168
 AliTriggerTask.cxx:169
 AliTriggerTask.cxx:170
 AliTriggerTask.cxx:171
 AliTriggerTask.cxx:172
 AliTriggerTask.cxx:173
 AliTriggerTask.cxx:174
 AliTriggerTask.cxx:175
 AliTriggerTask.cxx:176
 AliTriggerTask.cxx:177
 AliTriggerTask.cxx:178
 AliTriggerTask.cxx:179
 AliTriggerTask.cxx:180
 AliTriggerTask.cxx:181
 AliTriggerTask.cxx:182
 AliTriggerTask.cxx:183
 AliTriggerTask.cxx:184
 AliTriggerTask.cxx:185
 AliTriggerTask.cxx:186
 AliTriggerTask.cxx:187
 AliTriggerTask.cxx:188
 AliTriggerTask.cxx:189
 AliTriggerTask.cxx:190
 AliTriggerTask.cxx:191
 AliTriggerTask.cxx:192
 AliTriggerTask.cxx:193
 AliTriggerTask.cxx:194
 AliTriggerTask.cxx:195
 AliTriggerTask.cxx:196
 AliTriggerTask.cxx:197
 AliTriggerTask.cxx:198
 AliTriggerTask.cxx:199
 AliTriggerTask.cxx:200
 AliTriggerTask.cxx:201
 AliTriggerTask.cxx:202
 AliTriggerTask.cxx:203
 AliTriggerTask.cxx:204
 AliTriggerTask.cxx:205
 AliTriggerTask.cxx:206
 AliTriggerTask.cxx:207
 AliTriggerTask.cxx:208
 AliTriggerTask.cxx:209
 AliTriggerTask.cxx:210
 AliTriggerTask.cxx:211
 AliTriggerTask.cxx:212
 AliTriggerTask.cxx:213
 AliTriggerTask.cxx:214
 AliTriggerTask.cxx:215
 AliTriggerTask.cxx:216
 AliTriggerTask.cxx:217
 AliTriggerTask.cxx:218
 AliTriggerTask.cxx:219
 AliTriggerTask.cxx:220
 AliTriggerTask.cxx:221
 AliTriggerTask.cxx:222
 AliTriggerTask.cxx:223
 AliTriggerTask.cxx:224
 AliTriggerTask.cxx:225
 AliTriggerTask.cxx:226
 AliTriggerTask.cxx:227
 AliTriggerTask.cxx:228
 AliTriggerTask.cxx:229
 AliTriggerTask.cxx:230
 AliTriggerTask.cxx:231
 AliTriggerTask.cxx:232
 AliTriggerTask.cxx:233
 AliTriggerTask.cxx:234
 AliTriggerTask.cxx:235
 AliTriggerTask.cxx:236
 AliTriggerTask.cxx:237
 AliTriggerTask.cxx:238
 AliTriggerTask.cxx:239
 AliTriggerTask.cxx:240
 AliTriggerTask.cxx:241
 AliTriggerTask.cxx:242
 AliTriggerTask.cxx:243
 AliTriggerTask.cxx:244
 AliTriggerTask.cxx:245
 AliTriggerTask.cxx:246
 AliTriggerTask.cxx:247
 AliTriggerTask.cxx:248
 AliTriggerTask.cxx:249
 AliTriggerTask.cxx:250
 AliTriggerTask.cxx:251
 AliTriggerTask.cxx:252
 AliTriggerTask.cxx:253
 AliTriggerTask.cxx:254
 AliTriggerTask.cxx:255
 AliTriggerTask.cxx:256
 AliTriggerTask.cxx:257
 AliTriggerTask.cxx:258
 AliTriggerTask.cxx:259
 AliTriggerTask.cxx:260
 AliTriggerTask.cxx:261
 AliTriggerTask.cxx:262
 AliTriggerTask.cxx:263
 AliTriggerTask.cxx:264
 AliTriggerTask.cxx:265
 AliTriggerTask.cxx:266
 AliTriggerTask.cxx:267
 AliTriggerTask.cxx:268
 AliTriggerTask.cxx:269
 AliTriggerTask.cxx:270
 AliTriggerTask.cxx:271
 AliTriggerTask.cxx:272
 AliTriggerTask.cxx:273
 AliTriggerTask.cxx:274
 AliTriggerTask.cxx:275
 AliTriggerTask.cxx:276
 AliTriggerTask.cxx:277
 AliTriggerTask.cxx:278
 AliTriggerTask.cxx:279
 AliTriggerTask.cxx:280
 AliTriggerTask.cxx:281
 AliTriggerTask.cxx:282
 AliTriggerTask.cxx:283
 AliTriggerTask.cxx:284
 AliTriggerTask.cxx:285
 AliTriggerTask.cxx:286
 AliTriggerTask.cxx:287
 AliTriggerTask.cxx:288
 AliTriggerTask.cxx:289
 AliTriggerTask.cxx:290