12 #ifndef LIBRARIES_TAC_HITREBUILDERBYFIT_H_
13 #define LIBRARIES_TAC_HITREBUILDERBYFIT_H_
24 #include <TFitResult.h>
25 #include <TFitResultPtr.h>
28 #include <JANA/JFactory.h>
40 std::function<double(const double *data, const Double_t *param)>
waveFunction =
55 std::cout <<
"ROOT function pointer is " <<
fitFun << std::endl;
70 std::cout <<
"In ~HitRebuilderByFit" << std::endl;
75 jerror_t
readCCDB(jana::JEventLoop *eventLoop);
80 return "REBUILD_" + F::getTagString();
103 const std::function<double(const double* data, const Double_t* param)>&
getWaveFunction()
const {
110 std::cout <<
"In HitRebuilderByFit::readCCDB() , reading calibration constants" << std::endl;
117 if (eventLoop->GetCalib(
"/TAC/pedestals", adcPedestal))
118 jout <<
"Error loading /TAC/pedestals !" << std::endl;
121 map<string, double> pulseShapeParameter;
122 if (eventLoop->GetCalib(
"/TAC/pulse_shape", pulseShapeParameter))
123 jout <<
"Error loading /TAC/pulse_shape !" << std::endl;
126 if (pulseShapeParameter.find(
"riseTime") != pulseShapeParameter.end())
127 riseTime = pulseShapeParameter[
"riseTime"];
129 jerr <<
"Unable to get riseTime from /TAC/pulse_shape !" << std::endl;
131 if (pulseShapeParameter.find(
"decayTime") != pulseShapeParameter.end())
132 decayTime = pulseShapeParameter[
"decayTime"];
134 jerr <<
"Unable to get decayTime from /TAC/pulse_shape !" << std::endl;
137 std::cout <<
"riseTime is " << riseTime <<
" , decayTime is " << decayTime <<
138 " , adcPedestal is " << adcPedestal << std::endl;
145 const vector<uint16_t>& samples) {
148 string histoName = this->getTagString() +
":sample";
149 string histoTitle =
string(
150 " FADC samples for TAC for builder " + getTagString());
151 TH1D sampleHisto(histoName.c_str(), histoTitle.c_str(), samples.size(), 0.0,
152 double(samples.size()));
154 for (
auto& sample : samples) {
155 sampleHisto.SetBinContent(iBin,
double(sample));
156 sampleHisto.SetBinError(iBin, 1.0);
160 pair<double, double> maxInfo(0, 0);
161 auto maxElementIter = std::max_element(samples.begin(), samples.end());
162 double peakLocation = std::distance(samples.begin(), maxElementIter);
165 double amplitude = *maxElementIter - adcPedestal;
166 fitFun->SetParNames(
"Pedestal",
"PeakLocation",
"riseTime",
"Amplitude",
172 fitFun->SetParameters(adcPedestal, peakLocation, amplitude, amplitude,
176 double xMin = fitFun->GetXmin();
177 double xMax = peakLocation + 2 * decayTime;
184 fitFun->FixParameter(0, adcPedestal);
185 fitFun->FixParameter(2, riseTime);
186 fitFun->FixParameter(4, decayTime);
187 TFitResultPtr fitResultPtr = sampleHisto.Fit(fitFun,
"WWQ0S",
"", xMin,
189 double newPeak = fitFun->GetParameter(1);
191 double pulseTime = timeScaleADC * newPeak - adcTimeOffset + timeBaseADC;
193 if (!fitResultPtr->IsValid()) {
194 std::string errMsg =
"Fit failed in " + this->getTagString();
195 throw std::runtime_error(errMsg);
jerror_t readCCDB(jana::JEventLoop *eventLoop)
void setRiseTime(double riseTime=0.8)
const std::function< double(const double *data, const Double_t *param)> & getWaveFunction() const
jerror_t readCCDB(jana::JEventLoop *eventLoop)
double getDecayTime() const
double getRiseTime() const
HitRebuilderByFit(jana::JEventLoop *eventLoop)
void setDecayTime(double decayTime=2.6)
std::function< double(const double *data, const Double_t *param)> waveFunction
HitRebuilderByFit & operator=(const HitRebuilderByFit &b)
virtual ~HitRebuilderByFit()
HitRebuilderByFit(const HitRebuilderByFit &b)
virtual double getTimeFromRawData(const vector< uint16_t > &samples) override
static std::string getTagString()