ROOT logo
////////////////////////////////////////////////////////////////////////////
//                                                                        //
//  Mergable Trigger List                                                 //
//                                                                        //
//  Authors:                                                              //
//    Alexandru Bercuci <A.Bercuci@gsi.de>                                //
//                                                                        //
////////////////////////////////////////////////////////////////////////////



#include "TObjArray.h"
#include "TObjString.h"
#include "TH1.h"

#include "AliLog.h"

#include "AliTRDtriggerInfo.h"

ClassImp(AliTRDtriggerInfo)
//____________________________________________
AliTRDtriggerInfo::AliTRDtriggerInfo()
  :TObject()
  ,fTriggerList(NULL)
  ,fHisto(NULL)
{
//  Constructor. Reset all fields.
  memset(fTriggerSel, 0, kTriggerListSize *sizeof(Bool_t));
  memset(fTriggerStat, 0, kTriggerListSize *sizeof(Int_t));
}

//____________________________________________
AliTRDtriggerInfo::~AliTRDtriggerInfo()
{
//  Destructor. 
  if(fHisto) delete fHisto;
  if(fTriggerList){ fTriggerList->Delete(); delete fTriggerList;}
}

//____________________________________________
Int_t AliTRDtriggerInfo::Add(const Char_t *trigger, Int_t nstat, Bool_t select)
{
// Add trigger named "trigger" to the list. If trigger is not on the list it is add.
// The statistics of this trigger is set to "nstat" [default=1]
// On return the position incremented

  Int_t itrig(-1), nt(0);
  if((nt=GetNTriggers()) && (itrig = GetTrigger(trigger))>=0){
    fTriggerSel[itrig]  = select;
    fTriggerStat[itrig]+= nstat;
  } else {
    if(!nt) fTriggerList = new TObjArray;
    fTriggerList->Add(new TObjString(trigger));
    fTriggerStat[nt] = nstat;
    fTriggerSel[nt]  = select;
    nt++;
  }
  return nt;
}

//____________________________________________
void AliTRDtriggerInfo::Draw(Option_t *opt)
{
// Draw trigger statistics. Via parameter "opt" one can select a sublist of trigger names

  Int_t nt(0);
  if(!(nt = GetNTriggers())) return;
  if(fHisto && fHisto->GetNbinsX() != nt){ delete fHisto; fHisto=NULL;}
//
  if(!fHisto) fHisto = new TH1F("hTriggerStat", "Trigger Statistics;TRIGGER;Freq. [%]", nt, 0.5, nt+0.5);
  TAxis *ax(fHisto->GetXaxis());  fHisto->Reset();
  ax->SetTitleOffset(6.5); ax->CenterTitle();
  fHisto->SetFillStyle(3001);fHisto->SetFillColor(kGreen);
  fHisto->SetBarWidth(0.8);fHisto->SetBarOffset(0.1);
//
  Int_t ibin(0);
  if(strcmp(opt, "")!=0){
    TString sopt(opt);
    TObjArray *optTriggers = sopt.Tokenize(" ");
    for(Int_t iopt(0); iopt<optTriggers->GetEntries(); iopt++){
      const Char_t *trigger = ((TObjString*)(*optTriggers)[iopt])->GetName();
      Int_t itrig(-1);
      if((itrig = GetTrigger(trigger))<0) continue;
      ibin++;
      ax->SetBinLabel(ibin, trigger);
      fHisto->SetBinContent(ibin, fTriggerStat[itrig]);
    }
    optTriggers->Delete(); delete optTriggers;
  } else {
    for(Int_t jtrig(nt); jtrig--;){
      ibin++;
      ax->SetBinLabel(ibin, ((TObjString*)(*fTriggerList)[jtrig])->GetName());
      fHisto->SetBinContent(ibin, fTriggerStat[jtrig]);
    }
  }
  ax->SetRange(1, ibin);
  fHisto->Scale(1.e2/fHisto->Integral());
  fHisto->Draw("hbar2");

  return;
}

//____________________________________________
Int_t AliTRDtriggerInfo::GetNTriggers() const
{
// Return no of trigger classes
  return fTriggerList?fTriggerList->GetEntries():0;
}

//____________________________________________
const char* AliTRDtriggerInfo::GetTrigger(Int_t it) const
{
// Return trigger by index. 0 in case it is not found
  if(it<0||it>=GetNTriggers()) return 0;
  return ((TObjString*)(*fTriggerList)[it])->GetName();
}

//____________________________________________
Int_t AliTRDtriggerInfo::GetTrigger(const char *trigger) const
{
// Return trigger index by name. -1 in case trigger not registred

  for(Int_t jtrig(GetNTriggers()); jtrig--;){
    if(((TObjString*)(*fTriggerList)[jtrig])->String().CompareTo(trigger)==0) return jtrig;
  }
  return -1;
}

//____________________________________________
Long64_t AliTRDtriggerInfo::Merge(TCollection* list)
{
// Merge list of trigger statistics. Add new triggers if neccessary

  Int_t imerge(1);
  AliTRDtriggerInfo *o(NULL);
  TIterator *it(list->MakeIterator());
  while((o  = (AliTRDtriggerInfo*)it->Next())){
    for(Int_t jtrig(o->GetNTriggers()); jtrig--;) Add(((TObjString*)(*o->fTriggerList)[jtrig])->GetName(), o->fTriggerStat[jtrig], o->fTriggerSel[jtrig]);
    imerge++;
  }
  return imerge;
}
  
//____________________________________________
void AliTRDtriggerInfo::Print(Option_t *opt) const
{
// Print trigger statistics. If opt="a" detailed trigger/statistics is also provided

  Int_t nt(GetNTriggers());
  Int_t stat(0); for(Int_t jtrig(0); jtrig<nt; jtrig++) stat+=fTriggerStat[jtrig];
  printf("TriggerClasses[%3d] Stat[%5d]\n", nt, stat);
  if(!nt || strcmp(opt,"a")!=0) return;

  for(Int_t jtrig(0); jtrig<nt; jtrig++) printf("  %3d \"%s\" [%5d]\n", jtrig, ((TObjString*)(*fTriggerList)[jtrig])->GetName(), fTriggerStat[jtrig]);
}


 AliTRDtriggerInfo.cxx:1
 AliTRDtriggerInfo.cxx:2
 AliTRDtriggerInfo.cxx:3
 AliTRDtriggerInfo.cxx:4
 AliTRDtriggerInfo.cxx:5
 AliTRDtriggerInfo.cxx:6
 AliTRDtriggerInfo.cxx:7
 AliTRDtriggerInfo.cxx:8
 AliTRDtriggerInfo.cxx:9
 AliTRDtriggerInfo.cxx:10
 AliTRDtriggerInfo.cxx:11
 AliTRDtriggerInfo.cxx:12
 AliTRDtriggerInfo.cxx:13
 AliTRDtriggerInfo.cxx:14
 AliTRDtriggerInfo.cxx:15
 AliTRDtriggerInfo.cxx:16
 AliTRDtriggerInfo.cxx:17
 AliTRDtriggerInfo.cxx:18
 AliTRDtriggerInfo.cxx:19
 AliTRDtriggerInfo.cxx:20
 AliTRDtriggerInfo.cxx:21
 AliTRDtriggerInfo.cxx:22
 AliTRDtriggerInfo.cxx:23
 AliTRDtriggerInfo.cxx:24
 AliTRDtriggerInfo.cxx:25
 AliTRDtriggerInfo.cxx:26
 AliTRDtriggerInfo.cxx:27
 AliTRDtriggerInfo.cxx:28
 AliTRDtriggerInfo.cxx:29
 AliTRDtriggerInfo.cxx:30
 AliTRDtriggerInfo.cxx:31
 AliTRDtriggerInfo.cxx:32
 AliTRDtriggerInfo.cxx:33
 AliTRDtriggerInfo.cxx:34
 AliTRDtriggerInfo.cxx:35
 AliTRDtriggerInfo.cxx:36
 AliTRDtriggerInfo.cxx:37
 AliTRDtriggerInfo.cxx:38
 AliTRDtriggerInfo.cxx:39
 AliTRDtriggerInfo.cxx:40
 AliTRDtriggerInfo.cxx:41
 AliTRDtriggerInfo.cxx:42
 AliTRDtriggerInfo.cxx:43
 AliTRDtriggerInfo.cxx:44
 AliTRDtriggerInfo.cxx:45
 AliTRDtriggerInfo.cxx:46
 AliTRDtriggerInfo.cxx:47
 AliTRDtriggerInfo.cxx:48
 AliTRDtriggerInfo.cxx:49
 AliTRDtriggerInfo.cxx:50
 AliTRDtriggerInfo.cxx:51
 AliTRDtriggerInfo.cxx:52
 AliTRDtriggerInfo.cxx:53
 AliTRDtriggerInfo.cxx:54
 AliTRDtriggerInfo.cxx:55
 AliTRDtriggerInfo.cxx:56
 AliTRDtriggerInfo.cxx:57
 AliTRDtriggerInfo.cxx:58
 AliTRDtriggerInfo.cxx:59
 AliTRDtriggerInfo.cxx:60
 AliTRDtriggerInfo.cxx:61
 AliTRDtriggerInfo.cxx:62
 AliTRDtriggerInfo.cxx:63
 AliTRDtriggerInfo.cxx:64
 AliTRDtriggerInfo.cxx:65
 AliTRDtriggerInfo.cxx:66
 AliTRDtriggerInfo.cxx:67
 AliTRDtriggerInfo.cxx:68
 AliTRDtriggerInfo.cxx:69
 AliTRDtriggerInfo.cxx:70
 AliTRDtriggerInfo.cxx:71
 AliTRDtriggerInfo.cxx:72
 AliTRDtriggerInfo.cxx:73
 AliTRDtriggerInfo.cxx:74
 AliTRDtriggerInfo.cxx:75
 AliTRDtriggerInfo.cxx:76
 AliTRDtriggerInfo.cxx:77
 AliTRDtriggerInfo.cxx:78
 AliTRDtriggerInfo.cxx:79
 AliTRDtriggerInfo.cxx:80
 AliTRDtriggerInfo.cxx:81
 AliTRDtriggerInfo.cxx:82
 AliTRDtriggerInfo.cxx:83
 AliTRDtriggerInfo.cxx:84
 AliTRDtriggerInfo.cxx:85
 AliTRDtriggerInfo.cxx:86
 AliTRDtriggerInfo.cxx:87
 AliTRDtriggerInfo.cxx:88
 AliTRDtriggerInfo.cxx:89
 AliTRDtriggerInfo.cxx:90
 AliTRDtriggerInfo.cxx:91
 AliTRDtriggerInfo.cxx:92
 AliTRDtriggerInfo.cxx:93
 AliTRDtriggerInfo.cxx:94
 AliTRDtriggerInfo.cxx:95
 AliTRDtriggerInfo.cxx:96
 AliTRDtriggerInfo.cxx:97
 AliTRDtriggerInfo.cxx:98
 AliTRDtriggerInfo.cxx:99
 AliTRDtriggerInfo.cxx:100
 AliTRDtriggerInfo.cxx:101
 AliTRDtriggerInfo.cxx:102
 AliTRDtriggerInfo.cxx:103
 AliTRDtriggerInfo.cxx:104
 AliTRDtriggerInfo.cxx:105
 AliTRDtriggerInfo.cxx:106
 AliTRDtriggerInfo.cxx:107
 AliTRDtriggerInfo.cxx:108
 AliTRDtriggerInfo.cxx:109
 AliTRDtriggerInfo.cxx:110
 AliTRDtriggerInfo.cxx:111
 AliTRDtriggerInfo.cxx:112
 AliTRDtriggerInfo.cxx:113
 AliTRDtriggerInfo.cxx:114
 AliTRDtriggerInfo.cxx:115
 AliTRDtriggerInfo.cxx:116
 AliTRDtriggerInfo.cxx:117
 AliTRDtriggerInfo.cxx:118
 AliTRDtriggerInfo.cxx:119
 AliTRDtriggerInfo.cxx:120
 AliTRDtriggerInfo.cxx:121
 AliTRDtriggerInfo.cxx:122
 AliTRDtriggerInfo.cxx:123
 AliTRDtriggerInfo.cxx:124
 AliTRDtriggerInfo.cxx:125
 AliTRDtriggerInfo.cxx:126
 AliTRDtriggerInfo.cxx:127
 AliTRDtriggerInfo.cxx:128
 AliTRDtriggerInfo.cxx:129
 AliTRDtriggerInfo.cxx:130
 AliTRDtriggerInfo.cxx:131
 AliTRDtriggerInfo.cxx:132
 AliTRDtriggerInfo.cxx:133
 AliTRDtriggerInfo.cxx:134
 AliTRDtriggerInfo.cxx:135
 AliTRDtriggerInfo.cxx:136
 AliTRDtriggerInfo.cxx:137
 AliTRDtriggerInfo.cxx:138
 AliTRDtriggerInfo.cxx:139
 AliTRDtriggerInfo.cxx:140
 AliTRDtriggerInfo.cxx:141
 AliTRDtriggerInfo.cxx:142
 AliTRDtriggerInfo.cxx:143
 AliTRDtriggerInfo.cxx:144
 AliTRDtriggerInfo.cxx:145
 AliTRDtriggerInfo.cxx:146
 AliTRDtriggerInfo.cxx:147
 AliTRDtriggerInfo.cxx:148
 AliTRDtriggerInfo.cxx:149
 AliTRDtriggerInfo.cxx:150
 AliTRDtriggerInfo.cxx:151
 AliTRDtriggerInfo.cxx:152
 AliTRDtriggerInfo.cxx:153
 AliTRDtriggerInfo.cxx:154
 AliTRDtriggerInfo.cxx:155
 AliTRDtriggerInfo.cxx:156
 AliTRDtriggerInfo.cxx:157