+//_____________________________________________________________________________
+void AliZDCDigitizer::ReadPMTGains()
+{
+// Read PMT gain from an external file
+
+ char *fname = gSystem->ExpandPathName("$ALICE_ROOT/ZDC/PMTGainsdata.txt");
+ FILE *fdata = fopen(fname,"r");
+ if(fdata==NULL){
+ AliWarning(" Can't open file $ALICE_ROOT/ZDC/PMTGainsdata.txt to read ZDC PMT Gains\n");
+ AliWarning(" -> ZDC signal will be pedestal!!!!!!!!!!!!\n\n");
+ return;
+ }
+ int read=1;
+ Float_t data[5];
+ Int_t beam[12], det[12];
+ Float_t gain[12], aEne[12], bEne[12];
+ for(int ir=0; ir<12; ir++){
+ for(int ic=0; ic<5; ic++){
+ read = fscanf(fdata,"%f ",&data[ic]);
+ if(read==0) AliDebug(3, " Error in reading PMT gains from external file ");
+ }
+ beam[ir] = (int) (data[0]);
+ det[ir] = (int) (data[1]);
+ gain[ir] = data[2];
+ aEne[ir] = data[3];
+ bEne[ir] = data[4];
+ }
+ fclose(fdata);
+
+ if(((fBeamType.CompareTo("P-P")) == 0) || ((fBeamType.CompareTo("p-p")) == 0)){
+ for(int i=0; i<12; i++){
+ if(beam[i]==0 && fBeamEnergy!=0.){
+ if(det[i]!=31 && det[i]!=32){
+ for(Int_t j=0; j<5; j++) fPMGain[det[i]-1][j] = gain[i]*(aEne[i]/fBeamEnergy+bEne[i]);
+ }
+ else if(det[i] == 31) fPMGain[2][1] = gain[i]*(aEne[i]-fBeamEnergy*bEne[i]);
+ else if(det[i] == 32) fPMGain[2][2] = gain[i]*(aEne[i]-fBeamEnergy*bEne[i]);
+ }
+ }
+ //
+ printf("\n AliZDCDigitizer::ReadPMTGains -> ZDC PMT gains for p-p @ %1.0f+%1.0f GeV: ZNC(%1.0f), ZPC(%1.0f), ZEM(%1.0f), ZNA(%1.0f) ZPA(%1.0f)\n",
+ fBeamEnergy, fBeamEnergy, fPMGain[0][0], fPMGain[1][0], fPMGain[2][1], fPMGain[3][0], fPMGain[4][0]);
+ }
+ else if(((fBeamType.CompareTo("A-A")) == 0)){
+ for(int i=0; i<12; i++){
+ if(beam[i]==1){
+ Float_t scalGainFactor = fBeamEnergy/2760.;
+ if(det[i]!=31 && det[i]!=32){
+ for(Int_t j=0; j<5; j++) fPMGain[det[i]-1][j] = gain[i]/(aEne[i]*scalGainFactor);
+ }
+ else{
+ for(int iq=1; iq<3; iq++) fPMGain[2][iq] = gain[i]/(aEne[i]*scalGainFactor);
+ }
+ }
+ }
+ //
+ printf("\n AliZDCDigitizer::ReadPMTGains -> ZDC PMT gains for Pb-Pb @ %1.0f+%1.0f A GeV: ZN(%1.0f), ZP(%1.0f), ZEM(%1.0f)\n",
+ fBeamEnergy, fBeamEnergy, fPMGain[0][0], fPMGain[1][0], fPMGain[2][1]);
+ }
+ else if(((fBeamType.CompareTo("p-A")) == 0) || ((fBeamType.CompareTo("P-A")) == 0)
+ || ((fBeamType.CompareTo("A-p")) == 0) || ((fBeamType.CompareTo("A-P")) == 0)){
+ for(int i=0; i<12; i++){
+ if(beam[i]==0 && fBeamEnergy!=0.){
+ if(det[i]==1 || det[i]==2){
+ for(Int_t j=0; j<5; j++) fPMGain[det[i]-1][j] = gain[i]*(aEne[i]/fBeamEnergy+bEne[i]);
+ }
+ }
+ if(beam[i]==1){
+ Float_t scalGainFactor = fBeamEnergy/2760.;
+ Float_t npartScalingFactor = 208./15.;
+ if(det[i]==4 || det[i]==5){
+ for(Int_t j=0; j<5; j++) fPMGain[det[i]-1][j] = npartScalingFactor*gain[i]/(aEne[i]*scalGainFactor);
+ }
+ else if(det[i]==31 || det[i]==32){
+ for(int iq=1; iq<3; iq++) fPMGain[2][iq] = npartScalingFactor*gain[i]/(aEne[i]*scalGainFactor);
+ }
+ }
+ }
+ printf("\n AliZDCDigitizer::ReadPMTGains -> ZDC PMT gains for p-Pb: ZNC(%1.0f), ZPC(%1.0f), ZEM(%1.0f), ZNA(%1.0f) ZPA(%1.0f)\n",
+ fPMGain[0][0], fPMGain[1][0], fPMGain[2][1], fPMGain[3][0], fPMGain[4][0]);
+ }
+}
+
+//_____________________________________________________________________________
+void AliZDCDigitizer::CalculatePMTGains()
+{
+// Calculate PMT gain according to beam type and beam energy
+ if( ((fBeamType.CompareTo("P-P")) == 0) || ((fBeamType.CompareTo("p-p"))) ){
+ // PTM gains rescaled to beam energy for p-p
+ // New correction coefficients for PMT gains needed
+ // to reproduce experimental spectra (from Grazia Jul 2010)
+ if(fBeamEnergy != 0){
+ for(Int_t j = 0; j < 5; j++){
+ fPMGain[0][j] = 1.515831*(661.444/fBeamEnergy+0.000740671)*10000000;
+ fPMGain[1][j] = 0.674234*(864.350/fBeamEnergy+0.00234375)*10000000;
+ fPMGain[3][j] = 1.350938*(661.444/fBeamEnergy+0.000740671)*10000000;
+ fPMGain[4][j] = 0.678597*(864.350/fBeamEnergy+0.00234375)*10000000;
+ }
+ fPMGain[2][1] = 0.869654*(1.32312-0.000101515*fBeamEnergy)*10000000;
+ fPMGain[2][2] = 1.030883*(1.32312-0.000101515*fBeamEnergy)*10000000;
+ //
+ printf("\n AliZDCDigitizer::CalculatePMTGains -> ZDC PMT gains for p-p @ %1.0f+%1.0f GeV: ZNC(%1.0f), ZPC(%1.0f), ZEM(%1.0f), ZNA(%1.0f) ZPA(%1.0f)\n",
+ fBeamEnergy, fBeamEnergy, fPMGain[0][0], fPMGain[1][0], fPMGain[2][1], fPMGain[3][0], fPMGain[4][0]);
+
+ }
+ }
+ else if(((fBeamType.CompareTo("A-A")) == 0)){
+ // PTM gains for Pb-Pb @ 2.7+2.7 A TeV ***************
+ // rescaled for Pb-Pb @ 1.38+1.38 A TeV ***************
+ // Values corrected after 2010 Pb-Pb data taking (7/2/2011 - Ch.)
+ // Experimental data compared to EMD simulation for single nucleon peaks:
+ // ZN gains must be divided by 4, ZP gains by 10!
+ Float_t scalGainFactor = fBeamEnergy/2760.;
+ for(Int_t j = 0; j < 5; j++){
+ fPMGain[0][j] = 50000./(4*scalGainFactor); // ZNC
+ fPMGain[1][j] = 100000./(5*scalGainFactor); // ZPC
+ fPMGain[2][j] = 100000./scalGainFactor; // ZEM
+ fPMGain[3][j] = 50000./(4*scalGainFactor); // ZNA
+ fPMGain[4][j] = 100000./(5*scalGainFactor); // ZPA
+ }
+ printf("\n AliZDCDigitizer::CalculatePMTGains -> ZDC PMT gains for Pb-Pb @ %1.0f+%1.0f A GeV: ZN(%1.0f), ZP(%1.0f), ZEM(%1.0f)\n",
+ fBeamEnergy, fBeamEnergy, fPMGain[0][0], fPMGain[1][0], fPMGain[2][1]);
+ }
+ else if(((fBeamType.CompareTo("p-A")) == 0) || ((fBeamType.CompareTo("P-A"))) ){
+ // PTM gains for Pb-Pb @ 1.38+1.38 A TeV on side A
+ // PTM gains rescaled to beam energy for p-p on side C
+ // WARNING! Energies are set by hand for 2011 pA RUN!!!
+ Float_t scalGainFactor = fBeamEnergy/2760.;
+ Float_t npartScalingFactor = 208./15.;
+
+ for(Int_t j = 0; j < 5; j++){
+ fPMGain[0][j] = 1.515831*(661.444/fBeamEnergy+0.000740671)*10000000; //ZNC (p)
+ fPMGain[1][j] = 0.674234*(864.350/fBeamEnergy+0.00234375)*10000000; //ZPC (p)
+ if(j<2) fPMGain[2][j] = npartScalingFactor*100000./scalGainFactor; // ZEM (Pb)
+ // Npart max scales from 400 in Pb-Pb to ~8 in pPb -> *40.
+ fPMGain[3][j] = npartScalingFactor*50000/(4*scalGainFactor); // ZNA (Pb)
+ fPMGain[4][j] = npartScalingFactor*100000/(5*scalGainFactor); // ZPA (Pb)
+ }
+ printf("\n AliZDCDigitizer::CalculatePMTGains -> ZDC PMT gains for p-Pb: ZNC(%1.0f), ZPC(%1.0f), ZEM(%1.0f), ZNA(%1.0f) ZPA(%1.0f)\n",
+ fPMGain[0][0], fPMGain[1][0], fPMGain[2][1], fPMGain[3][0], fPMGain[4][0]);
+ }
+ else if(((fBeamType.CompareTo("A-p")) == 0) || ((fBeamType.CompareTo("A-P"))) ){
+ // PTM gains for Pb-Pb @ 1.38+1.38 A TeV on side
+ // PTM gains rescaled to beam energy for p-p on side C
+ // WARNING! Energies are set by hand for 2011 pA RUN!!!
+ Float_t scalGainFactor = fBeamEnergy/2760.;
+ Float_t npartScalingFactor = 208./15.;
+
+ for(Int_t j = 0; j < 5; j++){
+ fPMGain[3][j] = 1.350938*(661.444/fBeamEnergy+0.000740671)*10000000; //ZNA (p)
+ fPMGain[4][j] = 0.678597*(864.350/fBeamEnergy+0.00234375)*10000000; //ZPA (p)
+ // Npart max scales from 400 in Pb-Pb to ~8 in pPb -> *40.
+ fPMGain[1][j] = npartScalingFactor*50000/(4*scalGainFactor); // ZNC (Pb)
+ fPMGain[2][j] = npartScalingFactor*100000/(5*scalGainFactor); // ZPC (Pb)
+ }
+ fPMGain[2][1] = 0.869654*(1.32312-0.000101515*fBeamEnergy)*10000000; // ZEM (pp)
+ fPMGain[2][2] = 1.030883*(1.32312-0.000101515*fBeamEnergy)*10000000; // ZEM (pp)
+ printf("\n AliZDCDigitizer::CalculatePMTGains -> ZDC PMT gains for p-Pb: ZNC(%1.0f), ZPC(%1.0f), ZEM(%1.0f), ZNA(%1.0f) ZPA(%1.0f)\n",
+ fPMGain[0][0], fPMGain[1][0], fPMGain[2][1], fPMGain[3][0], fPMGain[4][0]);
+ }
+}
+