5#ifndef ZDCANALYSIS_ZDCPulseAnalyzer_h
6#define ZDCANALYSIS_ZDCPulseAnalyzer_h
12#include "TGraphErrors.h"
412 void reset(
bool reanalyze =
false);
426 bool AnalyzeData(
size_t nSamples,
size_t preSample,
427 const std::vector<float>& samples,
428 const std::vector<float>& samplesNoise,
429 const std::vector<bool>& useSamples,
430 float peak2ndDerivMinThresh,
431 const std::vector<float>& toCorrParams,
433 float minT0Corr,
float maxT0Corr
439 static std::vector<float>
calculate2ndDerivative(
const std::vector <float>& inputData,
unsigned int step);
441 static std::pair<std::vector<float>, std::vector<float>>
442 calculate2ndDerivative(
const std::vector<float>& inputData,
const std::vector<float>& inputNoise,
unsigned int step);
444 static std::vector<float>
calculateDerivative(
const std::vector <float>& inputData,
unsigned int step);
447 void prepareLGRefit(
const std::vector<float>& samplesLG,
const std::vector<float>& samplesNoise,
448 const std::vector<bool>& useSamples);
456 for (
size_t isample = 0; isample <
m_NSamplesAna; isample++) {
462 for (
size_t isample = 0; isample <
m_NSamplesAna; isample++) {
472 for (
size_t isample = 0; isample <
m_Nsample; isample++) {
483 for (
size_t isample = 0; isample <
m_Nsample; isample++) {
494 void checkTF1Limits(TF1* func);
496 void DoFit(
bool refitLG =
false);
497 void DoFitCombined(
bool refitLG =
false);
499 static std::unique_ptr<TFitter> MakeCombinedFitter(TF1* func);
503 static void CombinedPulsesFCN(
int& numParam,
double*,
double& f,
double* par,
int flag);
505 void UpdateFitterTimeLimits(TFitter* fitter,
ZDCFitWrapper* wrapper,
bool prePulse);
510 int pedestal,
const std::string& fitFunction,
int peak2ndDerivMinSample,
float peak2DerivMinThreshHG,
511 float peak2DerivMinThreshLG);
524 void enableDelayed(
float deltaT,
float pedestalShift,
bool fixedBaseline =
false);
526 void enableRepass(
float peak2ndDerivMinRepassHG,
float peak2ndDerivMinRepassLG);
528 void enableTimeSigCut(
bool AND,
float sigCut,
const std::string& TF1String,
529 const std::vector<double>& parsHG,
530 const std::vector<double>& parsLG);
532 void enablePreExclusion(
unsigned int maxSamplesExcl,
unsigned int HGADCThresh,
unsigned int LGADCThresh)
566 void SetCutValues(
float chisqDivAmpCutHG,
float chisqDivAmpCutLG,
567 float deltaT0MinHG,
float deltaT0MaxHG,
568 float deltaT0MinLG,
float deltaT0MaxLG);
570 void SetTimeCuts(
float deltaT0MinHG,
float deltaT0MaxHG,
571 float deltaT0MinLG,
float deltaT0MaxLG);
573 void SetChisqCuts(
float chisqDivAmpCutHG,
float chisqDivAmpScaleHG,
float chisqDivAmpOffsetHG,
float chisqDivAmpPowerHG,
574 float chisqDivAmpCutLG,
float chisqDivAmpScaleLG,
float chisqDivAmpOffsetLG,
float chisqDivAmpPowerLG);
582 void SetGainFactorsHGLG(
float gainFactorHG,
float gainFactorLG);
584 void SetFitMinMaxAmp(
float minAmpHG,
float minAmpLG,
float maxAmpHG,
float maxAmpLG);
586 void setMinimumSignificance(
float sigMinHG,
float sigMinLG);
588 void SetTauT0Values(
bool fixTau1,
bool fixTau2,
float tau1,
float tau2,
float t0HG,
float t0LG);
590 void enablePostPulseCheck(
unsigned int postPulseSampleDelta,
float postPulseDerivMinSig,
float postPulseAbsDer2ndMinSig,
float minMainDer2ndRatio);
593 void SetADCOverUnderflowValues(
int HGOverflowADC,
int HGUnderflowADC,
int LGOverflowADC);
596 const std::vector<float>& HGT0CorrParams,
const std::vector<float>& LGT0CorrParams)
608 void SetFitTimeMax(
float tmax);
610 void SetNonlinCorrParams(
float refADC,
float refScale,
const std::vector<float>& paramsHG,
const std::vector<float>& paramsLG)
612 std::string HGParamsStr =
"HG coefficients = ", LGParamsStr =
"LG coefficients = ";
614 for (
auto val : paramsHG) {HGParamsStr += std::to_string(val) +
" ";}
615 for (
auto val : paramsLG) {LGParamsStr += std::to_string(val) +
" ";}
617 (*m_msgFunc_p)(
ZDCMsg::Info, (
"Setting non-linear parameters for module: " +
m_tag +
", reference ADC = " +
618 std::to_string(refADC) +
", reference scale = " + std::to_string(refScale)));
633 void enableFADCCorrections(
bool correctPerSample, std::unique_ptr<const TH1>& correHistHG, std::unique_ptr<const TH1>& correHistLG);
636 bool LoadAndAnalyzeData(
const std::vector<float>& ADCSamplesHG,
const std::vector<float>& ADCSamplesLG);
638 bool LoadAndAnalyzeData(
const std::vector<float>& ADCSamplesHG,
const std::vector<float>& ADCSamplesLG,
639 const std::vector<float>& ADCSamplesHGDelayed,
const std::vector<float>& ADCSamplesLGDelayed);
641 bool ReanalyzeData();
780 unsigned int GetStatusMask()
const;
800 std::shared_ptr<TGraphErrors> GetCombinedGraph(
bool forceLG =
false);
801 std::shared_ptr<TGraphErrors> GetGraph(
bool forceLG =
false);
803 std::vector<float> GetFitPulls(
bool forceLG =
false)
const;
806 void dumpConfiguration()
const;
807 void dumpTF1(
const TF1*)
const;
Define macros for attributes used to control the static checker.
#define ATLAS_NOT_THREAD_SAFE
getNoisyStrip() Find noisy strips from hitmaps and write out into xml/db formats
std::map< std::string, JSONParamDescr > JSONParamList
std::vector< bool > m_useSampleHG
float GetFitPostAmp() const
static TF1 * s_combinedFitFunc
const std::vector< float > & GetShapeParameters() const
float m_initialPrePulseAmp
std::unique_ptr< const TF1 > m_timeResFuncHG_p
float GetAmpError() const
float m_chisqDivAmpScaleHG
float m_chisqDivAmpOffsetLG
std::unique_ptr< TFitter > m_prePulseCombinedFitter
bool underflowExclusion() const
float GetDelayedBaselineCorr() const
float m_initialPostPulseT0
unsigned int m_timeCutMode
std::unique_ptr< const TH1 > m_FADCCorrLG
size_t m_peak2ndDerivMinTolerance
std::vector< float > m_fitPulls
const std::vector< float > & GetSamplesDeriv2nd() const
size_t m_peak2ndDerivMinSample
std::vector< float > m_setPerSampleNoiseHG
bool ScanAndSubtractSamples()
std::vector< float > m_nonLinCorrParamsLG
int getMaxADCSampleLG() const
float GetFitPostT0() const
bool excludeEarlyLG() const
float m_peak2ndDerivMinThreshHG
bool m_havePerSampleNoiseLG
float GetAmplitude() const
std::vector< float > m_samplesNoiseLGRefit
static std::vector< float > s_pullValues
void enablePostExclusion(unsigned int maxSamplesExcl, unsigned int HGADCThresh, unsigned int LGADCThresh)
std::unique_ptr< const TF1 > m_timeResFuncLG_p
static TH1 * s_undelayedFitHist
std::pair< bool, std::string > ConfigFromJSON(const JSON &config)
static std::vector< float > calculate2ndDerivative(const std::vector< float > &inputData, unsigned int step)
std::unique_ptr< ZDCFitWrapper > m_defaultFitWrapper
float getMaxADCLG() const
std::string m_fitFunction
float getADCPeakHG() const
unsigned int m_preSampleIdx
float getRefitLGAmpCorr() const
int getMinADCSampleHG() const
std::vector< float > m_LGT0CorrParams
std::vector< float > m_samplesLGRefit
std::vector< float > m_samplesNoise
float getMinADCLG() const
float getMinADCSub() const
bool fitMinimumAmplitude() const
float m_chisqDivAmpPowerLG
const TH1 * GetHistogramPtr(bool refitLG=false)
float m_peak2ndDerivMinRepassLG
void SetNoiseSigmas(float noiseSigHG, float noiseSigLG)
int m_lastHGOverFlowSample
float GetMinDeriv2ndIndex() const
unsigned int m_preExclLGADCThresh
float getMinADCHG() const
unsigned int m_prePulseDelta
unsigned int m_postExclLGADCThresh
std::vector< float > m_shapeParameters
unsigned int m_NSamplesAna
bool DoAnalysis(bool repass)
float GetDelayedBaselineShiftFit() const
std::unique_ptr< TH1 > m_delayedHistLGRefit
unsigned int getLGMode() const
float m_delayedBaselineShift
unsigned int m_timingCorrMode
float m_chisqDivAmpScaleLG
std::vector< float > m_sampleNoiseLG
unsigned int m_maxSampleEvt
float getRefitLGAmp() const
int m_firstHGOverFlowSample
void saveFitFunc(bool save)
unsigned int m_maxSamplesPreExcl
float GetChisqRatio() const
std::vector< float > m_setPerSampleNoiseLG
std::vector< float > m_ADCSamplesLG
unsigned int m_underFlowExclSamplesPreLG
float m_postPulseMainMinDer2ndRatio
float m_refitLGChisqRatio
static float s_combinedFitTMin
std::vector< float > m_nonLinCorrParamsHG
ZDCPulseAnalyzer(ZDCMsg::MessageFunctionPtr msgFunc_p, const std::string &tag, int Nsample, float deltaTSample, size_t preSampleIdx, int pedestal, const std::string &fitFunction, int peak2ndDerivMinSample, float peak2DerivMinThreshHG, float peak2DerivMinThreshLG)
void setFitOPtions(const std::string &fitOptions)
unsigned int m_underFlowExclSamplesPostHG
unsigned int m_maxSamplesPostExcl
float getADCPeakLG() const
float m_chisqDivAmpPowerHG
int getMaxADCSampleHG() const
std::vector< float > m_ADCSamplesHGSub
std::unique_ptr< ZDCPrePulseFitWrapper > m_prePulseFitWrapper
void setLGMode(unsigned int mode)
float getRefitLGChisq() const
static float obtainDelayedBaselineCorr(const std::vector< float > &samples)
void prepareLGRefit(const std::vector< float > &samplesLG, const std::vector< float > &samplesNoise, const std::vector< bool > &useSamples)
double getAmplitudeCorrection(bool highGain)
float GetFitAmplitude() const
float m_peak2ndDerivMinRepassHG
unsigned int m_underFlowExclSamplesPreHG
float GetMaxDelta() const
float m_peak2ndDerivMinThreshLG
float m_postPulseAbsDer2ndMinSig
void SetPeak2ndDerivMinTolerance(size_t tolerance)
int getMinADCSampleLG() const
std::vector< float > m_ADCSamplesLGSub
float GetMinDelta() const
bool m_enableUnderflowExclHG
float m_delayedPedestalDiff
const std::vector< float > & GetSamplesSub() const
void disablePostPulseCheck()
std::vector< float > m_samplesSub
static float s_combinedFitTMax
std::vector< bool > m_useSampleLG
void reset(bool reanalyze=false)
float GetPreExpAmp() const
float GetAmpNoNonLin() const
unsigned int m_underFlowExclSamplesPostLG
unsigned int m_postPulseDelta
std::vector< float > m_ADCSamplesHG
bool AnalyzeData(size_t nSamples, size_t preSample, const std::vector< float > &samples, const std::vector< float > &samplesNoise, const std::vector< bool > &useSamples, float peak2ndDerivMinThresh, const std::vector< float > &toCorrParams, ChisqCutLambdatype chisqCutLambda, float minT0Corr, float maxT0Corr)
bool m_underflowExclusion
float getRefitLGTimeSub() const
std::vector< float > m_sampleNoiseHG
bool armSumInclude() const
std::vector< float > m_HGT0CorrParams
void enablePreExclusion(unsigned int maxSamplesExcl, unsigned int HGADCThresh, unsigned int LGADCThresh)
float getMaxADCHG() const
float getRefitLGChisqRatio() const
std::unique_ptr< TH1 > m_fitHistLGRefit
std::unique_ptr< TH1 > m_delayedHist
unsigned int m_preExclHGADCThresh
float GetFitExpAmp() const
static TH1 * s_delayedFitHist
float GetFitPreT0() const
std::unique_ptr< TH1 > m_fitHist
void set2ndDerivStep(size_t step)
std::unique_ptr< TFitter > m_defaultCombinedFitter
unsigned int m_minSampleEvt
std::vector< float > m_ADCSSampNoiseLG
bool PSHGOverUnderflow() const
float getRefitLGFitAmp() const
float GetMinDeriv2nd() const
float m_nonLinCorrRefScale
float GetFitPreAmp() const
void disableFADCCorrections()
float getPresample() const
bool m_havePerSampleNoiseHG
bool m_enableUnderflowExclLG
unsigned int m_postExclHGADCThresh
void setPerSampleNoiseSigmas(const std::vector< float > &sigmaHG, const std::vector< float > &sigmaLG)
bool m_haveFADCCorrections
static std::vector< float > calculateDerivative(const std::vector< float > &inputData, unsigned int step)
void SetNonlinCorrParams(float refADC, float refScale, const std::vector< float > ¶msHG, const std::vector< float > ¶msLG)
float m_chisqDivAmpOffsetHG
std::unique_ptr< const TH1 > m_FADCCorrHG
std::vector< float > m_samplesDeriv2ndErr
float getMaxADCSub() const
std::unique_ptr< ZDCPreExpFitWrapper > m_preExpFitWrapper
float GetPreSampleAmp() const
float m_postPulseDerivMinSig
float getRefitLGTime() const
ZDCMsg::MessageFunctionPtr m_msgFunc_p
void FillHistogram(bool refitLG)
std::vector< float >::const_iterator SampleCIter
std::vector< float > m_ADCSSampNoiseHG
float m_initialPrePulseT0
std::vector< float > m_samplesDeriv2nd
float GetBkgdMaxFraction() const
std::pair< bool, std::string > ValidateJSONConfig(const JSON &config)
std::string m_fadcCorrFileName
bool excludeLateLG() const
std::function< bool(float, float, float, float &)> ChisqCutLambdatype
void SetTimingCorrParams(TimingCorrMode mode, float refADC, float refScale, const std::vector< float > &HGT0CorrParams, const std::vector< float > &LGT0CorrParams)
std::shared_ptr< MessageFunction > MessageFunctionPtr