16 cout <<
"In HitRebuilderTAC::readCCDB() , reading calibration constants" << endl;
18 map<string, double> scaleFactors;
19 if (eventLoop->GetCalib(
"/TAC/digi_scales", scaleFactors))
20 jout <<
"Error loading /TAC/digi_scales !" << endl;
22 if (scaleFactors.find(
"TAC_ADC_TSCALE") != scaleFactors.end())
23 timeScaleADC = adcTimeRescaleFactor * scaleFactors[
"TAC_ADC_TSCALE"];
25 jerr <<
"Unable to get TAC_ADC_TSCALE from /TAC/digi_scales !" << endl;
28 map<string, double> baseTimeOffsets;
30 if (eventLoop->GetCalib(
"/TAC/base_time_offset", baseTimeOffsets))
31 jout <<
"Error loading /TAC/base_time_offset !" << endl;
32 if (baseTimeOffsets.find(
"TAC_BASE_TIME_OFFSET") != baseTimeOffsets.end())
33 timeBaseADC = baseTimeOffsets[
"TAC_BASE_TIME_OFFSET"];
36 <<
"Unable to get TAC_BASE_TIME_OFFSET from /TAC/base_time_offset !"
41 if (eventLoop->GetCalib(
"/TAC/adc_timing_offsets", adcTimeOffset))
42 jout <<
"Error loading /TAC/adc_timing_offsets !" << endl;
44 cout <<
"timeScaleADC is " << timeScaleADC <<
" , timeBaseADC is " << timeBaseADC <<
45 " , adcTimeOffset is " << adcTimeOffset << endl;
54 set<const Df250WindowRawData*> rawDataSet;
55 set<const JObject*> alreadyChecked;
57 baseHit->GetAssociatedAncestors(alreadyChecked, maxDepth, rawDataSet);
64 if (rawDataSet.size() != 1) {
66 errMsg <<
"DTACHit at " << showbase << baseHit
67 <<
" did not have Df250WindowRawData ancestors";
68 throw JException(errMsg.str());
70 return *rawDataSet.begin();
74 if (samples.size() < 1)
77 pair<double, double> maxInfo(0, 0);
78 auto maxElementIter = std::max_element(samples.begin(), samples.end());
79 double peakLocation = std::distance(samples.begin(), maxElementIter);
84 double weightedSum = 0;
85 double normalizationFactor = 0;
87 auto minIter = maxElementIter - 1;
88 auto maxIter = maxElementIter + 3;
89 if (maxElementIter == samples.begin())
90 minIter = samples.begin();
91 if (maxElementIter >= (samples.end() - 2))
92 maxIter = samples.end();
97 for (
auto& elemIter = minIter; elemIter != maxIter; elemIter++) {
98 double elemNumber = std::distance(samples.begin(), elemIter);
99 weightedSum += (elemNumber + 0.5) * (*elemIter);
100 normalizationFactor += (*elemIter);
105 if (normalizationFactor > 0)
106 peakLocation = weightedSum / normalizationFactor;
110 double pulseTime = timeScaleADC * peakLocation - adcTimeOffset
119 vector<const DTACHit*>& baseHitVector) {
121 static auto compareHits =
123 bool {
return( (lhs!=
nullptr)&(rhs!=nullptr ) ? fabs(lhs->
getPulsePeak()) > fabs(rhs->getPulsePeak() ) :
false );};
126 std::sort(baseHitVector.begin(), baseHitVector.end(), compareHits);
128 rawDataPtrSet.clear();
129 vector<DTACHit*> newHitVector;
130 for (
auto baseHit : baseHitVector) {
131 auto rawData = getRawData(baseHit);
137 double newTime = baseHit->getT();
138 if (rawDataPtrSet.find(rawData) == rawDataPtrSet.end()) {
139 auto& rawDataVector = rawData->samples;
143 newTime = getTimeFromRawData(rawDataVector);
144 }
catch (
const runtime_error&
e) {
145 newTime = baseHit->getT();
168 newHit->
setT(newTime);
173 newHit->AddAssociatedObject(baseHit);
175 rawDataPtrSet.insert(rawData);
177 newHitVector.push_back(newHit);
jerror_t readCCDB(jana::JEventLoop *eventLoop)
virtual std::vector< DTACHit * > operator()(vector< const DTACHit * > &baseHitVector) override
double getPulsePeak() const
void setTimeFADC(double timeFadc=0)
virtual const Df250WindowRawData * getRawData(const DTACHit *baseHit) override
virtual double getTimeFromRawData(const std::vector< uint16_t > &samples) override