+Bool_t
+AliDisplacedVertexSelection::Process(const AliESDEvent* esd)
+{
+ fVertexZ = 9999; // Default vertex value
+ fCent = 100; // Default centrality value
+
+ // Some constants
+ const Float_t kZDCrefSum = -66.5;
+ const Float_t kZDCrefDelta = -2.10;
+ const Float_t kZDCsigmaSum = 3.25;
+ const Float_t kZDCsigmaDelta = 2.25;
+ const Float_t kZDCsigmaSumSat = 2.50;
+ const Float_t kZDCsigmaDeltaSat = 1.35;
+
+ // Corrections for magnetic fields
+ const Float_t kZEMcorrPlusPlus[21] = {0.6840,0.7879,0.8722,
+ 0.9370,0.9837,1.0137,
+ 1.0292,1.0327,1.0271,
+ 1.0152,1.0000,0.9844,
+ 0.9714,0.9634,0.9626,
+ 0.9708,0.9891,1.0181,
+ 1.0574,1.1060,1.1617};
+ const Float_t kZEMcorrMoinsMoins[21] = {0.7082,0.8012,0.8809,
+ 0.9447,0.9916,1.0220,
+ 1.0372,1.0395,1.0318,
+ 1.0174,1.0000,0.9830,
+ 0.9699,0.9635,0.9662,
+ 0.9794,1.0034,1.0371,
+ 1.0782,1.1224,1.1634};
+
+ // --- Get the ESD object ------------------------------------------
+ AliESDZDC* esdZDC = esd->GetESDZDC();
+ if (!esdZDC) {
+ AliWarning("No ZDC ESD object!");
+ return false;
+ }
+ Double_t currentL3 = esd->GetCurrentL3();
+ Double_t currentDipo = esd->GetCurrentDip();
+
+ // --- ZDC and ZEM energy signal -----------------------------------
+ Double_t zdcEn = (esdZDC->GetZDCN1Energy()+
+ esdZDC->GetZDCP1Energy()+
+ esdZDC->GetZDCN2Energy()+
+ esdZDC->GetZDCP2Energy());
+ Double_t zemEn = (esdZDC->GetZDCEMEnergy(0)+
+ esdZDC->GetZDCEMEnergy(1))/8.;
+
+ // --- Calculate DeltaT and sumT -----------------------------------
+ Double_t deltaTdc = 0;
+ Double_t sumTdc = 0;
+
+ for(Int_t i = 0; i < 4; ++i) {
+ if(esdZDC->GetZDCTDCData(10,i) != 0) {
+ Double_t tdcCnoCorr = 0.025*(esdZDC->GetZDCTDCData(10,i)-
+ esdZDC->GetZDCTDCData(14,i));
+ Double_t tdcC = esdZDC->GetZDCTDCCorrected(10,i);
+ for(Int_t j = 0; j < 4; ++j) {
+ if(esdZDC->GetZDCTDCData(12,j) != 0) {
+ Double_t tdcAnoCorr = 0.025*(esdZDC->GetZDCTDCData(12,j)-
+ esdZDC->GetZDCTDCData(14,j));
+ Double_t tdcA = esdZDC->GetZDCTDCCorrected(12,j);
+ if(esdZDC->TestBit(AliESDZDC::kCorrectedTDCFilled)) {
+ deltaTdc = tdcC-tdcA;
+ sumTdc = tdcC+tdcA;
+ }
+ else {
+ deltaTdc = tdcCnoCorr-tdcAnoCorr;
+ sumTdc = tdcCnoCorr+tdcAnoCorr;
+ }
+ }
+ }
+ }
+ }
+
+ // --- Find the vertex ---------------------------------------------
+ if(deltaTdc!=0. || sumTdc!=0.) {
+ for (Int_t k = -10; k <= 10; ++k) {
+ Float_t zsat = 2.55F * k;
+ Float_t delta = (k == 0 ? kZDCsigmaDelta : kZDCsigmaDeltaSat);
+ Float_t sum = (k == 0 ? kZDCsigmaSum : kZDCsigmaSumSat);
+ Float_t dT = deltaTdc - kZDCrefDelta - zsat;
+ Float_t sT = sumTdc - kZDCrefSum - zsat;
+ Float_t check = dT * dT / delta / delta + sT * sT / sum / sum;
+ if (check > 1.0 || k == 0) continue;
+
+ // Set the vertex
+ fVertexZ = 37.5 * k;
+
+ // Correct zem energy
+ if(currentDipo>0 && currentL3>0) zemEn /= kZEMcorrPlusPlus[k+10];
+ if(currentDipo<0 && currentL3<0) zemEn /= kZEMcorrMoinsMoins[k+10];
+ }
+ }
+
+ // --- Calculate the centrality ------------------------------------
+ Float_t c1, c2, c3, c4, c5;
+ Int_t runnumber = esd->GetRunNumber();
+ if (runnumber < 137722 && runnumber >= 137161 ) {
+ c1 = 16992;
+ c2 = 345;
+ c3 = 2.23902e+02;
+ c4 = 1.56667;
+ c5 = 9.49434e-05;
+ }
+ else if (runnumber < 139172 && runnumber >= 137722) {
+ c1 = 15000;
+ c2 = 295;
+ c3 = 2.23660e+02;
+ c4 = 1.56664;
+ c5 = 8.99571e-05;
+ }
+ else if (runnumber >= 139172) {
+ c1 = 16992;
+ c2 = 345;
+ c3 = 2.04789e+02;
+ c4 = 1.56629;
+ c5 = 1.02768e-04;
+ }
+ else {
+ c1 = 16992;
+ c2 = 345;
+ c3 = 2.04789e+02;
+ c4 = 1.56629;
+ c5 = 1.02768e-04;
+ }
+
+ if (zemEn > c2) {
+ Float_t slope = (zdcEn + c1) / (zemEn - c2) + c3;
+ Float_t zdcCent = (TMath::ATan(slope) - c4) / c5;
+ if (zdcCent >= 0) fCent = zdcCent;
+ }