+//_____________________________________________________________________________
+void AliZDCReconstructor::ReconstructEventPbPb(TTree *clustersTree,
+ Float_t* corrADCZN1, Float_t* corrADCZP1, Float_t* corrADCZN2, Float_t* corrADCZP2,
+ Float_t* corrADCZEM1, Float_t* corrADCZEM2, Float_t* sPMRef1, Float_t* sPMRef2) const
+{
+ // ****************** Reconstruct one event ******************
+
+ // ****** Retrieving calibration data
+ // --- Equalization coefficients ---------------------------------------------
+ Float_t equalCoeffZN1[5], equalCoeffZP1[5], equalCoeffZN2[5], equalCoeffZP2[5];
+ for(Int_t ji=0; ji<5; ji++){
+ equalCoeffZN1[ji] = fTowCalibData->GetZN1EqualCoeff(ji);
+ equalCoeffZP1[ji] = fTowCalibData->GetZP1EqualCoeff(ji);
+ equalCoeffZN2[ji] = fTowCalibData->GetZN2EqualCoeff(ji);
+ equalCoeffZP2[ji] = fTowCalibData->GetZP2EqualCoeff(ji);
+ }
+ // --- Energy calibration factors ------------------------------------
+ Float_t valFromOCDB[6], calibEne[6];
+ for(Int_t ij=0; ij<6; ij++){
+ valFromOCDB[ij] = fEnCalibData->GetEnCalib(ij);
+ if(ij<4){
+ if(valFromOCDB[ij]!=0) calibEne[ij] = fBeamEnergy/valFromOCDB[ij];
+ else AliWarning(" Value from OCDB for E calibration = 0 !!!\n");
+ }
+ else calibEne[ij] = valFromOCDB[ij];
+ }
+
+ // ****** Equalization of detector responses
+ Float_t equalTowZN1[10], equalTowZN2[10], equalTowZP1[10], equalTowZP2[10];
+ for(Int_t gi=0; gi<10; gi++){
+ equalTowZN1[gi] = corrADCZN1[gi]*equalCoeffZN1[gi];
+ equalTowZP1[gi] = corrADCZP1[gi]*equalCoeffZP1[gi];
+ equalTowZN2[gi] = corrADCZN2[gi]*equalCoeffZN2[gi];
+ equalTowZP2[gi] = corrADCZP2[gi]*equalCoeffZP2[gi];
+ }
+
+ // ****** Summed response for hadronic calorimeter (SUMMED and then CALIBRATED!)
+ Float_t calibSumZN1[]={0,0}, calibSumZN2[]={0,0}, calibSumZP1[]={0,0}, calibSumZP2[]={0,0};
+ for(Int_t gi=0; gi<5; gi++){
+ calibSumZN1[0] += equalTowZN1[gi];
+ calibSumZP1[0] += equalTowZP1[gi];
+ calibSumZN2[0] += equalTowZN2[gi];
+ calibSumZP2[0] += equalTowZP2[gi];
+ //
+ calibSumZN1[1] += equalTowZN1[gi+5];
+ calibSumZP1[1] += equalTowZP1[gi+5];
+ calibSumZN2[1] += equalTowZN2[gi+5];
+ calibSumZP2[1] += equalTowZP2[gi+5];
+ }
+ // High gain chain
+ calibSumZN1[0] = calibSumZN1[0]*calibEne[0]/8.;
+ calibSumZP1[0] = calibSumZP1[0]*calibEne[1]/8.;
+ calibSumZN2[0] = calibSumZN2[0]*calibEne[2]/8.;
+ calibSumZP2[0] = calibSumZP2[0]*calibEne[3]/8.;
+ // Low gain chain
+ calibSumZN1[1] = calibSumZN1[1]*calibEne[0];
+ calibSumZP1[1] = calibSumZP1[1]*calibEne[1];
+ calibSumZN2[1] = calibSumZN2[1]*calibEne[2];
+ calibSumZP2[1] = calibSumZP2[1]*calibEne[3];
+ //
+ Float_t sumZEM[]={0,0}, calibZEM1[]={0,0}, calibZEM2[]={0,0};
+ calibZEM1[0] = corrADCZEM1[0]*calibEne[5]/8.;
+ calibZEM1[1] = corrADCZEM1[1]*calibEne[5];
+ calibZEM2[0] = corrADCZEM2[0]*calibEne[5]/8.;
+ calibZEM2[1] = corrADCZEM2[1]*calibEne[5];
+ for(Int_t k=0; k<2; k++) sumZEM[k] = calibZEM1[k] + calibZEM2[k];
+
+ // ****** Energy calibration of detector responses
+ Float_t calibTowZN1[10], calibTowZN2[10], calibTowZP1[10], calibTowZP2[10];
+ for(Int_t gi=0; gi<5; gi++){
+ // High gain chain
+ calibTowZN1[gi] = equalTowZN1[gi]*calibEne[0]/8.;
+ calibTowZP1[gi] = equalTowZP1[gi]*calibEne[1]/8.;
+ calibTowZN2[gi] = equalTowZN2[gi]*calibEne[2]/8.;
+ calibTowZP2[gi] = equalTowZP2[gi]*calibEne[3]/8.;
+ // Low gain chain
+ calibTowZN1[gi+5] = equalTowZN1[gi+5]*calibEne[0];
+ calibTowZP1[gi+5] = equalTowZP1[gi+5]*calibEne[1];
+ calibTowZN2[gi+5] = equalTowZN2[gi+5]*calibEne[2];
+ calibTowZP2[gi+5] = equalTowZP2[gi+5]*calibEne[3];
+ }
+
+ // ****** Number of detected spectator nucleons
+ Int_t nDetSpecNLeft=0, nDetSpecPLeft=0, nDetSpecNRight=0, nDetSpecPRight=0;
+ if(fBeamEnergy!=0){
+ nDetSpecNLeft = (Int_t) (calibSumZN1[0]/fBeamEnergy);
+ nDetSpecPLeft = (Int_t) (calibSumZP1[0]/fBeamEnergy);
+ nDetSpecNRight = (Int_t) (calibSumZN2[0]/fBeamEnergy);
+ nDetSpecPRight = (Int_t) (calibSumZP2[0]/fBeamEnergy);
+ }
+ else AliWarning(" ATTENTION!!! fBeamEnergy=0 -> N_spec will be ZERO!!! \n");
+ /*printf("\n\t AliZDCReconstructor -> nDetSpecNLeft %d, nDetSpecPLeft %d,"
+ " nDetSpecNRight %d, nDetSpecPRight %d\n",nDetSpecNLeft, nDetSpecPLeft,
+ nDetSpecNRight, nDetSpecPRight);*/
+
+ if(fIsCalibrationMB == kFALSE){
+ // ****** Reconstruction parameters ------------------
+ // Ch. debug
+ //fRecoParam->Print("");
+ //
+ TH2F *hZDCvsZEM = fRecoParam->GethZDCvsZEM();
+ TH2F *hZDCCvsZEM = fRecoParam->GethZDCCvsZEM();
+ TH2F *hZDCAvsZEM = fRecoParam->GethZDCAvsZEM();
+ TH1D *hNpartDist = fRecoParam->GethNpartDist();
+ TH1D *hbDist = fRecoParam->GethbDist();
+ Float_t ClkCenter = fRecoParam->GetClkCenter();
+ //
+ Double_t xHighEdge = hZDCvsZEM->GetXaxis()->GetXmax();
+ Double_t origin = xHighEdge*ClkCenter;
+ // 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)
+ Int_t nPart=0, nPartC=0, nPartA=0;
+ 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)
+ Float_t b=0, bC=0, bA=0;
+ Double_t bFrac=0., bFracC=0., bFracA=0.;
+ for(Int_t ibbin=1; ibbin<hbDist->GetNbinsX(); ibbin++){
+ bFrac += (hbDist->GetBinContent(ibbin))/(hbDist->GetEntries());
+ if((1.-bFrac) < xSecPerc){
+ b = hbDist->GetBinLowEdge(ibbin);
+ break;
+ }
+ }
+ //
+ for(Int_t ibbin=1; ibbin<hbDist->GetNbinsX(); ibbin++){
+ bFracC += (hbDist->GetBinContent(ibbin))/(hbDist->GetEntries());
+ if((1.-bFracC) < xSecPercC){
+ bC = hbDist->GetBinLowEdge(ibbin);
+ break;
+ }
+ }
+ //
+ for(Int_t ibbin=1; ibbin<hbDist->GetNbinsX(); ibbin++){
+ bFracA += (hbDist->GetBinContent(ibbin))/(hNpartDist->GetEntries());
+ if((1.-bFracA) < xSecPercA){
+ bA = hbDist->GetBinLowEdge(ibbin);
+ break;
+ }
+ }
+
+ // ****** Number of spectator nucleons
+ Int_t nGenSpec=0, nGenSpecC=0, nGenSpecA=0;
+ //
+ 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;
+
+ // Ch. debug
+ /*printf("\n\t AliZDCReconstructor -> calibSumZN1[0] %1.0f, calibSumZP1[0] %1.0f,"
+ " calibSumZN2[0] %1.0f, calibSumZP2[0] %1.0f, corrADCZEMHG %1.0f\n",
+ calibSumZN1[0],calibSumZP1[0],calibSumZN2[0],calibSumZP2[0],corrADCZEMHG);
+ printf("\t AliZDCReconstructor -> nGenSpecLeft %d nGenSpecRight %d\n",
+ nGenSpecLeft, nGenSpecRight);
+ printf("\t AliZDCReconstructor -> NpartL %d, NpartR %d, b %1.2f fm\n\n",nPartTotLeft, nPartTotRight, impPar);
+ */
+
+ // create the output tree
+ AliZDCReco reco(calibSumZN1, calibSumZP1, calibSumZN2, calibSumZP2,
+ calibTowZN1, calibTowZP1, calibTowZN2, calibTowZP2,
+ calibZEM1, calibZEM2, sPMRef1, sPMRef2,
+ nDetSpecNLeft, nDetSpecPLeft, nDetSpecNRight, nDetSpecPRight,
+ nGenSpec, nGenSpecA, nGenSpecC,
+ nPart, nPartA, nPartC, b, bA, bC);
+
+ AliZDCReco* preco = &reco;
+ const Int_t kBufferSize = 4000;
+ clustersTree->Branch("ZDC", "AliZDCReco", &preco, kBufferSize);
+ // write the output tree
+ clustersTree->Fill();
+
+ delete lineC; delete lineA;
+ } // ONLY IF fIsCalibrationMB==kFALSE
+ else{
+ // create the output tree
+ AliZDCReco reco(calibSumZN1, calibSumZP1, calibSumZN2, calibSumZP2,
+ calibTowZN1, calibTowZP1, calibTowZN2, calibTowZP2,
+ calibZEM1, calibZEM2, sPMRef1, sPMRef2,
+ nDetSpecNLeft, nDetSpecPLeft, nDetSpecNRight, nDetSpecPRight,
+ 0, 0, 0,
+ 0, 0, 0, 0., 0., 0.);
+
+ AliZDCReco* preco = &reco;
+ const Int_t kBufferSize = 4000;
+ clustersTree->Branch("ZDC", "AliZDCReco", &preco, kBufferSize);
+ // write the output tree
+ clustersTree->Fill();
+ }
+}
+
+//_____________________________________________________________________________
+void AliZDCReconstructor::BuildRecoParam(TH2F* hCorr, TH2F* hCorrC, TH2F* hCorrA,
+ Float_t ZDCC, Float_t ZDCA, Float_t ZEM) const
+{
+ // Calculate RecoParam object for Pb-Pb data
+ hCorr->Fill(ZDCC+ZDCA, ZEM);
+ hCorrC->Fill(ZDCC, ZEM);
+ hCorrA->Fill(ZDCA, ZEM);
+ //
+ /*TH1D* hNpartDist;
+ TH1D* hbDist;
+ Float_t clkCenter;*/
+
+}
+