diff --git a/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZDCDataAnalyzer.cxx b/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZDCDataAnalyzer.cxx index 8b2ad613a2f6296611e39a5915660bd2b4ec2155..e4f6d1a12ab4c90d742c4496381bdc91e4aa7ded 100644 --- a/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZDCDataAnalyzer.cxx +++ b/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZDCDataAnalyzer.cxx @@ -141,6 +141,24 @@ void ZDCDataAnalyzer::enableRepass(const ZDCModuleFloatArray& peak2ndDerivMinRep } } +void ZDCDataAnalyzer::SetGainFactorsHGLG(float gainFactorHG, float gainFactorLG) +{ + for (size_t side : {0, 1}) { + for (size_t module : {0, 1, 2, 3}) { + m_moduleAnalyzers[side][module]->SetGainFactorsHGLG(gainFactorHG, gainFactorLG); + } + } +} + +void ZDCDataAnalyzer::SetGainFactorsHGLG(const ZDCModuleFloatArray& gainFactorsHG, const ZDCModuleFloatArray& gainFactorsLG) +{ + for (size_t side : {0, 1}) { + for (size_t module : {0, 1, 2, 3}) { + m_moduleAnalyzers[side][module]->SetGainFactorsHGLG(gainFactorsHG[side][module], gainFactorsLG[side][module]); + } + } +} + void ZDCDataAnalyzer::SetPeak2ndDerivMinTolerances(size_t tolerance) { for (size_t side : {0, 1}) { for (size_t module : {0, 1, 2, 3}) { diff --git a/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZDCPulseAnalyzer.cxx b/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZDCPulseAnalyzer.cxx index e094f6fb386520977e30bba8545653d96c8936dd..aec2d62f0f1ff1f787ea2cf468da67039a724dfa 100644 --- a/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZDCPulseAnalyzer.cxx +++ b/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZDCPulseAnalyzer.cxx @@ -158,6 +158,11 @@ void ZDCPulseAnalyzer::SetDefaults() m_HGUnderflowADC = 20; m_LGOverflowADC = 1000; + // Default values for the gain factors uswed to match low and high gain + // + m_gainFactorLG = m_gainHG; + m_gainFactorHG = 1; + m_2ndDerivStep = 2; m_noiseSigHG = 1; @@ -299,10 +304,14 @@ void ZDCPulseAnalyzer::Reset(bool repass) m_samplesDeriv2nd.clear(); } -void ZDCPulseAnalyzer::SetFitMinMaxAmp(float minAmpHG, float minAmpLG, float maxAmpHG, float maxAmpLG) +void ZDCPulseAnalyzer::SetGainFactorsHGLG(float gainFactorHG, float gainFactorLG) { - std::cout << "Setting fit min,max amp values " << minAmpHG << ", " << maxAmpHG << std::endl; + m_gainFactorHG = gainFactorHG; + m_gainFactorLG = gainFactorLG; +} +void ZDCPulseAnalyzer::SetFitMinMaxAmp(float minAmpHG, float minAmpLG, float maxAmpHG, float maxAmpLG) +{ m_fitAmpMinHG = minAmpHG; m_fitAmpMinLG = minAmpLG; @@ -484,7 +493,7 @@ bool ZDCPulseAnalyzer::LoadAndAnalyzeData(const std::vector<float>& ADCSamplesHG if (ADCLG > m_LGOverflowADC) { m_LGOverflow = true; m_fail = true; - m_amplitude = m_LGOverflowADC * m_gainHG; // Give a vale here even though we know it's wrong because + m_amplitude = m_LGOverflowADC * m_gainFactorLG; // Give a vale here even though we know it's wrong because // the user may not check the return value and we know that // amplitude is bigger than this } @@ -560,7 +569,7 @@ bool ZDCPulseAnalyzer::LoadAndAnalyzeData(const std::vector<float>& ADCSamplesHG if (ADCLG > m_LGOverflowADC) { m_LGOverflow = true; m_fail = true; - m_amplitude = m_LGOverflowADC * m_gainHG; // Give a value here even though we know it's wrong because + m_amplitude = m_LGOverflowADC * m_gainFactorLG; // Give a value here even though we know it's wrong because // the user may not check the return value and we know that // amplitude is bigger than this } @@ -572,7 +581,7 @@ bool ZDCPulseAnalyzer::LoadAndAnalyzeData(const std::vector<float>& ADCSamplesHG if (ADCLGDelay > m_LGOverflowADC) { m_LGOverflow = true; m_fail = true; - m_amplitude = 1024 * m_gainHG; // Give a value here even though we know it's wrong because + m_amplitude = 1024 * m_gainFactorLG; // Give a value here even though we know it's wrong because // the user may not check the return value and we know that // amplitude is bigger than this } @@ -683,16 +692,16 @@ bool ZDCPulseAnalyzer::DoAnalysis(bool repass) // // Multiply amplitude by gain factor // - m_amplitude = m_fitAmplitude * m_gainHG; - m_ampError = m_fitAmpError * m_gainHG; - m_preSampleAmp = m_preSample * m_gainHG; - m_preAmplitude = m_fitPreAmp * m_gainHG; - m_postAmplitude = m_fitPostAmp * m_gainHG; - m_expAmplitude = m_fitExpAmp * m_gainHG; + m_amplitude = m_fitAmplitude * m_gainFactorLG; + m_ampError = m_fitAmpError * m_gainFactorLG; + m_preSampleAmp = m_preSample * m_gainFactorLG; + m_preAmplitude = m_fitPreAmp * m_gainFactorLG; + m_postAmplitude = m_fitPostAmp * m_gainFactorLG; + m_expAmplitude = m_fitExpAmp * m_gainFactorLG; // BAC: also scale up the 2nd derivative so low and high gain can be treated on the same footing // - m_minDeriv2nd *= m_gainHG; + m_minDeriv2nd *= m_gainFactorLG; } return result; @@ -713,12 +722,14 @@ bool ZDCPulseAnalyzer::DoAnalysis(bool repass) } } - m_preSampleAmp = m_preSample; - m_amplitude = m_fitAmplitude; - m_ampError = m_fitAmpError; - m_preAmplitude = m_fitPreAmp; - m_postAmplitude = m_fitPostAmp; - m_expAmplitude = m_fitExpAmp; + m_preSampleAmp = m_preSample * m_gainFactorHG; + m_amplitude = m_fitAmplitude * m_gainFactorHG; + m_ampError = m_fitAmpError * m_gainFactorHG; + m_preAmplitude = m_fitPreAmp * m_gainFactorHG; + m_postAmplitude = m_fitPostAmp* m_gainFactorHG; + m_expAmplitude = m_fitExpAmp * m_gainFactorHG; + + m_minDeriv2nd *= m_gainFactorHG; // If we have a non-linear correction, apply it here // diff --git a/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZdcAnalysisTool.cxx b/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZdcAnalysisTool.cxx index 2ae74c23fd4a4e4847b5ea95642deab6d3842cd5..2b389640b9db8ad006fb4d27d16a8556420e972c 100644 --- a/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZdcAnalysisTool.cxx +++ b/ForwardDetectors/ZDC/ZdcAnalysis/Root/ZdcAnalysisTool.cxx @@ -196,26 +196,32 @@ std::unique_ptr<ZDCDataAnalyzer> ZdcAnalysisTool::initializeLHCf2022() m_deltaTSample = 3.125; m_numSample = 24; - ZDCDataAnalyzer::ZDCModuleFloatArray tau1, tau2, peak2ndDerivMinSamples, t0; + ZDCDataAnalyzer::ZDCModuleFloatArray peak2ndDerivMinSamples; ZDCDataAnalyzer::ZDCModuleFloatArray peak2ndDerivMinThresholdsHG, peak2ndDerivMinThresholdsLG; ZDCDataAnalyzer::ZDCModuleFloatArray deltaT0CutLow, deltaT0CutHigh, chisqDivAmpCut; ZDCDataAnalyzer::ZDCModuleBoolArray fixTau1Arr, fixTau2Arr; + ZDCDataAnalyzer::ZDCModuleFloatArray tau1 = {0, 1.3, 0.9, 1.0, + 0, 1.2, 1.3, 1.35}; + + ZDCDataAnalyzer::ZDCModuleFloatArray tau2 = {4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5, 4.5}; + + ZDCDataAnalyzer::ZDCModuleFloatArray t0HG = {0, 26.3, 26.5, 26.8, 32, 32, 32, 32}; + + ZDCDataAnalyzer::ZDCModuleFloatArray t0LG = {0, 26.3, 26.5, 26.8, 0, 26.6, 26.3, 25.3}; + for (size_t side : {0, 1}) { for (size_t module : {0, 1, 2, 3}) { - fixTau1Arr[side][module] = false; + fixTau1Arr[side][module] = true; fixTau2Arr[side][module] = false; - tau1[side][module] = 1; - tau2[side][module] = 4.5; peak2ndDerivMinSamples[side][module] = 10; - peak2ndDerivMinThresholdsHG[side][module] = -12; - peak2ndDerivMinThresholdsLG[side][module] = -10; + peak2ndDerivMinThresholdsHG[side][module] = -35; + peak2ndDerivMinThresholdsLG[side][module] = -20; - t0[side][module] = 32; - deltaT0CutLow[side][module] = -100; - deltaT0CutHigh[side][module] = 100; - chisqDivAmpCut[side][module] = 500; + deltaT0CutLow[side][module] = -10; + deltaT0CutHigh[side][module] = 10; + chisqDivAmpCut[side][module] = 50; } } @@ -225,20 +231,41 @@ std::unique_ptr<ZDCDataAnalyzer> ZdcAnalysisTool::initializeLHCf2022() ZDCDataAnalyzer::ZDCModuleFloatArray HGUnderFlowADC = {{{{1, 1, 1, 1}}, {{1, 1, 1, 1}}}}; ZDCDataAnalyzer::ZDCModuleFloatArray LGOverFlowADC = {{{{4000, 4000, 4000, 4000}}, {{4000, 4000, 4000, 4000}}}}; + // For the LHCf run, use low gain samples + // + m_lowGainOnly = true; + // Construct the data analyzer // std::unique_ptr<ZDCDataAnalyzer> zdcDataAnalyzer (new ZDCDataAnalyzer(MakeMessageFunction(), m_numSample, m_deltaTSample, - m_presample, "FermiExp", + m_presample, "FermiExpRun3", peak2ndDerivMinSamples, peak2ndDerivMinThresholdsHG, peak2ndDerivMinThresholdsLG, - m_lowGainOnly)); // last parameter is lowGainOnly + m_lowGainOnly)); + zdcDataAnalyzer->SetPeak2ndDerivMinTolerances(4); zdcDataAnalyzer->SetADCOverUnderflowValues(HGOverFlowADC, HGUnderFlowADC, LGOverFlowADC); - zdcDataAnalyzer->SetTauT0Values(fixTau1Arr, fixTau2Arr, tau1, tau2, t0, t0); + zdcDataAnalyzer->SetTauT0Values(fixTau1Arr, fixTau2Arr, tau1, tau2, t0HG, t0LG); zdcDataAnalyzer->SetCutValues(chisqDivAmpCut, chisqDivAmpCut, deltaT0CutLow, deltaT0CutHigh, deltaT0CutLow, deltaT0CutHigh); + zdcDataAnalyzer->SetGainFactorsHGLG(0.1, 1); // a gain adjustment of unity applied to LG ADC, 0.1 to HG ADC values + + ZDCDataAnalyzer::ZDCModuleFloatArray noiseSigmasLG = {2, 2, 2, 2, 2, 2, 2, 2}; + ZDCDataAnalyzer::ZDCModuleFloatArray noiseSigmasHG = {20, 20, 20, 20, 20, 20, 20, 20}; + + zdcDataAnalyzer->SetNoiseSigmas(noiseSigmasHG, noiseSigmasLG); + + // Enable two-pass analysis + // + ZDCDataAnalyzer::ZDCModuleFloatArray peak2ndDerivMinRepassHG = {-10, -10, -10, -10, + -10, -10, -10, -10}; + + ZDCDataAnalyzer::ZDCModuleFloatArray peak2ndDerivMinRepassLG = {-6, -6, -6, -6, + -6, -6, -6, -6}; + + zdcDataAnalyzer->enableRepass(peak2ndDerivMinRepassHG, peak2ndDerivMinRepassLG); // Set the amplitude fit range limits // @@ -1093,6 +1120,7 @@ StatusCode ZdcAnalysisTool::recoZdcModules(const xAOD::ZdcModuleContainer& modul zdcModule->auxdecor<float>("PreSampleAmp" + m_auxSuffix) = pulseAna_p->GetPreSampleAmp(); zdcModule->auxdecor<float>("Presample" + m_auxSuffix) = pulseAna_p->GetPresample(); zdcModule->auxdecor<float>("MinDeriv2nd" + m_auxSuffix) = pulseAna_p->GetMinDeriv2nd(); + zdcModule->auxdecor<float>("MaxADC" + m_auxSuffix) = pulseAna_p->GetMaxADC(); } ATH_MSG_DEBUG ("side = " << side << " module=" << zdcModule->zdcModule() << " CalibEnergy=" << zdcModule->auxdecor<float>("CalibEnergy") @@ -1105,7 +1133,7 @@ StatusCode ZdcAnalysisTool::recoZdcModules(const xAOD::ZdcModuleContainer& modul for (const auto zdc_sum: moduleSumContainer) { - int iside = zdc_sum->zdcSide(); + int iside = (zdc_sum->zdcSide()==-1) ? 0 : 1; float calibEnergy = getCalibModuleSum(iside); zdc_sum->auxdecor<float>("CalibEnergy"+m_auxSuffix) = calibEnergy; diff --git a/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/ZDCDataAnalyzer.h b/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/ZDCDataAnalyzer.h index e0d3e222dc1d969f9f58b72477208c89f19ef66b..a73c6c33d05d752f878022700193610f827d8155 100644 --- a/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/ZDCDataAnalyzer.h +++ b/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/ZDCDataAnalyzer.h @@ -122,6 +122,10 @@ public: bool disableModule(size_t side, size_t module); + void SetGainFactorsHGLG(float gainFactorHG, float gainFactorLG); + + void SetGainFactorsHGLG(const ZDCModuleFloatArray& gainFactorsHG, const ZDCModuleFloatArray& gainFactorsLG); + void SetPeak2ndDerivMinTolerances(size_t tolerance); void SetFitTimeMax(float tmax); diff --git a/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/ZDCPulseAnalyzer.h b/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/ZDCPulseAnalyzer.h index f0c2ace1d5005c0649573794f794f53d2ea8575e..78fdf5e60f48899c3eb88e6cc52043ce1da331a2 100644 --- a/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/ZDCPulseAnalyzer.h +++ b/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/ZDCPulseAnalyzer.h @@ -362,6 +362,8 @@ public: m_noiseSigLG = noiseSigLG; } + void SetGainFactorsHGLG(float gainFactorHG, float gainFactorLG); + void SetFitMinMaxAmp(float minAmpHG, float minAmpLG, float maxAmpHG, float maxAmpLG); void SetTauT0Values(bool fixTau1, bool fixTau2, float tau1, float tau2, float t0HG, float t0LG); diff --git a/ForwardDetectors/ZDC/ZdcRec/src/ZdcRecChannelToolLucrod.cxx b/ForwardDetectors/ZDC/ZdcRec/src/ZdcRecChannelToolLucrod.cxx index c1332abfd6383d47760417508325ce4482f9781c..30a15edbeaad751062da115a88428b080a95ba44 100644 --- a/ForwardDetectors/ZDC/ZdcRec/src/ZdcRecChannelToolLucrod.cxx +++ b/ForwardDetectors/ZDC/ZdcRec/src/ZdcRecChannelToolLucrod.cxx @@ -157,7 +157,7 @@ int ZdcRecChannelToolLucrod::convertLucrod2ZM(const ZdcLucrodDataContainer* lucr { xAOD::ZdcModule* new_sum = new xAOD::ZdcModule(); zdcSums->push_back(xAOD::ZdcModuleContainer::unique_type(new_sum)); - new_sum->setZdcSide(iside); + new_sum->setZdcSide((iside==0) ? -1 : 1); new_sum->auxdata<uint16_t>("LucrodTriggerSideAmp") = (iside==0) ? zld->GetTrigAvgC() : zld->GetTrigAvgA(); } }