1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // ************** Class for ZDC reconstruction ************** //
21 // Author: Chiara.Oppedisano@to.infn.it //
23 // NOTATIONS ADOPTED TO IDENTIFY DETECTORS (used in different ages!): //
24 // (ZN1,ZP1) or (ZNC, ZPC) or RIGHT refers to side C (RB26) //
25 // (ZN2,ZP2) or (ZNA, ZPA) or LEFT refers to side A (RB24) //
27 ///////////////////////////////////////////////////////////////////////////////
35 #include "AliRawReader.h"
36 #include "AliESDEvent.h"
37 #include "AliESDZDC.h"
38 #include "AliZDCDigit.h"
39 #include "AliZDCRawStream.h"
40 #include "AliZDCReco.h"
41 #include "AliZDCReconstructor.h"
42 #include "AliZDCPedestals.h"
43 #include "AliZDCEnCalib.h"
44 #include "AliZDCTowerCalib.h"
45 #include "AliZDCRecoParam.h"
46 #include "AliZDCRecoParampp.h"
47 #include "AliZDCRecoParamPbPb.h"
48 #include "AliRunInfo.h"
51 ClassImp(AliZDCReconstructor)
52 AliZDCRecoParam *AliZDCReconstructor::fRecoParam=0; //reconstruction parameters
54 //_____________________________________________________________________________
55 AliZDCReconstructor:: AliZDCReconstructor() :
56 fPedData(GetPedestalData()),
57 fEnCalibData(GetEnergyCalibData()),
58 fTowCalibData(GetTowerCalibData()),
62 fIsCalibrationMB(kFALSE),
66 // **** Default constructor
70 //_____________________________________________________________________________
71 AliZDCReconstructor::~AliZDCReconstructor()
74 // if(fRecoParam) delete fRecoParam;
75 if(fPedData) delete fPedData;
76 if(fEnCalibData) delete fEnCalibData;
77 if(fTowCalibData) delete fTowCalibData;
80 //____________________________________________________________________________
81 void AliZDCReconstructor::Init()
83 // Setting reconstruction mode
84 // Getting beam type and beam energy from GRP calibration object
86 TString runType = GetRunInfo()->GetRunType();
87 if((runType.CompareTo("CALIBRATION_MB")) == 0){
88 fIsCalibrationMB = kTRUE;
91 TString beamType = GetRunInfo()->GetBeamType();
92 // This is a temporary solution to allow reconstruction in tests without beam
93 if(((beamType.CompareTo("UNKNOWN"))==0) &&
94 ((runType.CompareTo("PHYSICS"))==0 || (runType.CompareTo("CALIBRATION_BC"))==0)){
97 /*else if((beamType.CompareTo("UNKNOWN"))==0){
98 AliError("\t UNKNOWN beam type\n");
102 if(((beamType.CompareTo("pp"))==0) || ((beamType.CompareTo("p-p"))==0)
103 ||((beamType.CompareTo("PP"))==0) || ((beamType.CompareTo("P-P"))==0)){
106 else if((beamType.CompareTo("A-A")) == 0){
110 fBeamEnergy = GetRunInfo()->GetBeamEnergy();
111 if(fBeamEnergy==0.) AliWarning(" Beam energy value missing -> E_beam = 0");
113 if(fIsCalibrationMB==kFALSE)
114 printf("\n\n ***** ZDC reconstruction initialized for %s @ %1.0f GeV *****\n\n",beamType.Data(), fBeamEnergy);
118 //_____________________________________________________________________________
119 void AliZDCReconstructor::Reconstruct(TTree* digitsTree, TTree* clustersTree) const
121 // *** Local ZDC reconstruction for digits
122 // Works on the current event
124 // Retrieving calibration data
125 // Parameters for mean value pedestal subtraction
127 Float_t meanPed[2*kNch];
128 for(Int_t jj=0; jj<2*kNch; jj++) meanPed[jj] = fPedData->GetMeanPed(jj);
129 // Parameters pedestal subtraction through correlation with out-of-time signals
130 Float_t corrCoeff0[2*kNch], corrCoeff1[2*kNch];
131 for(Int_t jj=0; jj<2*kNch; jj++){
132 corrCoeff0[jj] = fPedData->GetPedCorrCoeff0(jj);
133 corrCoeff1[jj] = fPedData->GetPedCorrCoeff1(jj);
138 AliZDCDigit* pdigit = &digit;
139 digitsTree->SetBranchAddress("ZDC", &pdigit);
140 //printf("\n\t # of digits in tree: %d\n",(Int_t) digitsTree->GetEntries());
143 Float_t tZN1Corr[10], tZP1Corr[10], tZN2Corr[10], tZP2Corr[10];
144 Float_t dZEM1Corr[2], dZEM2Corr[2], sPMRef1[2], sPMRef2[2];
145 for(Int_t i=0; i<10; i++){
146 tZN1Corr[i] = tZP1Corr[i] = tZN2Corr[i] = tZP2Corr[i] = 0.;
147 if(i<2) dZEM1Corr[i] = dZEM2Corr[i] = sPMRef1[i] = sPMRef2[i] = 0.;
150 Int_t digNentries = digitsTree->GetEntries();
151 Float_t ootDigi[kNch];
152 // -- Reading out-of-time signals (last kNch entries) for current event
154 for(Int_t iDigit=kNch; iDigit<digNentries; iDigit++){
155 ootDigi[iDigit] = digitsTree->GetEntry(iDigit);
159 for(Int_t iDigit=0; iDigit<(digNentries/2); iDigit++) {
160 digitsTree->GetEntry(iDigit);
161 if (!pdigit) continue;
163 Int_t det = digit.GetSector(0);
164 Int_t quad = digit.GetSector(1);
166 Float_t ped2SubHg=0., ped2SubLg=0.;
168 if(det==1) pedindex = quad;
169 else if(det==2) pedindex = quad+5;
170 else if(det==3) pedindex = quad+9;
171 else if(det==4) pedindex = quad+12;
172 else if(det==5) pedindex = quad+17;
174 else pedindex = (det-1)/3+22;
177 ped2SubHg = meanPed[pedindex];
178 ped2SubLg = meanPed[pedindex+kNch];
180 else if(fPedSubMode==1){
181 ped2SubHg = corrCoeff1[pedindex]*ootDigi[pedindex]+corrCoeff0[pedindex];
182 ped2SubLg = corrCoeff1[pedindex+kNch]*ootDigi[pedindex+kNch]+corrCoeff0[pedindex+kNch];
185 if(quad != 5){ // ZDC (not reference PTMs!)
186 if(det == 1){ // *** ZNC
187 tZN1Corr[quad] = (Float_t) (digit.GetADCValue(0)-ped2SubHg);
188 tZN1Corr[quad+5] = (Float_t) (digit.GetADCValue(1)-ped2SubLg);
189 if(tZN1Corr[quad]<0.) tZN1Corr[quad] = 0.;
190 if(tZN1Corr[quad+5]<0.) tZN1Corr[quad+5] = 0.;
192 else if(det == 2){ // *** ZP1
193 tZP1Corr[quad] = (Float_t) (digit.GetADCValue(0)-ped2SubHg);
194 tZP1Corr[quad+5] = (Float_t) (digit.GetADCValue(1)-ped2SubLg);
195 if(tZP1Corr[quad]<0.) tZP1Corr[quad] = 0.;
196 if(tZP1Corr[quad+5]<0.) tZP1Corr[quad+5] = 0.;
199 if(quad == 1){ // *** ZEM1
200 dZEM1Corr[0] += (Float_t) (digit.GetADCValue(0)-ped2SubHg);
201 dZEM1Corr[1] += (Float_t) (digit.GetADCValue(1)-ped2SubLg);
202 if(dZEM1Corr[0]<0.) dZEM1Corr[0] = 0.;
203 if(dZEM1Corr[1]<0.) dZEM1Corr[1] = 0.;
205 else if(quad == 2){ // *** ZEM2
206 dZEM2Corr[0] += (Float_t) (digit.GetADCValue(0)-ped2SubHg);
207 dZEM2Corr[1] += (Float_t) (digit.GetADCValue(1)-ped2SubLg);
208 if(dZEM2Corr[0]<0.) dZEM2Corr[0] = 0.;
209 if(dZEM2Corr[1]<0.) dZEM2Corr[1] = 0.;
212 else if(det == 4){ // *** ZN2
213 tZN2Corr[quad] = (Float_t) (digit.GetADCValue(0)-ped2SubHg);
214 tZN2Corr[quad+5] = (Float_t) (digit.GetADCValue(1)-ped2SubLg);
215 if(tZN2Corr[quad]<0.) tZN2Corr[quad] = 0.;
216 if(tZN2Corr[quad+5]<0.) tZN2Corr[quad+5] = 0.;
218 else if(det == 5){ // *** ZP2
219 tZP2Corr[quad] = (Float_t) (digit.GetADCValue(0)-ped2SubHg);
220 tZP2Corr[quad+5] = (Float_t) (digit.GetADCValue(1)-ped2SubLg);
221 if(tZP2Corr[quad]<0.) tZP2Corr[quad] = 0.;
222 if(tZP2Corr[quad+5]<0.) tZP2Corr[quad+5] = 0.;
225 else{ // Reference PMs
227 sPMRef1[0] = (Float_t) (digit.GetADCValue(0)-ped2SubHg);
228 sPMRef1[1] = (Float_t) (digit.GetADCValue(1)-ped2SubLg);
230 if(sPMRef1[0]<0.) sPMRef1[0] = 0.;
231 if(sPMRef2[1]<0.) sPMRef1[1] = 0.;
234 sPMRef2[0] = (Float_t) (digit.GetADCValue(0)-ped2SubHg);
235 sPMRef2[1] = (Float_t) (digit.GetADCValue(1)-ped2SubLg);
237 if(sPMRef2[0]<0.) sPMRef2[0] = 0.;
238 if(sPMRef2[1]<0.) sPMRef2[1] = 0.;
243 /*printf("AliZDCReconstructor: digit #%d det %d quad %d pedHG %1.0f pedLG %1.0f\n",
244 iDigit, det, quad, ped2SubHg, ped2SubLg);
245 printf(" -> pedindex %d\n", pedindex);
246 printf(" HGChain -> RawDig %d DigCorr %1.2f",
247 digit.GetADCValue(0), digit.GetADCValue(0)-ped2SubHg);
248 printf(" LGChain -> RawDig %d DigCorr %1.2f\n",
249 digit.GetADCValue(1), digit.GetADCValue(1)-ped2SubLg);*/
254 for(Int_t jj=0; jj<32; jj++) counts[jj]=0;
256 Int_t evQualityBlock[4] = {1,0,0,0};
257 Int_t triggerBlock[4] = {0,0,0,0};
258 Int_t chBlock[3] = {0,0,0};
261 // reconstruct the event
263 ReconstructEventpp(clustersTree, tZN1Corr, tZP1Corr, tZN2Corr, tZP2Corr,
264 dZEM1Corr, dZEM2Corr, sPMRef1, sPMRef2,
266 evQualityBlock, triggerBlock, chBlock, puBits);
267 else if(fRecoMode==2)
268 ReconstructEventPbPb(clustersTree, tZN1Corr, tZP1Corr, tZN2Corr, tZP2Corr,
269 dZEM1Corr, dZEM2Corr, sPMRef1, sPMRef2,
271 evQualityBlock, triggerBlock, chBlock, puBits);
274 //_____________________________________________________________________________
275 void AliZDCReconstructor::Reconstruct(AliRawReader* rawReader, TTree* clustersTree) const
277 // *** ZDC raw data reconstruction
278 // Works on the current event
280 // Retrieving calibration data
281 // Parameters for pedestal subtraction
283 Float_t meanPed[2*kNch];
284 for(Int_t jj=0; jj<2*kNch; jj++) meanPed[jj] = fPedData->GetMeanPed(jj);
285 // Parameters pedestal subtraction through correlation with out-of-time signals
286 Float_t corrCoeff0[2*kNch], corrCoeff1[2*kNch];
287 for(Int_t jj=0; jj<2*kNch; jj++){
288 corrCoeff0[jj] = fPedData->GetPedCorrCoeff0(jj);
289 corrCoeff1[jj] = fPedData->GetPedCorrCoeff1(jj);
292 Int_t adcZN1[5], adcZN1oot[5], adcZN1lg[5], adcZN1ootlg[5];
293 Int_t adcZP1[5], adcZP1oot[5], adcZP1lg[5], adcZP1ootlg[5];
294 Int_t adcZN2[5], adcZN2oot[5], adcZN2lg[5], adcZN2ootlg[5];
295 Int_t adcZP2[5], adcZP2oot[5], adcZP2lg[5], adcZP2ootlg[5];
296 Int_t adcZEM[2], adcZEMoot[2], adcZEMlg[2], adcZEMootlg[2];
297 Int_t pmRef[2], pmRefoot[2], pmReflg[2], pmRefootlg[2];
298 for(Int_t ich=0; ich<5; ich++){
299 adcZN1[ich] = adcZN1oot[ich] = adcZN1lg[ich] = adcZN1ootlg[ich] = 0;
300 adcZP1[ich] = adcZP1oot[ich] = adcZP1lg[ich] = adcZP1ootlg[ich] = 0;
301 adcZN2[ich] = adcZN2oot[ich] = adcZN2lg[ich] = adcZN2ootlg[ich] = 0;
302 adcZP2[ich] = adcZP2oot[ich] = adcZP2lg[ich] = adcZP2ootlg[ich] = 0;
304 adcZEM[ich] = adcZEMoot[ich] = adcZEMlg[ich] = adcZEMootlg[ich] = 0;
305 pmRef[ich] = pmRefoot[ich] = pmReflg[ich] = pmRefootlg[ich] = 0;
309 Float_t tZN1Corr[10], tZP1Corr[10], tZN2Corr[10], tZP2Corr[10];
310 Float_t dZEM1Corr[2], dZEM2Corr[2], sPMRef1[2], sPMRef2[2];
311 for(Int_t i=0; i<10; i++){
312 tZN1Corr[i] = tZP1Corr[i] = tZN2Corr[i] = tZP2Corr[i] = 0.;
313 if(i<2) dZEM1Corr[i] = dZEM2Corr[i] = sPMRef1[i] = sPMRef2[i] = 0.;
316 Bool_t isScalerOn=kFALSE;
318 UInt_t scalerData[32];
319 for(Int_t k=0; k<32; k++) scalerData[k]=0;
321 Int_t evQualityBlock[4] = {1,0,0,0};
322 Int_t triggerBlock[4] = {0,0,0,0};
323 Int_t chBlock[3] = {0,0,0};
326 //fNRun = (Int_t) rawReader->GetRunNumber();
327 Int_t kFirstADCGeo=0, kLastADCGeo=3, kScalerGeo=8, kPUGeo=29;
328 //Int_t kTrigScales=30, kTrigHistory=31;
330 // loop over raw data
332 AliZDCRawStream rawData(rawReader);
333 while(rawData.Next()){
335 // ***************************** Reading ADCs
336 if((rawData.GetADCModule()>=kFirstADCGeo) && (rawData.GetADCModule()<=kLastADCGeo)){
337 //printf(" **** Reading ADC raw data from module %d **** \n",rawData.GetADCModule());
339 if((rawData.IsADCDataWord()) && (rawData.GetNChannelsOn()<48)) chBlock[0] = kTRUE;
340 if((rawData.IsADCDataWord()) && (rawData.IsOverflow() == kTRUE)) chBlock[1] = kTRUE;
341 if((rawData.IsADCDataWord()) && (rawData.IsUnderflow() == kTRUE)) chBlock[2] = kTRUE;
342 if((rawData.IsADCDataWord()) && (rawData.IsADCEventGood() == kTRUE)) evQualityBlock[0] = kTRUE;
344 if((rawData.IsADCDataWord()) && (rawData.IsUnderflow()==kFALSE)
345 && (rawData.IsOverflow()==kFALSE) && (rawData.IsADCEventGood()==kTRUE)){
347 Int_t adcMod = rawData.GetADCModule();
348 Int_t det = rawData.GetSector(0);
349 Int_t quad = rawData.GetSector(1);
350 Int_t gain = rawData.GetADCGain();
353 // Mean pedestal value subtraction -------------------------------------------------------
354 if(fPedSubMode == 0){
355 // Not interested in o.o.t. signals (ADC modules 2, 3)
356 if(adcMod == 2 || adcMod == 3) continue;
358 if(quad != 5){ // ZDCs (not reference PTMs)
361 if(gain == 0) tZN1Corr[quad] += (Float_t) (rawData.GetADCValue()-meanPed[pedindex]);
362 else tZN1Corr[quad+5] += (Float_t) (rawData.GetADCValue()-meanPed[pedindex+kNch]);
366 if(gain == 0) tZP1Corr[quad] += (Float_t) (rawData.GetADCValue()-meanPed[pedindex]);
367 else tZP1Corr[quad+5] += (Float_t) (rawData.GetADCValue()-meanPed[pedindex+kNch]);
372 if(gain == 0) dZEM1Corr[0] += (Float_t) (rawData.GetADCValue()-meanPed[pedindex]);
373 else dZEM1Corr[1] += (Float_t) (rawData.GetADCValue()-meanPed[pedindex+kNch]);
376 if(gain == 0) dZEM2Corr[0] += (Float_t) (rawData.GetADCValue()-meanPed[pedindex]);
377 else dZEM2Corr[1] += (Float_t) (rawData.GetADCValue()-meanPed[pedindex+kNch]);
382 if(gain == 0) tZN2Corr[quad] += (Float_t) (rawData.GetADCValue()-meanPed[pedindex]);
383 else tZN2Corr[quad+5] += (Float_t) (rawData.GetADCValue()-meanPed[pedindex+kNch]);
387 if(gain == 0) tZP2Corr[quad] += (Float_t) (rawData.GetADCValue()-meanPed[pedindex]);
388 else tZP2Corr[quad+5] += (Float_t) (rawData.GetADCValue()-meanPed[pedindex+kNch]);
391 else{ // reference PM
392 pedindex = (det-1)/3 + 22;
394 if(gain==0) sPMRef1[0] += (Float_t) (rawData.GetADCValue()-meanPed[pedindex]);
395 else sPMRef1[1] += (Float_t) (rawData.GetADCValue()-meanPed[pedindex+kNch]);
398 if(gain==0) sPMRef2[0] += (Float_t) (rawData.GetADCValue()-meanPed[pedindex]);
399 else sPMRef2[1] += (Float_t) (rawData.GetADCValue()-meanPed[pedindex+kNch]);
404 printf(" AliZDCReconstructor: det %d quad %d res %d -> Pedestal[%d] %1.0f",
405 det,quad,gain, pedindex, meanPed[pedindex]);
406 printf(" RawADC %d ADCCorr %1.0f\n",
407 rawData.GetADCValue(), rawData.GetADCValue()-meanPed[pedindex]);
409 }// mean pedestal subtraction
410 // Pedestal subtraction from correlation ------------------------------------------------
411 else if(fPedSubMode == 1){
413 if(adcMod==0 || adcMod==1){
414 if(quad != 5){ // signals from ZDCs
416 if(gain==0) adcZN1[quad] = rawData.GetADCValue();
417 else adcZN1lg[quad] = rawData.GetADCValue();
420 if(gain==0) adcZP1[quad] = rawData.GetADCValue();
421 else adcZP1lg[quad] = rawData.GetADCValue();
424 if(gain==0) adcZEM[quad-1] = rawData.GetADCValue();
425 else adcZEMlg[quad-1] = rawData.GetADCValue();
428 if(gain==0) adcZN2[quad] = rawData.GetADCValue();
429 else adcZN2lg[quad] = rawData.GetADCValue();
432 if(gain==0) adcZP2[quad] = rawData.GetADCValue();
433 else adcZP2lg[quad] = rawData.GetADCValue();
436 else{ // signals from reference PM
437 if(gain==0) pmRef[quad-1] = rawData.GetADCValue();
438 else pmReflg[quad-1] = rawData.GetADCValue();
441 // Out-of-time pedestals
442 else if(adcMod==2 || adcMod==3){
443 if(quad != 5){ // signals from ZDCs
445 if(gain==0) adcZN1oot[quad] = rawData.GetADCValue();
446 else adcZN1ootlg[quad] = rawData.GetADCValue();
449 if(gain==0) adcZP1oot[quad] = rawData.GetADCValue();
450 else adcZP1ootlg[quad] = rawData.GetADCValue();
453 if(gain==0) adcZEMoot[quad-1] = rawData.GetADCValue();
454 else adcZEMootlg[quad-1] = rawData.GetADCValue();
457 if(gain==0) adcZN2oot[quad] = rawData.GetADCValue();
458 else adcZN2ootlg[quad] = rawData.GetADCValue();
461 if(gain==0) adcZP2oot[quad] = rawData.GetADCValue();
462 else adcZP2ootlg[quad] = rawData.GetADCValue();
465 else{ // signals from reference PM
466 if(gain==0) pmRefoot[quad-1] = rawData.GetADCValue();
467 else pmRefootlg[quad-1] = rawData.GetADCValue();
470 } // pedestal subtraction from correlation
472 /*printf("\t AliZDCReconstructor: det %d quad %d res %d -> Ped[%d] = %1.0f\n",
473 det,quad,gain, pedindex, meanPed[pedindex]);*/
476 // ***************************** Reading Scaler
477 else if(rawData.GetADCModule()==kScalerGeo){
478 if(rawData.IsScalerWord()==kTRUE && rawData.IsScEventGood()==kTRUE){
480 scalerData[jsc] = rawData.GetTriggerCount();
482 //printf(" Reconstructed VME Scaler: %d %d ",jsc,scalerData[jsc]);
487 // ***************************** Reading PU
488 else if(rawData.GetADCModule()==kPUGeo){
489 puBits = rawData.GetDetectorPattern();
491 // ***************************** Reading trigger history
492 else if(rawData.IstriggerHistoryWord()==kTRUE){
493 triggerBlock[0] = rawData.IsCPTInputEMDTrigger();
494 triggerBlock[1] = rawData.IsCPTInputSemiCentralTrigger();
495 triggerBlock[2] = rawData.IsCPTInputCentralTrigger();
496 triggerBlock[3] = rawData.IsCPTInputMBTrigger();
502 for(Int_t t=0; t<5; t++){
503 tZN1Corr[t] = adcZN1[t] - (corrCoeff1[t]*adcZN1oot[t]+corrCoeff0[t]);
504 tZN1Corr[t+5] = adcZN1lg[t] - (corrCoeff1[t+kNch]*adcZN1ootlg[t]+corrCoeff0[t+kNch]);
506 tZP1Corr[t] = adcZP1[t] - (corrCoeff1[t+5]*adcZP1oot[t]+corrCoeff0[t+5]);
507 tZP1Corr[t+5] = adcZP1lg[t] - (corrCoeff1[t+5+kNch]*adcZP1ootlg[t]+corrCoeff0[t+5+kNch]);
509 tZN2Corr[t] = adcZN2[t] - (corrCoeff1[t+12]*adcZN2oot[t]+corrCoeff0[t+12]);
510 tZN2Corr[t+5] = adcZN2lg[t] - (corrCoeff1[t+12+kNch]*adcZN2ootlg[t]+corrCoeff0[t+12+kNch]);
512 tZP2Corr[t] = adcZP2[t] - (corrCoeff1[t+17]*adcZP2oot[t]+corrCoeff0[t+17]);
513 tZP2Corr[t+5] = adcZP2lg[t] - (corrCoeff1[t+17+kNch]*adcZP2ootlg[t]+corrCoeff0[t+17+kNch]);
514 // 0---------0 Ch. debug 0---------0
515 /* printf("\n\n ---------- Debug of pedestal subtraction from correlation ----------\n");
516 printf("\tCorrCoeff0\tCorrCoeff1\n");
517 printf(" ZN1 %d\t%1.0f\t%1.0f\n",t,corrCoeff0[t],corrCoeff1[t]);
518 printf(" ZN1lg %d\t%1.0f\t%1.0f\n",t+kNch,corrCoeff0[t+kNch],corrCoeff1[t+kNch]);
519 printf(" ZP1 %d\t%1.0f\t%1.0f\n",t+5,corrCoeff0[t+5],corrCoeff1[t+5]);
520 printf(" ZP1lg %d\t%1.0f\t%1.0f\n",t+5+kNch,corrCoeff0[t+5+kNch],corrCoeff1[t+5+kNch]);
521 printf(" ZN2 %d\t%1.0f\t%1.0f\n",t+12,corrCoeff0[t+12],corrCoeff1[t+12]);
522 printf(" ZN2lg %d\t%1.0f\t%1.0f\n",t+12+kNch,corrCoeff0[t+12+kNch],corrCoeff1[t+12+kNch]);
523 printf(" ZP2 %d\t%1.0f\t%1.0f\n",t+17,corrCoeff0[t+17],corrCoeff1[t+17]);
524 printf(" ZP2lg %d\t%1.0f\t%1.0f\n",t+17+kNch,corrCoeff0[t+17+kNch],corrCoeff1[t+17+kNch]);
526 printf("ZN1 -> rawADC %d\tpedestal%1.2f\tcorrADC%1.2f\n",
527 adcZN1[t],(corrCoeff1[t]*adcZN1oot[t]+corrCoeff0[t]),tZN1Corr[t]);
528 printf(" lg -> rawADC %d\tpedestal%1.2f\tcorrADC%1.2f\n",
529 adcZN1lg[t],(corrCoeff1[t+kNch]*adcZN1ootlg[t]+corrCoeff0[t+kNch]),tZN1Corr[t+5]);
531 printf("ZP1 -> rawADC %d\tpedestal%1.2f\tcorrADC%1.2f\n",
532 adcZP1[t],(corrCoeff1[t+5]*adcZP1oot[t]+corrCoeff0[t+5]),tZP1Corr[t]);
533 printf(" lg -> rawADC %d\tpedestal%1.2f\tcorrADC%1.2f\n",
534 adcZP1lg[t],(corrCoeff1[t+5+kNch]*adcZP1ootlg[t]+corrCoeff0[t+5+kNch]),tZP1Corr[t+5]);
536 printf("ZN2 -> rawADC %d\tpedestal%1.2f\tcorrADC%1.2f\n",
537 adcZN2[t],(corrCoeff1[t+12]*adcZN2oot[t]+corrCoeff0[t+12]),tZN2Corr[t]);
538 printf(" lg -> rawADC %d\tpedestal%1.2f\tcorrADC%1.2f\n",
539 adcZN2lg[t],(corrCoeff1[t+12+kNch]*adcZN2ootlg[t]+corrCoeff0[t+12+kNch]),tZN2Corr[t+5]);
541 printf("ZP2 -> rawADC %d\tpedestal%1.2f\tcorrADC%1.2f\n",
542 adcZP2[t],(corrCoeff1[t+17]*adcZP2oot[t]+corrCoeff0[t+17]),tZP2Corr[t]);
543 printf(" lg -> rawADC %d\tpedestal%1.2f\tcorrADC%1.2f\n",
544 adcZP2lg[t],(corrCoeff1[t+17+kNch]*adcZP2ootlg[t]+corrCoeff0[t+17+kNch]),tZP2Corr[t+5]);
547 dZEM1Corr[0] = adcZEM[0] - (corrCoeff1[9]*adcZEMoot[0]+corrCoeff0[9]);
548 dZEM1Corr[1] = adcZEMlg[0] - (corrCoeff1[9+kNch]*adcZEMootlg[0]+corrCoeff0[9+kNch]);
549 dZEM2Corr[0] = adcZEM[1] - (corrCoeff1[10]*adcZEMoot[1]+corrCoeff0[10]);
550 dZEM2Corr[1] = adcZEMlg[1] - (corrCoeff1[10+kNch]*adcZEMootlg[1]+corrCoeff0[10+kNch]);
552 sPMRef1[0] = pmRef[0] - (corrCoeff1[22]*pmRefoot[0]+corrCoeff0[22]);
553 sPMRef1[1] = pmReflg[0] - (corrCoeff1[22+kNch]*pmRefootlg[0]+corrCoeff0[22+kNch]);
554 sPMRef2[0] = pmRef[0] - (corrCoeff1[23]*pmRefoot[1]+corrCoeff0[23]);
555 sPMRef2[1] = pmReflg[0] - (corrCoeff1[23+kNch]*pmRefootlg[1]+corrCoeff0[23+kNch]);
558 if(fRecoMode==1) // p-p data
559 ReconstructEventpp(clustersTree, tZN1Corr, tZP1Corr, tZN2Corr, tZP2Corr,
560 dZEM1Corr, dZEM2Corr, sPMRef1, sPMRef2,
561 isScalerOn, scalerData,
562 evQualityBlock, triggerBlock, chBlock, puBits);
563 else if(fRecoMode==2) // Pb-Pb data
564 ReconstructEventPbPb(clustersTree, tZN1Corr, tZP1Corr, tZN2Corr, tZP2Corr,
565 dZEM1Corr, dZEM2Corr, sPMRef1, sPMRef2,
566 isScalerOn, scalerData,
567 evQualityBlock, triggerBlock, chBlock, puBits);
570 //_____________________________________________________________________________
571 void AliZDCReconstructor::ReconstructEventpp(TTree *clustersTree, Float_t* corrADCZN1,
572 Float_t* corrADCZP1, Float_t* corrADCZN2, Float_t* corrADCZP2,
573 Float_t* corrADCZEM1, Float_t* corrADCZEM2, Float_t* sPMRef1, Float_t* sPMRef2,
574 Bool_t isScalerOn, UInt_t* scaler,
575 Int_t* evQualityBlock, Int_t* triggerBlock, Int_t* chBlock, UInt_t puBits) const
577 // ****************** Reconstruct one event ******************
580 /*printf("\n*************************************************\n");
581 printf(" ReconstructEventpp -> values after pedestal subtraction:\n");
582 printf(" ADCZN1 [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
583 corrADCZN1[0],corrADCZN1[1],corrADCZN1[2],corrADCZN1[3],corrADCZN1[4]);
584 printf(" ADCZP1 [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
585 corrADCZP1[0],corrADCZP1[1],corrADCZP1[2],corrADCZP1[3],corrADCZP1[4]);
586 printf(" ADCZN2 [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
587 corrADCZN2[0],corrADCZN2[1],corrADCZN2[2],corrADCZN2[3],corrADCZN2[4]);
588 printf(" ADCZP2 [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
589 corrADCZP2[0],corrADCZP2[1],corrADCZP2[2],corrADCZP2[3],corrADCZP2[4]);
590 printf(" ADCZEM1 [%1.2f] ADCZEM2 [%1.2f] \n",corrADCZEM1[0],corrADCZEM2[0]);
591 printf("*************************************************\n");*/
593 // ---------------------- Setting reco flags for ESD
595 for(Int_t ifl=0; ifl<32; ifl++) rFlags[ifl]=0;
597 if(evQualityBlock[0] == 1) rFlags[31] = 0x0;
598 else rFlags[31] = 0x1;
600 if(evQualityBlock[1] == 1) rFlags[30] = 0x1;
601 if(evQualityBlock[2] == 1) rFlags[29] = 0x1;
602 if(evQualityBlock[3] == 1) rFlags[28] = 0x1;
604 if(triggerBlock[0] == 1) rFlags[27] = 0x1;
605 if(triggerBlock[1] == 1) rFlags[26] = 0x1;
606 if(triggerBlock[2] == 1) rFlags[25] = 0x1;
607 if(triggerBlock[3] == 1) rFlags[24] = 0x1;
609 if(chBlock[0] == 1) rFlags[18] = 0x1;
610 if(chBlock[1] == 1) rFlags[17] = 0x1;
611 if(chBlock[2] == 1) rFlags[16] = 0x1;
614 rFlags[13] = puBits & 0x00000020;
615 rFlags[12] = puBits & 0x00000010;
616 rFlags[11] = puBits & 0x00000080;
617 rFlags[10] = puBits & 0x00000040;
618 rFlags[9] = puBits & 0x00000020;
619 rFlags[8] = puBits & 0x00000010;
621 if(corrADCZP1[0]>fSignalThreshold) rFlags[5] = 0x1;
622 if(corrADCZN1[0]>fSignalThreshold) rFlags[4] = 0x1;
623 if(corrADCZEM2[0]>fSignalThreshold) rFlags[3] = 0x1;
624 if(corrADCZEM1[0]>fSignalThreshold) rFlags[2] = 0x1;
625 if(corrADCZP2[0]>fSignalThreshold) rFlags[1] = 0x1;
626 if(corrADCZN2[0]>fSignalThreshold) rFlags[0] = 0x1;
628 UInt_t recoFlag = rFlags[31] << 31 | rFlags[30] << 30 | rFlags[29] << 29 | rFlags[28] << 28 |
629 rFlags[27] << 27 | rFlags[26] << 26 | rFlags[25] << 25 | rFlags[24] << 24 |
630 0x0 << 23 | 0x0 << 22 | 0x0 << 21 | 0x0 << 20 |
631 0x0 << 19 | rFlags[18] << 18 | rFlags[17] << 17 | rFlags[16] << 16 |
632 0x0 << 15 | 0x0 << 14 | rFlags[13] << 13 | rFlags[12] << 12 |
633 rFlags[11] << 11 |rFlags[10] << 10 | rFlags[9] << 9 | rFlags[8] << 8 |
634 0x0 << 7 | 0x0 << 6 | rFlags[5] << 5 | rFlags[4] << 4 |
635 rFlags[3] << 3 | rFlags[2] << 2 | rFlags[1] << 1 | rFlags[0];
636 // --------------------------------------------------
638 // ****** Retrieving calibration data
639 // --- Equalization coefficients ---------------------------------------------
640 Float_t equalCoeffZN1[5], equalCoeffZP1[5], equalCoeffZN2[5], equalCoeffZP2[5];
641 for(Int_t ji=0; ji<5; ji++){
642 equalCoeffZN1[ji] = fTowCalibData->GetZN1EqualCoeff(ji);
643 equalCoeffZP1[ji] = fTowCalibData->GetZP1EqualCoeff(ji);
644 equalCoeffZN2[ji] = fTowCalibData->GetZN2EqualCoeff(ji);
645 equalCoeffZP2[ji] = fTowCalibData->GetZP2EqualCoeff(ji);
647 // --- Energy calibration factors ------------------------------------
649 // **** Energy calibration coefficient set to 1
650 // **** (no trivial way to calibrate in p-p runs)
651 for(Int_t ij=0; ij<6; ij++) calibEne[ij] = fEnCalibData->GetEnCalib(ij);
653 // ****** Equalization of detector responses
654 Float_t equalTowZN1[10], equalTowZN2[10], equalTowZP1[10], equalTowZP2[10];
655 for(Int_t gi=0; gi<10; gi++){
657 equalTowZN1[gi] = corrADCZN1[gi]*equalCoeffZN1[gi];
658 equalTowZP1[gi] = corrADCZP1[gi]*equalCoeffZP1[gi];
659 equalTowZN2[gi] = corrADCZN2[gi]*equalCoeffZN2[gi];
660 equalTowZP2[gi] = corrADCZP2[gi]*equalCoeffZP2[gi];
663 equalTowZN1[gi] = corrADCZN1[gi]*equalCoeffZN1[gi-5];
664 equalTowZP1[gi] = corrADCZP1[gi]*equalCoeffZP1[gi-5];
665 equalTowZN2[gi] = corrADCZN2[gi]*equalCoeffZN2[gi-5];
666 equalTowZP2[gi] = corrADCZP2[gi]*equalCoeffZP2[gi-5];
670 /*printf("\n ------------- EQUALIZATION -------------\n");
671 printf(" ADCZN1 [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
672 equalTowZN1[0],equalTowZN1[1],equalTowZN1[2],equalTowZN1[3],equalTowZN1[4]);
673 printf(" ADCZP1 [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
674 equalTowZP1[0],equalTowZP1[1],equalTowZP1[2],equalTowZP1[3],equalTowZP1[4]);
675 printf(" ADCZN2 [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
676 equalTowZN2[0],equalTowZN2[1],equalTowZN2[2],equalTowZN2[3],equalTowZN2[4]);
677 printf(" ADCZP2 [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
678 equalTowZP2[0],equalTowZP2[1],equalTowZP2[2],equalTowZP2[3],equalTowZP2[4]);
679 printf(" ----------------------------------------\n");*/
681 // ****** Summed response for hadronic calorimeter (SUMMED and then CALIBRATED!)
682 Float_t calibSumZN1[]={0,0}, calibSumZN2[]={0,0}, calibSumZP1[]={0,0}, calibSumZP2[]={0,0};
683 for(Int_t gi=0; gi<5; gi++){
684 calibSumZN1[0] += equalTowZN1[gi];
685 calibSumZP1[0] += equalTowZP1[gi];
686 calibSumZN2[0] += equalTowZN2[gi];
687 calibSumZP2[0] += equalTowZP2[gi];
689 calibSumZN1[1] += equalTowZN1[gi+5];
690 calibSumZP1[1] += equalTowZP1[gi+5];
691 calibSumZN2[1] += equalTowZN2[gi+5];
692 calibSumZP2[1] += equalTowZP2[gi+5];
695 calibSumZN1[0] = calibSumZN1[0]*calibEne[0];
696 calibSumZP1[0] = calibSumZP1[0]*calibEne[1];
697 calibSumZN2[0] = calibSumZN2[0]*calibEne[2];
698 calibSumZP2[0] = calibSumZP2[0]*calibEne[3];
700 calibSumZN1[1] = calibSumZN1[1]*calibEne[0];
701 calibSumZP1[1] = calibSumZP1[1]*calibEne[1];
702 calibSumZN2[1] = calibSumZN2[1]*calibEne[2];
703 calibSumZP2[1] = calibSumZP2[1]*calibEne[3];
705 // ****** Energy calibration of detector responses
706 Float_t calibTowZN1[10], calibTowZN2[10], calibTowZP1[10], calibTowZP2[10];
707 for(Int_t gi=0; gi<5; gi++){
709 calibTowZN1[gi] = equalTowZN1[gi]*calibEne[0];
710 calibTowZP1[gi] = equalTowZP1[gi]*calibEne[1];
711 calibTowZN2[gi] = equalTowZN2[gi]*calibEne[2];
712 calibTowZP2[gi] = equalTowZP2[gi]*calibEne[3];
714 calibTowZN1[gi+5] = equalTowZN1[gi+5]*calibEne[0];
715 calibTowZP1[gi+5] = equalTowZP1[gi+5]*calibEne[1];
716 calibTowZN2[gi+5] = equalTowZN2[gi+5]*calibEne[2];
717 calibTowZP2[gi+5] = equalTowZP2[gi+5]*calibEne[3];
720 Float_t sumZEM[]={0,0}, calibZEM1[]={0,0}, calibZEM2[]={0,0};
721 calibZEM1[0] = corrADCZEM1[0]*calibEne[5];
722 calibZEM1[1] = corrADCZEM1[1]*calibEne[5];
723 calibZEM2[0] = corrADCZEM2[0]*calibEne[5];
724 calibZEM2[1] = corrADCZEM2[1]*calibEne[5];
725 for(Int_t k=0; k<2; k++) sumZEM[k] = calibZEM1[k] + calibZEM2[k];
727 /*printf("\n ------------- CALIBRATION -------------\n");
728 printf(" ADCZN1 [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
729 calibTowZN1[0],calibTowZN1[1],calibTowZN1[2],calibTowZN1[3],calibTowZN1[4]);
730 printf(" ADCZP1 [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
731 calibTowZP1[0],calibTowZP1[1],calibTowZP1[2],calibTowZP1[3],calibTowZP1[4]);
732 printf(" ADCZN2 [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
733 calibTowZN2[0],calibTowZN2[1],calibTowZN2[2],calibTowZN2[3],calibTowZN2[4]);
734 printf(" ADCZP2 [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
735 calibTowZP2[0],calibTowZP2[1],calibTowZP2[2],calibTowZP2[3],calibTowZP2[4]);
736 printf(" ADCZEM1 [%1.2f] ADCZEM2 [%1.2f] \n",calibZEM1[0],calibZEM2[0]);
737 printf(" ----------------------------------------\n");*/
739 // ****** No. of spectator and participants nucleons
740 // Variables calculated to comply with ESD structure
741 // *** N.B. -> They have a meaning only in Pb-Pb!!!!!!!!!!!!
742 Int_t nDetSpecNLeft=0, nDetSpecPLeft=0, nDetSpecNRight=0, nDetSpecPRight=0;
743 Int_t nGenSpec=0, nGenSpecLeft=0, nGenSpecRight=0;
744 Int_t nPart=0, nPartTotLeft=0, nPartTotRight=0;
745 Double_t impPar=0., impPar1=0., impPar2=0.;
747 // create the output tree
748 AliZDCReco* reco = new AliZDCReco(calibSumZN1, calibSumZP1, calibSumZN2, calibSumZP2,
749 calibTowZN1, calibTowZP1, calibTowZN2, calibTowZP2,
750 calibZEM1, calibZEM2, sPMRef1, sPMRef2,
751 nDetSpecNLeft, nDetSpecPLeft, nDetSpecNRight, nDetSpecPRight,
752 nGenSpec, nGenSpecLeft, nGenSpecRight,
753 nPart, nPartTotLeft, nPartTotRight,
754 impPar, impPar1, impPar2,
755 recoFlag, isScalerOn, scaler);
757 const Int_t kBufferSize = 4000;
758 clustersTree->Branch("ZDC", "AliZDCReco", &reco, kBufferSize);
759 // write the output tree
760 clustersTree->Fill();
763 //_____________________________________________________________________________
764 void AliZDCReconstructor::ReconstructEventPbPb(TTree *clustersTree,
765 Float_t* corrADCZN1, Float_t* corrADCZP1, Float_t* corrADCZN2, Float_t* corrADCZP2,
766 Float_t* corrADCZEM1, Float_t* corrADCZEM2, Float_t* sPMRef1, Float_t* sPMRef2,
767 Bool_t isScalerOn, UInt_t* scaler,
768 Int_t* evQualityBlock, Int_t* triggerBlock, Int_t* chBlock, UInt_t puBits) const
770 // ****************** Reconstruct one event ******************
771 // ---------------------- Setting reco flags for ESD
773 for(Int_t ifl=0; ifl<32; ifl++) rFlags[ifl]=0;
775 if(evQualityBlock[0] == 1) rFlags[31] = 0x0;
776 else rFlags[31] = 0x1;
778 if(evQualityBlock[1] == 1) rFlags[30] = 0x1;
779 if(evQualityBlock[2] == 1) rFlags[29] = 0x1;
780 if(evQualityBlock[3] == 1) rFlags[28] = 0x1;
782 if(triggerBlock[0] == 1) rFlags[27] = 0x1;
783 if(triggerBlock[1] == 1) rFlags[26] = 0x1;
784 if(triggerBlock[2] == 1) rFlags[25] = 0x1;
785 if(triggerBlock[3] == 1) rFlags[24] = 0x1;
787 if(chBlock[0] == 1) rFlags[18] = 0x1;
788 if(chBlock[1] == 1) rFlags[17] = 0x1;
789 if(chBlock[2] == 1) rFlags[16] = 0x1;
791 rFlags[13] = puBits & 0x00000020;
792 rFlags[12] = puBits & 0x00000010;
793 rFlags[11] = puBits & 0x00000080;
794 rFlags[10] = puBits & 0x00000040;
795 rFlags[9] = puBits & 0x00000020;
796 rFlags[8] = puBits & 0x00000010;
798 if(corrADCZP1[0]>fSignalThreshold) rFlags[5] = 0x1;
799 if(corrADCZN1[0]>fSignalThreshold) rFlags[4] = 0x1;
800 if(corrADCZEM2[0]>fSignalThreshold) rFlags[3] = 0x1;
801 if(corrADCZEM1[0]>fSignalThreshold) rFlags[2] = 0x1;
802 if(corrADCZP2[0]>fSignalThreshold) rFlags[1] = 0x1;
803 if(corrADCZN2[0]>fSignalThreshold) rFlags[0] = 0x1;
805 UInt_t recoFlag = rFlags[31] << 31 | rFlags[30] << 30 | rFlags[29] << 29 | rFlags[28] << 28 |
806 rFlags[27] << 27 | rFlags[26] << 26 | rFlags[25] << 25 | rFlags[24] << 24 |
807 0x0 << 23 | 0x0 << 22 | 0x0 << 21 | 0x0 << 20 |
808 0x0 << 19 | rFlags[18] << 18 | rFlags[17] << 17 | rFlags[16] << 16 |
809 0x0 << 15 | 0x0 << 14 | rFlags[13] << 13 | rFlags[12] << 12 |
810 rFlags[11] << 11 |rFlags[10] << 10 | rFlags[9] << 9 | rFlags[8] << 8 |
811 0x0 << 7 | 0x0 << 6 | rFlags[5] << 5 | rFlags[4] << 4 |
812 rFlags[3] << 3 | rFlags[2] << 2 | rFlags[1] << 1 | rFlags[0];
813 // --------------------------------------------------
816 // ****** Retrieving calibration data
817 // --- Equalization coefficients ---------------------------------------------
818 Float_t equalCoeffZN1[5], equalCoeffZP1[5], equalCoeffZN2[5], equalCoeffZP2[5];
819 for(Int_t ji=0; ji<5; ji++){
820 equalCoeffZN1[ji] = fTowCalibData->GetZN1EqualCoeff(ji);
821 equalCoeffZP1[ji] = fTowCalibData->GetZP1EqualCoeff(ji);
822 equalCoeffZN2[ji] = fTowCalibData->GetZN2EqualCoeff(ji);
823 equalCoeffZP2[ji] = fTowCalibData->GetZP2EqualCoeff(ji);
825 // --- Energy calibration factors ------------------------------------
826 Float_t valFromOCDB[6], calibEne[6];
827 for(Int_t ij=0; ij<6; ij++){
828 valFromOCDB[ij] = fEnCalibData->GetEnCalib(ij);
830 if(valFromOCDB[ij]!=0) calibEne[ij] = fBeamEnergy/valFromOCDB[ij];
831 else AliWarning(" Value from OCDB for E calibration = 0 !!!\n");
833 else calibEne[ij] = valFromOCDB[ij];
836 // ****** Equalization of detector responses
837 Float_t equalTowZN1[10], equalTowZN2[10], equalTowZP1[10], equalTowZP2[10];
838 for(Int_t gi=0; gi<10; gi++){
840 equalTowZN1[gi] = corrADCZN1[gi]*equalCoeffZN1[gi];
841 equalTowZP1[gi] = corrADCZP1[gi]*equalCoeffZP1[gi];
842 equalTowZN2[gi] = corrADCZN2[gi]*equalCoeffZN2[gi];
843 equalTowZP2[gi] = corrADCZP2[gi]*equalCoeffZP2[gi];
846 equalTowZN1[gi] = corrADCZN1[gi]*equalCoeffZN1[gi-5];
847 equalTowZP1[gi] = corrADCZP1[gi]*equalCoeffZP1[gi-5];
848 equalTowZN2[gi] = corrADCZN2[gi]*equalCoeffZN2[gi-5];
849 equalTowZP2[gi] = corrADCZP2[gi]*equalCoeffZP2[gi-5];
853 // ****** Summed response for hadronic calorimeter (SUMMED and then CALIBRATED!)
854 Float_t calibSumZN1[]={0,0}, calibSumZN2[]={0,0}, calibSumZP1[]={0,0}, calibSumZP2[]={0,0};
855 for(Int_t gi=0; gi<5; gi++){
856 calibSumZN1[0] += equalTowZN1[gi];
857 calibSumZP1[0] += equalTowZP1[gi];
858 calibSumZN2[0] += equalTowZN2[gi];
859 calibSumZP2[0] += equalTowZP2[gi];
861 calibSumZN1[1] += equalTowZN1[gi+5];
862 calibSumZP1[1] += equalTowZP1[gi+5];
863 calibSumZN2[1] += equalTowZN2[gi+5];
864 calibSumZP2[1] += equalTowZP2[gi+5];
867 calibSumZN1[0] = calibSumZN1[0]*calibEne[0]*8.;
868 calibSumZP1[0] = calibSumZP1[0]*calibEne[1]*8.;
869 calibSumZN2[0] = calibSumZN2[0]*calibEne[2]*8.;
870 calibSumZP2[0] = calibSumZP2[0]*calibEne[3]*8.;
872 calibSumZN1[1] = calibSumZN1[1]*calibEne[0];
873 calibSumZP1[1] = calibSumZP1[1]*calibEne[1];
874 calibSumZN2[1] = calibSumZN2[1]*calibEne[2];
875 calibSumZP2[1] = calibSumZP2[1]*calibEne[3];
877 Float_t sumZEM[]={0,0}, calibZEM1[]={0,0}, calibZEM2[]={0,0};
878 calibZEM1[0] = corrADCZEM1[0]*calibEne[5]*8.;
879 calibZEM1[1] = corrADCZEM1[1]*calibEne[5];
880 calibZEM2[0] = corrADCZEM2[0]*calibEne[5]*8.;
881 calibZEM2[1] = corrADCZEM2[1]*calibEne[5];
882 for(Int_t k=0; k<2; k++) sumZEM[k] = calibZEM1[k] + calibZEM2[k];
884 // ****** Energy calibration of detector responses
885 Float_t calibTowZN1[10], calibTowZN2[10], calibTowZP1[10], calibTowZP2[10];
886 for(Int_t gi=0; gi<5; gi++){
888 calibTowZN1[gi] = equalTowZN1[gi]*calibEne[0]*8.;
889 calibTowZP1[gi] = equalTowZP1[gi]*calibEne[1]*8.;
890 calibTowZN2[gi] = equalTowZN2[gi]*calibEne[2]*8.;
891 calibTowZP2[gi] = equalTowZP2[gi]*calibEne[3]*8.;
893 calibTowZN1[gi+5] = equalTowZN1[gi+5]*calibEne[0];
894 calibTowZP1[gi+5] = equalTowZP1[gi+5]*calibEne[1];
895 calibTowZN2[gi+5] = equalTowZN2[gi+5]*calibEne[2];
896 calibTowZP2[gi+5] = equalTowZP2[gi+5]*calibEne[3];
899 // ****** Number of detected spectator nucleons
900 Int_t nDetSpecNLeft=0, nDetSpecPLeft=0, nDetSpecNRight=0, nDetSpecPRight=0;
902 nDetSpecNLeft = (Int_t) (calibSumZN1[0]/fBeamEnergy);
903 nDetSpecPLeft = (Int_t) (calibSumZP1[0]/fBeamEnergy);
904 nDetSpecNRight = (Int_t) (calibSumZN2[0]/fBeamEnergy);
905 nDetSpecPRight = (Int_t) (calibSumZP2[0]/fBeamEnergy);
907 else AliWarning(" ATTENTION!!! fBeamEnergy=0 -> N_spec will be ZERO!!! \n");
908 /*printf("\n\t AliZDCReconstructor -> nDetSpecNLeft %d, nDetSpecPLeft %d,"
909 " nDetSpecNRight %d, nDetSpecPRight %d\n",nDetSpecNLeft, nDetSpecPLeft,
910 nDetSpecNRight, nDetSpecPRight);*/
912 Int_t nGenSpec=0, nGenSpecA=0, nGenSpecC=0;
913 Int_t nPart=0, nPartA=0, nPartC=0;
914 Double_t b=0., bA=0., bC=0.;
916 if(fIsCalibrationMB == kFALSE){
917 // ****** Reconstruction parameters ------------------
919 //fRecoParam->Print("");
922 if (!fRecoParam) fRecoParam = const_cast<AliZDCRecoParam*>(GetRecoParam());
924 TH2F *hZDCvsZEM = fRecoParam->GethZDCvsZEM();
925 TH2F *hZDCCvsZEM = fRecoParam->GethZDCCvsZEM();
926 TH2F *hZDCAvsZEM = fRecoParam->GethZDCAvsZEM();
927 TH1D *hNpartDist = fRecoParam->GethNpartDist();
928 TH1D *hbDist = fRecoParam->GethbDist();
929 Float_t ClkCenter = fRecoParam->GetClkCenter();
931 Double_t xHighEdge = hZDCvsZEM->GetXaxis()->GetXmax();
932 Double_t origin = xHighEdge*ClkCenter;
934 //printf("\n\n xHighEdge %1.2f, origin %1.4f \n", xHighEdge, origin);
936 // ====> Summed ZDC info (sideA+side C)
937 TF1 *line = new TF1("line","[0]*x+[1]",0.,xHighEdge);
938 Float_t y = (calibSumZN1[0]+calibSumZP1[0]+calibSumZN2[0]+calibSumZP2[0])/1000.;
939 Float_t x = (calibZEM1[0]+calibZEM2[0])/1000.;
940 line->SetParameter(0, y/(x-origin));
941 line->SetParameter(1, -origin*y/(x-origin));
943 //printf(" ***************** Summed ZDC info (sideA+side C) \n");
944 //printf(" E_{ZEM} %1.4f, E_{ZDC} %1.2f, TF1: %1.2f*x + %1.2f ", x, y,y/(x-origin),-origin*y/(x-origin));
946 Double_t countPerc=0;
947 Double_t xBinCenter=0, yBinCenter=0;
948 for(Int_t nbinx=1; nbinx<=hZDCvsZEM->GetNbinsX(); nbinx++){
949 for(Int_t nbiny=1; nbiny<=hZDCvsZEM->GetNbinsY(); nbiny++){
950 xBinCenter = hZDCvsZEM->GetXaxis()->GetBinCenter(nbinx);
951 yBinCenter = hZDCvsZEM->GetYaxis()->GetBinCenter(nbiny);
953 if(line->GetParameter(0)>0){
954 if(yBinCenter < (line->GetParameter(0)*xBinCenter + line->GetParameter(1))){
955 countPerc += hZDCvsZEM->GetBinContent(nbinx,nbiny);
957 /*printf(" xBinCenter %1.3f, yBinCenter %1.0f, countPerc %1.0f\n",
958 xBinCenter, yBinCenter, countPerc);*/
962 if(yBinCenter > (line->GetParameter(0)*xBinCenter + line->GetParameter(1))){
963 countPerc += hZDCvsZEM->GetBinContent(nbinx,nbiny);
965 /*printf(" xBinCenter %1.3f, yBinCenter %1.0f, countPerc %1.0f\n",
966 xBinCenter, yBinCenter, countPerc);*/
972 Double_t xSecPerc = 0.;
973 if(hZDCvsZEM->GetEntries()!=0){
974 xSecPerc = countPerc/hZDCvsZEM->GetEntries();
977 AliWarning(" Histogram hZDCvsZEM from OCDB has no entries!!!");
980 //printf(" xSecPerc %1.4f \n", xSecPerc);
983 TF1 *lineC = new TF1("lineC","[0]*x+[1]",0.,xHighEdge);
984 Float_t yC = (calibSumZN1[0]+calibSumZP1[0])/1000.;
985 lineC->SetParameter(0, yC/(x-origin));
986 lineC->SetParameter(1, -origin*yC/(x-origin));
988 //printf(" ***************** Side C \n");
989 //printf(" E_{ZEM} %1.4f, E_{ZDCC} %1.2f, TF1: %1.2f*x + %1.2f ", x, yC,yC/(x-origin),-origin*yC/(x-origin));
991 Double_t countPercC=0;
992 Double_t xBinCenterC=0, yBinCenterC=0;
993 for(Int_t nbinx=1; nbinx<=hZDCCvsZEM->GetNbinsX(); nbinx++){
994 for(Int_t nbiny=1; nbiny<=hZDCCvsZEM->GetNbinsY(); nbiny++){
995 xBinCenterC = hZDCCvsZEM->GetXaxis()->GetBinCenter(nbinx);
996 yBinCenterC = hZDCCvsZEM->GetYaxis()->GetBinCenter(nbiny);
997 if(lineC->GetParameter(0)>0){
998 if(yBinCenterC < (lineC->GetParameter(0)*xBinCenterC + lineC->GetParameter(1))){
999 countPercC += hZDCCvsZEM->GetBinContent(nbinx,nbiny);
1003 if(yBinCenterC > (lineC->GetParameter(0)*xBinCenterC + lineC->GetParameter(1))){
1004 countPercC += hZDCCvsZEM->GetBinContent(nbinx,nbiny);
1010 Double_t xSecPercC = 0.;
1011 if(hZDCCvsZEM->GetEntries()!=0){
1012 xSecPercC = countPercC/hZDCCvsZEM->GetEntries();
1015 AliWarning(" Histogram hZDCCvsZEM from OCDB has no entries!!!");
1018 //printf(" xSecPercC %1.4f \n", xSecPercC);
1021 TF1 *lineA = new TF1("lineA","[0]*x+[1]",0.,xHighEdge);
1022 Float_t yA = (calibSumZN2[0]+calibSumZP2[0])/1000.;
1023 lineA->SetParameter(0, yA/(x-origin));
1024 lineA->SetParameter(1, -origin*yA/(x-origin));
1027 //printf(" ***************** Side A \n");
1028 //printf(" E_{ZEM} %1.4f, E_{ZDCA} %1.2f, TF1: %1.2f*x + %1.2f ", x, yA,yA/(x-origin),-origin*yA/(x-origin));
1030 Double_t countPercA=0;
1031 Double_t xBinCenterA=0, yBinCenterA=0;
1032 for(Int_t nbinx=1; nbinx<=hZDCAvsZEM->GetNbinsX(); nbinx++){
1033 for(Int_t nbiny=1; nbiny<=hZDCAvsZEM->GetNbinsY(); nbiny++){
1034 xBinCenterA = hZDCAvsZEM->GetXaxis()->GetBinCenter(nbinx);
1035 yBinCenterA = hZDCAvsZEM->GetYaxis()->GetBinCenter(nbiny);
1036 if(lineA->GetParameter(0)>0){
1037 if(yBinCenterA < (lineA->GetParameter(0)*xBinCenterA + lineA->GetParameter(1))){
1038 countPercA += hZDCAvsZEM->GetBinContent(nbinx,nbiny);
1042 if(yBinCenterA > (lineA->GetParameter(0)*xBinCenterA + lineA->GetParameter(1))){
1043 countPercA += hZDCAvsZEM->GetBinContent(nbinx,nbiny);
1049 Double_t xSecPercA = 0.;
1050 if(hZDCAvsZEM->GetEntries()!=0){
1051 xSecPercA = countPercA/hZDCAvsZEM->GetEntries();
1054 AliWarning(" Histogram hZDCAvsZEM from OCDB has no entries!!!");
1057 //printf(" xSecPercA %1.4f \n", xSecPercA);
1059 // ****** Number of participants (from E_ZDC vs. E_ZEM correlation)
1060 Double_t nPartFrac=0., nPartFracC=0., nPartFracA=0.;
1061 for(Int_t npbin=1; npbin<hNpartDist->GetNbinsX(); npbin++){
1062 nPartFrac += (hNpartDist->GetBinContent(npbin))/(hNpartDist->GetEntries());
1063 if((1.-nPartFrac) < xSecPerc){
1064 nPart = (Int_t) hNpartDist->GetBinLowEdge(npbin);
1066 //printf(" ***************** Summed ZDC info (sideA+side C) \n");
1067 //printf(" nPartFrac %1.4f, nPart %d\n", nPartFrac, nPart);
1071 if(nPart<0) nPart=0;
1073 for(Int_t npbin=1; npbin<hNpartDist->GetNbinsX(); npbin++){
1074 nPartFracC += (hNpartDist->GetBinContent(npbin))/(hNpartDist->GetEntries());
1075 if((1.-nPartFracC) < xSecPercC){
1076 nPartC = (Int_t) hNpartDist->GetBinLowEdge(npbin);
1078 //printf(" ***************** Side C \n");
1079 //printf(" nPartFracC %1.4f, nPartC %d\n", nPartFracC, nPartC);
1083 if(nPartC<0) nPartC=0;
1085 for(Int_t npbin=1; npbin<hNpartDist->GetNbinsX(); npbin++){
1086 nPartFracA += (hNpartDist->GetBinContent(npbin))/(hNpartDist->GetEntries());
1087 if((1.-nPartFracA) < xSecPercA){
1088 nPartA = (Int_t) hNpartDist->GetBinLowEdge(npbin);
1090 //printf(" ***************** Side A \n");
1091 //printf(" nPartFracA %1.4f, nPartA %d\n\n", nPartFracA, nPartA);
1095 if(nPartA<0) nPartA=0;
1097 // ****** Impact parameter (from E_ZDC vs. E_ZEM correlation)
1098 Double_t bFrac=0., bFracC=0., bFracA=0.;
1099 for(Int_t ibbin=1; ibbin<hbDist->GetNbinsX(); ibbin++){
1100 bFrac += (hbDist->GetBinContent(ibbin))/(hbDist->GetEntries());
1101 if((1.-bFrac) < xSecPerc){
1102 b = hbDist->GetBinLowEdge(ibbin);
1107 for(Int_t ibbin=1; ibbin<hbDist->GetNbinsX(); ibbin++){
1108 bFracC += (hbDist->GetBinContent(ibbin))/(hbDist->GetEntries());
1109 if((1.-bFracC) < xSecPercC){
1110 bC = hbDist->GetBinLowEdge(ibbin);
1115 for(Int_t ibbin=1; ibbin<hbDist->GetNbinsX(); ibbin++){
1116 bFracA += (hbDist->GetBinContent(ibbin))/(hNpartDist->GetEntries());
1117 if((1.-bFracA) < xSecPercA){
1118 bA = hbDist->GetBinLowEdge(ibbin);
1123 // ****** Number of spectator nucleons
1124 nGenSpec = 416 - nPart;
1125 nGenSpecC = 416 - nPartC;
1126 nGenSpecA = 416 - nPartA;
1127 if(nGenSpec>416) nGenSpec=416; if(nGenSpec<0) nGenSpec=0;
1128 if(nGenSpecC>416) nGenSpecC=416; if(nGenSpecC<0) nGenSpecC=0;
1129 if(nGenSpecA>416) nGenSpecA=416; if(nGenSpecA<0) nGenSpecA=0;
1132 /*printf("\n\t AliZDCReconstructor -> calibSumZN1[0] %1.0f, calibSumZP1[0] %1.0f,"
1133 " calibSumZN2[0] %1.0f, calibSumZP2[0] %1.0f, corrADCZEMHG %1.0f\n",
1134 calibSumZN1[0],calibSumZP1[0],calibSumZN2[0],calibSumZP2[0],corrADCZEMHG);
1135 printf("\t AliZDCReconstructor -> nGenSpecLeft %d nGenSpecRight %d\n",
1136 nGenSpecLeft, nGenSpecRight);
1137 printf("\t AliZDCReconstructor -> NpartL %d, NpartR %d, b %1.2f fm\n\n",nPartTotLeft, nPartTotRight, impPar);
1140 delete lineC; delete lineA;
1142 } // ONLY IF fIsCalibrationMB==kFALSE
1144 AliZDCReco* reco = new AliZDCReco(calibSumZN1, calibSumZP1, calibSumZN2, calibSumZP2,
1145 calibTowZN1, calibTowZP1, calibTowZN2, calibTowZP2,
1146 calibZEM1, calibZEM2, sPMRef1, sPMRef2,
1147 nDetSpecNLeft, nDetSpecPLeft, nDetSpecNRight, nDetSpecPRight,
1148 nGenSpec, nGenSpecA, nGenSpecC,
1149 nPart, nPartA, nPartC, b, bA, bC,
1150 recoFlag, isScalerOn, scaler);
1152 const Int_t kBufferSize = 4000;
1153 clustersTree->Branch("ZDC", "AliZDCReco", &reco, kBufferSize);
1155 // write the output tree
1156 clustersTree->Fill();
1159 //_____________________________________________________________________________
1160 void AliZDCReconstructor::BuildRecoParam(Float_t ZDCC, Float_t ZDCA, Float_t ZEM) const
1162 // Calculate RecoParam object for Pb-Pb data
1163 (fRecoParam->GethZDCvsZEM())->Fill(ZDCC+ZDCA, ZEM);
1164 (fRecoParam->GethZDCCvsZEM())->Fill(ZDCC, ZEM);
1165 (fRecoParam->GethZDCAvsZEM())->Fill(ZDCA, ZEM);
1169 //_____________________________________________________________________________
1170 void AliZDCReconstructor::FillZDCintoESD(TTree *clustersTree, AliESDEvent* esd) const
1172 // fill energies and number of participants to the ESD
1175 AliZDCReco* preco = &reco;
1176 clustersTree->SetBranchAddress("ZDC", &preco);
1178 clustersTree->GetEntry(0);
1180 AliESDZDC * esdzdc = esd->GetESDZDC();
1181 Float_t tZN1Ene[5], tZN2Ene[5], tZP1Ene[5], tZP2Ene[5];
1182 Float_t tZN1EneLR[5], tZN2EneLR[5], tZP1EneLR[5], tZP2EneLR[5];
1183 for(Int_t i=0; i<5; i++){
1184 tZN1Ene[i] = reco.GetZN1HREnTow(i);
1185 tZN2Ene[i] = reco.GetZN2HREnTow(i);
1186 tZP1Ene[i] = reco.GetZP1HREnTow(i);
1187 tZP2Ene[i] = reco.GetZP2HREnTow(i);
1189 tZN1EneLR[i] = reco.GetZN1LREnTow(i);
1190 tZN2EneLR[i] = reco.GetZN2LREnTow(i);
1191 tZP1EneLR[i] = reco.GetZP1LREnTow(i);
1192 tZP2EneLR[i] = reco.GetZP2LREnTow(i);
1195 esdzdc->SetZN1TowerEnergy(tZN1Ene);
1196 esdzdc->SetZN2TowerEnergy(tZN2Ene);
1197 esdzdc->SetZP1TowerEnergy(tZP1Ene);
1198 esdzdc->SetZP2TowerEnergy(tZP2Ene);
1200 esdzdc->SetZN1TowerEnergyLR(tZN1EneLR);
1201 esdzdc->SetZN2TowerEnergyLR(tZN2EneLR);
1202 esdzdc->SetZP1TowerEnergyLR(tZP1EneLR);
1203 esdzdc->SetZP2TowerEnergyLR(tZP2EneLR);
1205 Int_t nPart = reco.GetNParticipants();
1206 Int_t nPartA = reco.GetNPartSideA();
1207 Int_t nPartC = reco.GetNPartSideC();
1208 Double_t b = reco.GetImpParameter();
1209 Double_t bA = reco.GetImpParSideA();
1210 Double_t bC = reco.GetImpParSideC();
1211 UInt_t recoFlag = reco.GetRecoFlag();
1213 esd->SetZDC(reco.GetZN1HREnergy(), reco.GetZP1HREnergy(), reco.GetZEM1HRsignal(),
1214 reco.GetZEM2HRsignal(), reco.GetZN2HREnergy(), reco.GetZP2HREnergy(),
1215 nPart, nPartA, nPartC, b, bA, bC, recoFlag);
1217 // Writing ZDC scaler for cross section calculation
1218 // ONLY IF the scaler has been read during the event
1219 if(reco.IsScalerOn()==kTRUE){
1221 for(Int_t jk=0; jk<32; jk++) counts[jk] = reco.GetZDCScaler(jk);
1222 esd->SetZDCScaler(counts);
1226 //_____________________________________________________________________________
1227 AliCDBStorage* AliZDCReconstructor::SetStorage(const char *uri)
1229 // Setting the storage
1231 Bool_t deleteManager = kFALSE;
1233 AliCDBManager *manager = AliCDBManager::Instance();
1234 AliCDBStorage *defstorage = manager->GetDefaultStorage();
1236 if(!defstorage || !(defstorage->Contains("ZDC"))){
1237 AliWarning("No default storage set or default storage doesn't contain ZDC!");
1238 manager->SetDefaultStorage(uri);
1239 deleteManager = kTRUE;
1242 AliCDBStorage *storage = manager->GetDefaultStorage();
1245 AliCDBManager::Instance()->UnsetDefaultStorage();
1246 defstorage = 0; // the storage is killed by AliCDBManager::Instance()->Destroy()
1252 //_____________________________________________________________________________
1253 AliZDCPedestals* AliZDCReconstructor::GetPedestalData() const
1256 // Getting pedestal calibration object for ZDC set
1258 AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/Pedestals");
1259 if(!entry) AliFatal("No calibration data loaded!");
1260 entry->SetOwner(kFALSE);
1262 AliZDCPedestals *calibdata = dynamic_cast<AliZDCPedestals*> (entry->GetObject());
1263 if(!calibdata) AliFatal("Wrong calibration object in calibration file!");
1268 //_____________________________________________________________________________
1269 AliZDCEnCalib* AliZDCReconstructor::GetEnergyCalibData() const
1272 // Getting energy and equalization calibration object for ZDC set
1274 AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/EnergyCalib");
1275 if(!entry) AliFatal("No calibration data loaded!");
1276 entry->SetOwner(kFALSE);
1278 AliZDCEnCalib *calibdata = dynamic_cast<AliZDCEnCalib*> (entry->GetObject());
1279 if(!calibdata) AliFatal("Wrong calibration object in calibration file!");
1284 //_____________________________________________________________________________
1285 AliZDCTowerCalib* AliZDCReconstructor::GetTowerCalibData() const
1288 // Getting energy and equalization calibration object for ZDC set
1290 AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/TowerCalib");
1291 if(!entry) AliFatal("No calibration data loaded!");
1292 entry->SetOwner(kFALSE);
1294 AliZDCTowerCalib *calibdata = dynamic_cast<AliZDCTowerCalib*> (entry->GetObject());
1295 if(!calibdata) AliFatal("Wrong calibration object in calibration file!");
1300 //_____________________________________________________________________________
1301 AliZDCRecoParampp* AliZDCReconstructor::GetppRecoParamFromOCDB() const
1304 // Getting reconstruction parameters from OCDB
1306 AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/RecoParampp");
1307 if(!entry) AliFatal("No RecoParam data found in OCDB!");
1309 AliZDCRecoParampp *param = dynamic_cast<AliZDCRecoParampp*> (entry->GetObject());
1310 if(!param) AliFatal("No RecoParam object in OCDB entry!");
1316 //_____________________________________________________________________________
1317 AliZDCRecoParamPbPb* AliZDCReconstructor::GetPbPbRecoParamFromOCDB() const
1320 // Getting reconstruction parameters from OCDB
1322 AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/RecoParamPbPb");
1323 if(!entry) AliFatal("No RecoParam data found in OCDB!");
1325 AliZDCRecoParamPbPb *param = dynamic_cast<AliZDCRecoParamPbPb*> (entry->GetObject());
1326 if(!param) AliFatal("No RecoParam object in OCDB entry!");