uint LayeredCaloTowerTool::buildTowers(std::vector<std::vector<float>>& aTowers) { // Get the input collection with cells from simulation + digitisation (after // calibration and with noise) const fcc::CaloHitCollection* cells = m_cells.get(); debug() << "Input cell collection size: " << cells->size() << endmsg; // Loop over a collection of calorimeter cells and build calo towers // borders of the cell in eta/phi float etaCellMin = 0, etaCellMax = 0; float phiCellMin = 0, phiCellMax = 0; int layerCell = 0; // tower index of the borders of the cell int iPhiMin = 0, iPhiMax = 0; int iEtaMin = 0, iEtaMax = 0; // fraction of cell area in eta/phi belonging to towers // Min - first tower, Max - last tower, Middle - middle tower(s) // If cell size <= tower size => first == last == middle tower, all fractions = 1 // cell size > tower size => Sum of fractions = 1 float ratioEta = 1.0, ratioPhi = 1.0; float fracEtaMin = 1.0, fracEtaMax = 1.0, fracEtaMiddle = 1.0; float fracPhiMin = 1.0, fracPhiMax = 1.0, fracPhiMiddle = 1.0; float epsilon = 0.0001; for (const auto& cell : *cells) { // find to which tower(s) the cell belongs etaCellMin = m_segmentation->eta(cell.core().cellId) - m_segmentation->gridSizeEta() * 0.5; etaCellMax = m_segmentation->eta(cell.core().cellId) + m_segmentation->gridSizeEta() * 0.5; phiCellMin = m_segmentation->phi(cell.core().cellId) - M_PI / (double)m_segmentation->phiBins(); phiCellMax = m_segmentation->phi(cell.core().cellId) + M_PI / (double)m_segmentation->phiBins(); if (m_addLayerRestriction == true) { dd4hep::DDSegmentation::CellID cID = cell.core().cellId; layerCell = m_decoder->get(cID, "layer"); debug() << "Cell' layer = " << layerCell << endmsg; } iEtaMin = idEta(etaCellMin + epsilon); iPhiMin = idPhi(phiCellMin + epsilon); iEtaMax = idEta(etaCellMax - epsilon); iPhiMax = idPhi(phiCellMax - epsilon); // if a cell is larger than a tower in eta/phi, calculate the fraction of // the cell area belonging to the first/last/middle towers fracEtaMin = 1.0; fracEtaMax = 1.0; fracEtaMiddle = 1.0; if (iEtaMin != iEtaMax) { fracEtaMin = fabs(eta(iEtaMin) + 0.5 * m_deltaEtaTower - etaCellMin) / m_segmentation->gridSizeEta(); fracEtaMax = fabs(etaCellMax - eta(iEtaMax) + 0.5 * m_deltaEtaTower) / m_segmentation->gridSizeEta(); if ((iEtaMax - iEtaMin - 1) != 0) { fracEtaMiddle = (1 - fracEtaMin - fracEtaMax) / float(iEtaMax - iEtaMin - 1); } else { fracEtaMiddle = 0.0; } } fracPhiMin = 1.0; fracPhiMax = 1.0; fracPhiMiddle = 1.0; if (iPhiMin != iPhiMax) { fracPhiMin = fabs(phi(iPhiMin) + 0.5 * m_deltaPhiTower - phiCellMin) / (2 * M_PI / (double)m_segmentation->phiBins()); fracPhiMax = fabs(phiCellMax - phi(iPhiMax) + 0.5 * m_deltaPhiTower) / (2 * M_PI / (double)m_segmentation->phiBins()); if ((iPhiMax - iPhiMin - 1) != 0) { fracPhiMiddle = (1 - fracPhiMin - fracPhiMax) / float(iPhiMax - iPhiMin - 1); } else { fracPhiMiddle = 0.0; } } // Loop through the appropriate towers and add transverse energy for (auto iEta = iEtaMin; iEta <= iEtaMax; iEta++) { if (iEta == iEtaMin) { ratioEta = fracEtaMin; } else if (iEta == iEtaMax) { ratioEta = fracEtaMax; } else { ratioEta = fracEtaMiddle; } for (auto iPhi = iPhiMin; iPhi <= iPhiMax; iPhi++) { if (iPhi == iPhiMin) { ratioPhi = fracPhiMin; } else if (iPhi == iPhiMax) { ratioPhi = fracPhiMax; } else { ratioPhi = fracPhiMiddle; } if (m_addLayerRestriction == true) { if (layerCell >= m_minimumLayer && layerCell <= m_maximumLayer) { aTowers[iEta][phiNeighbour(iPhi)] += cell.core().energy / cosh(m_segmentation->eta(cell.core().cellId)) * ratioEta * ratioPhi; } } else aTowers[iEta][phiNeighbour(iPhi)] += cell.core().energy / cosh(m_segmentation->eta(cell.core().cellId)) * ratioEta * ratioPhi; } } } return cells->size(); }
void LayeredCaloTowerTool::attachCells(float eta, float phi, uint halfEtaFin, uint halfPhiFin, fcc::CaloCluster& aEdmCluster, bool) { const fcc::CaloHitCollection* cells = m_cells.get(); for (const auto& cell : *cells) { float etaCell = m_segmentation->eta(cell.core().cellId); float phiCell = m_segmentation->phi(cell.core().cellId); if ((abs(static_cast<long int>(idEta(etaCell)) - static_cast<long int>(idEta(eta))) <= halfEtaFin) && (abs(static_cast<long int>(idPhi(phiCell)) - static_cast<long int>(idPhi(phi))) <= halfPhiFin)) { aEdmCluster.addhits(cell); } } return; }