177 double currentComponentTime = storeBgMetaData->getRealTime();
179 B2FATAL(
"Mismatch in component times:\n"
181 <<
"Background file: " << currentComponentTime);
183 VxdID currentSensorID(0);
184 double currentSensorThickness(0);
185 double currentSensorArea(0);
189 B2DEBUG(100,
"Expo and dose");
190 currentSensorID.
setID(0);
191 double currentSensorMass(0);
193 for (
const SVDSimHit& hit : storeSimHits) {
195 VxdID sensorID = hit.getSensorID();
196 if (sensorID != currentSensorID) {
197 currentSensorID = sensorID;
205 (hitEnergy /
Unit::J) / (currentSensorMass / 1000) * (
c_smy / currentComponentTime);
207 m_sensorData[currentSensorID].m_expo += hitEnergy / currentSensorArea / (currentComponentTime /
Unit::s);
209 const ROOT::Math::XYZVector localPos = hit.getPosIn();
210 const ROOT::Math::XYZVector globalPos =
pointToGlobal(currentSensorID, localPos);
211 float globalPosXYZ[3];
212 globalPos.GetCoordinates(globalPosXYZ);
215 hit.getPDGcode(), hit.getGlobalTime(),
216 localPos.X(), localPos.Y(), globalPosXYZ, hitEnergy,
217 (hitEnergy /
Unit::J) / (currentSensorMass / 1000) / (currentComponentTime /
Unit::s),
218 (hitEnergy /
Unit::J) / currentSensorArea / (currentComponentTime /
Unit::s)
226 B2DEBUG(100,
"Neutron flux");
227 currentSensorID.
setID(0);
229 VxdID sensorID = hit.getSensorID();
231 if (sensorID != currentSensorID) {
232 currentSensorID = sensorID;
238 ROOT::Math::XYZVector entryPos(hit.getEntryU(), hit.getEntryV(), hit.getEntryW());
239 ROOT::Math::XYZVector exitPos(hit.getExitU(), hit.getExitV(), hit.getExitW());
240 double stepLength = (exitPos - entryPos).
R();
246 double minDistance = 1.0e10;
247 for (
const SVDSimHit& related : storeSimHits) {
248 double distance = (entryPos - related.getPosIn()).R();
249 if (distance < minDistance) {
250 minDistance = distance;
256 B2WARNING(
"No related SVDSimHit found");
263 ROOT::Math::XYZVector hitMomentum(hit.getMomentum());
264 hitMomentum.SetX(std::isfinite(hitMomentum.X()) ? hitMomentum.X() : 0.0);
265 hitMomentum.SetY(std::isfinite(hitMomentum.Y()) ? hitMomentum.Y() : 0.0);
266 hitMomentum.SetZ(std::isfinite(hitMomentum.Z()) ? hitMomentum.Z() : 0.0);
268 double kineticEnergy(0.0);
269 double nielWeight(0.0);
272 kineticEnergy =
sqrt(hitMomentum.Mag2() + m0 * m0) - m0;
277 kineticEnergy =
sqrt(hitMomentum.Mag2() + m0 * m0) - m0;
282 kineticEnergy =
sqrt(hitMomentum.Mag2() + m0 * m0) - m0;
287 kineticEnergy =
sqrt(hitMomentum.Mag2() + m0 * m0) - m0;
292 kineticEnergy =
sqrt(hitMomentum.Mag2() + m0 * m0) - m0;
296 nielWeight = std::isfinite(nielWeight) ? nielWeight : 0.0;
297 m_sensorData[currentSensorID].m_neutronFlux += nielWeight * stepLength / currentSensorThickness / currentSensorArea /
298 currentComponentTime *
c_smy;
302 ROOT::Math::XYZVector localPos(hit.getU(), hit.getV(), hit.getW());
303 const ROOT::Math::XYZVector globalPos =
pointToGlobal(currentSensorID, localPos);
304 float globalPosXYZ[3];
305 globalPos.GetCoordinates(globalPosXYZ);
306 ROOT::Math::XYZVector localMom = hit.getMomentum();
307 const ROOT::Math::XYZVector globalMom =
vectorToGlobal(currentSensorID, localMom);
308 float globalMomXYZ[3];
309 globalMom.GetCoordinates(globalMomXYZ);
313 hit.getU(), hit.getV(), globalPosXYZ, globalMomXYZ, kineticEnergy,
314 stepLength, nielWeight,
315 stepLength / currentSensorThickness / currentSensorArea / (currentComponentTime /
Unit::s),
316 nielWeight * stepLength / currentSensorThickness / currentSensorArea / (currentComponentTime /
Unit::s)
324 B2DEBUG(100,
"Fired strips");
325 currentSensorID.
setID(0);
326 double currentSensorUCut = 0;
327 double currentSensorVCut = 0;
329 std::map<VxdID, std::multiset<unsigned short> > firedStrips;
333 VxdID sensorID = digit.getSensorID();
334 if (sensorID != currentSensorID) {
335 currentSensorID = sensorID;
337 currentSensorUCut = eToADU(3.0 * info.getElectronicNoiseU());
338 currentSensorVCut = eToADU(3.0 * info.getElectronicNoiseV());
340 B2DEBUG(30,
"MaxCharge: " << digit.getMaxADCCounts() <<
" threshold: " << (digit.isUStrip() ? currentSensorUCut :
342 if (digit.getMaxADCCounts() < (digit.isUStrip() ? currentSensorUCut : currentSensorVCut))
continue;
343 B2DEBUG(30,
"Passed.");
345 VxdID writeID(sensorID);
346 if (digit.isUStrip())
350 firedStrips[writeID].insert(digit.getCellID());
353 for (
auto idAndSet : firedStrips) {
354 bool isUStrip = (idAndSet.first.getSegmentNumber() == 0);
355 VxdID sensorID = idAndSet.first;
358 int nFired_APV = idAndSet.second.size();
360 for (
auto it = idAndSet.second.begin();
361 it != idAndSet.second.end();
362 it = idAndSet.second.upper_bound(*it)) nFired++;
363 double fired = nFired / (currentComponentTime /
Unit::s) / sensorArea;
389 B2DEBUG(100,
"Occupancy");
390 currentSensorID.
setID(0);
391 double currentNoiseU = 0;
392 double currentNoiseV = 0;
395 for (
auto cluster : storeClsuters) {
396 VxdID sensorID = cluster.getSensorID();
397 if (currentSensorID != sensorID) {
398 currentSensorID = sensorID;
400 currentNoiseU = eToADU(info.getElectronicNoiseU());
401 currentNoiseV = eToADU(info.getElectronicNoiseV());
402 nStripsU = info.getUCells();
403 nStripsV = info.getVCells();
405 bool isU = cluster.isUCluster();
406 double snr = (isU) ? cluster.getCharge() / currentNoiseU : cluster.getCharge() / currentNoiseV;
407 int nStrips = (isU) ? nStripsU : nStripsV;
408 double tau_error = 45 / snr *
Unit::ns;
411 double w_acceptance = tau_acceptance / currentComponentTime;
413 double occupancy = 1.0 / nStrips * cluster.getSize();
415 m_sensorData[sensorID].m_occupancyU += w_acceptance * occupancy;
416 m_sensorData[sensorID].m_occupancyU_APV += w_acceptance_APV * occupancy;
418 m_sensorData[sensorID].m_occupancyV += w_acceptance * occupancy;
419 m_sensorData[sensorID].m_occupancyV_APV += w_acceptance_APV * occupancy;
425 cluster.isUCluster(), cluster.getPosition(), cluster.getSize(),
426 cluster.getCharge(), snr, w_acceptance, w_acceptance * occupancy,
427 w_acceptance_APV * occupancy