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 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){
24 AliCDBManager* man = AliCDBManager::Instance();
25 man->SetDefaultStorage(ocdbStorage.Data());
28 AliTriggerConfiguration* cfg = (AliTriggerConfiguration*) man->Get("GRP/CTP/Config")->GetObject();
29 if (!cfg) { printf("No GRP/CTP/Config object for run %i\n",run); return TObjArray(); }
31 TObjArray classes = cfg->GetClasses();
32 AliTriggerRunScalers* scalers = (AliTriggerRunScalers*) man->Get("GRP/CTP/Scalers")->GetObject();
33 if (!scalers) { printf("No GRP/CTP/Scalers object for run %i\n",run); return TObjArray(); }
34 Int_t nEntries = scalers->GetScalersRecords()->GetEntriesFast();
36 for (Int_t r=0;r<nEntries-1;r++){
37 // Get SOR and EOR scaler records
38 AliTriggerScalersRecord* record1 = scalers->GetScalersRecord(r);
39 AliTriggerScalersRecord* record2 = scalers->GetScalersRecord(r+1);
40 if (!record1) { printf("Null pointer to scalers record\n"); return TObjArray(); }
41 if (!record2) { printf("Null pointer to scalers record\n"); return TObjArray(); }
42 for (Int_t i=0;i<classes.GetEntriesFast();i++){
43 // Extract SOR and EOR trigger counts
44 Int_t classId = cfg->GetClassIndexFromName(classes.At(i)->GetName());
45 const AliTriggerScalers* scaler1 = record1->GetTriggerScalersForClass(classId);
46 const AliTriggerScalers* scaler2 = record2->GetTriggerScalersForClass(classId);
47 if (!scaler1) { printf("Null pointer to scalers for class\n"); return TObjArray(); }
48 if (!scaler2) { printf("Null pointer to scalers for class\n"); return TObjArray(); }
49 L0B[i] += dif(scaler2->GetLOCB(),scaler1->GetLOCB());
50 L0A[i] += dif(scaler2->GetLOCA(),scaler1->GetLOCA());
51 L1B[i] += dif(scaler2->GetL1CB(),scaler1->GetL1CB());
52 L1A[i] += dif(scaler2->GetL1CA(),scaler1->GetL1CA());
53 L2B[i] += dif(scaler2->GetL2CB(),scaler1->GetL2CB());
54 L2A[i] += dif(scaler2->GetL2CA(),scaler1->GetL2CA());
61 Int_t triggerInfo(Int_t run, TString refClassName, TString ocdbStorage, TString &activeDetectors, Double_t* par){
62 AliCDBManager* man = AliCDBManager::Instance();
63 man->SetDefaultStorage(ocdbStorage.Data());
65 if (run!=189694) { // No GRP/GRP/LHCData for this run
66 AliLHCData* lhc = (AliLHCData*) man->Get("GRP/GRP/LHCData")->GetObject();
67 if (!lhc) { printf("No GRP/GRP/LHCData object for run %i\n",run); return 1; }
68 par[0] = lhc->GetFillNumber();
71 AliTriggerConfiguration* cfg = (AliTriggerConfiguration*) man->Get("GRP/CTP/Config")->GetObject();
72 if (!cfg) { printf("No GRP/CTP/Config object for run %i\n",run); return 1; }
73 activeDetectors = cfg->GetActiveDetectors().Data();
76 AliTriggerRunScalers* scalers = (AliTriggerRunScalers*) man->Get("GRP/CTP/Scalers")->GetObject();
77 if (!scalers) { printf("No GRP/CTP/Scalers object for run %i\n",run); return 1; }
78 Int_t nEntries = scalers->GetScalersRecords()->GetEntriesFast();
80 Double_t run_duration = 0;
82 ULong64_t l0bempty = 0;
83 Int_t classId = cfg->GetClassIndexFromName(refClassName);
84 Int_t emptyclassid = cfg->GetClassIndexFromName("CBEAMB-ABCE-NOPF-ALL");
85 for (Int_t r=0;r<nEntries-1;r++){
86 // Get SOR and EOR scaler records
87 AliTriggerScalersRecord* record1 = scalers->GetScalersRecord(r);
88 AliTriggerScalersRecord* record2 = scalers->GetScalersRecord(r+1);
89 if (!record1) { printf("Null pointer to scalers record\n"); return 2; }
90 if (!record2) { printf("Null pointer to scalers record\n"); return 2; }
91 const AliTimeStamp* stamp1 = record1->GetTimeStamp();
92 const AliTimeStamp* stamp2 = record2->GetTimeStamp();
93 const AliTriggerScalers* scaler1 = record1->GetTriggerScalersForClass(classId);
94 const AliTriggerScalers* scaler2 = record2->GetTriggerScalersForClass(classId);
95 if (!stamp1 ) { printf("Null pointer to start timestamp\n"); return 2; }
96 if (!stamp2 ) { printf("Null pointer to stop timestamp\n"); return 2; }
97 if (!scaler1) { printf("Null pointer to scalers for class %s\n",refClassName.Data()); return 2; }
98 if (!scaler2) { printf("Null pointer to scalers for class %s\n",refClassName.Data()); return 2; }
99 // run_duration += dif(stamp2->GetSeconds(),stamp1->GetSeconds());
100 l0b += dif(scaler2->GetLOCB() ,scaler1->GetLOCB());
101 if (emptyclassid<0) continue;
102 const AliTriggerScalers* emptyScaler1 = record1->GetTriggerScalersForClass(emptyclassid);
103 const AliTriggerScalers* emptyScaler2 = record2->GetTriggerScalersForClass(emptyclassid);
104 if (!emptyScaler1) { printf("Null pointer to scalers for empty class\n"); return 2; }
105 if (!emptyScaler2) { printf("Null pointer to scalers for empty class\n"); return 2; }
106 l0bempty+=dif(emptyScaler2->GetLOCB(),emptyScaler1->GetLOCB());
108 UInt_t t1 = scalers->GetScalersRecord(0 )->GetTimeStamp()->GetSeconds();
109 UInt_t t2 = scalers->GetScalersRecord(nEntries-1)->GetTimeStamp()->GetSeconds();
110 run_duration = dif(t2,t1);
112 for (Int_t r=0;r<nEntries-1;r++){
113 // Get SOR and EOR scaler records
114 AliTriggerScalersRecord* record1 = scalers->GetScalersRecord(r);
115 const AliTimeStamp* stamp1 = record1->GetTimeStamp();
116 Int_t period = stamp1->GetPeriod();
117 Int_t orbit = stamp1->GetOrbit();
118 printf("%5i %5i %5i %ll\n",r,period,orbit);
122 par[1] = run_duration;
124 if (TMath::Abs(run_duration)<1) return 3;
126 // Get number of colliding bunches per orbit
127 Double_t nBCsPerOrbit = -1;
128 Double_t orbitRate = 11245.;
129 if (refClassName.Contains("1B-ABCE-")){
130 nBCsPerOrbit = lhc->GetNInteractingBunchesMeasured();
131 Printf("Number of BCs from LHC data=%i",nBCsPerOrbit);
132 if (nBCsPerOrbit<0 && l0bempty>0) nBCsPerOrbit = Double_t(l0bempty)/orbitRate/run_duration;
134 // Extract number of bunches per orbit
135 AliTriggerClass* cl = cfg->GetTriggerClass(classId);
136 AliTriggerBCMask* mask = cl->GetBCMask();
137 nBCsPerOrbit = mask->GetNUnmaskedBCs();
139 par[3] = nBCsPerOrbit;
141 Double_t totalBCs = orbitRate*run_duration*nBCsPerOrbit;
142 if (totalBCs<1 || l0b<1) return 4;
143 par[4] = -TMath::Log(1-Double_t(l0b)/totalBCs); // mu