Changing to centrality dependent corrections
[u/mrichter/AliRoot.git] / ANALYSIS / TenderSupplies / AliVZEROTenderSupply.cxx
CommitLineData
782d2143 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16
17///////////////////////////////////////////////////////////////////////////////
18// //
19// Recalculate VZERO timing and decision using the tender //
20// (in case the LHC phase drift is updated in OCDB) //
21// //
22///////////////////////////////////////////////////////////////////////////////
23
24#include <TList.h>
25#include <TObjString.h>
26#include <TChain.h>
27#include <TF1.h>
28
29#include <AliLog.h>
30#include <AliESDEvent.h>
31#include <AliESDVZERO.h>
32#include <AliCDBId.h>
33#include <AliCDBManager.h>
34#include <AliCDBEntry.h>
35#include <AliTender.h>
36#include <AliLHCClockPhase.h>
37#include <AliVZEROCalibData.h>
38#include <AliVZEROTriggerMask.h>
054ed67b 39#include <AliVZEROReconstructor.h>
782d2143 40
41#include "AliVZEROTenderSupply.h"
42
43ClassImp(AliVZEROTenderSupply)
44
45AliVZEROTenderSupply::AliVZEROTenderSupply() :
46 AliTenderSupply(),
47 fCalibData(NULL),
48 fTimeSlewing(NULL),
7bf5b178 49 fRecoParam(NULL),
782d2143 50 fLHCClockPhase(0),
51 fDebug(kFALSE)
52{
53 //
54 // default ctor
55 //
56}
57
58//_____________________________________________________
59AliVZEROTenderSupply::AliVZEROTenderSupply(const char *name, const AliTender *tender) :
60 AliTenderSupply(name,tender),
61 fCalibData(NULL),
62 fTimeSlewing(NULL),
7bf5b178 63 fRecoParam(NULL),
782d2143 64 fLHCClockPhase(0),
65 fDebug(kFALSE)
66{
67 //
68 // named ctor
69 //
70}
71
72//_____________________________________________________
73void AliVZEROTenderSupply::Init()
74{
75 //
76 // Initialise VZERO tender
77 //
78}
79
80//_____________________________________________________
81void AliVZEROTenderSupply::ProcessEvent()
82{
83 //
84 // Reapply the LHC-clock phase drift
85 //
86
87 AliESDEvent *event=fTender->GetEvent();
88 if (!event) return;
89
90 //load gain correction if run has changed
91 if (fTender->RunChanged()){
92 if (fDebug) printf("AliVZEROTenderSupply::ProcessEvent - Run Changed (%d)\n",fTender->GetRun());
93 GetPhaseCorrection();
94
054ed67b 95 AliCDBEntry *entryGeom = fTender->GetCDBManager()->Get("GRP/Geometry/Data",fTender->GetRun());
96 if (!entryGeom) {
97 AliError("No geometry entry is found");
98 return;
99 } else {
100 if (fDebug) printf("AliVZEROTenderSupply::Used geometry entry: %s\n",entryGeom->GetId().ToString().Data());
101 }
102
782d2143 103 AliCDBEntry *entryCal = fTender->GetCDBManager()->Get("VZERO/Calib/Data",fTender->GetRun());
104 if (!entryCal) {
105 AliError("No VZERO calibration entry is found");
106 fCalibData = NULL;
107 return;
108 } else {
109 fCalibData = (AliVZEROCalibData*)entryCal->GetObject();
110 if (fDebug) printf("AliVZEROTenderSupply::Used VZERO calibration entry: %s\n",entryCal->GetId().ToString().Data());
111 }
112
113 AliCDBEntry *entrySlew = fTender->GetCDBManager()->Get("VZERO/Calib/TimeSlewing",fTender->GetRun());
114 if (!entrySlew) {
115 AliError("VZERO time slewing function is not found in OCDB !");
116 fTimeSlewing = NULL;
117 return;
118 } else {
119 fTimeSlewing = (TF1*)entrySlew->GetObject();
120 if (fDebug) printf("AliVZEROTenderSupply::Used VZERO time slewing entry: %s\n",entrySlew->GetId().ToString().Data());
121 }
7bf5b178 122
123 AliCDBEntry *entryRecoParam = fTender->GetCDBManager()->Get("VZERO/Calib/RecoParam",fTender->GetRun());
124 if (!entryRecoParam) {
125 AliError("VZERO reco-param object is not found in OCDB !");
126 fRecoParam = NULL;
127 return;
128 } else {
9bc3a9d3 129 TObjArray *recoParamArr = (TObjArray*)entryRecoParam->GetObject();
7bf5b178 130 if (fDebug) printf("AliVZEROTenderSupply::Used VZERO reco-param entry: %s\n",entryRecoParam->GetId().ToString().Data());
9bc3a9d3 131 fRecoParam = NULL;
132 for(Int_t i = 0; i < recoParamArr->GetEntriesFast(); i++) {
133 AliVZERORecoParam *par = (AliVZERORecoParam*)recoParamArr->At(i);
134 if (!par) continue;
135 if (par->IsDefault()) fRecoParam = par;
136 }
137 if (!fRecoParam) AliError("No default VZERO reco-param object is found in OCDB !");
7bf5b178 138 }
782d2143 139 }
140
7bf5b178 141 if (!fCalibData || !fTimeSlewing || !fRecoParam) {
054ed67b 142 AliWarning("VZERO calibration objects not found!");
143 return;
144 }
782d2143 145 //
146 // correct VZERO time signals and decision
147 //
148 AliESDVZERO *esdVZERO = event->GetVZEROData();
149 if (!esdVZERO) {
150 AliError("No VZERO object is found inside ESD!");
151 return;
152 }
153 if (!esdVZERO->TestBit(AliESDVZERO::kDecisionFilled)) {
154 AliWarning("VZERO offline trigger decisions were not filled in ESD, the tender supply is disabled");
155 return;
156 }
157
054ed67b 158 if (fDebug) printf("LHC-clock phase correction: %f\n",fLHCClockPhase);
159
160 if (fDebug) printf("Original VZERO decision %d (%f ns) and %d (%f ns)\n",
161 esdVZERO->GetV0ADecision(),esdVZERO->GetV0ATime(),
162 esdVZERO->GetV0CDecision(),esdVZERO->GetV0CTime());
782d2143 163 Float_t time[64];
164 for(Int_t i = 0; i < 64; ++i) {
165 time[i] = esdVZERO->GetTime(i);
054ed67b 166 if (time[i] > (AliVZEROReconstructor::kInvalidTime + 1e-6))
167 time[i] += fLHCClockPhase;
782d2143 168 }
169 esdVZERO->SetTime(time);
170
171 {
172 AliVZEROTriggerMask triggerMask;
7bf5b178 173 triggerMask.SetRecoParam(fRecoParam);
782d2143 174 triggerMask.FillMasks(esdVZERO, fCalibData, fTimeSlewing);
175 }
054ed67b 176 if (fDebug) printf("Modified VZERO decision %d (%f ns) and %d (%f ns)\n",
177 esdVZERO->GetV0ADecision(),esdVZERO->GetV0ATime(),
178 esdVZERO->GetV0CDecision(),esdVZERO->GetV0CTime());
782d2143 179
180}
181
182//_____________________________________________________
183void AliVZEROTenderSupply::GetPhaseCorrection()
184{
185 //
186 // Get Gain splines from OCDB
187 //
188
189 AliInfo("Get LHC-clock phase correction");
190
191 //
192 //find previous entry from the UserInfo
193 //
194 TTree *tree=((TChain*)fTender->GetInputData(0))->GetTree();
195 if (!tree) {
196 AliError("Tree not found in ESDhandler");
197 return;
198 }
199
200 TList *userInfo=(TList*)tree->GetUserInfo();
201 if (!userInfo) {
202 AliError("No UserInfo found in tree");
203 return;
204 }
205
206 TList *cdbList=(TList*)userInfo->FindObject("cdbList");
207 if (!cdbList) {
208 AliError("No cdbList found in UserInfo");
209 if (AliLog::GetGlobalLogLevel()>=AliLog::kError) userInfo->Print();
210 return;
211 }
212
213 Float_t oldPhase = 0;
214
215 TIter nextCDB(cdbList);
216 TObjString *os=0x0;
217 while ( (os=(TObjString*)nextCDB()) ){
218 if (!(os->GetString().Contains("GRP/Calib/LHCClockPhase"))) continue;
219 AliCDBId *id=AliCDBId::MakeFromString(os->GetString());
220
221 AliCDBEntry *entry=fTender->GetCDBManager()->Get(*id);
222 if (!entry) {
223 AliError("The previous LHC-clock phase entry is not found");
224 delete id;
225 return;
226 }
227
228 if (fDebug) printf("AliVZEROTenderSupply::Used old LHC-clock phase entry: %s\n",entry->GetId().ToString().Data());
229
230 AliLHCClockPhase *phase = (AliLHCClockPhase*)entry->GetObject();
231 if (!phase) {
232 AliError("Phase object is not found in the calibration entry");
233 delete id;
234 return;
235 }
236
237 oldPhase = phase->GetMeanPhase();
238
239 delete id;
240 break;
241 }
242
243 //
244 //new LHC-clock phase entry
245 //
246 Float_t newPhase = 0;
247 AliCDBEntry *entryNew=fTender->GetCDBManager()->Get("GRP/Calib/LHCClockPhase",fTender->GetRun());
248 if (!entryNew) {
249 AliError("No new LHC-clock phase calibration entry is found");
250 return;
251 }
252 if (fDebug) printf("AliVZEROTenderSupply::Used new LHC-clock phase entry: %s\n",entryNew->GetId().ToString().Data());
253
254 AliLHCClockPhase *phase2 = (AliLHCClockPhase*)entryNew->GetObject();
255 if (!phase2) {
256 AliError("Phase object is not found in the calibration entry");
257 return;
258 }
259
260 newPhase = phase2->GetMeanPhase();
261
262 fLHCClockPhase = newPhase - oldPhase;
263}