1 #include "AliDisplacedVertexSelection.h"
4 #include "AliESDEvent.h"
6 ClassImp(AliDisplacedVertexSelection)
11 //____________________________________________________________________
12 AliDisplacedVertexSelection::AliDisplacedVertexSelection()
18 //____________________________________________________________________
19 AliDisplacedVertexSelection::AliDisplacedVertexSelection(const AliDisplacedVertexSelection& o)
25 //____________________________________________________________________
26 AliDisplacedVertexSelection&
27 AliDisplacedVertexSelection::operator=(const AliDisplacedVertexSelection& o)
29 if (&o == this) return *this;
33 //____________________________________________________________________
35 AliDisplacedVertexSelection::Output(TList* /*l*/, const char* /* name*/) const
39 //____________________________________________________________________
41 AliDisplacedVertexSelection::Print(Option_t*) const
44 char ind[gROOT->GetDirLevel()+1];
45 for (Int_t i = 0; i < gROOT->GetDirLevel(); i++) ind[i] = ' ';
46 ind[gROOT->GetDirLevel()] = '\0';
47 std::cout << std::boolalpha
48 << std::noboolalpha << std::endl;
52 //____________________________________________________________________
54 AliDisplacedVertexSelection::Process(const AliESDEvent* esd)
56 fVertexZ = 9999; // Default vertex value
57 fCent = 100; // Default centrality value
60 const Float_t kZDCrefSum = -66.5;
61 const Float_t kZDCrefDelta = -2.10;
62 const Float_t kZDCsigmaSum = 3.25;
63 const Float_t kZDCsigmaDelta = 2.25;
64 const Float_t kZDCsigmaSumSat = 2.50;
65 const Float_t kZDCsigmaDeltaSat = 1.35;
67 // Corrections for magnetic fields
68 const Float_t kZEMcorrPlusPlus[21] = {0.6840,0.7879,0.8722,
74 1.0574,1.1060,1.1617};
75 const Float_t kZEMcorrMoinsMoins[21] = {0.7082,0.8012,0.8809,
81 1.0782,1.1224,1.1634};
83 // --- Get the ESD object ------------------------------------------
84 AliESDZDC* esdZDC = esd->GetESDZDC();
86 AliWarning("No ZDC ESD object!");
89 Double_t currentL3 = esd->GetCurrentL3();
90 Double_t currentDipo = esd->GetCurrentDip();
92 // --- ZDC and ZEM energy signal -----------------------------------
93 Double_t zdcEn = (esdZDC->GetZDCN1Energy()+
94 esdZDC->GetZDCP1Energy()+
95 esdZDC->GetZDCN2Energy()+
96 esdZDC->GetZDCP2Energy());
97 Double_t zemEn = (esdZDC->GetZDCEMEnergy(0)+
98 esdZDC->GetZDCEMEnergy(1))/8.;
100 // --- Calculate DeltaT and sumT -----------------------------------
101 Double_t deltaTdc = 0;
104 for(Int_t i = 0; i < 4; ++i) {
105 if(esdZDC->GetZDCTDCData(10,i) != 0) {
106 Double_t tdcCnoCorr = 0.025*(esdZDC->GetZDCTDCData(10,i)-
107 esdZDC->GetZDCTDCData(14,i));
108 Double_t tdcC = esdZDC->GetZDCTDCCorrected(10,i);
109 for(Int_t j = 0; j < 4; ++j) {
110 if(esdZDC->GetZDCTDCData(12,j) != 0) {
111 Double_t tdcAnoCorr = 0.025*(esdZDC->GetZDCTDCData(12,j)-
112 esdZDC->GetZDCTDCData(14,j));
113 Double_t tdcA = esdZDC->GetZDCTDCCorrected(12,j);
114 if(esdZDC->TestBit(AliESDZDC::kCorrectedTDCFilled)) {
115 deltaTdc = tdcC-tdcA;
119 deltaTdc = tdcCnoCorr-tdcAnoCorr;
120 sumTdc = tdcCnoCorr+tdcAnoCorr;
127 // --- Find the vertex ---------------------------------------------
128 if(deltaTdc!=0. || sumTdc!=0.) {
129 for (Int_t k = -10; k <= 10; ++k) {
130 Float_t zsat = 2.55F * k;
131 Float_t delta = (k == 0 ? kZDCsigmaDelta : kZDCsigmaDeltaSat);
132 Float_t sum = (k == 0 ? kZDCsigmaSum : kZDCsigmaSumSat);
133 Float_t dT = deltaTdc - kZDCrefDelta - zsat;
134 Float_t sT = sumTdc - kZDCrefSum - zsat;
135 Float_t check = dT * dT / delta / delta + sT * sT / sum / sum;
136 if (check > 1.0 || k == 0) continue;
141 // Correct zem energy
142 if(currentDipo>0 && currentL3>0) zemEn /= kZEMcorrPlusPlus[k+10];
143 if(currentDipo<0 && currentL3<0) zemEn /= kZEMcorrMoinsMoins[k+10];
147 // --- Calculate the centrality ------------------------------------
148 Float_t c1, c2, c3, c4, c5;
149 Int_t runnumber = esd->GetRunNumber();
150 if (runnumber < 137722 && runnumber >= 137161 ) {
157 else if (runnumber < 139172 && runnumber >= 137722) {
164 else if (runnumber >= 139172) {
180 Float_t slope = (zdcEn + c1) / (zemEn - c2) + c3;
181 Float_t zdcCent = (TMath::ATan(slope) - c4) / c5;
182 if (zdcCent >= 0) fCent = zdcCent;
188 //____________________________________________________________________
190 AliDisplacedVertexSelection::CheckDisplacedVertex(const AliESDEvent* esd) const {
191 // Code taken directly from M.Guilbaud.
192 AliWarning("This method is deprecated");
193 Double_t zvtx = 9999.;
195 Float_t kZDCrefSum =-66.5;
196 Float_t kZDCrefDelta =-2.10;
197 Float_t kZDCsigmaSum = 3.25;
198 Float_t kZDCsigmaDelta = 2.25;
199 Float_t kZDCsigmaSumSat = 2.50;
200 Float_t kZDCsigmaDeltaSat = 1.35;
202 AliESDZDC* esdZDC = esd -> GetESDZDC();
204 /* Double_t zdcNCEnergy = esdZDC->GetZDCN1Energy();
205 Double_t fZpcEnergy = esdZDC->GetZDCP1Energy();
206 Double_t fZnaEnergy = esdZDC->GetZDCN2Energy();
207 Double_t fZpaEnergy = esdZDC->GetZDCP2Energy();
208 Double_t fZem1Energy = esdZDC->GetZDCEMEnergy(0);
209 Double_t fZem2Energy = esdZDC->GetZDCEMEnergy(1);*/
211 //Double_t fzdcEn = (esdZDC->GetZDCN1Energy()+esdZDC->GetZDCP1Energy()+esdZDC->GetZDCN2Energy()+esdZDC->GetZDCP2Energy());
212 //Double_t fzemEn = (esdZDC->GetZDCEMEnergy(0)+esdZDC->GetZDCEMEnergy(1))/8.;
219 Double_t deltaTdc = 0;
222 for(Int_t i = 0; i < 4; ++i) {
223 if(esdZDC->GetZDCTDCData(10,i) != 0) {
224 Double_t tdcCnoCorr = 0.025*(esdZDC->GetZDCTDCData(10,i)-
225 esdZDC->GetZDCTDCData(14,i));
226 Double_t tdcC = esdZDC->GetZDCTDCCorrected(10,i);
227 for(Int_t j = 0; j < 4; ++j) {
228 if(esdZDC->GetZDCTDCData(12,j) != 0) {
229 Double_t tdcAnoCorr = 0.025*(esdZDC->GetZDCTDCData(12,j)-
230 esdZDC->GetZDCTDCData(14,j));
231 Double_t tdcA = esdZDC->GetZDCTDCCorrected(12,j);
232 if(esdZDC->TestBit(AliESDZDC::kCorrectedTDCFilled)) {
233 deltaTdc = tdcC-tdcA;
237 deltaTdc = tdcCnoCorr-tdcAnoCorr;
238 sumTdc = tdcCnoCorr+tdcAnoCorr;
245 ///////////////////////
246 //Global Event Filter//
247 ///////////////////////
248 Bool_t zdcAccSat[21];
250 // Bool_t zdcAccSatRunClass[21];
251 for(Int_t k = -10; k <= 10; k++) zdcAccSat[k+10] = kFALSE;
254 if(deltaTdc!=0. || sumTdc!=0.) {
255 for (Int_t k = -10; k <= 10; ++k) {
256 Float_t zsat = 2.55F * k;
259 if(((deltaTdc-kZDCrefDelta)*(deltaTdc-kZDCrefDelta)/
260 (kZDCsigmaDelta*kZDCsigmaDelta)+
261 (sumTdc -kZDCrefSum ) * (sumTdc -kZDCrefSum ) /
262 (kZDCsigmaSum *kZDCsigmaSum))<=1.0) {
263 zdcAccSat[k+10] = kTRUE;
267 if(((deltaTdc-kZDCrefDelta-zsat)*(deltaTdc-kZDCrefDelta-zsat)/
268 (kZDCsigmaDeltaSat*kZDCsigmaDeltaSat)+
269 (sumTdc -kZDCrefSum -zsat)*(sumTdc -kZDCrefSum -zsat)/
270 (kZDCsigmaSumSat *kZDCsigmaSumSat ))<=1.0) {
271 zdcAccSat[k+10] = kTRUE;
277 for(Int_t k=-10;k<=10;++k) {
278 if(zdcAccSat[k+10] && k!=0 ) {
279 //std::cout<<"Displaced vertex at "<<37.5*(Float_t)k<<" cm"<<std::endl;
280 zvtx = 37.5*(Float_t)k;
287 //____________________________________________________________________
289 AliDisplacedVertexSelection::CalculateDisplacedVertexCent(const AliESDEvent* esd) const
291 Float_t kZDCrefSum =-66.5;
292 Float_t kZDCrefDelta =-2.10;
293 Float_t kZDCsigmaSum = 3.25;
294 Float_t kZDCsigmaDelta = 2.25;
295 Float_t kZDCsigmaSumSat = 2.50;
296 Float_t kZDCsigmaDeltaSat = 1.35;
298 AliESDZDC* esdZDC = esd -> GetESDZDC();
300 Int_t runnumber = esd->GetRunNumber();
301 Double_t fcurrentL3 = esd->GetCurrentL3();
302 Double_t fcurrentDipo = esd->GetCurrentDip();
305 Double_t fzdcEn = (esdZDC->GetZDCN1Energy()+
306 esdZDC->GetZDCP1Energy()+
307 esdZDC->GetZDCN2Energy()+
308 esdZDC->GetZDCP2Energy());
309 Double_t fzemEn = (esdZDC->GetZDCEMEnergy(0)+
310 esdZDC->GetZDCEMEnergy(1))/8.;
316 Double_t deltaTdc = 0;
319 for(Int_t i = 0; i < 4; ++i) {
320 if(esdZDC->GetZDCTDCData(10,i) != 0) {
321 Double_t tdcCnoCorr = 0.025*(esdZDC->GetZDCTDCData(10,i)-
322 esdZDC->GetZDCTDCData(14,i));
323 Double_t tdcC = esdZDC->GetZDCTDCCorrected(10,i);
324 for(Int_t j = 0; j < 4; ++j) {
325 if(esdZDC->GetZDCTDCData(12,j) != 0) {
326 Double_t tdcAnoCorr = 0.025*(esdZDC->GetZDCTDCData(12,j)-
327 esdZDC->GetZDCTDCData(14,j));
328 Double_t tdcA = esdZDC->GetZDCTDCCorrected(12,j);
329 if(esdZDC->TestBit(AliESDZDC::kCorrectedTDCFilled)) {
330 deltaTdc = tdcC-tdcA;
334 deltaTdc = tdcCnoCorr-tdcAnoCorr;
335 sumTdc = tdcCnoCorr+tdcAnoCorr;
342 ///////////////////////
343 //Global Event Filter//
344 ///////////////////////
345 Bool_t zdcAccSat[21];
346 // Bool_t zdcAccSatRunClass[21];
347 for(Int_t k = -10; k <= 10; k++) zdcAccSat[k+10] = kFALSE;
349 if(deltaTdc!=0. || sumTdc!=0.) {
350 for(Int_t k = -10; k <= 10; ++k) {
351 Float_t zsat = 2.55*(Float_t)k;
354 if(((deltaTdc-kZDCrefDelta)*(deltaTdc-kZDCrefDelta)/
355 (kZDCsigmaDelta*kZDCsigmaDelta)+
356 (sumTdc -kZDCrefSum )*(sumTdc -kZDCrefSum )/
357 (kZDCsigmaSum *kZDCsigmaSum))<=1.0) {
358 zdcAccSat[k+10] = kTRUE;
362 if(((deltaTdc-kZDCrefDelta-zsat)*(deltaTdc-kZDCrefDelta-zsat)/
363 (kZDCsigmaDeltaSat*kZDCsigmaDeltaSat)+
364 (sumTdc -kZDCrefSum -zsat)*(sumTdc -kZDCrefSum -zsat)/
365 (kZDCsigmaSumSat *kZDCsigmaSumSat ))<=1.0) {
366 zdcAccSat[k+10] = kTRUE;
374 Float_t kZEMcorrPlusPlus[21] = {0.6840,0.7879,0.8722,0.9370,0.9837,1.0137,
375 1.0292,1.0327,1.0271,1.0152,1.0000,0.9844,
376 0.9714,0.9634,0.9626,0.9708,0.9891,1.0181,
377 1.0574,1.1060,1.1617};
378 Float_t kZEMcorrMoinsMoins[21] = {0.7082,0.8012,0.8809,0.9447,0.9916,1.0220,
379 1.0372,1.0395,1.0318,1.0174,1.0000,0.9830,
380 0.9699,0.9635,0.9662,0.9794,1.0034,1.0371,
381 1.0782,1.1224,1.1634};
386 for(Int_t k = -10; k <= 10; ++k) {
387 if(zdcAccSat[k+10]) {
388 //std::cout<<"Vertex at "<<37.5*(Float_t)k<<"cm from cent"<<std::endl;
389 if(fcurrentDipo>0 && fcurrentL3>0) {
390 fzemEn /= kZEMcorrPlusPlus[k+10];
392 if(fcurrentDipo<0 && fcurrentL3<0) {
393 fzemEn /= kZEMcorrMoinsMoins[k+10];
398 ////////////////////////
399 //Centrality selection//
400 ////////////////////////
401 Double_t fzdcPercentile = -1;
405 if(runnumber < 137722 && runnumber >= 137161 ) {
407 slope = (fzdcEn + 16992.)/(fzemEn - 345.);
408 slope += 2.23902e+02;
409 fzdcPercentile = (TMath::ATan(slope) - 1.56667)/9.49434e-05;
410 if (fzdcPercentile<0) fzdcPercentile = 0;
412 else fzdcPercentile = 100; }
413 else if(runnumber < 139172 && runnumber >= 137722) {
415 slope = (fzdcEn + 15000.)/(fzemEn - 295.);
416 slope += 2.23660e+02;
417 fzdcPercentile = (TMath::ATan(slope) - 1.56664)/8.99571e-05;
418 if (fzdcPercentile<0) fzdcPercentile = 0;
420 else fzdcPercentile = 100;
422 else if(runnumber >= 139172) {
424 slope = (fzdcEn + 16992.)/(fzemEn - 345.);
425 slope += 2.04789e+02;
426 fzdcPercentile = (TMath::ATan(slope) - 1.56629)/1.02768e-04;
427 if (fzdcPercentile<0) fzdcPercentile = 0;
429 else fzdcPercentile = 100;
433 slope = (fzdcEn + 16992.)/(fzemEn - 345.);
434 slope += 2.04789e+02;
435 fzdcPercentile = (TMath::ATan(slope) - 1.56629)/1.02768e-04;
436 if(fzdcPercentile<0) fzdcPercentile = 0;
438 else fzdcPercentile = 100;
441 if(fzdcPercentile > 0 && fzdcPercentile <100) {
442 //std::cout<<fzdcPercentile<<std::endl;
443 cent = fzdcPercentile;
447 //____________________________________________________________________