+ Int_t nGenSpec=0, nGenSpecA=0, nGenSpecC=0;
+ Int_t nPart=0, nPartA=0, nPartC=0;
+ Double_t b=0., bA=0., bC=0.;
+
+ if(fIsCalibrationMB == kFALSE){
+ // ****** Reconstruction parameters ------------------
+ if(!fgRecoParam) fgRecoParam = const_cast<AliZDCRecoParam*>(GetRecoParam());
+ if(!fgRecoParam){
+ AliError(" RecoParam object not retrieved correctly: not reconstructing ZDC event!!!");
+ return;
+ }
+ TH1D* hNpartDist = fgRecoParam->GethNpartDist();
+ TH1D* hbDist = fgRecoParam->GethbDist();
+ Float_t fClkCenter = fgRecoParam->GetClkCenter();
+ if(!hNpartDist || !hbDist){
+ AliError("Something wrong in Glauber MC histos got from AliZDCREcoParamPbPb: NO EVENT RECO FOR ZDC DATA!!!\n\n");
+ //return;
+ }
+ else{
+ if(!fgMBCalibData) fgMBCalibData = const_cast<AliZDCMBCalib*>(GetMBCalibData());
+ TH2F *hZDCvsZEM = fgMBCalibData->GethZDCvsZEM();
+ TH2F *hZDCCvsZEM = fgMBCalibData->GethZDCCvsZEM();
+ TH2F *hZDCAvsZEM = fgMBCalibData->GethZDCAvsZEM();
+ //
+ Double_t xHighEdge = hZDCvsZEM->GetXaxis()->GetXmax();
+ Double_t origin = xHighEdge*fClkCenter;
+ // Ch. debug
+ //printf("\n\n xHighEdge %1.2f, origin %1.4f \n", xHighEdge, origin);
+ //
+ // ====> Summed ZDC info (sideA+side C)
+ TF1 *line = new TF1("line","[0]*x+[1]",0.,xHighEdge);
+ Float_t y = (calibSumZN1[0]+calibSumZP1[0]+calibSumZN2[0]+calibSumZP2[0])/1000.;
+ Float_t x = (calibZEM1[0]+calibZEM2[0])/1000.;
+ line->SetParameter(0, y/(x-origin));
+ line->SetParameter(1, -origin*y/(x-origin));
+ // Ch. debug
+ //printf(" ***************** Summed ZDC info (sideA+side C) \n");
+ //printf(" E_{ZEM} %1.4f, E_{ZDC} %1.2f, TF1: %1.2f*x + %1.2f ", x, y,y/(x-origin),-origin*y/(x-origin));
+ //
+ Double_t countPerc=0;
+ Double_t xBinCenter=0, yBinCenter=0;
+ for(Int_t nbinx=1; nbinx<=hZDCvsZEM->GetNbinsX(); nbinx++){
+ for(Int_t nbiny=1; nbiny<=hZDCvsZEM->GetNbinsY(); nbiny++){
+ xBinCenter = hZDCvsZEM->GetXaxis()->GetBinCenter(nbinx);
+ yBinCenter = hZDCvsZEM->GetYaxis()->GetBinCenter(nbiny);
+ //
+ if(line->GetParameter(0)>0){
+ if(yBinCenter < (line->GetParameter(0)*xBinCenter + line->GetParameter(1))){
+ countPerc += hZDCvsZEM->GetBinContent(nbinx,nbiny);
+ // Ch. debug
+ //printf(" xBinCenter %1.3f, yBinCenter %1.0f, countPerc %1.0f\n",
+ //xBinCenter, yBinCenter, countPerc);
+ }
+ }
+ else{
+ if(yBinCenter > (line->GetParameter(0)*xBinCenter + line->GetParameter(1))){
+ countPerc += hZDCvsZEM->GetBinContent(nbinx,nbiny);
+ // Ch. debug
+ //printf(" xBinCenter %1.3f, yBinCenter %1.0f, countPerc %1.0f\n",
+ //xBinCenter, yBinCenter, countPerc);
+ }
+ }
+ }
+ }
+ //
+ Double_t xSecPerc = 0.;
+ if(hZDCvsZEM->GetEntries()!=0){
+ xSecPerc = countPerc/hZDCvsZEM->GetEntries();
+ }
+ else{
+ AliWarning(" Histogram hZDCvsZEM from OCDB has no entries!!!");
+ }
+ // Ch. debug
+ //printf(" xSecPerc %1.4f \n", xSecPerc);
+
+ // ====> side C
+ TF1 *lineC = new TF1("lineC","[0]*x+[1]",0.,xHighEdge);
+ Float_t yC = (calibSumZN1[0]+calibSumZP1[0])/1000.;
+ lineC->SetParameter(0, yC/(x-origin));
+ lineC->SetParameter(1, -origin*yC/(x-origin));
+ // Ch. debug
+ //printf(" ***************** Side C \n");
+ //printf(" E_{ZEM} %1.4f, E_{ZDCC} %1.2f, TF1: %1.2f*x + %1.2f ", x, yC,yC/(x-origin),-origin*yC/(x-origin));
+ //
+ Double_t countPercC=0;
+ Double_t xBinCenterC=0, yBinCenterC=0;
+ for(Int_t nbinx=1; nbinx<=hZDCCvsZEM->GetNbinsX(); nbinx++){
+ for(Int_t nbiny=1; nbiny<=hZDCCvsZEM->GetNbinsY(); nbiny++){
+ xBinCenterC = hZDCCvsZEM->GetXaxis()->GetBinCenter(nbinx);
+ yBinCenterC = hZDCCvsZEM->GetYaxis()->GetBinCenter(nbiny);
+ if(lineC->GetParameter(0)>0){
+ if(yBinCenterC < (lineC->GetParameter(0)*xBinCenterC + lineC->GetParameter(1))){
+ countPercC += hZDCCvsZEM->GetBinContent(nbinx,nbiny);
+ }
+ }
+ else{
+ if(yBinCenterC > (lineC->GetParameter(0)*xBinCenterC + lineC->GetParameter(1))){
+ countPercC += hZDCCvsZEM->GetBinContent(nbinx,nbiny);
+ }
+ }
+ }
+ }
+ //
+ Double_t xSecPercC = 0.;
+ if(hZDCCvsZEM->GetEntries()!=0){
+ xSecPercC = countPercC/hZDCCvsZEM->GetEntries();
+ }
+ else{
+ AliWarning(" Histogram hZDCCvsZEM from OCDB has no entries!!!");
+ }
+ // Ch. debug
+ //printf(" xSecPercC %1.4f \n", xSecPercC);
+
+ // ====> side A
+ TF1 *lineA = new TF1("lineA","[0]*x+[1]",0.,xHighEdge);
+ Float_t yA = (calibSumZN2[0]+calibSumZP2[0])/1000.;
+ lineA->SetParameter(0, yA/(x-origin));
+ lineA->SetParameter(1, -origin*yA/(x-origin));
+ //
+ // Ch. debug
+ //printf(" ***************** Side A \n");
+ //printf(" E_{ZEM} %1.4f, E_{ZDCA} %1.2f, TF1: %1.2f*x + %1.2f ", x, yA,yA/(x-origin),-origin*yA/(x-origin));
+ //
+ Double_t countPercA=0;
+ Double_t xBinCenterA=0, yBinCenterA=0;
+ for(Int_t nbinx=1; nbinx<=hZDCAvsZEM->GetNbinsX(); nbinx++){
+ for(Int_t nbiny=1; nbiny<=hZDCAvsZEM->GetNbinsY(); nbiny++){
+ xBinCenterA = hZDCAvsZEM->GetXaxis()->GetBinCenter(nbinx);
+ yBinCenterA = hZDCAvsZEM->GetYaxis()->GetBinCenter(nbiny);
+ if(lineA->GetParameter(0)>0){
+ if(yBinCenterA < (lineA->GetParameter(0)*xBinCenterA + lineA->GetParameter(1))){
+ countPercA += hZDCAvsZEM->GetBinContent(nbinx,nbiny);
+ }
+ }
+ else{
+ if(yBinCenterA > (lineA->GetParameter(0)*xBinCenterA + lineA->GetParameter(1))){
+ countPercA += hZDCAvsZEM->GetBinContent(nbinx,nbiny);
+ }
+ }
+ }
+ }
+ //
+ Double_t xSecPercA = 0.;
+ if(hZDCAvsZEM->GetEntries()!=0){
+ xSecPercA = countPercA/hZDCAvsZEM->GetEntries();
+ }
+ else{
+ AliWarning(" Histogram hZDCAvsZEM from OCDB has no entries!!!");
+ }
+ // Ch. debug
+ //printf(" xSecPercA %1.4f \n", xSecPercA);
+
+ // ****** Number of participants (from E_ZDC vs. E_ZEM correlation)
+ Double_t nPartFrac=0., nPartFracC=0., nPartFracA=0.;
+ for(Int_t npbin=1; npbin<hNpartDist->GetNbinsX(); npbin++){
+ nPartFrac += (hNpartDist->GetBinContent(npbin))/(hNpartDist->GetEntries());
+ if((1.-nPartFrac) < xSecPerc){
+ nPart = (Int_t) hNpartDist->GetBinLowEdge(npbin);
+ // Ch. debug
+ //printf(" ***************** Summed ZDC info (sideA+side C) \n");
+ //printf(" nPartFrac %1.4f, nPart %d\n", nPartFrac, nPart);
+ break;
+ }
+ }
+ if(nPart<0) nPart=0;
+ //
+ for(Int_t npbin=1; npbin<hNpartDist->GetNbinsX(); npbin++){
+ nPartFracC += (hNpartDist->GetBinContent(npbin))/(hNpartDist->GetEntries());
+ if((1.-nPartFracC) < xSecPercC){
+ nPartC = (Int_t) hNpartDist->GetBinLowEdge(npbin);
+ // Ch. debug
+ //printf(" ***************** Side C \n");
+ //printf(" nPartFracC %1.4f, nPartC %d\n", nPartFracC, nPartC);
+ break;
+ }
+ }
+ if(nPartC<0) nPartC=0;
+ //
+ for(Int_t npbin=1; npbin<hNpartDist->GetNbinsX(); npbin++){
+ nPartFracA += (hNpartDist->GetBinContent(npbin))/(hNpartDist->GetEntries());
+ if((1.-nPartFracA) < xSecPercA){
+ nPartA = (Int_t) hNpartDist->GetBinLowEdge(npbin);
+ // Ch. debug
+ //printf(" ***************** Side A \n");
+ //printf(" nPartFracA %1.4f, nPartA %d\n\n", nPartFracA, nPartA);
+ break;
+ }
+ }
+ if(nPartA<0) nPartA=0;
+
+ // ****** Impact parameter (from E_ZDC vs. E_ZEM correlation)
+ Double_t bFrac=0., bFracC=0., bFracA=0.;
+ for(Int_t ibbin=1; ibbin<hbDist->GetNbinsX(); ibbin++){
+ bFrac += (hbDist->GetBinContent(ibbin))/(hbDist->GetEntries());
+ if(bFrac > xSecPerc){
+ b = hbDist->GetBinLowEdge(ibbin);
+ break;
+ }
+ }
+ //
+ for(Int_t ibbin=1; ibbin<hbDist->GetNbinsX(); ibbin++){
+ bFracC += (hbDist->GetBinContent(ibbin))/(hbDist->GetEntries());
+ if(bFracC > xSecPercC){
+ bC = hbDist->GetBinLowEdge(ibbin);
+ break;
+ }
+ }
+ //
+ for(Int_t ibbin=1; ibbin<hbDist->GetNbinsX(); ibbin++){
+ bFracA += (hbDist->GetBinContent(ibbin))/(hbDist->GetEntries());
+ if(bFracA > xSecPercA){
+ bA = hbDist->GetBinLowEdge(ibbin);
+ break;
+ }
+ }
+
+ // ****** Number of spectator nucleons
+ nGenSpec = 416 - nPart;
+ nGenSpecC = 416 - nPartC;
+ nGenSpecA = 416 - nPartA;
+ if(nGenSpec>416) nGenSpec=416; if(nGenSpec<0) nGenSpec=0;
+ if(nGenSpecC>416) nGenSpecC=416; if(nGenSpecC<0) nGenSpecC=0;
+ if(nGenSpecA>416) nGenSpecA=416; if(nGenSpecA<0) nGenSpecA=0;
+
+ delete line;
+ delete lineC; delete lineA;
+ }
+ } // ONLY IF fIsCalibrationMB==kFALSE
+
+ Bool_t energyFlag = kTRUE;
+ AliZDCReco* reco = new AliZDCReco(calibSumZN1, calibSumZP1, calibSumZN2, calibSumZP2,
+ calibTowZN1, calibTowZP1, calibTowZN2, calibTowZP2,
+ calibZEM1, calibZEM2, sPMRef1, sPMRef2,