ROOT logo
#ifndef __CINT__
#include "TMath.h"
#include "AliCDBManager.h"
#include "AliTriggerScalers.h"
#include "AliTriggerRunScalers.h"
#include "AliTimeStamp.h"
#include "AliTriggerScalersRecord.h"
#include "AliTriggerConfiguration.h"
#include "AliLHCData.h"
#include "AliTriggerClass.h"
#include "AliTriggerBCMask.h"
#include "AliCDBPath.h"
#include "AliCDBEntry.h"
#endif

UInt_t dif(UInt_t stop, UInt_t start){
  UInt_t d;
  if(stop >= start) d=stop-start;
  else d = stop+(0xffffffff-start)+1;
  return d;
};

TObjArray GetClasses(Int_t run, TString ocdbStorage, ULong64_t* L0B, ULong64_t* L0A, ULong64_t* L1B, ULong64_t* L1A, ULong64_t* L2B, ULong64_t* L2A){
  AliCDBManager* man = AliCDBManager::Instance();
  man->SetDefaultStorage(ocdbStorage.Data());
  man->SetRun(run);
  // Get scalers 
  AliTriggerConfiguration* cfg = (AliTriggerConfiguration*) man->Get("GRP/CTP/Config")->GetObject();
  if (!cfg) { printf("No GRP/CTP/Config object for run %i\n",run); return TObjArray(); }

  TObjArray classes = cfg->GetClasses();
  AliTriggerRunScalers* scalers = (AliTriggerRunScalers*) man->Get("GRP/CTP/Scalers")->GetObject();
  if (!scalers) { printf("No GRP/CTP/Scalers object for run %i\n",run); return TObjArray(); }
  Int_t nEntries = scalers->GetScalersRecords()->GetEntriesFast();
  
  for (Int_t r=0;r<nEntries-1;r++){
    // Get SOR and EOR scaler records
    AliTriggerScalersRecord* record1 = scalers->GetScalersRecord(r);
    AliTriggerScalersRecord* record2 = scalers->GetScalersRecord(r+1);
    if (!record1) { printf("Null pointer to scalers record\n"); return TObjArray(); }
    if (!record2) { printf("Null pointer to scalers record\n"); return TObjArray(); }
    for (Int_t i=0;i<classes.GetEntriesFast();i++){
      // Extract SOR and EOR trigger counts
      Int_t classId = cfg->GetClassIndexFromName(classes.At(i)->GetName());
      const AliTriggerScalers* scaler1 = record1->GetTriggerScalersForClass(classId);
      const AliTriggerScalers* scaler2 = record2->GetTriggerScalersForClass(classId);
      if (!scaler1) { printf("Null pointer to scalers for class\n"); return TObjArray(); }
      if (!scaler2) { printf("Null pointer to scalers for class\n"); return TObjArray(); }
      L0B[i] += dif(scaler2->GetLOCB(),scaler1->GetLOCB());
      L0A[i] += dif(scaler2->GetLOCA(),scaler1->GetLOCA());
      L1B[i] += dif(scaler2->GetL1CB(),scaler1->GetL1CB());
      L1A[i] += dif(scaler2->GetL1CA(),scaler1->GetL1CA());
      L2B[i] += dif(scaler2->GetL2CB(),scaler1->GetL2CB());
      L2A[i] += dif(scaler2->GetL2CA(),scaler1->GetL2CA());
    }
  }
  return classes;
}


Int_t triggerInfo(Int_t run, TString refClassName, TString ocdbStorage, TString &activeDetectors, Double_t* par){
  AliCDBManager* man = AliCDBManager::Instance();
  man->SetDefaultStorage(ocdbStorage.Data());
  man->SetRun(run);
  if (run!=189694) { // No GRP/GRP/LHCData for this run
    AliLHCData* lhc = (AliLHCData*) man->Get("GRP/GRP/LHCData")->GetObject();
    if (!lhc) { printf("No GRP/GRP/LHCData object for run %i\n",run); return 1; }
    par[0] = lhc->GetFillNumber();
  }
  
  AliTriggerConfiguration* cfg = (AliTriggerConfiguration*) man->Get("GRP/CTP/Config")->GetObject();
  if (!cfg) { printf("No GRP/CTP/Config object for run %i\n",run); return 1; }
  activeDetectors = cfg->GetActiveDetectors().Data();

  // Get scalers 
  AliTriggerRunScalers* scalers = (AliTriggerRunScalers*) man->Get("GRP/CTP/Scalers")->GetObject();
  if (!scalers) { printf("No GRP/CTP/Scalers object for run %i\n",run); return 1; }
  Int_t nEntries = scalers->GetScalersRecords()->GetEntriesFast();

  Double_t run_duration   = 0;
  ULong64_t l0b      = 0;
  ULong64_t l0bempty = 0;
  Int_t classId      = cfg->GetClassIndexFromName(refClassName);
  Int_t emptyclassid = cfg->GetClassIndexFromName("CBEAMB-ABCE-NOPF-ALL");
  for (Int_t r=0;r<nEntries-1;r++){
    // Get SOR and EOR scaler records
    AliTriggerScalersRecord* record1 = scalers->GetScalersRecord(r);
    AliTriggerScalersRecord* record2 = scalers->GetScalersRecord(r+1);
    if (!record1) { printf("Null pointer to scalers record\n"); return 2; }
    if (!record2) { printf("Null pointer to scalers record\n"); return 2; }
    const AliTimeStamp*      stamp1  = record1->GetTimeStamp();
    const AliTimeStamp*      stamp2  = record2->GetTimeStamp();
    const AliTriggerScalers* scaler1 = record1->GetTriggerScalersForClass(classId);
    const AliTriggerScalers* scaler2 = record2->GetTriggerScalersForClass(classId);
    if (!stamp1 ) { printf("Null pointer to start timestamp\n");   return 2; }
    if (!stamp2 ) { printf("Null pointer to stop timestamp\n");    return 2; }
    if (!scaler1) { printf("Null pointer to scalers for class %s\n",refClassName.Data()); return 2; }
    if (!scaler2) { printf("Null pointer to scalers for class %s\n",refClassName.Data()); return 2; }
//    run_duration += dif(stamp2->GetSeconds(),stamp1->GetSeconds());
    l0b          += dif(scaler2->GetLOCB()  ,scaler1->GetLOCB());
    if (emptyclassid<0) continue;
    const AliTriggerScalers* emptyScaler1 = record1->GetTriggerScalersForClass(emptyclassid);
    const AliTriggerScalers* emptyScaler2 = record2->GetTriggerScalersForClass(emptyclassid);
    if (!emptyScaler1) { printf("Null pointer to scalers for empty class\n"); return 2; }
    if (!emptyScaler2) { printf("Null pointer to scalers for empty class\n");  return 2; }
    l0bempty+=dif(emptyScaler2->GetLOCB(),emptyScaler1->GetLOCB());
  }
  UInt_t t1 = scalers->GetScalersRecord(0         )->GetTimeStamp()->GetSeconds();
  UInt_t t2 = scalers->GetScalersRecord(nEntries-1)->GetTimeStamp()->GetSeconds();
  run_duration = dif(t2,t1);
  
  for (Int_t r=0;r<nEntries-1;r++){
    // Get SOR and EOR scaler records
    AliTriggerScalersRecord* record1 = scalers->GetScalersRecord(r);
    const AliTimeStamp*      stamp1  = record1->GetTimeStamp();
    Int_t period = stamp1->GetPeriod();
    Int_t orbit = stamp1->GetOrbit();
    printf("%5i %5i %5i %ll\n",r,period,orbit);
  }

  
  par[1] = run_duration;
  par[2] = l0b;
  if (TMath::Abs(run_duration)<1) return 3;

  // Get number of colliding bunches per orbit
  Double_t nBCsPerOrbit = -1;
  Double_t orbitRate = 11245.;
  if (refClassName.Contains("1B-ABCE-")){
    nBCsPerOrbit = lhc->GetNInteractingBunchesMeasured();
    Printf("Number of BCs from LHC data=%i",nBCsPerOrbit);
    if (nBCsPerOrbit<0 && l0bempty>0) nBCsPerOrbit = Double_t(l0bempty)/orbitRate/run_duration;
  } else {
    // Extract number of bunches per orbit
    AliTriggerClass* cl = cfg->GetTriggerClass(classId);
    AliTriggerBCMask* mask = cl->GetBCMask();
    nBCsPerOrbit = mask->GetNUnmaskedBCs();
  }
  par[3] = nBCsPerOrbit;
  
  Double_t totalBCs = orbitRate*run_duration*nBCsPerOrbit;
  if (totalBCs<1 || l0b<1) return 4;
  par[4] = -TMath::Log(1-Double_t(l0b)/totalBCs); // mu
  return 0;
}
 triggerInfo.C:1
 triggerInfo.C:2
 triggerInfo.C:3
 triggerInfo.C:4
 triggerInfo.C:5
 triggerInfo.C:6
 triggerInfo.C:7
 triggerInfo.C:8
 triggerInfo.C:9
 triggerInfo.C:10
 triggerInfo.C:11
 triggerInfo.C:12
 triggerInfo.C:13
 triggerInfo.C:14
 triggerInfo.C:15
 triggerInfo.C:16
 triggerInfo.C:17
 triggerInfo.C:18
 triggerInfo.C:19
 triggerInfo.C:20
 triggerInfo.C:21
 triggerInfo.C:22
 triggerInfo.C:23
 triggerInfo.C:24
 triggerInfo.C:25
 triggerInfo.C:26
 triggerInfo.C:27
 triggerInfo.C:28
 triggerInfo.C:29
 triggerInfo.C:30
 triggerInfo.C:31
 triggerInfo.C:32
 triggerInfo.C:33
 triggerInfo.C:34
 triggerInfo.C:35
 triggerInfo.C:36
 triggerInfo.C:37
 triggerInfo.C:38
 triggerInfo.C:39
 triggerInfo.C:40
 triggerInfo.C:41
 triggerInfo.C:42
 triggerInfo.C:43
 triggerInfo.C:44
 triggerInfo.C:45
 triggerInfo.C:46
 triggerInfo.C:47
 triggerInfo.C:48
 triggerInfo.C:49
 triggerInfo.C:50
 triggerInfo.C:51
 triggerInfo.C:52
 triggerInfo.C:53
 triggerInfo.C:54
 triggerInfo.C:55
 triggerInfo.C:56
 triggerInfo.C:57
 triggerInfo.C:58
 triggerInfo.C:59
 triggerInfo.C:60
 triggerInfo.C:61
 triggerInfo.C:62
 triggerInfo.C:63
 triggerInfo.C:64
 triggerInfo.C:65
 triggerInfo.C:66
 triggerInfo.C:67
 triggerInfo.C:68
 triggerInfo.C:69
 triggerInfo.C:70
 triggerInfo.C:71
 triggerInfo.C:72
 triggerInfo.C:73
 triggerInfo.C:74
 triggerInfo.C:75
 triggerInfo.C:76
 triggerInfo.C:77
 triggerInfo.C:78
 triggerInfo.C:79
 triggerInfo.C:80
 triggerInfo.C:81
 triggerInfo.C:82
 triggerInfo.C:83
 triggerInfo.C:84
 triggerInfo.C:85
 triggerInfo.C:86
 triggerInfo.C:87
 triggerInfo.C:88
 triggerInfo.C:89
 triggerInfo.C:90
 triggerInfo.C:91
 triggerInfo.C:92
 triggerInfo.C:93
 triggerInfo.C:94
 triggerInfo.C:95
 triggerInfo.C:96
 triggerInfo.C:97
 triggerInfo.C:98
 triggerInfo.C:99
 triggerInfo.C:100
 triggerInfo.C:101
 triggerInfo.C:102
 triggerInfo.C:103
 triggerInfo.C:104
 triggerInfo.C:105
 triggerInfo.C:106
 triggerInfo.C:107
 triggerInfo.C:108
 triggerInfo.C:109
 triggerInfo.C:110
 triggerInfo.C:111
 triggerInfo.C:112
 triggerInfo.C:113
 triggerInfo.C:114
 triggerInfo.C:115
 triggerInfo.C:116
 triggerInfo.C:117
 triggerInfo.C:118
 triggerInfo.C:119
 triggerInfo.C:120
 triggerInfo.C:121
 triggerInfo.C:122
 triggerInfo.C:123
 triggerInfo.C:124
 triggerInfo.C:125
 triggerInfo.C:126
 triggerInfo.C:127
 triggerInfo.C:128
 triggerInfo.C:129
 triggerInfo.C:130
 triggerInfo.C:131
 triggerInfo.C:132
 triggerInfo.C:133
 triggerInfo.C:134
 triggerInfo.C:135
 triggerInfo.C:136
 triggerInfo.C:137
 triggerInfo.C:138
 triggerInfo.C:139
 triggerInfo.C:140
 triggerInfo.C:141
 triggerInfo.C:142
 triggerInfo.C:143
 triggerInfo.C:144
 triggerInfo.C:145
 triggerInfo.C:146