Line data Source code
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 : /* $Id$ */
17 :
18 : ///////////////////////////////////////////////////////////////////////////////
19 : // //
20 : // ************** Class for ZDC reconstruction ************** //
21 : // Author: Chiara.Oppedisano@to.infn.it //
22 : // //
23 : // NOTATIONS ADOPTED TO IDENTIFY DETECTORS (used in different ages!): //
24 : // (ZNC,ZPC) or (ZNC, ZPC) or RIGHT refers to side C (RB26) //
25 : // (ZNA,ZPA) or (ZNA, ZPA) or LEFT refers to side A (RB24) //
26 : // //
27 : ///////////////////////////////////////////////////////////////////////////////
28 :
29 :
30 : #include <TH2F.h>
31 : #include <TH1D.h>
32 : #include <TAxis.h>
33 : #include <TMap.h>
34 :
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 "AliZDCSaturationCalib.h"
45 : #include "AliZDCTowerCalib.h"
46 : #include "AliZDCMBCalib.h"
47 : #include "AliZDCTDCCalib.h"
48 : #include "AliZDCChMap.h"
49 : #include "AliZDCRecoParam.h"
50 : #include "AliZDCRecoParampp.h"
51 : #include "AliZDCRecoParamPbPb.h"
52 : #include "AliRunInfo.h"
53 : #include "AliLHCClockPhase.h"
54 :
55 :
56 12 : ClassImp(AliZDCReconstructor)
57 : AliZDCRecoParam *AliZDCReconstructor::fgRecoParam=0; //reconstruction parameters
58 : AliZDCMBCalib *AliZDCReconstructor::fgMBCalibData=0; //calibration parameters for A-A reconstruction
59 :
60 : //_____________________________________________________________________________
61 2 : AliZDCReconstructor:: AliZDCReconstructor() :
62 4 : fPedData(GetPedestalData()),
63 4 : fEnCalibData(GetEnergyCalibData()),
64 4 : fSatCalibData(GetSaturationCalibData()),
65 4 : fTowCalibData(GetTowerCalibData()),
66 4 : fTDCCalibData(GetTDCCalibData()),
67 4 : fMapping(GetMapping()),
68 2 : fRecoMode(0),
69 2 : fBeamEnergy(0.),
70 2 : fNRun(0),
71 2 : fIsCalibrationMB(kFALSE),
72 2 : fSignalThreshold(7),
73 2 : fMeanPhase(0),
74 2 : fESDZDC(NULL)
75 10 : {
76 : // **** Default constructor
77 4 : }
78 :
79 :
80 : //_____________________________________________________________________________
81 : AliZDCReconstructor::~AliZDCReconstructor()
82 12 : {
83 : // destructor
84 : // if(fgRecoParam) delete fgRecoParam;
85 2 : AliCDBManager * man = AliCDBManager::Instance();
86 4 : if (man && !man->GetCacheFlag()) { // CDB objects must NOT be deleted if cache is active!
87 0 : if(fPedData) delete fPedData;
88 0 : if(fEnCalibData) delete fEnCalibData;
89 0 : if(fSatCalibData) delete fSatCalibData;
90 0 : if(fTowCalibData) delete fTowCalibData;
91 0 : if(fgMBCalibData) delete fgMBCalibData;
92 0 : if(fTDCCalibData) delete fTDCCalibData;
93 0 : if(fMapping) delete fMapping;
94 : }
95 6 : if(fESDZDC) delete fESDZDC;
96 6 : }
97 :
98 : //____________________________________________________________________________
99 : void AliZDCReconstructor::Init()
100 : {
101 : // Setting reconstruction parameters
102 :
103 4 : TString runType = GetRunInfo()->GetRunType();
104 4 : if((runType.CompareTo("CALIBRATION_MB")) == 0){
105 0 : fIsCalibrationMB = kTRUE;
106 0 : }
107 :
108 4 : TString beamType = GetRunInfo()->GetBeamType();
109 : // To allow reconstruction in tests without beam
110 4 : if(((beamType.CompareTo("UNKNOWN"))==0) &&
111 4 : ((runType.CompareTo("PHYSICS"))==0 || (runType.CompareTo("CALIBRATION_BC"))==0)){
112 2 : fRecoMode=1;
113 2 : }
114 :
115 2 : fBeamEnergy = GetRunInfo()->GetBeamEnergy();
116 2 : if(fBeamEnergy<0.01){
117 0 : AliWarning(" Beam energy value missing -> setting it to 1380 GeV ");
118 0 : fBeamEnergy = 1380.;
119 0 : }
120 :
121 10 : if(((beamType.CompareTo("pp"))==0) || ((beamType.CompareTo("p-p"))==0)
122 10 : ||((beamType.CompareTo("PP"))==0) || ((beamType.CompareTo("P-P"))==0)){
123 0 : fRecoMode=1;
124 0 : }
125 10 : else if(((beamType.CompareTo("p-A"))==0) || ((beamType.CompareTo("A-p"))==0)
126 10 : ||((beamType.CompareTo("P-A"))==0) || ((beamType.CompareTo("A-P"))==0)){
127 0 : fRecoMode=1;
128 0 : }
129 8 : else if((beamType.CompareTo("A-A")) == 0 || (beamType.CompareTo("AA")) == 0){
130 0 : fRecoMode=2;
131 : /*if(!fgRecoParam) fgRecoParam = const_cast<AliZDCRecoParam*>(GetRecoParam());
132 : if(fgRecoParam){
133 : fgRecoParam->SetGlauberMCDist(fBeamEnergy);
134 : }*/
135 0 : }
136 :
137 8 : AliCDBEntry *entry = AliCDBManager::Instance()->Get("GRP/Calib/LHCClockPhase");
138 2 : if (!entry) AliFatal("LHC clock-phase shift is not found in OCDB !");
139 : else{
140 2 : AliLHCClockPhase *phaseLHC = (AliLHCClockPhase*)entry->GetObject();
141 : // 4/2/2011 According to A. Di Mauro BEAM1 measurement is more reliable
142 : // than BEAM2 and therefore also than the average of the 2
143 4 : fMeanPhase = phaseLHC->GetMeanPhaseB1();
144 : }
145 2 : if(fIsCalibrationMB==kFALSE)
146 8 : AliInfo(Form("\n\n ***** ZDC reconstruction initialized for %s @ %1.0f + %1.0f GeV *****\n\n",
147 : beamType.Data(), fBeamEnergy, fBeamEnergy));
148 :
149 : // if EMD calibration run NO ENERGY CALIBRATION should be performed
150 : // pp-like reconstruction must be performed (E calib. coeff. = 1)
151 4 : if((runType.CompareTo("CALIBRATION_EMD")) == 0) fRecoMode=1;
152 :
153 6 : AliInfo(Form(" ZDC reconstruction mode %d (1 -> p-p/p-A, 2-> A-A)\n\n",fRecoMode));
154 :
155 6 : fESDZDC = new AliESDZDC();
156 2 : }
157 :
158 :
159 : //____________________________________________________________________________
160 : void AliZDCReconstructor::Init(TString beamType, Float_t beamEnergy)
161 : {
162 : // Setting reconstruction mode
163 : // Needed to work in the HLT framework
164 :
165 0 : fIsCalibrationMB = kFALSE;
166 :
167 0 : fBeamEnergy = beamEnergy;
168 :
169 0 : if(((beamType.CompareTo("pp"))==0) || ((beamType.CompareTo("p-p"))==0)
170 0 : ||((beamType.CompareTo("PP"))==0) || ((beamType.CompareTo("P-P"))==0)){
171 0 : fRecoMode=1;
172 0 : }
173 0 : else if(((beamType.CompareTo("p-A"))==0) || ((beamType.CompareTo("A-p"))==0)
174 0 : ||((beamType.CompareTo("P-A"))==0) || ((beamType.CompareTo("A-P"))==0)){
175 0 : fRecoMode=1;
176 0 : }
177 0 : else if((beamType.CompareTo("A-A")) == 0 || (beamType.CompareTo("AA")) == 0){
178 0 : fRecoMode=2;
179 : //if(!fgRecoParam) fgRecoParam = const_cast<AliZDCRecoParam*>(GetRecoParam());
180 : //if( fgRecoParam ) fgRecoParam->SetGlauberMCDist(fBeamEnergy);
181 0 : }
182 :
183 0 : AliCDBEntry *entry = AliCDBManager::Instance()->Get("GRP/Calib/LHCClockPhase");
184 0 : if (!entry) AliFatal("LHC clock-phase shift is not found in OCDB !");
185 : else{
186 0 : AliLHCClockPhase *phaseLHC = (AliLHCClockPhase*)entry->GetObject();
187 0 : fMeanPhase = phaseLHC->GetMeanPhase();
188 : }
189 0 : fESDZDC = new AliESDZDC();
190 :
191 0 : AliInfo(Form("\n\n ***** ZDC reconstruction initialized for %s @ %1.0f + %1.0f GeV *****\n\n",
192 : beamType.Data(), fBeamEnergy, fBeamEnergy));
193 :
194 0 : }
195 :
196 : //_____________________________________________________________________________
197 : void AliZDCReconstructor::Reconstruct(TTree* digitsTree, TTree* clustersTree) const
198 : {
199 : // *** Local ZDC reconstruction for digits
200 : // Works on the current event
201 :
202 : // Retrieving calibration data
203 : // Parameters for mean value pedestal subtraction
204 : int const kNch = 24;
205 8 : Float_t meanPed[2*kNch];
206 392 : for(Int_t jj=0; jj<2*kNch; jj++) meanPed[jj] = fPedData->GetMeanPed(jj);
207 : // Parameters pedestal subtraction through correlation with out-of-time signals
208 4 : Float_t corrCoeff0[2*kNch], corrCoeff1[2*kNch];
209 392 : for(Int_t jj=0; jj<2*kNch; jj++){
210 192 : corrCoeff0[jj] = fPedData->GetPedCorrCoeff0(jj);
211 192 : corrCoeff1[jj] = fPedData->GetPedCorrCoeff1(jj);
212 : }
213 4 : Bool_t testPedSubBit = fPedData->TestPedModeBit();
214 :
215 4 : Bool_t chPedSubMode[kNch] = {0,};
216 4 : if(testPedSubBit){
217 0 : for(int i=0; i<kNch; i++) chPedSubMode[i] = fPedData->GetUseCorrFit(i);
218 0 : }
219 :
220 4 : int adcInTime[kNch][2], adcOutOfTime[kNch][2];
221 4 : float adcCorr[kNch][2];
222 4 : int signalCode[2*kNch]={0,};
223 200 : for(int ich=0; ich<24; ich++){
224 576 : for(int ig=0; ig<=1; ig++){
225 192 : adcInTime[ich][ig] = adcOutOfTime[ich][ig] = adcCorr[ich][ig] = -1;
226 : }
227 : }
228 4 : int tdcCabling[7]={-1,-1,-1,-1,-1,-1,-1};
229 :
230 : // get digits
231 4 : AliZDCDigit digit;
232 4 : AliZDCDigit* pdigit = &digit;
233 4 : digitsTree->SetBranchAddress("ZDC", &pdigit);
234 : //printf("\n\t # of digits in tree: %d\n",(Int_t) digitsTree->GetEntries());
235 :
236 : // loop over digits
237 8 : Int_t digNentries = digitsTree->GetEntries();
238 392 : for(Int_t iDigit=0; iDigit<digNentries; iDigit++){
239 192 : digitsTree->GetEntry(iDigit);
240 192 : if(pdigit){
241 : // first kNch channels are in-time ADC values
242 192 : if(iDigit<kNch){
243 576 : for(int igain=0; igain<=1; igain++) adcInTime[iDigit][igain] = digit.GetADCValue(igain);
244 96 : }
245 96 : else if(iDigit>=kNch && iDigit<2*kNch){
246 576 : for(int igain=0; igain<=1; igain++) adcOutOfTime[iDigit-kNch][igain] = digit.GetADCValue(igain);
247 96 : }
248 0 : else AliWarning(" Looking for wrong index in digit tree: index >kNch !!!\n");
249 : //
250 : // Writing cabled signal code for digits!!!!!!!!!!!!!!!!!!!!!!!!
251 192 : int det = digit.GetSector(0);
252 192 : int quad = digit.GetSector(1);
253 192 : if(iDigit<kNch){ // first Nch digits are for in time signals
254 96 : signalCode[iDigit] = GetChannelSignal(det, quad, kTRUE);
255 96 : }
256 192 : if(testPedSubBit){
257 0 : if(iDigit>=kNch && iDigit<2*kNch){ // 2nd Nch digits are for out of time signals
258 0 : signalCode[iDigit] = GetChannelSignal(det, quad, kFALSE);
259 0 : }
260 : } // if(testPedSubBit)
261 192 : }
262 : } // Loop over digits
263 :
264 : // PEDESTAL subtraction
265 : // Nov 2015: if PedSubMode==kTRUE but coefficients are null, mean value must be subtracted!!!!!
266 200 : for(int ich=0; ich<24; ich++){
267 96 : if(chPedSubMode[ich]==kTRUE && (TMath::Abs(corrCoeff1[ich])>0. && TMath::Abs(corrCoeff0[ich])>0.)){
268 : // Pedestal subtraction from correlation ------------------------------------------------
269 0 : for(int igain=0; igain<=1; igain++)
270 0 : adcCorr[ich][igain] = (float) (adcInTime[ich][igain] - (corrCoeff1[ich+igain*kNch]*adcOutOfTime[ich][igain]+corrCoeff0[ich+igain*kNch]));
271 0 : }
272 96 : else if((chPedSubMode[ich]==kFALSE) || (chPedSubMode[ich]==kTRUE && ((TMath::Abs(corrCoeff1[ich]))<1e5 && TMath::Abs(corrCoeff0[ich])<1e5))){
273 : // Pedestal subtraction from mean value ------------------------------------------------
274 576 : for(int igain=0; igain<=1; igain++){
275 192 : adcCorr[ich][igain] = (float) (adcInTime[ich][igain] - meanPed[ich+igain*kNch]);
276 : }
277 96 : }
278 : // Ch. debug
279 : //printf("ZDC rec.ADC: ch.%d (code %d) rawADC %d subMode %d meanPed %f pedfromcorr = %f -> corrADC HR %f \n", ich, adcSignal[ich], adcInTime[ich][0], chPedSubMode[ich], meanPed[ich], corrCoeff1[ich]*adcOutOfTime[ich][0]+corrCoeff0[ich], adcCorr[ich][0]);
280 : }
281 :
282 : // Ch. debug
283 : //printf("\n ---- AliZDCReconstructor: rec from digits\n");
284 : //for(int ich=0; ich<kNch; ich++) if(adcInTime[ich][0]>0.) printf(" ch.%d signalcode %d rawADC HR %d subMode %d corrADC HR %f \n", ich, signalCode[ich], adcInTime[ich][0], chPedSubMode[ich], adcCorr[ich][0]);
285 :
286 4 : UInt_t counts[32];
287 4 : Int_t tdc[32][4];
288 264 : for(Int_t jj=0; jj<32; jj++){
289 128 : counts[jj]=0;
290 1280 : for(Int_t ii=0; ii<4; ii++) tdc[jj][ii]=0;
291 : }
292 :
293 4 : Int_t evQualityBlock[4] = {1,0,0,0};
294 4 : Int_t triggerBlock[4] = {0,0,0,0};
295 4 : Int_t chBlock[3] = {0,0,0};
296 : UInt_t puBits=0;
297 :
298 : // reconstruct the event
299 4 : if(fRecoMode==1)
300 8 : ReconstructEventpp(clustersTree, adcCorr, signalCode, tdcCabling, kFALSE, counts, tdc,
301 4 : evQualityBlock, triggerBlock, chBlock, puBits);
302 0 : else if(fRecoMode==2)
303 0 : ReconstructEventPbPb(clustersTree, adcCorr, signalCode, tdcCabling, kFALSE, counts, tdc,
304 0 : evQualityBlock, triggerBlock, chBlock, puBits);
305 4 : }
306 :
307 : //_____________________________________________________________________________
308 : void AliZDCReconstructor::Reconstruct(AliRawReader* rawReader, TTree* clustersTree) const
309 : {
310 : // *** ZDC raw data reconstruction
311 : // Works on the current event
312 :
313 : // Retrieving calibration data
314 : // Parameters for pedestal subtraction
315 : int const kNch = 24;
316 8 : Float_t meanPed[2*kNch];
317 392 : for(Int_t jj=0; jj<2*kNch; jj++) meanPed[jj] = fPedData->GetMeanPed(jj);
318 : // Parameters pedestal subtraction through correlation with out-of-time signals
319 4 : Float_t corrCoeff0[2*kNch], corrCoeff1[2*kNch];
320 392 : for(Int_t jj=0; jj<2*kNch; jj++){
321 192 : corrCoeff0[jj] = fPedData->GetPedCorrCoeff0(jj);
322 192 : corrCoeff1[jj] = fPedData->GetPedCorrCoeff1(jj);
323 : //printf(" %d %1.4f %1.4f\n", jj,corrCoeff0[jj],corrCoeff1[jj]);
324 : }
325 4 : Bool_t testPedSubBit = fPedData->TestPedModeBit();
326 : //ch. debug
327 : //printf(" pedSubMode from OCDB object (test bit) %d (FALSE = mean value, TRUE = from corr. w. o.o.t)\n", testPedSubBit);
328 :
329 : // Reading mapping from OCDB
330 : //fMapping->Print("");
331 : //
332 4 : Int_t tdcSignalCode[32] = {0};
333 : // **** Adding a fix since kL0 in RUN1 was not set in the mapping (23/7/2015)
334 : Bool_t iskL0set = kFALSE;
335 264 : for(int i=0; i<32; i++){
336 128 : tdcSignalCode[i] = fMapping->GetTDCSignalCode(i);
337 : // Ch. debug
338 : //printf(" TDC ch.%d signal %d \n",i, tdcSignalCode[i]);
339 :
340 132 : if(fMapping->GetTDCSignalCode(i) == kL0) iskL0set = kTRUE;
341 : }
342 : // if kL0 is not set (RUN1) it is manually set to ch.15
343 4 : if(!iskL0set) tdcSignalCode[15] = kL0;
344 : // Ch. debug
345 : //printf(" iskL0set %d tdcSignalCode[15] %d \n",iskL0set, tdcSignalCode[15]);
346 :
347 : Bool_t isScalerOn=kFALSE;
348 : Int_t jsc=0, itdc=0, ihittdc=0;
349 4 : Int_t iprevtdc[32];
350 4 : UInt_t scalerData[32]={0,};
351 4 : Int_t tdcData[32][4];
352 264 : for(Int_t k=0; k<32; k++){
353 128 : iprevtdc[k]=-1;
354 1280 : for(Int_t i=0; i<4; i++) tdcData[k][i]=0;
355 : }
356 :
357 :
358 4 : Int_t evQualityBlock[4] = {1,0,0,0};
359 4 : Int_t triggerBlock[4] = {0,0,0,0};
360 4 : Int_t chBlock[3] = {0,0,0};
361 : UInt_t puBits=0;
362 :
363 4 : int adcInTime[kNch][2], adcOutOfTime[kNch][2];
364 4 : float adcCorr[kNch][2];
365 200 : for(int ich=0; ich<kNch; ich++){
366 576 : for(int ig=0; ig<=1; ig++) adcInTime[ich][ig] = adcOutOfTime[ich][ig] = adcCorr[ich][ig] = 0;
367 : }
368 :
369 4 : Bool_t chPedSubMode[kNch] = {0,};
370 4 : if(testPedSubBit){
371 0 : for(int i=0; i<kNch; i++) chPedSubMode[i] = fPedData->GetUseCorrFit(i);
372 0 : }
373 :
374 4 : int adcSignal[kNch]={0};
375 4 : int tdcCabling[7]={-1,-1,-1,-1,-1,-1,-1};
376 :
377 :
378 : // loop over raw data
379 : //rawReader->Reset();
380 4 : AliZDCRawStream rawData(rawReader);
381 844 : while(rawData.Next()){
382 :
383 : // ***************************** Reading ADCs
384 832 : if((rawData.GetADCModule()>=kFirstADCGeo) && (rawData.GetADCModule()<=kLastADCGeo)){
385 : //printf(" **** Reading ADC raw data from module %d **** \n",rawData.GetADCModule());
386 : //
387 1112 : if((rawData.IsADCDataWord()) && (rawData.GetNChannelsOn()<48)) chBlock[0] = kTRUE;
388 755 : if((rawData.IsADCDataWord()) && (rawData.IsOverflow() == kTRUE)) chBlock[1] = kTRUE;
389 764 : if((rawData.IsADCDataWord()) && (rawData.IsUnderflow() == kTRUE)) chBlock[2] = kTRUE;
390 1112 : if((rawData.IsADCDataWord()) && (rawData.IsADCEventGood() == kTRUE)) evQualityBlock[0] = kTRUE;
391 :
392 1100 : if((rawData.IsADCDataWord()) && (rawData.IsUnderflow()==kFALSE)
393 708 : && (rawData.IsOverflow()==kFALSE)){
394 : //&& (rawData.IsOverflow()==kFALSE) && (rawData.IsADCEventGood()==kTRUE)){
395 :
396 345 : Int_t adcMod = rawData.GetADCModule();
397 345 : Int_t adcCh = rawData.GetADCChannel();
398 345 : Int_t det = rawData.GetSector(0);
399 345 : Int_t quad = rawData.GetSector(1);
400 345 : Int_t gain = rawData.GetADCGain();
401 345 : Int_t value = rawData.GetADCValue();
402 : //
403 : // NB -> index is needed to cpompute which of the 24 signal I want to reconstruct I am dealing with!!!!!!!!!
404 : // The order is: ZNC(PMC,1,2,3,4) ZPC(PMC,1,2,3,4) ZEM1 ZEM2 ZNA(PMC,1,2,3,4) ZPA(PMC,1,2,3,4) PMREF1 PMREF2
405 : // that MUST correspond to the oredr with which are written the pedestals!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
406 : int index = -1;
407 345 : if(quad!=5){
408 378 : if(det==1) index = quad;
409 308 : else if(det==2) index = 5+quad;
410 216 : else if(det==3) index = 9+quad; // giusto 9!!!!
411 240 : else if(det==4) index = 12+quad;
412 160 : else if(det==5) index = 17+quad;
413 : }
414 32 : else index = (det-1)/3+22;
415 : //Ch.debug
416 : //printf("\t AliZDCReconstructor: ADC mod.%d ch.%d det.%d quad.%d, gain.%d value %d\n",adcMod, adcCh,det,quad,gain,value);
417 :
418 345 : if((adcMod==0 || adcMod==1) && index!=-1){
419 201 : adcInTime[index][gain] = value; // in time signals
420 201 : adcSignal[index] = GetChannelSignal(det, quad, kTRUE);
421 : //Ch.debug
422 : //printf(" mod.%d ch.%d sigcode %d det.%d sec.%d adcInTime[%d][%d] = %d\n\n",adcMod, adcCh, adcSignal[index], det,quad,index, gain, value);
423 201 : }
424 144 : else if((adcMod==2 || adcMod==3) && index!=-1){
425 144 : adcOutOfTime[index][gain] = value; // out of time signals
426 144 : }
427 :
428 345 : }//IsADCDataWord
429 : }// ADC DATA
430 : // ***************************** Reading Scaler
431 24 : else if(rawData.GetADCModule()==kScalerGeo){
432 0 : if(rawData.IsScalerWord()==kTRUE){
433 : isScalerOn = kTRUE;
434 0 : scalerData[jsc] = rawData.GetTriggerCount();
435 : // Ch. debug
436 : //printf(" Reconstructed VME Scaler: %d %d ",jsc,scalerData[jsc]);
437 : //
438 0 : jsc++;
439 0 : }
440 : }// VME SCALER DATA
441 : // ***************************** Reading ZDC TDC
442 24 : else if(rawData.GetADCModule()==kZDCTDCGeo && rawData.IsZDCTDCDatum()==kTRUE){
443 0 : itdc = rawData.GetChannel();
444 : // Setting signal code read from OCDB
445 0 : rawData.SetCabledSignal(tdcSignalCode[itdc]);
446 : // setting TDC channels from raw data (=0 if reconstructing from digits!!!!)
447 : // NB -> I want to store the ch. in tdcCabling variable ONLY if it is not yet stored!!!
448 : // NB -> THE ORDER MUST BE THE SAME AS THE ONE IN ZDCMAPPINGDA.cxx (7/7/2015)
449 : // ZEM1 ZEM2 ZNC ZPC ZNA ZPA
450 : // otherwise calibrated TDC won't be centered around zero (wrong offset subtracted)
451 0 : if(tdcSignalCode[itdc]==kZEM1D && tdcCabling[0]<0) tdcCabling[0] = itdc;
452 0 : else if(tdcSignalCode[itdc]==kZEM2D && tdcCabling[1]<0) tdcCabling[1] = itdc;
453 0 : else if(tdcSignalCode[itdc]==kZNCD && tdcCabling[2]<0) tdcCabling[2] = itdc;
454 0 : else if(tdcSignalCode[itdc]==kZPCD && tdcCabling[3]<0) tdcCabling[3] = itdc;
455 0 : else if(tdcSignalCode[itdc]==kZNAD && tdcCabling[4]<0) tdcCabling[4] = itdc;
456 0 : else if(tdcSignalCode[itdc]==kZPAD && tdcCabling[5]<0) tdcCabling[5] = itdc;
457 0 : else if(tdcSignalCode[itdc]==kL0 && tdcCabling[6]<0) tdcCabling[6] = itdc;
458 : //
459 0 : iprevtdc[itdc]++;
460 0 : if(iprevtdc[itdc]<4) tdcData[itdc][iprevtdc[itdc]] = rawData.GetZDCTDCDatum();
461 : // Ch. debug
462 : //printf(" TDCch.%d hit %d signal %d value %d\n",itdc, iprevtdc[itdc], rawData.GetCabledSignal(),rawData.GetZDCTDCDatum());
463 : }// ZDC TDC DATA
464 : // ***************************** Reading PU
465 24 : else if(rawData.GetADCModule()==kPUGeo){
466 0 : puBits = rawData.GetDetectorPattern();
467 0 : }
468 : // ***************************** Reading trigger history
469 24 : else if(rawData.IstriggerHistoryWord()==kTRUE){
470 0 : triggerBlock[0] = rawData.IsCPTInputEMDTrigger();
471 0 : triggerBlock[1] = rawData.IsCPTInputSemiCentralTrigger();
472 0 : triggerBlock[2] = rawData.IsCPTInputCentralTrigger();
473 0 : triggerBlock[3] = rawData.IsCPTInputMBTrigger();
474 0 : }
475 :
476 : }//loop on raw data
477 : // Ch. debug
478 : //printf("\n TDC channels ZEM1 %d ZEM2 %d ZNC %d ZPC %d ZNA %d ZPA %d L0 %d\n\n", tdcCabling[0],tdcCabling[1],tdcCabling[2],tdcCabling[3],tdcCabling[4],tdcCabling[5],tdcCabling[6]);
479 :
480 : // PEDESTAL subtraction
481 : // Jul 2015: if PedSubMode==kTRUE but coefficients are null, mean value must be subtracted!!!!!
482 200 : for(int ich=0; ich<24; ich++){
483 96 : if(chPedSubMode[ich]==kTRUE && (TMath::Abs(corrCoeff1[ich])>0. && TMath::Abs(corrCoeff0[ich])>0.)){
484 : // Pedestal subtraction from correlation ------------------------------------------------
485 0 : for(int igain=0; igain<=1; igain++)
486 0 : adcCorr[ich][igain] = (float) (adcInTime[ich][igain] - (corrCoeff1[ich+igain*kNch]*adcOutOfTime[ich][igain]+corrCoeff0[ich+igain*kNch]));
487 0 : }
488 96 : else if((chPedSubMode[ich]==kFALSE) || (chPedSubMode[ich]==kTRUE && ((TMath::Abs(corrCoeff1[ich]))<1e5 && TMath::Abs(corrCoeff0[ich])<1e5))){
489 : // Pedestal subtraction from mean value ------------------------------------------------
490 576 : for(int igain=0; igain<=1; igain++){
491 192 : adcCorr[ich][igain] = (float) (adcInTime[ich][igain] - meanPed[ich+igain*kNch]);
492 : }
493 96 : }
494 : // Ch. debug
495 : //printf("ZDC rec.ADC: ch.%d (code %d) rawADC %d subMode %d meanPed %f pedfromcorr = %f -> corrADC HR %f \n", ich, adcSignal[ich], adcInTime[ich][0], chPedSubMode[ich], meanPed[ich], corrCoeff1[ich]*adcOutOfTime[ich][0]+corrCoeff0[ich], adcCorr[ich][0]);
496 : }
497 :
498 :
499 :
500 4 : if(fRecoMode==1) // p-p data
501 8 : ReconstructEventpp(clustersTree, adcCorr, adcSignal, tdcCabling, isScalerOn, scalerData, tdcData,
502 4 : evQualityBlock, triggerBlock, chBlock, puBits);
503 0 : else if(fRecoMode==2) // Pb-Pb data
504 0 : ReconstructEventPbPb(clustersTree, adcCorr, adcSignal, tdcCabling, isScalerOn, scalerData, tdcData,
505 0 : evQualityBlock, triggerBlock, chBlock, puBits);
506 4 : }
507 :
508 : //_____________________________________________________________________________
509 : void AliZDCReconstructor::ReconstructEventpp(TTree *clustersTree,
510 : Float_t adc[24][2], Int_t signalCodeADC[24], Int_t tdcCabling[7], Bool_t isScalerOn, UInt_t* scaler,
511 : Int_t tdc[32][4], const Int_t* const evQualityBlock,
512 : const Int_t* const triggerBlock, const Int_t* const chBlock, UInt_t puBits) const
513 : {
514 : // ****************** Reconstruct one event ******************
515 :
516 : int const kNch = 24;
517 8 : Float_t corrADCZNC[10] = {0,}, corrADCZPC[10] = {0,};
518 8 : Float_t corrADCZNA[10] = {0,}, corrADCZPA[10] = {0,};
519 8 : Float_t corrADCZEM1[2] = {0,0}, corrADCZEM2[2] = {0,0};
520 8 : Float_t sPMRef1[2] = {0,0}, sPMRef2[2] = {0,0};
521 :
522 400 : for(int i=0; i<kNch; i++){
523 192 : if(signalCodeADC[i]==kZNAC){
524 48 : for(int igain=0; igain<=1; igain++) corrADCZNA[0+5*igain] = adc[i][igain];
525 8 : }
526 184 : else if(signalCodeADC[i]==kZNA1){
527 48 : for(int igain=0; igain<=1; igain++) corrADCZNA[1+5*igain] = adc[i][igain];
528 8 : }
529 176 : else if(signalCodeADC[i]==kZNA2){
530 48 : for(int igain=0; igain<=1; igain++) corrADCZNA[2+5*igain] = adc[i][igain];
531 8 : }
532 168 : else if(signalCodeADC[i]==kZNA3){
533 48 : for(int igain=0; igain<=1; igain++) corrADCZNA[3+5*igain] = adc[i][igain];
534 8 : }
535 160 : else if(signalCodeADC[i]==kZNA4){
536 48 : for(int igain=0; igain<=1; igain++) corrADCZNA[4+5*igain] = adc[i][igain];
537 8 : }
538 152 : else if(signalCodeADC[i]==kZPAC){
539 48 : for(int igain=0; igain<=1; igain++) corrADCZPA[0+5*igain] = adc[i][igain];
540 8 : }
541 144 : else if(signalCodeADC[i]==kZPA1){
542 48 : for(int igain=0; igain<=1; igain++) corrADCZPA[1+5*igain] = adc[i][igain];
543 8 : }
544 136 : else if(signalCodeADC[i]==kZPA2){
545 48 : for(int igain=0; igain<=1; igain++) corrADCZPA[2+5*igain] = adc[i][igain];
546 8 : }
547 128 : else if(signalCodeADC[i]==kZPA3){
548 48 : for(int igain=0; igain<=1; igain++) corrADCZPA[3+5*igain] = adc[i][igain];
549 8 : }
550 120 : else if(signalCodeADC[i]==kZPA4){
551 48 : for(int igain=0; igain<=1; igain++) corrADCZPA[4+5*igain] = adc[i][igain];
552 8 : }
553 112 : else if(signalCodeADC[i]==kZEM1){
554 48 : for(int igain=0; igain<=1; igain++) corrADCZEM1[igain] = adc[i][igain];
555 8 : }
556 104 : else if(signalCodeADC[i]==kZEM2){
557 48 : for(int igain=0; igain<=1; igain++) corrADCZEM2[igain] = adc[i][igain];
558 8 : }
559 96 : else if(signalCodeADC[i]==kZNCC){
560 48 : for(int igain=0; igain<=1; igain++) corrADCZNC[0+5*igain] = adc[i][igain];
561 8 : }
562 88 : else if(signalCodeADC[i]==kZNC1){
563 48 : for(int igain=0; igain<=1; igain++) corrADCZNC[1+5*igain] = adc[i][igain];
564 8 : }
565 80 : else if(signalCodeADC[i]==kZNC2){
566 48 : for(int igain=0; igain<=1; igain++) corrADCZNC[2+5*igain] = adc[i][igain];
567 8 : }
568 72 : else if(signalCodeADC[i]==kZNC3){
569 48 : for(int igain=0; igain<=1; igain++) corrADCZNC[3+5*igain] = adc[i][igain];
570 8 : }
571 64 : else if(signalCodeADC[i]==kZNC4){
572 48 : for(int igain=0; igain<=1; igain++) corrADCZNC[4+5*igain] = adc[i][igain];
573 8 : }
574 56 : else if(signalCodeADC[i]==kZPCC){
575 48 : for(int igain=0; igain<=1; igain++) corrADCZPC[0+5*igain] = adc[i][igain];
576 8 : }
577 48 : else if(signalCodeADC[i]==kZPC1){
578 48 : for(int igain=0; igain<=1; igain++) corrADCZPC[1+5*igain] = adc[i][igain];
579 8 : }
580 40 : else if(signalCodeADC[i]==kZPC2){
581 48 : for(int igain=0; igain<=1; igain++) corrADCZPC[2+5*igain] = adc[i][igain];
582 8 : }
583 32 : else if(signalCodeADC[i]==kZPC3){
584 48 : for(int igain=0; igain<=1; igain++) corrADCZPC[3+5*igain] = adc[i][igain];
585 8 : }
586 24 : else if(signalCodeADC[i]==kZPC4){
587 48 : for(int igain=0; igain<=1; igain++) corrADCZPC[4+5*igain] = adc[i][igain];
588 8 : }
589 16 : else if(signalCodeADC[i]==kZDCCMon){
590 0 : for(int igain=0; igain<=1; igain++) sPMRef1[igain] = adc[i][igain];
591 0 : }
592 16 : else if(signalCodeADC[i]==kZDCAMon){
593 0 : for(int igain=0; igain<=1; igain++) sPMRef2[igain] = adc[i][igain];
594 0 : }
595 :
596 : // Ch. Debug
597 : //printf(" ADC ch. %d cabled signal %d\n",i, signalCodeADC[i]);
598 : }
599 :
600 : // CH. debug
601 : /*printf("\n*************************************************\n");
602 : printf(" ReconstructEventpp -> values after pedestal subtraction:\n");
603 : for(int ich=0; ich<24; ich++) printf(" ch.%d ADC hg %1.2f lg %1.2f\n", ich, adc[ich][0],adc[ich][1]);
604 : printf("*************************************************\n");
605 : // CH. debug
606 : printf("\n*************************************************\n");
607 : printf(" ADCZNC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
608 : corrADCZNC[0],corrADCZNC[1],corrADCZNC[2],corrADCZNC[3],corrADCZNC[4]);
609 : printf(" ADCZPC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
610 : corrADCZPC[0],corrADCZPC[1],corrADCZPC[2],corrADCZPC[3],corrADCZPC[4]);
611 : printf(" ADCZNA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
612 : corrADCZNA[0],corrADCZNA[1],corrADCZNA[2],corrADCZNA[3],corrADCZNA[4]);
613 : printf(" ADCZPA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
614 : corrADCZPA[0],corrADCZPA[1],corrADCZPA[2],corrADCZPA[3],corrADCZPA[4]);
615 : printf(" ADCZEM1 [%1.2f] ADCZEM2 [%1.2f] \n",corrADCZEM1[0],corrADCZEM2[0]);
616 : printf("*************************************************\n"); */
617 :
618 : // ---------------------- Setting reco flags for ESD
619 8 : UInt_t rFlags[32];
620 528 : for(Int_t ifl=0; ifl<32; ifl++) rFlags[ifl]=0;
621 :
622 16 : if(evQualityBlock[0] == 1) rFlags[31] = 0x0;
623 0 : else rFlags[31] = 0x1;
624 : //
625 8 : if(evQualityBlock[1] == 1) rFlags[30] = 0x1;
626 8 : if(evQualityBlock[2] == 1) rFlags[29] = 0x1;
627 8 : if(evQualityBlock[3] == 1) rFlags[28] = 0x1;
628 :
629 8 : if(triggerBlock[0] == 1) rFlags[27] = 0x1;
630 8 : if(triggerBlock[1] == 1) rFlags[26] = 0x1;
631 8 : if(triggerBlock[2] == 1) rFlags[25] = 0x1;
632 8 : if(triggerBlock[3] == 1) rFlags[24] = 0x1;
633 :
634 12 : if(chBlock[0] == 1) rFlags[18] = 0x1;
635 11 : if(chBlock[1] == 1) rFlags[17] = 0x1;
636 12 : if(chBlock[2] == 1) rFlags[16] = 0x1;
637 :
638 8 : rFlags[13] = puBits & 0x00000020;
639 8 : rFlags[12] = puBits & 0x00000010;
640 8 : rFlags[11] = puBits & 0x00000080;
641 8 : rFlags[10] = puBits & 0x00000040;
642 8 : rFlags[9] = puBits & 0x00000020;
643 8 : rFlags[8] = puBits & 0x00000010;
644 :
645 8 : if(corrADCZPC[0]>fSignalThreshold) rFlags[5] = 0x1;
646 8 : if(corrADCZNC[0]>fSignalThreshold) rFlags[4] = 0x1;
647 8 : if(corrADCZEM2[0]>fSignalThreshold) rFlags[3] = 0x1;
648 8 : if(corrADCZEM1[0]>fSignalThreshold) rFlags[2] = 0x1;
649 8 : if(corrADCZPA[0]>fSignalThreshold) rFlags[1] = 0x1;
650 8 : if(corrADCZNA[0]>fSignalThreshold) rFlags[0] = 0x1;
651 :
652 16 : UInt_t recoFlag = rFlags[31] << 31 | rFlags[30] << 30 | rFlags[29] << 29 | rFlags[28] << 28 |
653 16 : rFlags[27] << 27 | rFlags[26] << 26 | rFlags[25] << 25 | rFlags[24] << 24 |
654 : 0x0 << 23 | 0x0 << 22 | 0x0 << 21 | 0x0 << 20 |
655 8 : 0x0 << 19 | rFlags[18] << 18 | rFlags[17] << 17 | rFlags[16] << 16 |
656 16 : 0x0 << 15 | 0x0 << 14 | rFlags[13] << 13 | rFlags[12] << 12 |
657 16 : rFlags[11] << 11 |rFlags[10] << 10 | rFlags[9] << 9 | rFlags[8] << 8 |
658 16 : 0x0 << 7 | 0x0 << 6 | rFlags[5] << 5 | rFlags[4] << 4 |
659 16 : rFlags[3] << 3 | rFlags[2] << 2 | rFlags[1] << 1 | rFlags[0];
660 : // --------------------------------------------------
661 :
662 : // ****** Retrieving calibration data
663 : // --- Equalization coefficients ---------------------------------------------
664 8 : Float_t equalCoeffZNC[5], equalCoeffZPC[5], equalCoeffZNA[5], equalCoeffZPA[5];
665 96 : for(Int_t ji=0; ji<5; ji++){
666 40 : equalCoeffZNC[ji] = fTowCalibData->GetZNCEqualCoeff(ji);
667 40 : equalCoeffZPC[ji] = fTowCalibData->GetZPCEqualCoeff(ji);
668 40 : equalCoeffZNA[ji] = fTowCalibData->GetZNAEqualCoeff(ji);
669 40 : equalCoeffZPA[ji] = fTowCalibData->GetZPAEqualCoeff(ji);
670 : }
671 : // --- Energy calibration factors ------------------------------------
672 8 : Float_t calibEne[6], calibSatZNA[4], calibSatZNC[4];
673 : // **** Energy calibration coefficient set to 1
674 : // **** (no trivial way to calibrate in p-p runs)
675 112 : for(Int_t ij=0; ij<6; ij++) calibEne[ij] = fEnCalibData->GetEnCalib(ij);
676 : //fEnCalibData->Print("");
677 80 : for(Int_t ij=0; ij<4; ij++){
678 32 : calibSatZNA[ij] = fSatCalibData->GetZNASatCalib(ij);
679 32 : calibSatZNC[ij] = fSatCalibData->GetZNCSatCalib(ij);
680 : }
681 :
682 : // ****** Equalization of detector responses ************************
683 8 : Float_t equalTowZNC[10], equalTowZNA[10], equalTowZPC[10], equalTowZPA[10];
684 176 : for(Int_t gi=0; gi<10; gi++){
685 160 : if(gi<5){
686 120 : equalTowZNC[gi] = corrADCZNC[gi]*equalCoeffZNC[gi];
687 40 : equalTowZPC[gi] = corrADCZPC[gi]*equalCoeffZPC[gi];
688 40 : equalTowZNA[gi] = corrADCZNA[gi]*equalCoeffZNA[gi];
689 40 : equalTowZPA[gi] = corrADCZPA[gi]*equalCoeffZPA[gi];
690 40 : }
691 : else{
692 40 : equalTowZNC[gi] = corrADCZNC[gi]*equalCoeffZNC[gi-5];
693 40 : equalTowZPC[gi] = corrADCZPC[gi]*equalCoeffZPC[gi-5];
694 40 : equalTowZNA[gi] = corrADCZNA[gi]*equalCoeffZNA[gi-5];
695 40 : equalTowZPA[gi] = corrADCZPA[gi]*equalCoeffZPA[gi-5];
696 : }
697 : }
698 : // Ch. debug
699 : /*printf("\n ------------- EQUALIZATION -------------\n");
700 : printf(" ADCZNC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
701 : equalTowZNC[0],equalTowZNC[1],equalTowZNC[2],equalTowZNC[3],equalTowZNC[4]);
702 : printf(" ADCZPC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
703 : equalTowZPC[0],equalTowZPC[1],equalTowZPC[2],equalTowZPC[3],equalTowZPC[4]);
704 : printf(" ADCZNA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
705 : equalTowZNA[0],equalTowZNA[1],equalTowZNA[2],equalTowZNA[3],equalTowZNA[4]);
706 : printf(" ADCZPA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
707 : equalTowZPA[0],equalTowZPA[1],equalTowZPA[2],equalTowZPA[3],equalTowZPA[4]);
708 : printf(" ----------------------------------------\n");*/
709 :
710 : // *** p-A RUN 2013 -> new calibration object
711 : // to take into account saturation in ZN PMC
712 : // -> 5th order pol. fun. to be applied BEFORE en. calibration
713 24 : equalTowZNC[0] = equalTowZNC[0] + calibSatZNC[0]*equalTowZNC[0]*equalTowZNC[0] +
714 16 : calibSatZNC[1]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0] +
715 16 : calibSatZNC[2]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0] +
716 8 : calibSatZNC[3]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0];
717 24 : equalTowZNA[0] = equalTowZNA[0] + calibSatZNA[0]*equalTowZNA[0]*equalTowZNA[0] +
718 16 : calibSatZNA[1]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0] +
719 16 : calibSatZNA[2]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0] +
720 8 : calibSatZNA[3]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0];
721 :
722 : // Ch. debug
723 : /*printf("\n ------------- SATURATION CORRECTION -------------\n");
724 : printf(" ZNC PMC %1.2f\n", equalTowZNC[0]);
725 : printf(" ZNA PMC %1.2f\n", equalTowZNA[0]);
726 : printf(" ----------------------------------------\n");*/
727 :
728 : // ****** Summed response for hadronic calorimeter (SUMMED and then CALIBRATED!)
729 8 : Float_t calibSumZNC[2]={0,0}, calibSumZNA[2]={0,0}, calibSumZPC[2]={0,0}, calibSumZPA[2]={0,0};
730 96 : for(Int_t gi=0; gi<5; gi++){
731 40 : calibSumZNC[0] += equalTowZNC[gi];
732 40 : calibSumZPC[0] += equalTowZPC[gi];
733 40 : calibSumZNA[0] += equalTowZNA[gi];
734 40 : calibSumZPA[0] += equalTowZPA[gi];
735 : //
736 40 : calibSumZNC[1] += equalTowZNC[gi+5];
737 40 : calibSumZPC[1] += equalTowZPC[gi+5];
738 40 : calibSumZNA[1] += equalTowZNA[gi+5];
739 40 : calibSumZPA[1] += equalTowZPA[gi+5];
740 : }
741 : // High gain chain
742 8 : calibSumZNC[0] = calibSumZNC[0]*calibEne[0];
743 8 : calibSumZPC[0] = calibSumZPC[0]*calibEne[1];
744 8 : calibSumZNA[0] = calibSumZNA[0]*calibEne[2];
745 8 : calibSumZPA[0] = calibSumZPA[0]*calibEne[3];
746 : // Low gain chain
747 8 : calibSumZNC[1] = calibSumZNC[1]*calibEne[0];
748 8 : calibSumZPC[1] = calibSumZPC[1]*calibEne[1];
749 8 : calibSumZNA[1] = calibSumZNA[1]*calibEne[2];
750 8 : calibSumZPA[1] = calibSumZPA[1]*calibEne[3];
751 :
752 : // ****** Energy calibration of detector responses
753 8 : Float_t calibTowZNC[10], calibTowZNA[10], calibTowZPC[10], calibTowZPA[10];
754 96 : for(Int_t gi=0; gi<5; gi++){
755 : // High gain chain
756 40 : calibTowZNC[gi] = equalTowZNC[gi]*calibEne[0];
757 40 : calibTowZPC[gi] = equalTowZPC[gi]*calibEne[1];
758 40 : calibTowZNA[gi] = equalTowZNA[gi]*calibEne[2];
759 40 : calibTowZPA[gi] = equalTowZPA[gi]*calibEne[3];
760 : // Low gain chain
761 40 : calibTowZNC[gi+5] = equalTowZNC[gi+5]*calibEne[0];
762 40 : calibTowZPC[gi+5] = equalTowZPC[gi+5]*calibEne[1];
763 40 : calibTowZNA[gi+5] = equalTowZNA[gi+5]*calibEne[2];
764 40 : calibTowZPA[gi+5] = equalTowZPA[gi+5]*calibEne[3];
765 : }
766 : //
767 8 : Float_t calibZEM1[2]={0,0}, calibZEM2[2]={0,0};
768 8 : calibZEM1[0] = corrADCZEM1[0]*calibEne[4];
769 8 : calibZEM1[1] = corrADCZEM1[1]*calibEne[4];
770 8 : calibZEM2[0] = corrADCZEM2[0]*calibEne[5];
771 8 : calibZEM2[1] = corrADCZEM2[1]*calibEne[5];
772 : // Ch. debug
773 : /*printf("\n ------------- CALIBRATION -------------\n");
774 : printf(" ADCZNC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
775 : calibTowZNC[0],calibTowZNC[1],calibTowZNC[2],calibTowZNC[3],calibTowZNC[4]);
776 : printf(" ADCZPC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
777 : calibTowZPC[0],calibTowZPC[1],calibTowZPC[2],calibTowZPC[3],calibTowZPC[4]);
778 : printf(" ADCZNA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
779 : calibTowZNA[0],calibTowZNA[1],calibTowZNA[2],calibTowZNA[3],calibTowZNA[4]);
780 : printf(" ADCZPA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
781 : calibTowZPA[0],calibTowZPA[1],calibTowZPA[2],calibTowZPA[3],calibTowZPA[4]);
782 : printf(" ADCZEM1 [%1.2f] ADCZEM2 [%1.2f] \n",calibZEM1[0],calibZEM2[0]);
783 : printf(" ----------------------------------------\n");*/
784 :
785 : // ****** No. of spectator and participants nucleons
786 : // Variables calculated to comply with ESD structure
787 : // *** N.B. -> They have a meaning only in Pb-Pb!!!!!!!!!!!!
788 : Int_t nDetSpecNLeft=0, nDetSpecPLeft=0, nDetSpecNRight=0, nDetSpecPRight=0;
789 : Int_t nGenSpec=0, nGenSpecLeft=0, nGenSpecRight=0;
790 : Int_t nPart=0, nPartTotLeft=0, nPartTotRight=0;
791 : Double_t impPar=0., impPar1=0., impPar2=0.;
792 :
793 : Bool_t energyFlag = kFALSE;
794 : // create the output tree
795 24 : AliZDCReco* reco = new AliZDCReco(calibSumZNC, calibSumZPC, calibSumZNA, calibSumZPA,
796 8 : calibTowZNC, calibTowZPC, calibTowZNA, calibTowZPA,
797 8 : calibZEM1, calibZEM2, sPMRef1, sPMRef2,
798 : nDetSpecNLeft, nDetSpecPLeft, nDetSpecNRight, nDetSpecPRight,
799 : nGenSpec, nGenSpecLeft, nGenSpecRight,
800 : nPart, nPartTotLeft, nPartTotRight,
801 : impPar, impPar1, impPar2,
802 8 : recoFlag, energyFlag, isScalerOn, scaler, tdc, tdcCabling);
803 :
804 : const Int_t kBufferSize = 4000;
805 8 : clustersTree->Branch("ZDC", "AliZDCReco", &reco, kBufferSize);
806 : // write the output tree
807 8 : clustersTree->Fill();
808 16 : delete reco;
809 8 : }
810 :
811 : //_____________________________________________________________________________
812 : void AliZDCReconstructor::ReconstructEventPbPb(TTree *clustersTree,
813 : Float_t adc[24][2], Int_t signalCodeADC[24], Int_t tdcCabling[7], Bool_t isScalerOn, UInt_t* scaler,
814 : Int_t tdc[32][4], const Int_t* const evQualityBlock,
815 : const Int_t* const triggerBlock, const Int_t* const chBlock, UInt_t puBits) const
816 : {
817 : // ****************** Reconstruct one event ******************
818 :
819 : int const kNch = 24;
820 0 : Float_t corrADCZNC[10] = {0,}, corrADCZPC[10] = {0,};
821 0 : Float_t corrADCZNA[10] = {0,}, corrADCZPA[10] = {0,};
822 0 : Float_t corrADCZEM1[2] = {0,0}, corrADCZEM2[2] = {0,0};
823 0 : Float_t sPMRef1[2] = {0,0}, sPMRef2[2] = {0,0};
824 :
825 0 : for(int i=0; i<kNch; i++){
826 0 : if(signalCodeADC[i]==kZNAC){
827 0 : for(int igain=0; igain<=1; igain++) corrADCZNA[0+5*igain] = adc[i][igain];
828 0 : }
829 0 : else if(signalCodeADC[i]==kZNA1){
830 0 : for(int igain=0; igain<=1; igain++) corrADCZNA[1+5*igain] = adc[i][igain];
831 0 : }
832 0 : else if(signalCodeADC[i]==kZNA2){
833 0 : for(int igain=0; igain<=1; igain++) corrADCZNA[2+5*igain] = adc[i][igain];
834 0 : }
835 0 : else if(signalCodeADC[i]==kZNA3){
836 0 : for(int igain=0; igain<=1; igain++) corrADCZNA[3+5*igain] = adc[i][igain];
837 0 : }
838 0 : else if(signalCodeADC[i]==kZNA4){
839 0 : for(int igain=0; igain<=1; igain++) corrADCZNA[4+5*igain] = adc[i][igain];
840 0 : }
841 0 : else if(signalCodeADC[i]==kZPAC){
842 0 : for(int igain=0; igain<=1; igain++) corrADCZPA[0+5*igain] = adc[i][igain];
843 0 : }
844 0 : else if(signalCodeADC[i]==kZPA1){
845 0 : for(int igain=0; igain<=1; igain++) corrADCZPA[1+5*igain] = adc[i][igain];
846 0 : }
847 0 : else if(signalCodeADC[i]==kZPA2){
848 0 : for(int igain=0; igain<=1; igain++) corrADCZPA[2+5*igain] = adc[i][igain];
849 0 : }
850 0 : else if(signalCodeADC[i]==kZPA3){
851 0 : for(int igain=0; igain<=1; igain++) corrADCZPA[3+5*igain] = adc[i][igain];
852 0 : }
853 0 : else if(signalCodeADC[i]==kZPA4){
854 0 : for(int igain=0; igain<=1; igain++) corrADCZPA[4+5*igain] = adc[i][igain];
855 0 : }
856 0 : else if(signalCodeADC[i]==kZEM1){
857 0 : for(int igain=0; igain<=1; igain++) corrADCZEM1[igain] = adc[i][igain];
858 0 : }
859 0 : else if(signalCodeADC[i]==kZEM2){
860 0 : for(int igain=0; igain<=1; igain++) corrADCZEM2[igain] = adc[i][igain];
861 0 : }
862 0 : else if(signalCodeADC[i]==kZNCC){
863 0 : for(int igain=0; igain<=1; igain++) corrADCZNC[0+5*igain] = adc[i][igain];
864 0 : }
865 0 : else if(signalCodeADC[i]==kZNC1){
866 0 : for(int igain=0; igain<=1; igain++) corrADCZNC[1+5*igain] = adc[i][igain];
867 0 : }
868 0 : else if(signalCodeADC[i]==kZNC2){
869 0 : for(int igain=0; igain<=1; igain++) corrADCZNC[2+5*igain] = adc[i][igain];
870 0 : }
871 0 : else if(signalCodeADC[i]==kZNC3){
872 0 : for(int igain=0; igain<=1; igain++) corrADCZNC[3+5*igain] = adc[i][igain];
873 0 : }
874 0 : else if(signalCodeADC[i]==kZNC4){
875 0 : for(int igain=0; igain<=1; igain++) corrADCZNC[4+5*igain] = adc[i][igain];
876 0 : }
877 0 : else if(signalCodeADC[i]==kZPCC){
878 0 : for(int igain=0; igain<=1; igain++) corrADCZPC[0+5*igain] = adc[i][igain];
879 0 : }
880 0 : else if(signalCodeADC[i]==kZPC1){
881 0 : for(int igain=0; igain<=1; igain++) corrADCZPC[1+5*igain] = adc[i][igain];
882 0 : }
883 0 : else if(signalCodeADC[i]==kZPC2){
884 0 : for(int igain=0; igain<=1; igain++) corrADCZPC[2+5*igain] = adc[i][igain];
885 0 : }
886 0 : else if(signalCodeADC[i]==kZPC3){
887 0 : for(int igain=0; igain<=1; igain++) corrADCZPC[3+5*igain] = adc[i][igain];
888 0 : }
889 0 : else if(signalCodeADC[i]==kZPC4){
890 0 : for(int igain=0; igain<=1; igain++) corrADCZPC[4+5*igain] = adc[i][igain];
891 0 : }
892 0 : else if(signalCodeADC[i]==kZDCCMon){
893 0 : for(int igain=0; igain<=1; igain++) sPMRef1[igain] = adc[i][igain];
894 0 : }
895 0 : else if(signalCodeADC[i]==kZDCAMon){
896 0 : for(int igain=0; igain<=1; igain++) sPMRef2[igain] = adc[i][igain];
897 0 : }
898 :
899 : // Ch. Debug
900 : //printf(" ADC ch. %d cabled signal %d\n",i, signalCodeADC[i]);
901 : }
902 :
903 : // CH. debug
904 : /*printf("\n*************************************************\n");
905 : printf(" ReconstructEventPbPb -> values after pedestal subtraction:\n");
906 : for(int ich=0; ich<24; ich++) printf(" ch.%d ADC hg %1.2f lg %1.2f\n", ich, adc[ich][0],adc[ich][1]);
907 : printf("*************************************************\n");*/
908 : // CH. debug
909 : /*printf("\n*************************************************\n");
910 : printf(" ADCZNC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
911 : corrADCZNC[0],corrADCZNC[1],corrADCZNC[2],corrADCZNC[3],corrADCZNC[4]);
912 : printf(" ADCZPC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
913 : corrADCZPC[0],corrADCZPC[1],corrADCZPC[2],corrADCZPC[3],corrADCZPC[4]);
914 : printf(" ADCZPC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
915 : corrADCZPC[0],corrADCZPC[1],corrADCZPC[2],corrADCZPC[3],corrADCZPC[4]);
916 : printf(" ADCZPA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
917 : corrADCZPA[0],corrADCZPA[1],corrADCZPA[2],corrADCZPA[3],corrADCZPA[4]);
918 : printf(" ADCZEM1 [%1.2f] ADCZEM2 [%1.2f] \n",corrADCZEM1[0],corrADCZEM2[0]);
919 : printf("*************************************************\n"); */
920 :
921 : // ---------------------- Setting reco flags for ESD
922 0 : UInt_t rFlags[32];
923 0 : for(Int_t ifl=0; ifl<32; ifl++) rFlags[ifl]=0;
924 :
925 0 : if(evQualityBlock[0] == 1) rFlags[31] = 0x0;
926 0 : else rFlags[31] = 0x1;
927 : //
928 0 : if(evQualityBlock[1] == 1) rFlags[30] = 0x1;
929 0 : if(evQualityBlock[2] == 1) rFlags[29] = 0x1;
930 0 : if(evQualityBlock[3] == 1) rFlags[28] = 0x1;
931 :
932 0 : if(triggerBlock[0] == 1) rFlags[27] = 0x1;
933 0 : if(triggerBlock[1] == 1) rFlags[26] = 0x1;
934 0 : if(triggerBlock[2] == 1) rFlags[25] = 0x1;
935 0 : if(triggerBlock[3] == 1) rFlags[24] = 0x1;
936 :
937 0 : if(chBlock[0] == 1) rFlags[18] = 0x1;
938 0 : if(chBlock[1] == 1) rFlags[17] = 0x1;
939 0 : if(chBlock[2] == 1) rFlags[16] = 0x1;
940 :
941 0 : rFlags[13] = puBits & 0x00000020;
942 0 : rFlags[12] = puBits & 0x00000010;
943 0 : rFlags[11] = puBits & 0x00000080;
944 0 : rFlags[10] = puBits & 0x00000040;
945 0 : rFlags[9] = puBits & 0x00000020;
946 0 : rFlags[8] = puBits & 0x00000010;
947 :
948 0 : if(corrADCZPC[0]>fSignalThreshold) rFlags[5] = 0x1;
949 0 : if(corrADCZNC[0]>fSignalThreshold) rFlags[4] = 0x1;
950 0 : if(corrADCZEM2[0]>fSignalThreshold) rFlags[3] = 0x1;
951 0 : if(corrADCZEM1[0]>fSignalThreshold) rFlags[2] = 0x1;
952 0 : if(corrADCZPA[0]>fSignalThreshold) rFlags[1] = 0x1;
953 0 : if(corrADCZNA[0]>fSignalThreshold) rFlags[0] = 0x1;
954 :
955 0 : UInt_t recoFlag = rFlags[31] << 31 | rFlags[30] << 30 | rFlags[29] << 29 | rFlags[28] << 28 |
956 0 : rFlags[27] << 27 | rFlags[26] << 26 | rFlags[25] << 25 | rFlags[24] << 24 |
957 : 0x0 << 23 | 0x0 << 22 | 0x0 << 21 | 0x0 << 20 |
958 0 : 0x0 << 19 | rFlags[18] << 18 | rFlags[17] << 17 | rFlags[16] << 16 |
959 0 : 0x0 << 15 | 0x0 << 14 | rFlags[13] << 13 | rFlags[12] << 12 |
960 0 : rFlags[11] << 11 |rFlags[10] << 10 | rFlags[9] << 9 | rFlags[8] << 8 |
961 0 : 0x0 << 7 | 0x0 << 6 | rFlags[5] << 5 | rFlags[4] << 4 |
962 0 : rFlags[3] << 3 | rFlags[2] << 2 | rFlags[1] << 1 | rFlags[0];
963 : // --------------------------------------------------
964 :
965 :
966 : // ****** Retrieving calibration data
967 : // --- Equalization coefficients ---------------------------------------------
968 0 : Float_t equalCoeffZNC[5], equalCoeffZPC[5], equalCoeffZNA[5], equalCoeffZPA[5];
969 0 : for(Int_t ji=0; ji<5; ji++){
970 0 : equalCoeffZNC[ji] = fTowCalibData->GetZNCEqualCoeff(ji);
971 0 : equalCoeffZPC[ji] = fTowCalibData->GetZPCEqualCoeff(ji);
972 0 : equalCoeffZNA[ji] = fTowCalibData->GetZNAEqualCoeff(ji);
973 0 : equalCoeffZPA[ji] = fTowCalibData->GetZPAEqualCoeff(ji);
974 : }
975 : // --- Energy calibration factors ------------------------------------
976 0 : Float_t calibEne[6], calibSatZNA[4], calibSatZNC[4];
977 : // **** Energy calibration coefficient set to 1
978 : // **** (no trivial way to calibrate in p-p runs)
979 0 : for(Int_t ij=0; ij<6; ij++) calibEne[ij] = fEnCalibData->GetEnCalib(ij);
980 0 : for(Int_t ij=0; ij<4; ij++){
981 0 : calibSatZNA[ij] = fSatCalibData->GetZNASatCalib(ij);
982 0 : calibSatZNC[ij] = fSatCalibData->GetZNCSatCalib(ij);
983 : }
984 :
985 : // ****** Equalization of detector responses
986 0 : Float_t equalTowZNC[10], equalTowZNA[10], equalTowZPC[10], equalTowZPA[10];
987 0 : for(Int_t gi=0; gi<10; gi++){
988 0 : if(gi<5){
989 0 : equalTowZNC[gi] = corrADCZNC[gi]*equalCoeffZNC[gi];
990 0 : equalTowZPC[gi] = corrADCZPC[gi]*equalCoeffZPC[gi];
991 0 : equalTowZNA[gi] = corrADCZNA[gi]*equalCoeffZNA[gi];
992 0 : equalTowZPA[gi] = corrADCZPA[gi]*equalCoeffZPA[gi];
993 0 : }
994 : else{
995 0 : equalTowZNC[gi] = corrADCZNC[gi]*equalCoeffZNC[gi-5];
996 0 : equalTowZPC[gi] = corrADCZPC[gi]*equalCoeffZPC[gi-5];
997 0 : equalTowZNA[gi] = corrADCZNA[gi]*equalCoeffZNA[gi-5];
998 0 : equalTowZPA[gi] = corrADCZPA[gi]*equalCoeffZPA[gi-5];
999 : }
1000 : }
1001 :
1002 : // Ch. debug
1003 : /*printf("\n ------------- EQUALIZATION -------------\n");
1004 : printf(" ADCZNC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
1005 : equalTowZNC[0],equalTowZNC[1],equalTowZNC[2],equalTowZNC[3],equalTowZNC[4]);
1006 : printf(" ADCZPC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
1007 : equalTowZPC[0],equalTowZPC[1],equalTowZPC[2],equalTowZPC[3],equalTowZPC[4]);
1008 : printf(" ADCZNA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
1009 : equalTowZNA[0],equalTowZNA[1],equalTowZNA[2],equalTowZNA[3],equalTowZNA[4]);
1010 : printf(" ADCZPA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
1011 : equalTowZPA[0],equalTowZPA[1],equalTowZPA[2],equalTowZPA[3],equalTowZPA[4]);
1012 : printf(" ----------------------------------------\n");*/
1013 :
1014 : // *** p-A RUN 2013 -> new calibration object
1015 : // to take into account saturation in ZN PMC
1016 : // -> 5th order pol. fun. to be applied BEFORE en. calibration
1017 0 : equalTowZNC[0] = equalTowZNC[0] + calibSatZNC[0]*equalTowZNC[0]*equalTowZNC[0] +
1018 0 : calibSatZNC[1]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0] +
1019 0 : calibSatZNC[2]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0] +
1020 0 : calibSatZNC[3]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0]*equalTowZNC[0];
1021 0 : equalTowZNA[0] = equalTowZNA[0] + calibSatZNA[0]*equalTowZNA[0]*equalTowZNA[0] +
1022 0 : calibSatZNA[1]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0] +
1023 0 : calibSatZNA[2]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0] +
1024 0 : calibSatZNA[3]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0]*equalTowZNA[0];
1025 :
1026 : // ****** Summed response for hadronic calorimeter (SUMMED and then CALIBRATED!)
1027 0 : Float_t calibSumZNC[]={0,0}, calibSumZNA[]={0,0}, calibSumZPC[]={0,0}, calibSumZPA[]={0,0};
1028 0 : for(Int_t gi=0; gi<5; gi++){
1029 0 : calibSumZNC[0] += equalTowZNC[gi];
1030 0 : calibSumZPC[0] += equalTowZPC[gi];
1031 0 : calibSumZNA[0] += equalTowZNA[gi];
1032 0 : calibSumZPA[0] += equalTowZPA[gi];
1033 : //
1034 0 : calibSumZNC[1] += equalTowZNC[gi+5];
1035 0 : calibSumZPC[1] += equalTowZPC[gi+5];
1036 0 : calibSumZNA[1] += equalTowZNA[gi+5];
1037 0 : calibSumZPA[1] += equalTowZPA[gi+5];
1038 : }
1039 :
1040 : // High gain chain
1041 : // NB -> The calibration factor is extracted from *8 chain
1042 : // i.e. it is equal to 1.38 TeV/100 ch. ADC -> must be *8. for HG chain!!!!
1043 0 : calibSumZNC[0] = calibSumZNC[0]*calibEne[0]*8.;
1044 0 : calibSumZPC[0] = calibSumZPC[0]*calibEne[1]*8.;
1045 0 : calibSumZNA[0] = calibSumZNA[0]*calibEne[2]*8.;
1046 0 : calibSumZPA[0] = calibSumZPA[0]*calibEne[3]*8.;
1047 : // Low gain chain
1048 0 : calibSumZNC[1] = calibSumZNC[1]*calibEne[0];
1049 0 : calibSumZPC[1] = calibSumZPC[1]*calibEne[1];
1050 0 : calibSumZNA[1] = calibSumZNA[1]*calibEne[2];
1051 0 : calibSumZPA[1] = calibSumZPA[1]*calibEne[3];
1052 : //
1053 0 : Float_t calibZEM1[2]={0,0}, calibZEM2[2]={0,0};
1054 0 : calibZEM1[0] = corrADCZEM1[0]*calibEne[4];
1055 0 : calibZEM1[1] = corrADCZEM1[1]*calibEne[4];
1056 0 : calibZEM2[0] = corrADCZEM2[0]*calibEne[5];
1057 0 : calibZEM2[1] = corrADCZEM2[1]*calibEne[5];
1058 :
1059 : // ****** Energy calibration of detector responses
1060 0 : Float_t calibTowZNC[10], calibTowZNA[10], calibTowZPC[10], calibTowZPA[10];
1061 0 : for(Int_t gi=0; gi<5; gi++){
1062 : // High gain chain
1063 0 : calibTowZNC[gi] = equalTowZNC[gi]*2*calibEne[0]*8.;
1064 0 : calibTowZPC[gi] = equalTowZPC[gi]*2*calibEne[1]*8.;
1065 0 : calibTowZNA[gi] = equalTowZNA[gi]*2*calibEne[2]*8.;
1066 0 : calibTowZPA[gi] = equalTowZPA[gi]*2*calibEne[3]*8.;
1067 : // Low gain chain
1068 0 : calibTowZNC[gi+5] = equalTowZNC[gi+5]*2*calibEne[0];
1069 0 : calibTowZPC[gi+5] = equalTowZPC[gi+5]*2*calibEne[1];
1070 0 : calibTowZNA[gi+5] = equalTowZNA[gi+5]*2*calibEne[2];
1071 0 : calibTowZPA[gi+5] = equalTowZPA[gi+5]*2*calibEne[3];
1072 : }
1073 :
1074 : // Ch. debug
1075 : /*printf("\n ------------- CALIBRATION -------------\n");
1076 : printf(" ADCZNC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
1077 : calibTowZNC[0],calibTowZNC[1],calibTowZNC[2],calibTowZNC[3],calibTowZNC[4]);
1078 : printf(" ADCZPC [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
1079 : calibTowZPC[0],calibTowZPC[1],calibTowZPC[2],calibTowZPC[3],calibTowZPC[4]);
1080 : printf(" ADCZNA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
1081 : calibTowZNA[0],calibTowZNA[1],calibTowZNA[2],calibTowZNA[3],calibTowZNA[4]);
1082 : printf(" ADCZPA [%1.2f %1.2f %1.2f %1.2f %1.2f]\n",
1083 : calibTowZPA[0],calibTowZPA[1],calibTowZPA[2],calibTowZPA[3],calibTowZPA[4]);
1084 : printf(" ADCZEM1 [%1.2f] ADCZEM2 [%1.2f] \n",calibZEM1[0],calibZEM2[0]);
1085 : printf(" ----------------------------------------\n");*/
1086 :
1087 : // ****** Number of detected spectator nucleons
1088 : Int_t nDetSpecNLeft=0, nDetSpecPLeft=0, nDetSpecNRight=0, nDetSpecPRight=0;
1089 0 : if(fBeamEnergy>0.01){
1090 0 : nDetSpecNLeft = (Int_t) (calibSumZNC[0]/fBeamEnergy);
1091 0 : nDetSpecPLeft = (Int_t) (calibSumZPC[0]/fBeamEnergy);
1092 0 : nDetSpecNRight = (Int_t) (calibSumZNA[0]/fBeamEnergy);
1093 0 : nDetSpecPRight = (Int_t) (calibSumZPA[0]/fBeamEnergy);
1094 0 : }
1095 0 : else AliWarning(" ATTENTION!!! fBeamEnergy=0 -> N_spec will be ZERO!!! \n");
1096 :
1097 : Int_t nGenSpec=0, nGenSpecA=0, nGenSpecC=0;
1098 : Int_t nPart=0, nPartA=0, nPartC=0;
1099 : Double_t b=0., bA=0., bC=0.;
1100 :
1101 : /*if(fIsCalibrationMB == kFALSE){
1102 : // ****** Reconstruction parameters ------------------
1103 : if(!fgRecoParam) fgRecoParam = const_cast<AliZDCRecoParam*>(GetRecoParam());
1104 : if(!fgRecoParam){
1105 : AliError(" RecoParam object not retrieved correctly: not reconstructing ZDC event!!!");
1106 : return;
1107 : }
1108 : TH1D* hNpartDist = fgRecoParam->GethNpartDist();
1109 : TH1D* hbDist = fgRecoParam->GethbDist();
1110 : Float_t fClkCenter = fgRecoParam->GetClkCenter();
1111 : if(!hNpartDist || !hbDist){
1112 : AliError("Something wrong in Glauber MC histos got from AliZDCREcoParamPbPb: NO EVENT RECO FOR ZDC DATA!!!\n\n");
1113 : //return;
1114 : }
1115 : else{
1116 : if(!fgMBCalibData) fgMBCalibData = const_cast<AliZDCMBCalib*>(GetMBCalibData());
1117 : TH2F *hZDCvsZEM = fgMBCalibData->GethZDCvsZEM();
1118 : TH2F *hZDCCvsZEM = fgMBCalibData->GethZDCCvsZEM();
1119 : TH2F *hZDCAvsZEM = fgMBCalibData->GethZDCAvsZEM();
1120 : //
1121 : Double_t xHighEdge = hZDCvsZEM->GetXaxis()->GetXmax();
1122 : Double_t origin = xHighEdge*fClkCenter;
1123 : // Ch. debug
1124 : //printf("\n\n xHighEdge %1.2f, origin %1.4f \n", xHighEdge, origin);
1125 : //
1126 : // ====> Summed ZDC info (sideA+side C)
1127 : TF1 *line = new TF1("line","[0]*x+[1]",0.,xHighEdge);
1128 : Float_t y = (calibSumZNC[0]+calibSumZPC[0]+calibSumZNA[0]+calibSumZPA[0])/1000.;
1129 : Float_t x = (calibZEM1[0]+calibZEM2[0])/1000.;
1130 : line->SetParameter(0, y/(x-origin));
1131 : line->SetParameter(1, -origin*y/(x-origin));
1132 : // Ch. debug
1133 : //printf(" ***************** Summed ZDC info (sideA+side C) \n");
1134 : //printf(" E_{ZEM} %1.4f, E_{ZDC} %1.2f, TF1: %1.2f*x + %1.2f ", x, y,y/(x-origin),-origin*y/(x-origin));
1135 : //
1136 : Double_t countPerc=0;
1137 : Double_t xBinCenter=0, yBinCenter=0;
1138 : for(Int_t nbinx=1; nbinx<=hZDCvsZEM->GetNbinsX(); nbinx++){
1139 : for(Int_t nbiny=1; nbiny<=hZDCvsZEM->GetNbinsY(); nbiny++){
1140 : xBinCenter = hZDCvsZEM->GetXaxis()->GetBinCenter(nbinx);
1141 : yBinCenter = hZDCvsZEM->GetYaxis()->GetBinCenter(nbiny);
1142 : //
1143 : if(line->GetParameter(0)>0){
1144 : if(yBinCenter < (line->GetParameter(0)*xBinCenter + line->GetParameter(1))){
1145 : countPerc += hZDCvsZEM->GetBinContent(nbinx,nbiny);
1146 : // Ch. debug
1147 : //printf(" xBinCenter %1.3f, yBinCenter %1.0f, countPerc %1.0f\n",
1148 : //xBinCenter, yBinCenter, countPerc);
1149 : }
1150 : }
1151 : else{
1152 : if(yBinCenter > (line->GetParameter(0)*xBinCenter + line->GetParameter(1))){
1153 : countPerc += hZDCvsZEM->GetBinContent(nbinx,nbiny);
1154 : // Ch. debug
1155 : //printf(" xBinCenter %1.3f, yBinCenter %1.0f, countPerc %1.0f\n",
1156 : //xBinCenter, yBinCenter, countPerc);
1157 : }
1158 : }
1159 : }
1160 : }
1161 : //
1162 : Double_t xSecPerc = 0.;
1163 : if(hZDCvsZEM->GetEntries()!=0){
1164 : xSecPerc = countPerc/hZDCvsZEM->GetEntries();
1165 : }
1166 : else{
1167 : AliWarning(" Histogram hZDCvsZEM from OCDB has no entries!!!");
1168 : }
1169 : // Ch. debug
1170 : //printf(" xSecPerc %1.4f \n", xSecPerc);
1171 :
1172 : // ====> side C
1173 : TF1 *lineC = new TF1("lineC","[0]*x+[1]",0.,xHighEdge);
1174 : Float_t yC = (calibSumZNC[0]+calibSumZPC[0])/1000.;
1175 : lineC->SetParameter(0, yC/(x-origin));
1176 : lineC->SetParameter(1, -origin*yC/(x-origin));
1177 : // Ch. debug
1178 : //printf(" ***************** Side C \n");
1179 : //printf(" E_{ZEM} %1.4f, E_{ZDCC} %1.2f, TF1: %1.2f*x + %1.2f ", x, yC,yC/(x-origin),-origin*yC/(x-origin));
1180 : //
1181 : Double_t countPercC=0;
1182 : Double_t xBinCenterC=0, yBinCenterC=0;
1183 : for(Int_t nbinx=1; nbinx<=hZDCCvsZEM->GetNbinsX(); nbinx++){
1184 : for(Int_t nbiny=1; nbiny<=hZDCCvsZEM->GetNbinsY(); nbiny++){
1185 : xBinCenterC = hZDCCvsZEM->GetXaxis()->GetBinCenter(nbinx);
1186 : yBinCenterC = hZDCCvsZEM->GetYaxis()->GetBinCenter(nbiny);
1187 : if(lineC->GetParameter(0)>0){
1188 : if(yBinCenterC < (lineC->GetParameter(0)*xBinCenterC + lineC->GetParameter(1))){
1189 : countPercC += hZDCCvsZEM->GetBinContent(nbinx,nbiny);
1190 : }
1191 : }
1192 : else{
1193 : if(yBinCenterC > (lineC->GetParameter(0)*xBinCenterC + lineC->GetParameter(1))){
1194 : countPercC += hZDCCvsZEM->GetBinContent(nbinx,nbiny);
1195 : }
1196 : }
1197 : }
1198 : }
1199 : //
1200 : Double_t xSecPercC = 0.;
1201 : if(hZDCCvsZEM->GetEntries()!=0){
1202 : xSecPercC = countPercC/hZDCCvsZEM->GetEntries();
1203 : }
1204 : else{
1205 : AliWarning(" Histogram hZDCCvsZEM from OCDB has no entries!!!");
1206 : }
1207 : // Ch. debug
1208 : //printf(" xSecPercC %1.4f \n", xSecPercC);
1209 :
1210 : // ====> side A
1211 : TF1 *lineA = new TF1("lineA","[0]*x+[1]",0.,xHighEdge);
1212 : Float_t yA = (calibSumZNA[0]+calibSumZPA[0])/1000.;
1213 : lineA->SetParameter(0, yA/(x-origin));
1214 : lineA->SetParameter(1, -origin*yA/(x-origin));
1215 : //
1216 : // Ch. debug
1217 : //printf(" ***************** Side A \n");
1218 : //printf(" E_{ZEM} %1.4f, E_{ZDCA} %1.2f, TF1: %1.2f*x + %1.2f ", x, yA,yA/(x-origin),-origin*yA/(x-origin));
1219 : //
1220 : Double_t countPercA=0;
1221 : Double_t xBinCenterA=0, yBinCenterA=0;
1222 : for(Int_t nbinx=1; nbinx<=hZDCAvsZEM->GetNbinsX(); nbinx++){
1223 : for(Int_t nbiny=1; nbiny<=hZDCAvsZEM->GetNbinsY(); nbiny++){
1224 : xBinCenterA = hZDCAvsZEM->GetXaxis()->GetBinCenter(nbinx);
1225 : yBinCenterA = hZDCAvsZEM->GetYaxis()->GetBinCenter(nbiny);
1226 : if(lineA->GetParameter(0)>0){
1227 : if(yBinCenterA < (lineA->GetParameter(0)*xBinCenterA + lineA->GetParameter(1))){
1228 : countPercA += hZDCAvsZEM->GetBinContent(nbinx,nbiny);
1229 : }
1230 : }
1231 : else{
1232 : if(yBinCenterA > (lineA->GetParameter(0)*xBinCenterA + lineA->GetParameter(1))){
1233 : countPercA += hZDCAvsZEM->GetBinContent(nbinx,nbiny);
1234 : }
1235 : }
1236 : }
1237 : }
1238 : //
1239 : Double_t xSecPercA = 0.;
1240 : if(hZDCAvsZEM->GetEntries()!=0){
1241 : xSecPercA = countPercA/hZDCAvsZEM->GetEntries();
1242 : }
1243 : else{
1244 : AliWarning(" Histogram hZDCAvsZEM from OCDB has no entries!!!");
1245 : }
1246 : // Ch. debug
1247 : //printf(" xSecPercA %1.4f \n", xSecPercA);
1248 :
1249 : // ****** Number of participants (from E_ZDC vs. E_ZEM correlation)
1250 : Double_t nPartFrac=0., nPartFracC=0., nPartFracA=0.;
1251 : for(Int_t npbin=1; npbin<hNpartDist->GetNbinsX(); npbin++){
1252 : nPartFrac += (hNpartDist->GetBinContent(npbin))/(hNpartDist->GetEntries());
1253 : if((1.-nPartFrac) < xSecPerc){
1254 : nPart = (Int_t) hNpartDist->GetBinLowEdge(npbin);
1255 : // Ch. debug
1256 : //printf(" ***************** Summed ZDC info (sideA+side C) \n");
1257 : //printf(" nPartFrac %1.4f, nPart %d\n", nPartFrac, nPart);
1258 : break;
1259 : }
1260 : }
1261 : if(nPart<0) nPart=0;
1262 : //
1263 : for(Int_t npbin=1; npbin<hNpartDist->GetNbinsX(); npbin++){
1264 : nPartFracC += (hNpartDist->GetBinContent(npbin))/(hNpartDist->GetEntries());
1265 : if((1.-nPartFracC) < xSecPercC){
1266 : nPartC = (Int_t) hNpartDist->GetBinLowEdge(npbin);
1267 : // Ch. debug
1268 : //printf(" ***************** Side C \n");
1269 : //printf(" nPartFracC %1.4f, nPartC %d\n", nPartFracC, nPartC);
1270 : break;
1271 : }
1272 : }
1273 : if(nPartC<0) nPartC=0;
1274 : //
1275 : for(Int_t npbin=1; npbin<hNpartDist->GetNbinsX(); npbin++){
1276 : nPartFracA += (hNpartDist->GetBinContent(npbin))/(hNpartDist->GetEntries());
1277 : if((1.-nPartFracA) < xSecPercA){
1278 : nPartA = (Int_t) hNpartDist->GetBinLowEdge(npbin);
1279 : // Ch. debug
1280 : //printf(" ***************** Side A \n");
1281 : //printf(" nPartFracA %1.4f, nPartA %d\n\n", nPartFracA, nPartA);
1282 : break;
1283 : }
1284 : }
1285 : if(nPartA<0) nPartA=0;
1286 :
1287 : // ****** Impact parameter (from E_ZDC vs. E_ZEM correlation)
1288 : Double_t bFrac=0., bFracC=0., bFracA=0.;
1289 : for(Int_t ibbin=1; ibbin<hbDist->GetNbinsX(); ibbin++){
1290 : bFrac += (hbDist->GetBinContent(ibbin))/(hbDist->GetEntries());
1291 : if(bFrac > xSecPerc){
1292 : b = hbDist->GetBinLowEdge(ibbin);
1293 : break;
1294 : }
1295 : }
1296 : //
1297 : for(Int_t ibbin=1; ibbin<hbDist->GetNbinsX(); ibbin++){
1298 : bFracC += (hbDist->GetBinContent(ibbin))/(hbDist->GetEntries());
1299 : if(bFracC > xSecPercC){
1300 : bC = hbDist->GetBinLowEdge(ibbin);
1301 : break;
1302 : }
1303 : }
1304 : //
1305 : for(Int_t ibbin=1; ibbin<hbDist->GetNbinsX(); ibbin++){
1306 : bFracA += (hbDist->GetBinContent(ibbin))/(hbDist->GetEntries());
1307 : if(bFracA > xSecPercA){
1308 : bA = hbDist->GetBinLowEdge(ibbin);
1309 : break;
1310 : }
1311 : }
1312 :
1313 : // ****** Number of spectator nucleons
1314 : nGenSpec = 416 - nPart;
1315 : nGenSpecC = 416 - nPartC;
1316 : nGenSpecA = 416 - nPartA;
1317 : if(nGenSpec>416) nGenSpec=416; if(nGenSpec<0) nGenSpec=0;
1318 : if(nGenSpecC>416) nGenSpecC=416; if(nGenSpecC<0) nGenSpecC=0;
1319 : if(nGenSpecA>416) nGenSpecA=416; if(nGenSpecA<0) nGenSpecA=0;
1320 :
1321 : delete line;
1322 : delete lineC; delete lineA;
1323 : }
1324 : }*/ // ONLY IF fIsCalibrationMB==kFALSE
1325 :
1326 : Bool_t energyFlag = kTRUE;
1327 0 : AliZDCReco* reco = new AliZDCReco(calibSumZNC, calibSumZPC, calibSumZNA, calibSumZPA,
1328 0 : calibTowZNC, calibTowZPC, calibTowZNA, calibTowZPA,
1329 0 : calibZEM1, calibZEM2, sPMRef1, sPMRef2,
1330 : nDetSpecNLeft, nDetSpecPLeft, nDetSpecNRight, nDetSpecPRight,
1331 : nGenSpec, nGenSpecA, nGenSpecC,
1332 : nPart, nPartA, nPartC, b, bA, bC,
1333 0 : recoFlag, energyFlag, isScalerOn, scaler, tdc, tdcCabling);
1334 :
1335 : const Int_t kBufferSize = 4000;
1336 0 : clustersTree->Branch("ZDC", "AliZDCReco", &reco, kBufferSize);
1337 : //reco->Print("");
1338 : // write the output tree
1339 0 : clustersTree->Fill();
1340 0 : delete reco;
1341 0 : }
1342 :
1343 :
1344 : //_____________________________________________________________________________
1345 : void AliZDCReconstructor::FillZDCintoESD(TTree *clustersTree, AliESDEvent* esd) const
1346 : {
1347 : // fill energies and number of participants to the ESD
1348 :
1349 : // Retrieving TDC calibration data
1350 : // Parameters for TDC centering around zero
1351 : int const knTDC = 6;
1352 16 : Float_t tdcOffset[knTDC];
1353 112 : for(Int_t jj=0; jj<knTDC; jj++) tdcOffset[jj] = fTDCCalibData->GetMeanTDC(jj);
1354 : //fTDCCalibData->Print("");
1355 :
1356 8 : AliZDCReco reco;
1357 8 : AliZDCReco* preco = &reco;
1358 8 : clustersTree->SetBranchAddress("ZDC", &preco);
1359 8 : clustersTree->GetEntry(0);
1360 :
1361 16 : fESDZDC->SetZDC(reco.GetZN1HREnergy(), reco.GetZP1HREnergy(),
1362 8 : reco.GetZEM1HRsignal(), reco.GetZEM2HRsignal(),
1363 8 : reco.GetZN2HREnergy(), reco.GetZP2HREnergy(),
1364 8 : reco.GetNParticipants(), reco.GetNPartSideA(), reco.GetNPartSideC(),
1365 8 : reco.GetImpParameter(), reco.GetImpParSideA(), reco.GetImpParSideC(),
1366 8 : reco.GetRecoFlag());
1367 :
1368 8 : Float_t tZNCEne[5], tZNAEne[5], tZPCEne[5], tZPAEne[5];
1369 8 : Float_t tZNCEneLR[5], tZNAEneLR[5], tZPCEneLR[5], tZPAEneLR[5];
1370 96 : for(Int_t i=0; i<5; i++){
1371 40 : tZNCEne[i] = reco.GetZN1HREnTow(i);
1372 40 : tZNAEne[i] = reco.GetZN2HREnTow(i);
1373 40 : tZPCEne[i] = reco.GetZP1HREnTow(i);
1374 40 : tZPAEne[i] = reco.GetZP2HREnTow(i);
1375 : //
1376 40 : tZNCEneLR[i] = reco.GetZN1LREnTow(i);
1377 40 : tZNAEneLR[i] = reco.GetZN2LREnTow(i);
1378 40 : tZPCEneLR[i] = reco.GetZP1LREnTow(i);
1379 40 : tZPAEneLR[i] = reco.GetZP2LREnTow(i);
1380 : }
1381 : //
1382 8 : fESDZDC->SetZN1TowerEnergy(tZNCEne);
1383 8 : fESDZDC->SetZN2TowerEnergy(tZNAEne);
1384 8 : fESDZDC->SetZP1TowerEnergy(tZPCEne);
1385 8 : fESDZDC->SetZP2TowerEnergy(tZPAEne);
1386 : //
1387 8 : fESDZDC->SetZN1TowerEnergyLR(tZNCEneLR);
1388 8 : fESDZDC->SetZN2TowerEnergyLR(tZNAEneLR);
1389 8 : fESDZDC->SetZP1TowerEnergyLR(tZPCEneLR);
1390 8 : fESDZDC->SetZP2TowerEnergyLR(tZPAEneLR);
1391 : //
1392 : // Writing ZDC scaler for cross section calculation
1393 : // ONLY IF the scaler has been read during the event
1394 8 : if(reco.IsScalerOn()==kTRUE){
1395 0 : UInt_t counts[32];
1396 0 : for(Int_t jk=0; jk<32; jk++) counts[jk] = reco.GetZDCScaler(jk);
1397 0 : fESDZDC->SetZDCScaler(counts);
1398 0 : }
1399 :
1400 8 : Int_t *tdcCabling = reco.GetTDCchCabling();
1401 : //
1402 : // Ch. debug
1403 : //printf("\n FillZDCintoESD: TDC channels ZEM1 %d ZEM2 %d ZNC %d ZPC %d ZNA %d ZPA %d L0 %d\n\n", tdcCabling[0],tdcCabling[1],tdcCabling[2],tdcCabling[3],tdcCabling[4],tdcCabling[5],tdcCabling[6]);
1404 :
1405 8 : fESDZDC->SetZEM1TDChit(kFALSE);
1406 8 : fESDZDC->SetZEM2TDChit(kFALSE);
1407 8 : fESDZDC->SetZNCTDChit(kFALSE);
1408 8 : fESDZDC->SetZPCTDChit(kFALSE);
1409 8 : fESDZDC->SetZNATDChit(kFALSE);
1410 8 : fESDZDC->SetZPATDChit(kFALSE);
1411 :
1412 8 : Int_t tdcValues[32][4] = {{0,}};
1413 8 : Float_t tdcCorrected[32][4] = {{999.,}};
1414 528 : for(Int_t jk=0; jk<32; jk++){
1415 2560 : for(Int_t lk=0; lk<4; lk++){
1416 1024 : tdcValues[jk][lk] = reco.GetZDCTDCData(jk, lk);
1417 : //
1418 : // NB -> THE ORDER MUST BE THE SAME AS THE ONE IN ZDCMAPPINGDA.cxx (7/7/2015)
1419 : // otherwise calibrated TDC won't be centered around zero (wrong offset subtracted)
1420 1024 : if(tdcCabling[0]>0. && jk==tdcCabling[0] && TMath::Abs(tdcValues[jk][lk])>1e-09) fESDZDC->SetZEM1TDChit(kTRUE);
1421 1024 : else if(tdcCabling[1]>0. && jk==tdcCabling[1] && TMath::Abs(tdcValues[jk][lk])>1e-09) fESDZDC->SetZEM2TDChit(kTRUE);
1422 1024 : else if(tdcCabling[2]>0. && jk==tdcCabling[2] && TMath::Abs(tdcValues[jk][lk])>1e-09) fESDZDC->SetZNCTDChit(kTRUE);
1423 1024 : else if(tdcCabling[3]>0. && jk==tdcCabling[3] && TMath::Abs(tdcValues[jk][lk])>1e-09) fESDZDC->SetZPCTDChit(kTRUE);
1424 1024 : else if(tdcCabling[4]>0. && jk==tdcCabling[4] && TMath::Abs(tdcValues[jk][lk])>1e-09) fESDZDC->SetZNATDChit(kTRUE);
1425 1024 : else if(tdcCabling[5]>0. && jk==tdcCabling[5] && TMath::Abs(tdcValues[jk][lk])>1e-09) fESDZDC->SetZPATDChit(kTRUE);
1426 : }
1427 : }
1428 : //printf("\n FillZDCintoESD: hit TDC ZEM1 %d ZEM2 %d ZNC %d ZPC %d ZNA %d ZPA %d \n", fESDZDC->IsZEM1hit(),fESDZDC->IsZEM2hit(),fESDZDC->IsZNChit(),fESDZDC->IsZPChit(),fESDZDC->IsZNAhit(),fESDZDC->IsZPAhit());
1429 :
1430 : // Writing TDC data into ZDC ESDs
1431 : // 4/2/2011 -> Subtracting L0 (tdcValues[15]) instead of ADC gate
1432 : // we try to keep the TDC oscillations as low as possible!
1433 528 : for(Int_t jk=0; jk<32; jk++){
1434 2560 : for(Int_t lk=0; lk<4; lk++){
1435 1024 : if(TMath::Abs(tdcValues[jk][lk])>1e-09){
1436 : // Feb2013 -> TDC corrected entry filled ONLY IF tdc has a hit && L0 TDC ch. is defined
1437 0 : if(TMath::Abs(tdcValues[jk][lk])>1e-09 && tdcCabling[6]>0.){
1438 0 : tdcCorrected[jk][lk] = 0.025*(tdcValues[jk][lk]-tdcValues[tdcCabling[6]][0])+fMeanPhase;
1439 : // Detector channels are centered around zero using the OCDB object
1440 0 : for(int idch=0; idch<6; idch++){
1441 0 : if(jk==tdcCabling[idch]){
1442 0 : tdcCorrected[jk][lk] -= tdcOffset[idch];
1443 : // Ch. debug
1444 : //printf("ch.%d -> %d (TDC raw - L0) %f offset %f TDC corrected %f\n", jk,idch, 0.025*(tdcValues[jk][lk]-tdcValues[tdcCabling[6]][0]), tdcOffset[idch], tdcCorrected[jk][lk]);
1445 0 : }
1446 : }
1447 0 : }
1448 : }
1449 : }
1450 : }
1451 :
1452 128 : for(int idch=0; idch<7; idch++){
1453 56 : if(tdcCabling[idch]>0.) fESDZDC->SetZDCTDCChannel(idch, tdcCabling[idch]);
1454 : }
1455 :
1456 :
1457 8 : fESDZDC->SetZDCTDCData(tdcValues);
1458 8 : fESDZDC->SetZDCTDCCorrected(tdcCorrected);
1459 8 : fESDZDC->AliESDZDC::SetBit(AliESDZDC::kTDCcablingSet, kTRUE);
1460 8 : fESDZDC->AliESDZDC::SetBit(AliESDZDC::kCorrectedTDCFilled, kTRUE);
1461 8 : fESDZDC->AliESDZDC::SetBit(AliESDZDC::kEnergyCalibratedSignal, reco.GetEnergyFlag());
1462 : //fESDZDC->Print("");
1463 :
1464 16 : if(esd) esd->SetZDCData(fESDZDC);
1465 8 : }
1466 :
1467 : //_____________________________________________________________________________
1468 : AliCDBStorage* AliZDCReconstructor::SetStorage(const char *uri)
1469 : {
1470 : // Setting the storage
1471 :
1472 : Bool_t deleteManager = kFALSE;
1473 :
1474 0 : AliCDBManager *manager = AliCDBManager::Instance();
1475 0 : AliCDBStorage *defstorage = manager->GetDefaultStorage();
1476 :
1477 0 : if(!defstorage || !(defstorage->Contains("ZDC"))){
1478 0 : AliWarning("No default storage set or default storage doesn't contain ZDC!");
1479 0 : manager->SetDefaultStorage(uri);
1480 : deleteManager = kTRUE;
1481 0 : }
1482 :
1483 0 : AliCDBStorage *storage = manager->GetDefaultStorage();
1484 :
1485 0 : if(deleteManager){
1486 0 : AliCDBManager::Instance()->UnsetDefaultStorage();
1487 : defstorage = 0; // the storage is killed by AliCDBManager::Instance()->Destroy()
1488 0 : }
1489 :
1490 0 : return storage;
1491 : }
1492 :
1493 : //_____________________________________________________________________________
1494 : AliZDCPedestals* AliZDCReconstructor::GetPedestalData() const
1495 : {
1496 :
1497 : // Getting pedestal calibration object for ZDC set
1498 : AliZDCPedestals *calibdata = 0x0;
1499 6 : AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/Pedestals");
1500 2 : if(!entry) AliFatal("No calibration data loaded!");
1501 : else{
1502 : //entry->SetOwner(kFALSE);
1503 :
1504 6 : calibdata = dynamic_cast<AliZDCPedestals*> (entry->GetObject());
1505 2 : if(!calibdata) AliFatal("Wrong calibration object in calibration file!");
1506 :
1507 : }
1508 2 : return calibdata;
1509 0 : }
1510 :
1511 : //_____________________________________________________________________________
1512 : AliZDCEnCalib* AliZDCReconstructor::GetEnergyCalibData() const
1513 : {
1514 :
1515 : // Getting energy and equalization calibration object for ZDC set
1516 : AliZDCEnCalib *calibdata = 0x0;
1517 6 : AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/EnergyCalib");
1518 2 : if(!entry) AliFatal("No calibration data loaded!");
1519 : else{
1520 2 : entry->SetOwner(kFALSE);
1521 :
1522 6 : calibdata = dynamic_cast<AliZDCEnCalib*> (entry->GetObject());
1523 2 : if(!calibdata) AliFatal("Wrong calibration object in calibration file!");
1524 : }
1525 2 : return calibdata;
1526 0 : }
1527 :
1528 : //_____________________________________________________________________________
1529 : AliZDCSaturationCalib* AliZDCReconstructor::GetSaturationCalibData() const
1530 : {
1531 :
1532 : // Getting energy and equalization calibration object for ZDC set
1533 : AliZDCSaturationCalib *calibdata = 0x0;
1534 6 : AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/SaturationCalib");
1535 2 : if(!entry) AliFatal("No calibration data loaded!");
1536 : else{
1537 2 : entry->SetOwner(kFALSE);
1538 :
1539 6 : calibdata = dynamic_cast<AliZDCSaturationCalib*> (entry->GetObject());
1540 2 : if(!calibdata) AliFatal("Wrong calibration object in calibration file!");
1541 : }
1542 2 : return calibdata;
1543 0 : }
1544 :
1545 : //_____________________________________________________________________________
1546 : AliZDCTowerCalib* AliZDCReconstructor::GetTowerCalibData() const
1547 : {
1548 :
1549 : // Getting energy and equalization calibration object for ZDC set
1550 : AliZDCTowerCalib *calibdata = 0x0;
1551 6 : AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/TowerCalib");
1552 2 : if(!entry) AliFatal("No calibration data loaded!");
1553 : else{
1554 2 : entry->SetOwner(kFALSE);
1555 :
1556 6 : calibdata = dynamic_cast<AliZDCTowerCalib*> (entry->GetObject());
1557 2 : if(!calibdata) AliFatal("Wrong calibration object in calibration file!");
1558 : }
1559 2 : return calibdata;
1560 0 : }
1561 :
1562 : //_____________________________________________________________________________
1563 : AliZDCMBCalib* AliZDCReconstructor::GetMBCalibData() const
1564 : {
1565 :
1566 : // Getting energy and equalization calibration object for ZDC set
1567 : AliZDCMBCalib *calibdata = 0x0;
1568 0 : AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/MBCalib");
1569 0 : if(!entry) AliFatal("No calibration data loaded!");
1570 : else{
1571 0 : entry->SetOwner(kFALSE);
1572 :
1573 0 : calibdata = dynamic_cast<AliZDCMBCalib*> (entry->GetObject());
1574 0 : if(!calibdata) AliFatal("Wrong calibration object in calibration file!");
1575 : }
1576 0 : return calibdata;
1577 0 : }
1578 :
1579 : //_____________________________________________________________________________
1580 : AliZDCTDCCalib* AliZDCReconstructor::GetTDCCalibData() const
1581 : {
1582 :
1583 : // Getting TDC object for ZDC
1584 : AliZDCTDCCalib *calibdata = 0x0;
1585 6 : AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/TDCCalib");
1586 2 : if(!entry) AliFatal("No calibration data loaded!");
1587 : else{
1588 2 : entry->SetOwner(kFALSE);
1589 :
1590 6 : calibdata = dynamic_cast<AliZDCTDCCalib*> (entry->GetObject());
1591 2 : if(!calibdata) AliFatal("Wrong calibration object in calibration file!");
1592 :
1593 : }
1594 2 : return calibdata;
1595 0 : }
1596 :
1597 : //_____________________________________________________________________________
1598 : AliZDCChMap* AliZDCReconstructor::GetMapping() const
1599 : {
1600 :
1601 : // Getting TDC object for ZDC
1602 : AliZDCChMap *calibdata = 0x0;
1603 6 : AliCDBEntry *entry = AliCDBManager::Instance()->Get("ZDC/Calib/ChMap");
1604 2 : if(!entry) AliFatal("No calibration data loaded!");
1605 : else{
1606 2 : entry->SetOwner(kFALSE);
1607 :
1608 6 : calibdata = dynamic_cast<AliZDCChMap*> (entry->GetObject());
1609 2 : if(!calibdata) AliFatal("Wrong calibration object in calibration file!");
1610 :
1611 : }
1612 2 : return calibdata;
1613 0 : }
1614 :
1615 :
1616 : //_____________________________________________________________________________
1617 : int AliZDCReconstructor::GetChannelSignal(int det, int quad, Bool_t intime) const
1618 : {
1619 594 : if(intime){
1620 594 : if(quad!=5){ // No ref. PMT
1621 273 : if(det==1){
1622 90 : if(quad==0) return kZNCC;
1623 60 : else if(quad==1) return kZNC1;
1624 48 : else if(quad==2) return kZNC2;
1625 36 : else if(quad==3) return kZNC3;
1626 24 : else if(quad==4) return kZNC4;
1627 : }
1628 204 : else if(det==2){
1629 72 : if(quad==0) return kZPCC;
1630 60 : else if(quad==1) return kZPC1;
1631 48 : else if(quad==2) return kZPC2;
1632 36 : else if(quad==3) return kZPC3;
1633 24 : else if(quad==4) return kZPC4;
1634 : }
1635 144 : else if(det==3){
1636 36 : if(quad==1) return kZEM1;
1637 24 : else if(quad==2) return kZEM2;
1638 : }
1639 120 : else if(det==4){
1640 72 : if(quad==0) return kZNAC;
1641 60 : else if(quad==1) return kZNA1;
1642 48 : else if(quad==2) return kZNA2;
1643 36 : else if(quad==3) return kZNA3;
1644 24 : else if(quad==4) return kZNA4;
1645 : }
1646 60 : else if(det==5){
1647 72 : if(quad==0) return kZPAC;
1648 60 : else if(quad==1) return kZPA1;
1649 48 : else if(quad==2) return kZPA2;
1650 36 : else if(quad==3) return kZPA3;
1651 24 : else if(quad==4) return kZPA4;
1652 : }
1653 : }
1654 : else{ // Ref. PMT
1655 24 : if(quad==1) return kZDCCMon;
1656 24 : else if(quad==4) return kZDCAMon;
1657 : }
1658 : }
1659 : else{
1660 0 : if(quad!=5){ // No ref. PMT
1661 0 : if(det==1){
1662 0 : if(quad==0) return kZNCCoot;
1663 0 : else if(quad==1) return kZNC1oot;
1664 0 : else if(quad==2) return kZNC2oot;
1665 0 : else if(quad==3) return kZNC3oot;
1666 0 : else if(quad==4) return kZNC4oot;
1667 : }
1668 0 : else if(det==2){
1669 0 : if(quad==0) return kZPCCoot;
1670 0 : else if(quad==1) return kZPC1oot;
1671 0 : else if(quad==2) return kZPC2oot;
1672 0 : else if(quad==3) return kZPC3oot;
1673 0 : else if(quad==4) return kZPC4oot;
1674 : }
1675 0 : else if(det==3){
1676 0 : if(quad==1) return kZEM1oot;
1677 0 : else if(quad==2) return kZEM2oot;
1678 : }
1679 0 : else if(det==4){
1680 0 : if(quad==0) return kZNACoot;
1681 0 : else if(quad==1) return kZNA1oot;
1682 0 : else if(quad==2) return kZNA2oot;
1683 0 : else if(quad==3) return kZNA3oot;
1684 0 : else if(quad==4) return kZNA4oot;
1685 : }
1686 0 : else if(det==5){
1687 0 : if(quad==0) return kZPACoot;
1688 0 : else if(quad==1) return kZPA1oot;
1689 0 : else if(quad==2) return kZPA2oot;
1690 0 : else if(quad==3) return kZPA3oot;
1691 0 : else if(quad==4) return kZPA4oot;
1692 : }
1693 : }
1694 : else{
1695 0 : if(quad==1) return kZDCCMon;
1696 0 : else if(quad==4) return kZDCAMon;
1697 : }
1698 : }
1699 297 : }
|