10 TSMin_(0), TSMax_(0), vts4Chi2_(0), pedestalConstraint_(
false),
12 ts4Min_(0), vts4Max_(0), pulseJitter_(0), timeMean_(0), timeSig_(0), pedMean_(0)
15 iniTimesArr = { {-100,-75,-50,-25,0,25,50,75,100,125} };
23 bool iApplyTimeSlew,
double iTS4Min,
const std::vector<double> & iTS4Max,
24 double iPulseJitter,
double iTimeMean,
double iTimeSigHPD,
double iTimeSigSiPM,
26 double iTMin,
double iTMax,
27 const std::vector<double> & its4Chi2,
82 constexpr char const*
varNames[] = {
"time",
"energy",
"time1",
"energy1",
"time2",
"energy2",
"ped"};
84 int PulseShapeFitOOTPileupCorrection::pulseShapeFit(
const double * energyArr,
const double * pedenArr,
const double *chargeArr,
const double *pedArr,
const double *gainArr,
const double tsTOTen, std::vector<float> &fitParsVec,
const double * noiseArrSq,
unsigned int soi)
const {
90 tmpy[
i]=energyArr[
i]-pedenArr[
i];
99 tmperry2[
i]=noiseArrSq[
i];
102 tmperry2[
i]*=(gainArr[
i]*gainArr[
i]);
103 tmperry [
i]=
sqrt(tmperry2[
i]);
106 if( i ==soi || i ==(soi+1) ){
107 tstrig += chargeArr[
i] - pedArr[
i];
112 psfPtr_->setpsFiterry (tmperry);
113 psfPtr_->setpsFiterry2(tmperry2);
114 psfPtr_->setpsFitslew (tmpslew);
117 float timevalfit = 0;
118 float chargevalfit= 0;
121 bool fitStatus =
false;
122 bool useTriple =
false;
124 unsigned BX[3] = {soi,soi+1,soi-1};
125 if(
ts4Chi2_ != 0)
fit(1,timevalfit,chargevalfit,pedvalfit,chi2,fitStatus,tsMAX,tsTOTen,tmpy,BX);
127 if(tmpy[soi-2] > 3.*tmpy[soi-1]) BX[2] = soi-2;
130 fit(3,timevalfit,chargevalfit,pedvalfit,chi2,fitStatus,tsMAX,tsTOTen,tmpy,BX);
144 int outfitStatus = (fitStatus ? 1: 0 );
146 fitParsVec.push_back(chargevalfit);
147 fitParsVec.push_back(timevalfit);
148 fitParsVec.push_back(pedvalfit);
149 fitParsVec.push_back(chi2);
150 fitParsVec.push_back(useTriple);
159 float pedMax = iTSMax;
163 if(pedMax < 1.) pedMax = 1.;
166 for(
int i = 0;
i <
int((n-1)/2);
i++) {
168 vstart[2*
i+1] = iEnArr[iBX[
i]];
173 for(
int i = 0;
i <
n;
i++) step[
i] = 0.1;
180 for(
int i = 0;
i <
int((n-1)/2);
i++) {
187 if(vstart[n-1] >
std::abs(pedMax)) vstart[n-1] = pedMax;
194 const double *results =
nullptr;
195 for(
int tries=0; tries<=3;++tries){
202 if(chi2 == -1 || chi2>chi2valfit+0.01) {
205 if( tries == 0 &&
fitTimes_ == 1 )
break;
207 if( tries == 2 &&
fitTimes_ == 4 )
break;
208 if( tries == 3 &&
fitTimes_ == 5 )
break;
225 timevalfit = results[0];
226 chargevalfit = results[1];
227 pedvalfit = results[n-1];
232 float& reconstructedEnergy,
233 float& reconstructedTime,
238 psfPtr_->setDefaultcntNANinfit();
240 const unsigned cssize = channelData.
nSamples();
241 const unsigned int soi = channelData.
soi();
249 double tsTOT = 0, tstrig = 0;
254 for(
unsigned int ip=0; ip<cssize; ++ip){
262 double energy = charge*
gain;
263 double peden = ped*
gain;
265 chargeArr[ip] =
charge; pedArr[ip] = ped; gainArr[ip] =
gain;
266 energyArr[ip] = energy; pedenArr[ip] = peden;
277 noisePHArr[ip] =
sqrt((charge-ped)*channelData.
fcByPE());
281 noiseArrSq[ip]= noiseADCArr[ip]*noiseADCArr[ip] + channelData.
tsPedestalWidth(ip)*channelData.
tsPedestalWidth(ip) + noisePHArr[ip]*noisePHArr[ip];
283 tsTOT += charge - ped;
284 tsTOTen += energy - peden;
285 if( ip == soi || ip == soi+1 ){
286 tstrig += charge - ped;
296 psfPtr_->setinvertpedSig2(1./(averagePedSig2GeV));
308 std::vector<float> fitParsVec;
309 if(tstrig >=
ts4Min_ && tsTOTen > 0.) {
310 pulseShapeFit(energyArr, pedenArr, chargeArr, pedArr, gainArr, tsTOTen, fitParsVec, noiseArrSq, channelData.
soi());
313 fitParsVec.push_back(0.);
314 fitParsVec.push_back(-9999);
315 fitParsVec.push_back(0.);
316 fitParsVec.push_back(-9999);
317 fitParsVec.push_back(
false);
321 reconstructedEnergy = fitParsVec[0];
322 reconstructedTime = fitParsVec[1];
323 chi2 = fitParsVec[3];
324 useTriple = fitParsVec[4];
double tsGain(const unsigned ts) const
const HcalTimeSlew * hcalTimeSlewDelay_
std::vector< double > vts4Max_
double MinValue() const override
return minimum function value
double singlePulseShapeFunc(const double *x)
std::vector< double > vts4Chi2_
void phase1Apply(const HBHEChannelInfo &channelData, float &reconstructedEnergy, float &reconstructedTime, bool &useTriple, float &chi2) const
~PulseShapeFitOOTPileupCorrection()
void SetFunction(const ROOT::Math::IMultiGenFunction &func) override
set the function to minimize
double tsPedestal(const unsigned ts) const
PSFitter::HybridMinimizer * hybridfitter
void setPUParams(bool iPedestalConstraint, bool iTimeConstraint, bool iAddPulseJitter, bool iApplyTimeSlew, double iTS4Min, const std::vector< double > &iTS4Max, double iPulseJitter, double iTimeMean, double iTimeSigHPD, double iTimeSigSiPM, double iPedMean, double iTMin, double iTMax, const std::vector< double > &its4Chi2, HcalTimeSlew::BiasSetting slewFlavor, int iFitTimes)
void SetMinimizerType(EMinimizerType type)
int depth() const
get the tower depth
void setPulseShapeTemplate(const HcalPulseShapes::Shape &ps, bool isHPD, unsigned nSamples, const HcalTimeSlew *hcalTimeSlewDelay)
double tsRawCharge(const unsigned ts) const
std::array< double, HcalConst::maxSamples > iniTimesArr
bool SetFixedVariable(unsigned int, const std::string &, double) override
set fixed variable (override if minimizer supports them )
Abs< T >::type abs(const T &t)
std::unique_ptr< ROOT::Math::Functor > tpfunctor_
constexpr size_t nSamples
std::unique_ptr< ROOT::Math::Functor > dpfunctor_
bool isCurrentChannelHPD_
void fit(int iFit, float &timevalfit, float &chargevalfit, float &pedvalfit, float &chi2, bool &fitStatus, double &iTSMax, const double &iTSTOTen, double *iEnArr, unsigned(&iBX)[3]) const
PulseShapeFitOOTPileupCorrection()
double triplePulseShapeFunc(const double *x)
std::unique_ptr< ROOT::Math::Functor > spfunctor_
double doublePulseShapeFunc(const double *x)
double tsPedestalWidth(const unsigned ts) const
const double * X() const override
return pointer to X values at the minimum
HcalTimeSlew::BiasSetting slewFlavor_
bool SetLimitedVariable(unsigned int ivar, const std::string &name, double val, double step, double, double) override
set upper/lower limited variable (override if minimizer supports them )
std::unique_ptr< FitterFuncs::PulseShapeFunctor > psfPtr_
void resetPulseShapeTemplate(const HcalPulseShapes::Shape &ps, unsigned nSamples)
float delay(float fC, BiasSetting bias=Medium) const
Returns the amount (ns) by which a pulse of the given number of fC will be delayed by the timeslew ef...
unsigned nSamples() const
const HcalPulseShapes::Shape * currentPulseShape_
int pulseShapeFit(const double *energyArr, const double *pedenArr, const double *chargeArr, const double *pedArr, const double *gainArr, const double tsTOTen, std::vector< float > &fitParsVec, const double *ADCnoise, unsigned int soi) const
float tsDFcPerADC(const unsigned ts) const