--- /dev/null
+// 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;
+};