3 #include "AliCDBManager.h"
4 #include "AliTriggerScalers.h"
5 #include "AliTriggerRunScalers.h"
6 #include "AliTimeStamp.h"
7 #include "AliTriggerScalersRecord.h"
8 #include "AliTriggerConfiguration.h"
9 #include "AliLHCData.h"
10 #include "AliTriggerClass.h"
11 #include "AliTriggerBCMask.h"
12 #include "AliCDBPath.h"
13 #include "AliCDBEntry.h"
16 UInt_t dif(UInt_t stop, UInt_t start){
18 if(stop >= start) d=stop-start;
19 else d = stop+(0xffffffff-start)+1;
23 Int_t triggerInfo(Int_t run, TString refClassName, TString ocdbStorage, Double_t* par){
24 AliCDBManager* man = AliCDBManager::Instance();
25 man->SetDefaultStorage(ocdbStorage.Data());
27 AliLHCData* lhc = (AliLHCData*) man->Get("GRP/GRP/LHCData")->GetObject();
28 par[0] = lhc->GetFillNumber();
30 AliTriggerConfiguration* cfg = (AliTriggerConfiguration*) man->Get("GRP/CTP/Config")->GetObject();
33 AliTriggerRunScalers* scalers = (AliTriggerRunScalers*) man->Get("GRP/CTP/Scalers")->GetObject();
34 Int_t nEntries = scalers->GetScalersRecords()->GetEntriesFast();
36 // Get SOR and EOR scaler records
37 AliTriggerScalersRecord* record1 = scalers->GetScalersRecord(0);
38 AliTriggerScalersRecord* record2 = scalers->GetScalersRecord(nEntries-1);
39 if (!record1) { printf("Null pointer to start scalers record\n"); return 1; }
40 if (!record2) { printf("Null pointer to stop scalers record\n"); return 1; }
42 // Extract SOR and EOR times
43 const AliTimeStamp* stemp1 = record1->GetTimeStamp();
44 const AliTimeStamp* stemp2 = record2->GetTimeStamp();
45 if (!stemp1) { printf("Null pointer to start timestemp\n"); return 1; }
46 if (!stemp2) { printf("Null pointer to stop timestemp\n"); return 1; }
47 Double_t duration = stemp2->GetSeconds()-stemp1->GetSeconds();
49 if (TMath::Abs(duration)<1) return 2;
51 // Extract SOR and EOR trigger counts
52 Int_t classid = cfg->GetClassIndexFromName(refClassName);
53 const AliTriggerScalers* scaler1 = record1->GetTriggerScalersForClass(classid);
54 const AliTriggerScalers* scaler2 = record2->GetTriggerScalersForClass(classid);
55 if (!scaler1) { printf("Null pointer to start scalers for reference class\n"); return 1; }
56 if (!scaler2) { printf("Null pointer to stop scalers for reference class\n"); return 1; }
57 UInt_t l0b = dif(scaler2->GetLOCB(),scaler1->GetLOCB());
60 // Get number of colliding bunches per orbit
61 Double_t orbitRate = 11245.; // Hz
62 Double_t nBCsPerOrbit = -1;
63 if (refClassName.Contains("1B-ABCE-")){
64 nBCsPerOrbit = lhc->GetNInteractingBunchesMeasured();
65 Printf("Number of BCs from LHC data=%i",nBCsPerOrbit);
67 Int_t emptyclassid = cfg->GetClassIndexFromName("CBEAMB-ABCE-NOPF-ALL");
68 if (emptyclassid<0) return 3;
69 const AliTriggerScalers* emptyScaler1 = record1->GetTriggerScalersForClass(emptyclassid);
70 const AliTriggerScalers* emptyScaler2 = record2->GetTriggerScalersForClass(emptyclassid);
71 if (!scaler1) { printf("Null pointer to start scalers for reference class\n"); return 1; }
72 if (!scaler2) { printf("Null pointer to stop scalers for reference class\n"); return 1; }
73 UInt_t l0bempty = dif(emptyScaler2->GetLOCB(),emptyScaler1->GetLOCB());
74 if (l0bempty==0) return 4;
75 nBCsPerOrbit = l0bempty/orbitRate/duration;
79 // Extract number of bunches per orbit
80 AliTriggerClass* cl = cfg->GetTriggerClass(classid);
81 AliTriggerBCMask* mask = cl->GetBCMask();
82 nBCsPerOrbit = mask->GetNUnmaskedBCs();
84 par[3] = nBCsPerOrbit;
86 Double_t totalBCs = duration*orbitRate*nBCsPerOrbit;
87 par[4] = -TMath::Log(1-l0b/totalBCs); // mu