]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGPP/EVS/triggerInfo.C
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGPP / EVS / triggerInfo.C
1 #ifndef __CINT__
2 #include "TMath.h"
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"
14 #endif
15
16 UInt_t dif(UInt_t stop, UInt_t start){
17   UInt_t d;
18   if(stop >= start) d=stop-start;
19   else d = stop+(0xffffffff-start)+1;
20   return d;
21 };
22
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());
26   man->SetRun(run);
27   // Get scalers 
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(); }
30
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();
35   
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());
55     }
56   }
57   return classes;
58 }
59
60
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());
64   man->SetRun(run);
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();
69   }
70   
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();
74
75   // Get scalers 
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();
79
80   Double_t run_duration   = 0;
81   ULong64_t l0b      = 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());
107   }
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);
111   
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);
119   }
120
121   
122   par[1] = run_duration;
123   par[2] = l0b;
124   if (TMath::Abs(run_duration)<1) return 3;
125
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;
133   } else {
134     // Extract number of bunches per orbit
135     AliTriggerClass* cl = cfg->GetTriggerClass(classId);
136     AliTriggerBCMask* mask = cl->GetBCMask();
137     nBCsPerOrbit = mask->GetNUnmaskedBCs();
138   }
139   par[3] = nBCsPerOrbit;
140   
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
144   return 0;
145 }