103 for (
int iPixel = 0 ; iPixel < c_NPixelPerModule * c_NModule ; iPixel++) {
105 short slotId = (iPixel / c_NPixelPerModule) + 1;
106 short pixelId = (iPixel % c_NPixelPerModule) + 1;
107 short pmtId = ((pixelId - 1) % c_NPixelPerRow) / c_NChannelPerPMTRow + c_NPMTPerRow * ((pixelId - 1) / (c_NPixelPerModule / 2)) + 1;
108 short pmtChId = (pixelId - 1) % c_NChannelPerPMTRow + c_NChannelPerPMTRow * ((pixelId - 1) %
109 (c_NPixelPerModule / 2) / c_NPixelPerRow) + 1;
111 std::ostringstream pixelstr;
112 pixelstr <<
"s" << std::setw(2) << std::setfill(
'0') << slotId <<
"_PMT"
113 << std::setw(2) << std::setfill(
'0') << pmtId
114 <<
"_" << std::setw(2) << std::setfill(
'0') << pmtChId;
116 std::ostringstream hnameForgain;
117 hnameForgain <<
"hTimeHeight_gain_" << pixelstr.str();
118 std::ostringstream htitleForgain;
119 htitleForgain <<
"2D distribution of hit timing and pulse height for Gain" << pixelstr.str();
125 std::ostringstream hnameForIntegral;
126 hnameForIntegral <<
"hTimeIntegral_gain_" << pixelstr.str();
127 std::ostringstream htitleForIntegral;
128 htitleForIntegral <<
"2D distribution of hit timing and integral for Gain" << pixelstr.str();
134 std::ostringstream hnameForeff;
135 hnameForeff <<
"hTimeHeight_efficiency_" << pixelstr.str();
136 std::ostringstream htitleForeff;
137 htitleForeff <<
"2D distribution of hit timing and pulse height for efficiency" << pixelstr.str();
144 const short nAsic = c_NPixelPerModule / c_NChannelPerAsic * c_NChannelPerPMT;
145 m_nCalPulseHistogram =
new TH1F(
"hNCalPulse",
"number of calibration pulses identificed for each asic",
146 nAsic, -0.5, nAsic - 0.5);
153 std::map<short, float> refTimingMap;
154 std::map<short, std::vector<hitInfo_t> >
158 for (
const auto& digit : digits) {
160 short slotId = digit.getModuleID();
161 short pixelId = digit.getPixelID();
162 short globalPixelId = (slotId - 1) * c_NPixelPerModule + pixelId - 1;
163 if (digit.getHitQuality() == TOPDigit::c_CalPulse) {
164 calPulsesMap[globalPixelId].push_back((
hitInfo_t) { (float)digit.getTime(), (float)digit.getPulseHeight() });
170 for (
const auto& calPulse : calPulsesMap) {
172 short globalPixelId = calPulse.first;
173 short globalAsicId = globalPixelId / c_NChannelPerAsic;
174 std::vector<hitInfo_t> vec = calPulse.second;
175 double calPulseTiming = 9999999;
176 unsigned nCalPulseCandidates = vec.size();
178 double maxPulseHeight = -1;
179 double maxHeightTiming = 9999999;
180 for (
unsigned iVec = 0 ; iVec < nCalPulseCandidates ; iVec++) {
181 if (maxPulseHeight < vec[iVec].m_height) {
182 maxPulseHeight = vec[iVec].m_height;
183 maxHeightTiming = vec[iVec].m_time;
187 calPulseTiming = maxHeightTiming;
189 for (
unsigned iVec = 0 ; iVec < nCalPulseCandidates ; iVec++) {
190 for (
unsigned jVec = 0 ; jVec < nCalPulseCandidates ; jVec++) {
192 if (iVec == jVec || vec[iVec].m_time > vec[jVec].m_time)
continue;
199 if (refTimingMap.count(globalAsicId) == 0 || refTimingMap[globalAsicId] > vec[iVec].m_time)
200 calPulseTiming = vec[iVec].m_time;
206 if (calPulseTiming < 9999998) {
207 refTimingMap[globalAsicId] = calPulseTiming;
213 for (
const auto& digit : digits) {
214 short slotId = digit.getModuleID();
215 short pixelId = digit.getPixelID();
216 short globalPixelId = (slotId - 1) * c_NPixelPerModule + pixelId - 1;
217 short globalAsicId = globalPixelId / c_NChannelPerAsic;
219 if (digit.getHitQuality() == TOPDigit::c_Junk
220 || digit.getHitQuality() == TOPDigit::c_CrossTalk)
continue;
222 float hitTime = digit.getTime() - refTimingMap[globalAsicId];
223 float pulseHeight = digit.getPulseHeight();
224 float Integral = digit.getIntegral();
225 short windowNumberOfHit = (short)(digit.getFirstWindow()) + (short)(digit.getRawTime() / 64);
235 if (!digit.isSecondaryChargeShare()) {
244 if (digit.isSecondaryChargeShare() || digit.isPrimaryChargeShare())
continue;