ROOT logo
// Macro to calculate pileup factor
// evgeny.kryshen@cern.ch
//
//Two cases:
//1) Reference trigger based on coincidence with beam pick-up counters to trigger beam-beam colliding bunches. 
//   Run 120072 is an example. In this case one can get total number of colliding bunches from L0b scalers for 
//   "empty" trigger corresponding to coincidence of A and C beam pick-up counters (CBEAMB-ABCE-NOPF-ALL).
//
//2) Reference trigger based on BC masks to constrain beam-beam colliding bunches (-B- in the class name). 
//   In this case total number of bunches can be computed as (run duration)*(orbit rate)*(number of B-like BCs per orbit).
//   One can switch to this option setting emptyClassName=NULL. 

UInt_t dif(UInt_t stop, UInt_t start);


Double_t mu(Int_t run=120072, char* className = "CINT1B-ABCE-NOPF-ALL", char* emptyClassName = "CBEAMB-ABCE-NOPF-ALL"){
//void mu(Int_t run=196310, char* className = "CINT7-B-NOPF-ALLNOTRD", char* emptyClassName = NULL){
  if (!TGrid::Connect("alien://")) return -1.;

  AliCDBManager* man = AliCDBManager::Instance();
  man->SetDefaultStorage("raw://");
  man->SetRun(run);
  AliTriggerConfiguration* cfg = (AliTriggerConfiguration*) man->Get("GRP/CTP/Config")->GetObject();

  // Get scalers
  AliTriggerRunScalers* scalers = (AliTriggerRunScalers*) man->Get("GRP/CTP/Scalers")->GetObject();
  Int_t nEntries = scalers->GetScalersRecords()->GetEntries();
  
  // Get SOR and EOR scaler records
  AliTriggerScalersRecord* record1 = scalers->GetScalersRecord(0);
  AliTriggerScalersRecord* record2 = scalers->GetScalersRecord(nEntries-1);
  
  // Extract SOR and EOR trigger counts
  Int_t classid      = cfg->GetClassIndexFromName(className);
  AliTriggerScalers* scaler1 = record1->GetTriggerScalersForClass(classid);
  AliTriggerScalers* scaler2 = record2->GetTriggerScalersForClass(classid);
  UInt_t l0b = dif(scaler2->GetLOCB(),scaler1->GetLOCB());
  
  Double_t totalBCs;
  if (emptyClassName) {
    Int_t emptyclassid = cfg->GetClassIndexFromName(emptyClassName);
    scaler1 = record1->GetTriggerScalersForClass(emptyclassid);
    scaler2 = record2->GetTriggerScalersForClass(emptyclassid);
    UInt_t l0bempty = dif(scaler2->GetLOCB(),scaler1->GetLOCB());
    totalBCs = l0bempty;
  }
  else {
    Double_t orbitRate = 11245.; // Hz
    // Extract SOR and EOR times
    AliTimeStamp* stemp1 = record1->GetTimeStamp();
    AliTimeStamp* stemp2 = record2->GetTimeStamp();
    UInt_t duration = stemp2->GetSeconds()-stemp1->GetSeconds();
    // Extract number of bunches per orbit
    AliTriggerClass* cl = cfg->GetTriggerClass(classid);
    AliTriggerBCMask* mask = cl->GetBCMask();
    Int_t nBCsPerOrbit = mask->GetNUnmaskedBCs();
    
    totalBCs = duration*orbitRate*nBCsPerOrbit;
  }
  
  Double_t mu = -TMath::Log(1-l0b/totalBCs);
  printf("l0b=%i totalBCs=%.0f mu=%f\n",l0b,totalBCs,mu);
  return mu;
}

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;
};
 mu.C:1
 mu.C:2
 mu.C:3
 mu.C:4
 mu.C:5
 mu.C:6
 mu.C:7
 mu.C:8
 mu.C:9
 mu.C:10
 mu.C:11
 mu.C:12
 mu.C:13
 mu.C:14
 mu.C:15
 mu.C:16
 mu.C:17
 mu.C:18
 mu.C:19
 mu.C:20
 mu.C:21
 mu.C:22
 mu.C:23
 mu.C:24
 mu.C:25
 mu.C:26
 mu.C:27
 mu.C:28
 mu.C:29
 mu.C:30
 mu.C:31
 mu.C:32
 mu.C:33
 mu.C:34
 mu.C:35
 mu.C:36
 mu.C:37
 mu.C:38
 mu.C:39
 mu.C:40
 mu.C:41
 mu.C:42
 mu.C:43
 mu.C:44
 mu.C:45
 mu.C:46
 mu.C:47
 mu.C:48
 mu.C:49
 mu.C:50
 mu.C:51
 mu.C:52
 mu.C:53
 mu.C:54
 mu.C:55
 mu.C:56
 mu.C:57
 mu.C:58
 mu.C:59
 mu.C:60
 mu.C:61
 mu.C:62
 mu.C:63
 mu.C:64
 mu.C:65
 mu.C:66
 mu.C:67
 mu.C:68
 mu.C:69
 mu.C:70
 mu.C:71
 mu.C:72