103 auto const& sensorID = pair2.first;
111 for (
int uBin = 0; uBin <
m_nBinsU; ++uBin) {
112 for (
int vBin = 0; vBin <
m_nBinsV; ++vBin) {
113 std::pair<VxdID, int> key(sensorID,
getRegionID(uBin, vBin));
122 for (
int ui = 0; ui < info.getUCells(); ++ui) {
123 for (
int vi = 0; vi < info.getVCells(); ++vi) {
127 m_sensitiveAreaMap[sensorID] -= info.getVPitch(info.getVCellPosition(vi)) * info.getUPitch();
130 std::pair<VxdID, int> key(sensorID,
getRegionID(uBin, vBin));
139 B2WARNING(
"All pixels from Sensor=" << sensorID <<
" are masked.");
142 for (
int uBin = 0; uBin <
m_nBinsU; ++uBin) {
143 for (
int vBin = 0; vBin <
m_nBinsV; ++vBin) {
144 std::pair<VxdID, int> key(sensorID,
getRegionID(uBin, vBin));
146 B2WARNING(
"All pixels from subregion uBin=" << uBin <<
" vBin=" << vBin <<
" on Sensor=" << sensorID <<
" are masked.");
164 unsigned long long int ts = eventMetaDataPtr->getTime() /
m_timePeriod;
173 std::map<VxdID, double> occupancyMap;
176 VxdID sensorID = gTools->getSensorIDFromPXDIndex(i);
177 occupancyMap[sensorID] = 0.0;
185 for (
const PXDDigit& storeDigit : storeDigits) {
186 VxdID sensorID = storeDigit.getSensorID();
188 double hitEnergy = storeDigit.getCharge() * ADUToEnergy;
194 m_buffer[ts][sensorID].m_expo += hitEnergy;
199 m_buffer[ts][sensorID].m_regionDoseMap[regionID] += (hitEnergy /
Unit::J);
200 m_buffer[ts][sensorID].m_regionExpoMap[regionID] += hitEnergy;
204 auto& sensorID = pair.first;
205 auto& bgdata = pair.second;
206 bgdata.m_run = eventMetaDataPtr->getRun();
208 if (occupancyMap.find(sensorID) != occupancyMap.end()) {
209 bgdata.m_nEvents += 1;
210 bgdata.m_meanOccupancy += occupancyMap[sensorID];
211 if (occupancyMap[sensorID] > bgdata.m_maxOccupancy) {
212 bgdata.m_maxOccupancy = occupancyMap[sensorID];
214 if (occupancyMap[sensorID] < bgdata.m_minOccupancy) {
215 bgdata.m_minOccupancy = occupancyMap[sensorID];
220 for (
const PXDCluster& cluster : storeClusters) {
222 VxdID sensorID = cluster.getSensorID();
225 auto cluster_uID = info.getUCellID(cluster.getU());
226 auto cluster_vID = info.getVCellID(cluster.getV());
231 double clusterEnergy = cluster.getCharge() * ADUToEnergy;
233 if (cluster.getSize() == 1 && clusterEnergy < 10000 * Unit::eV && clusterEnergy > 6000 *
Unit::eV) {
234 m_buffer[ts][sensorID].m_softPhotonFlux += 1.0;
235 m_buffer[ts][sensorID].m_regionSoftPhotonFluxMap[regionID] += 1.0;
236 }
else if (cluster.getSize() == 1 && clusterEnergy > 10000 *
Unit::eV) {
237 m_buffer[ts][sensorID].m_hardPhotonFlux += 1.0;
238 m_buffer[ts][sensorID].m_regionHardPhotonFluxMap[regionID] += 1.0;
239 }
else if (cluster.getSize() > 1 && clusterEnergy > 10000 *
Unit::eV) {
240 m_buffer[ts][sensorID].m_chargedParticleFlux += 1.0;
241 m_buffer[ts][sensorID].m_regionChargedParticleFluxMap[regionID] += 1.0;
251 TTree* treeBEAST =
new TTree(
"tout",
"BEAST data tree");
254 treeBEAST->Branch(
"ts", &(ts));
257 auto& sensorID = pair.first;
258 auto& bgdata = pair.second;
259 string sensorDescr = sensorID;
260 treeBEAST->Branch(str(format(
"pxd_%1%_run") % sensorDescr).c_str(), &(bgdata.m_run));
261 treeBEAST->Branch(str(format(
"pxd_%1%_nEvents") % sensorDescr).c_str(), &(bgdata.m_nEvents));
262 treeBEAST->Branch(str(format(
"pxd_%1%_minOccupancy") % sensorDescr).c_str(), &(bgdata.m_minOccupancy));
263 treeBEAST->Branch(str(format(
"pxd_%1%_maxOccupancy") % sensorDescr).c_str(), &(bgdata.m_maxOccupancy));
264 treeBEAST->Branch(str(format(
"pxd_%1%_meanOccupancy") % sensorDescr).c_str(), &(bgdata.m_meanOccupancy));
265 treeBEAST->Branch(str(format(
"pxd_%1%_exposition") % sensorDescr).c_str(), &(bgdata.m_expo));
266 treeBEAST->Branch(str(format(
"pxd_%1%_dose") % sensorDescr).c_str(), &(bgdata.m_dose));
267 treeBEAST->Branch(str(format(
"pxd_%1%_softPhotonFlux") % sensorDescr).c_str(), &(bgdata.m_softPhotonFlux));
268 treeBEAST->Branch(str(format(
"pxd_%1%_hardPhotonFlux") % sensorDescr).c_str(), &(bgdata.m_hardPhotonFlux));
269 treeBEAST->Branch(str(format(
"pxd_%1%_chargedParticleFlux") % sensorDescr).c_str(),
270 &(bgdata.m_chargedParticleFlux));
272 for (
int uBin = 0; uBin <
m_nBinsU; ++uBin) {
273 for (
int vBin = 0; vBin <
m_nBinsV; ++vBin) {
275 treeBEAST->Branch(str(format(
"pxd_%1%_region_%2%_%3%_exposition") % sensorDescr % uBin % vBin).c_str(),
276 &(bgdata.m_regionExpoMap[regionID]));
277 treeBEAST->Branch(str(format(
"pxd_%1%_region_%2%_%3%_dose") % sensorDescr % uBin % vBin).c_str(),
278 &(bgdata.m_regionDoseMap[regionID]));
279 treeBEAST->Branch(str(format(
"pxd_%1%_region_%2%_%3%_softPhotonFlux") % sensorDescr % uBin % vBin).c_str(),
280 &(bgdata.m_regionSoftPhotonFluxMap[regionID]));
281 treeBEAST->Branch(str(format(
"pxd_%1%_region_%2%_%3%_hardPhotonFlux") % sensorDescr % uBin % vBin).c_str(),
282 &(bgdata.m_regionHardPhotonFluxMap[regionID]));
283 treeBEAST->Branch(str(format(
"pxd_%1%_region_%2%_%3%_chargedParticleFlux") % sensorDescr % uBin % vBin).c_str(),
284 &(bgdata.m_regionChargedParticleFluxMap[regionID]));
290 for (
auto const& pair1 :
m_buffer) {
291 auto const& timestamp = pair1.first;
292 auto const& sensors = pair1.second;
296 for (
auto const& pair2 : sensors) {
297 auto const& sensorID = pair2.first;
298 auto const& bgdata = pair2.second;
305 m_sensorData[sensorID].m_meanOccupancy = bgdata.m_meanOccupancy / bgdata.m_nEvents;
307 if (currentSensorArea > 0) {
308 m_sensorData[sensorID].m_dose *= (1.0 / (currentComponentTime /
Unit::s)) * (1000 / currentSensorMass);
309 m_sensorData[sensorID].m_expo *= (1.0 / currentSensorArea) * (1.0 / (currentComponentTime /
Unit::s));
310 m_sensorData[sensorID].m_softPhotonFlux *= (1.0 / currentSensorArea) * (1.0 / (currentComponentTime /
Unit::s));
311 m_sensorData[sensorID].m_hardPhotonFlux *= (1.0 / currentSensorArea) * (1.0 / (currentComponentTime /
Unit::s));
312 m_sensorData[sensorID].m_chargedParticleFlux *= (1.0 / currentSensorArea) * (1.0 / (currentComponentTime /
Unit::s));
315 std::pair<VxdID, int> key(sensorID, regionID);
318 if (currentRegionArea > 0) {
319 m_sensorData[sensorID].m_regionDoseMap[regionID] *= (1.0 / currentComponentTime) * (1000 / currentRegionMass);
320 m_sensorData[sensorID].m_regionExpoMap[regionID] *= (1.0 / currentRegionArea) * (1.0 / (currentComponentTime /
Unit::s));
321 m_sensorData[sensorID].m_regionSoftPhotonFluxMap[regionID] *= (1.0 / currentRegionArea) * (1.0 / (currentComponentTime /
Unit::s));
322 m_sensorData[sensorID].m_regionHardPhotonFluxMap[regionID] *= (1.0 / currentRegionArea) * (1.0 / (currentComponentTime /
Unit::s));
323 m_sensorData[sensorID].m_regionChargedParticleFluxMap[regionID] *= (1.0 / currentRegionArea) * (1.0 /
324 (currentComponentTime /
Unit::s));