diff --git a/ForwardDetectors/ZDC/ZdcAnalysis/Root/RpdSubtractCentroidTool.cxx b/ForwardDetectors/ZDC/ZdcAnalysis/Root/RpdSubtractCentroidTool.cxx index 8d61b688f7cfc20289e6443b5e768b70c5e4c33a..0fe55efb7970f7e29b6fea25389ebdd306845311 100644 --- a/ForwardDetectors/ZDC/ZdcAnalysis/Root/RpdSubtractCentroidTool.cxx +++ b/ForwardDetectors/ZDC/ZdcAnalysis/Root/RpdSubtractCentroidTool.cxx @@ -27,37 +27,12 @@ RpdSubtractCentroidTool::RpdSubtractCentroidTool(const std::string& name) : asg::AsgTool(name), m_name(name), m_init(false), - m_validInput(false), - m_runNumber(0), - m_lumiBlock(0), m_xCenter({0, 0}), m_yCenter({0, 0}), m_xyRotAngle({0, 0}), m_yzRotAngle({0, 0}), m_xCentAvg({0, 0}), - m_yCentAvg({0, 0}), - m_status({1 << ValidBit, 1 << ValidBit}), // calculation is valid by default - m_ampSum({0, 0}), - m_ampSumSub({0, 0}), - m_ampSub({ - std::vector<std::vector<float>>(m_nRows, std::vector<float>(m_nCols)), - std::vector<std::vector<float>>(m_nRows, std::vector<float>(m_nCols)) - }), - m_xCentUnsub({0, 0}), - m_yCentUnsub({0, 0}), - m_xCentUnsubCor({0, 0}), - m_yCentUnsubCor({0, 0}), - m_xCent({0, 0}), - m_yCent({0, 0}), - m_xCentCor({0, 0}), - m_yCentCor({0, 0}), - m_xCentRowUnsub({std::vector<float>(m_nRows, 0), std::vector<float>(m_nRows, 0)}), - m_yCentColUnsub({std::vector<float>(m_nCols, 0), std::vector<float>(m_nCols, 0)}), - m_xCentRow({std::vector<float>(m_nRows, 0), std::vector<float>(m_nRows, 0)}), - m_yCentCol({std::vector<float>(m_nCols, 0), std::vector<float>(m_nCols, 0)}), - m_xStdev({0, 0}), - m_yStdev({0, 0}), - m_xyCov({0, 0}) + m_yCentAvg({0, 0}) { #ifndef XAOD_STANDALONE declareInterface<IZdcAnalysisTool>(this); @@ -168,8 +143,49 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine SG::ReadDecorHandle<xAOD::ZdcModuleContainer, float> zdcFinalEnergyHandle(m_ZDCFinalEnergyKey); SG::ReadDecorHandle<xAOD::ZdcModuleContainer, unsigned int> zdcStatusHandle(m_ZDCStatusKey); - m_runNumber = eventInfo->runNumber(); - m_lumiBlock = eventInfo->lumiBlock(); + // unsigned int runNumber = eventInfo->runNumber(); + unsigned int lumiBlock = eventInfo->lumiBlock(); + + // Analysis results + // ================ + std::array<unsigned int, 2> status = {1 << ValidBit, 1 << ValidBit}; // calculation is valid by default + // the amplitude sum on the given side + std::array<float, 2> ampSum = {0, 0}; + // the subtracted amplitude sum on the given side + std::array<float, 2> ampSumSub = {0, 0}; + // the subtracted amplitude for each channel first index row, second column + std::array<std::vector<std::vector<float> >, 2> ampSub = { + std::vector<std::vector<float>>(m_nRows, std::vector<float>(m_nCols, 0)), + std::vector<std::vector<float>>(m_nRows, std::vector<float>(m_nCols, 0)) + }; + // x centroid, average not subtracted + std::array<float, 2> xCentUnsub = {0, 0}; + // y centroid, average not subtracted + std::array<float, 2> yCentUnsub = {0, 0}; + // x centroid, average not subtracted, with geometry corrections + std::array<float, 2> xCentUnsubCor = {0, 0}; + // y centroid, average not subtracted, with geometry corrections + std::array<float, 2> yCentUnsubCor = {0, 0}; + // x centroid, subtracted + std::array<float, 2> xCent = {0, 0}; + // y centroid, subtracted + std::array<float, 2> yCent = {0, 0}; + // x centroid, subtracted, with geometry corrections + std::array<float, 2> xCentCor = {0, 0}; + // y centroid, subtracted, with geometry corrections + std::array<float, 2> yCentCor = {0, 0}; + // the x centroid for each row, using unsubtracted amplitudes (diagnostic) + std::array<std::vector<float>, 2> xCentRowUnsub = {std::vector<float>(m_nRows, 0), std::vector<float>(m_nRows, 0)}; + // the y centroid for each column, using unsubtracted amplitudes (diagnostic) + std::array<std::vector<float>, 2> yCentColUnsub = {std::vector<float>(m_nCols, 0), std::vector<float>(m_nCols, 0)}; + // the x centroid for each row (diagnostic) + std::array<std::vector<float>, 2> xCentRow = {std::vector<float>(m_nRows, 0), std::vector<float>(m_nRows, 0)}; + // the y centroid for each column (diagnostic) + std::array<std::vector<float>, 2> yCentCol = {std::vector<float>(m_nCols, 0), std::vector<float>(m_nCols, 0)}; + // x standard deviation + std::array<float, 2> xStdev = {0, 0}; + // y standard deviation + std::array<float, 2> yStdev = {0, 0}; std::array<std::vector<std::vector<RpdChannelData>>, 2> rpdChannelData = { std::vector<std::vector<RpdChannelData>>(4, std::vector<RpdChannelData>(4)), @@ -180,10 +196,10 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine std::array<float, 2> zdcFinalEnergy; ATH_MSG_DEBUG("Starting event processing"); - ATH_MSG_DEBUG("LB=" << m_lumiBlock); + ATH_MSG_DEBUG("LB=" << lumiBlock); ATH_MSG_DEBUG("Processing modules"); - for (const auto zdcModule : moduleContainer) { + for (const auto &zdcModule : moduleContainer) { if (zdcModule->zdcType() == 1) { // This is RPD data in Run 3 // @@ -196,14 +212,11 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine } else if (zdcModule->zdcSide() == 1) { side = 1; } else { - ATH_MSG_WARNING("Invalid side value found for module number: " << zdcModule->zdcModule() << ", side value = " << side); continue; } const unsigned int &rpdChannel = zdcModule->zdcChannel(); - ATH_MSG_DEBUG("RPD side " << side << " chan " << rpdChannel); - if (rpdChannel > 15) { // // The data is somehow corrupt, spit out an error @@ -226,58 +239,56 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine } } - for (const auto zdcSum: moduleSumContainer) { + for (const auto &zdcSum: moduleSumContainer) { int side = -1; if (zdcSum->zdcSide() == -1) { side = 0; } else if (zdcSum->zdcSide() == 1) { side = 1; } else { - ATH_MSG_WARNING("Invalid side value found for module number: " << zdcSum->zdcModule() << ", side value = " << side); continue; } rpdSideStatus.at(side) = rpdSideStatusHandle(*zdcSum); zdcSideStatus.at(side) = zdcStatusHandle(*zdcSum); zdcFinalEnergy.at(side) = zdcFinalEnergyHandle(*zdcSum); - } // check values and set status bits accordingly for (int side : {0, 1}) { if (zdcSideStatus.at(side)) { - m_status.at(side) |= 1 << ZDCValidBit; + status.at(side) |= 1 << ZDCValidBit; } else { // => centroid calculation is invalid - m_status.at(side) &= ~(1 << ValidBit); + status.at(side) &= ~(1 << ValidBit); } if (zdcFinalEnergy.at(side) > m_maxZDCEnergy.at(side)) { - m_status.at(side) |= 1 << ExcessiveZDCEnergyBit; + status.at(side) |= 1 << ExcessiveZDCEnergyBit; // => centroid calculation is invalid - m_status.at(side) &= ~(1 << ValidBit); + status.at(side) &= ~(1 << ValidBit); } if (zdcFinalEnergy.at(side) < m_minZDCEnergy.at(side)) { - m_status.at(side) |= 1 << MinimumZDCEnergyBit; + status.at(side) |= 1 << MinimumZDCEnergyBit; // => centroid calculation is invalid - m_status.at(side) &= ~(1 << ValidBit); + status.at(side) &= ~(1 << ValidBit); } bool rpdPileup = rpdSideStatus.at(side) & (1 << RPDDataAnalyzer::SideOutOfTimePileupBit); if (rpdPileup) { - m_status.at(side) |= 1 << PileupBit; + status.at(side) |= 1 << PileupBit; } bool rpdAnaValid = rpdSideStatus.at(side) & (1 << RPDDataAnalyzer::SideValidBit); if (rpdAnaValid) { - m_status.at(side) |= 1 << RPDValidBit; + status.at(side) |= 1 << RPDValidBit; } else { // => centroid calculation is invalid - m_status.at(side) &= ~(1 << ValidBit); + status.at(side) &= ~(1 << ValidBit); } // check channels of RPD for (int row = 0; row < m_nRows; row++) { for (int col = 0; col < m_nCols; col++) { if (rpdChannelData.at(side).at(row).at(col).pileupFrac > m_pileupMaxFrac.at(side)) { - m_status.at(side) |= 1 << ExcessivePileupBit; + status.at(side) |= 1 << ExcessivePileupBit; // => centroid calculation is invalid - m_status.at(side) &= ~(1 << ValidBit); + status.at(side) &= ~(1 << ValidBit); } } } @@ -291,12 +302,12 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine // top row -> nothing to subtract float amplitudeSubtr = rpdChannelData.at(side).at(row).at(col).amplitude; rpdChannelData.at(side).at(row).at(col).amplitudeSubtr = amplitudeSubtr; - m_ampSub.at(side).at(row).at(col) = amplitudeSubtr; + ampSub.at(side).at(row).at(col) = amplitudeSubtr; } else { // other rows -> subtract the tile above this one float amplitudeSubtr = rpdChannelData.at(side).at(row).at(col).amplitude - rpdChannelData.at(side).at(row + 1).at(col).amplitude; rpdChannelData.at(side).at(row).at(col).amplitudeSubtr = amplitudeSubtr; - m_ampSub.at(side).at(row).at(col) = amplitudeSubtr; + ampSub.at(side).at(row).at(col) = amplitudeSubtr; } } } @@ -325,38 +336,38 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine rowSums.at(side).at(row) += rpdChannelData.at(side).at(row).at(col).amplitudeSubtr; colSumsUnsub.at(side).at(col) += rpdChannelData.at(side).at(row).at(col).amplitude; colSums.at(side).at(col) += rpdChannelData.at(side).at(row).at(col).amplitudeSubtr; - m_ampSum.at(side) += rpdChannelData.at(side).at(row).at(col).amplitude; - m_ampSumSub.at(side) += rpdChannelData.at(side).at(row).at(col).amplitudeSubtr; + ampSum.at(side) += rpdChannelData.at(side).at(row).at(col).amplitude; + ampSumSub.at(side) += rpdChannelData.at(side).at(row).at(col).amplitudeSubtr; } } } // check for any zero values in sum -> avoid dividing by zero; negative total sum is also bad for (int side : {0, 1}) { - if (m_ampSum.at(side) <= 0) { - m_status.at(side) |= 1 << ZeroSumBit; + if (ampSum.at(side) <= 0) { + status.at(side) |= 1 << ZeroSumBit; // => unsub centroid calculation is invalid - m_status.at(side) &= ~(1 << ValidBit); + status.at(side) &= ~(1 << ValidBit); } - if (m_ampSumSub.at(side) <= 0) { - m_status.at(side) |= 1 << ZeroSumBit; + if (ampSumSub.at(side) <= 0) { + status.at(side) |= 1 << ZeroSumBit; // => centroid calculation is invalid - m_status.at(side) &= ~(1 << ValidBit); + status.at(side) &= ~(1 << ValidBit); } for (int row = 0; row < m_nRows; row++) { if (rowSumsUnsub.at(side).at(row) <= 0) { - m_status.at(side) |= 1 << (ZeroSumRow0Bit + row); + status.at(side) |= 1 << (ZeroSumRow0Bit + row); } if (rowSums.at(side).at(row) <= 0) { - m_status.at(side) |= 1 << (ZeroSumRow0Bit + row); + status.at(side) |= 1 << (ZeroSumRow0Bit + row); } } for (int col = 0; col < m_nCols; col++) { if (colSumsUnsub.at(side).at(col) <= 0) { - m_status.at(side) |= 1 << (ZeroSumCol0Bit + col); + status.at(side) |= 1 << (ZeroSumCol0Bit + col); } if (colSums.at(side).at(col) <= 0) { - m_status.at(side) |= 1 << (ZeroSumCol0Bit + col); + status.at(side) |= 1 << (ZeroSumCol0Bit + col); } } } @@ -366,10 +377,10 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine for (int row = 0; row < m_nRows; row++) { for (int col = 0; col < m_nCols; col++) { const float &litudeSubtr = rpdChannelData.at(side).at(row).at(col).amplitudeSubtr; - if (amplitudeSubtr < 0 && -amplitudeSubtr/m_ampSumSub.at(side) < m_subAmpUnderflowFrac.at(side)) { - m_status.at(side) |= 1 << ExcessivePileupBit; + if (amplitudeSubtr < 0 && -amplitudeSubtr/ampSumSub.at(side) < m_subAmpUnderflowFrac.at(side)) { + status.at(side) |= 1 << ExcessivePileupBit; // => centroid calculation is invalid - m_status.at(side) &= ~(1 << ValidBit); + status.at(side) &= ~(1 << ValidBit); } } } @@ -378,21 +389,21 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine // calculate centroid for (int side : {0, 1}) { for (int col = 0; col < m_nCols; col++) { - if (m_ampSum.at(side) > 0) { - m_xCentUnsub.at(side) += colSumsUnsub.at(side).at(col)*rpdChannelData.at(side).at(0).at(col).xposRel/m_ampSum.at(side); + if (ampSum.at(side) > 0) { + xCentUnsub.at(side) += colSumsUnsub.at(side).at(col)*rpdChannelData.at(side).at(0).at(col).xposRel/ampSum.at(side); } - if (m_ampSumSub.at(side) > 0) { - m_xCent.at(side) += colSums.at(side).at(col)*rpdChannelData.at(side).at(0).at(col).xposRel/m_ampSumSub.at(side); + if (ampSumSub.at(side) > 0) { + xCent.at(side) += colSums.at(side).at(col)*rpdChannelData.at(side).at(0).at(col).xposRel/ampSumSub.at(side); } } } for (int side : {0, 1}) { for (int row = 0; row < m_nRows; row++) { - if (m_ampSum.at(side) > 0) { - m_yCentUnsub.at(side) += rowSumsUnsub.at(side).at(row)*rpdChannelData.at(side).at(row).at(0).yposRel/m_ampSum.at(side); + if (ampSum.at(side) > 0) { + yCentUnsub.at(side) += rowSumsUnsub.at(side).at(row)*rpdChannelData.at(side).at(row).at(0).yposRel/ampSum.at(side); } - if (m_ampSumSub.at(side) > 0) { - m_yCent.at(side) += rowSums.at(side).at(row)*rpdChannelData.at(side).at(row).at(0).yposRel/m_ampSumSub.at(side); + if (ampSumSub.at(side) > 0) { + yCent.at(side) += rowSums.at(side).at(row)*rpdChannelData.at(side).at(row).at(0).yposRel/ampSumSub.at(side); } } } @@ -402,16 +413,16 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine for (int row = 0; row < m_nRows; row++) { for (int col = 0; col < m_nCols; col++) { if (rowSumsUnsub.at(side).at(row) > 0) { - m_xCentRowUnsub.at(side).at(row) += rpdChannelData.at(side).at(row).at(col).amplitude*rpdChannelData.at(side).at(row).at(col).xposRel/rowSumsUnsub.at(side).at(row); + xCentRowUnsub.at(side).at(row) += rpdChannelData.at(side).at(row).at(col).amplitude*rpdChannelData.at(side).at(row).at(col).xposRel/rowSumsUnsub.at(side).at(row); } if (rowSums.at(side).at(row) > 0) { - m_xCentRow.at(side).at(row) += rpdChannelData.at(side).at(row).at(col).amplitudeSubtr*rpdChannelData.at(side).at(row).at(col).xposRel/rowSums.at(side).at(row); + xCentRow.at(side).at(row) += rpdChannelData.at(side).at(row).at(col).amplitudeSubtr*rpdChannelData.at(side).at(row).at(col).xposRel/rowSums.at(side).at(row); } if (colSumsUnsub.at(side).at(col) > 0) { - m_yCentColUnsub.at(side).at(col) += rpdChannelData.at(side).at(row).at(col).amplitude*rpdChannelData.at(side).at(row).at(col).yposRel/colSumsUnsub.at(side).at(col); + yCentColUnsub.at(side).at(col) += rpdChannelData.at(side).at(row).at(col).amplitude*rpdChannelData.at(side).at(row).at(col).yposRel/colSumsUnsub.at(side).at(col); } if (colSums.at(side).at(col) > 0) { - m_yCentCol.at(side).at(col) += rpdChannelData.at(side).at(row).at(col).amplitudeSubtr*rpdChannelData.at(side).at(row).at(col).yposRel/colSums.at(side).at(col); + yCentCol.at(side).at(col) += rpdChannelData.at(side).at(row).at(col).amplitudeSubtr*rpdChannelData.at(side).at(row).at(col).yposRel/colSums.at(side).at(col); } } } @@ -419,20 +430,20 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine // calculate standard deviation of row x / col y centroids for (int side : {0, 1}) { - m_xStdev.at(side) = TMath::RMS(m_xCentRow.at(side).begin(), m_xCentRow.at(side).end()); - m_yStdev.at(side) = TMath::RMS(m_yCentCol.at(side).begin(), m_yCentCol.at(side).end()); + xStdev.at(side) = TMath::RMS(xCentRow.at(side).begin(), xCentRow.at(side).end()); + yStdev.at(side) = TMath::RMS(yCentCol.at(side).begin(), yCentCol.at(side).end()); } // use information from geometry (TODO: and calibration) to get centroid in beamline coordinates for (int side : {0, 1}) { - float x = m_xCentUnsubCor.at(side); - float y = m_yCentUnsubCor.at(side); - m_xCentUnsubCor.at(side) = geometryCorrectionX(x, y, side); - m_yCentUnsubCor.at(side) = geometryCorrectionY(x, y, side); - x = m_xCentCor.at(side); - y = m_yCentCor.at(side); - m_xCentCor.at(side) = geometryCorrectionX(x, y, side); - m_yCentCor.at(side) = geometryCorrectionY(x, y, side); + float x = xCentUnsubCor.at(side); + float y = yCentUnsubCor.at(side); + xCentUnsubCor.at(side) = geometryCorrectionX(x, y, side); + yCentUnsubCor.at(side) = geometryCorrectionY(x, y, side); + x = xCentCor.at(side); + y = yCentCor.at(side); + xCentCor.at(side) = geometryCorrectionX(x, y, side); + yCentCor.at(side) = geometryCorrectionY(x, y, side); } ATH_MSG_DEBUG("Finishing event processing"); @@ -456,29 +467,28 @@ StatusCode RpdSubtractCentroidTool::recoZdcModules(const xAOD::ZdcModuleContaine SG::WriteDecorHandle<xAOD::ZdcModuleContainer, float> yDetColCentroidStdevHandle(m_yDetColCentroidStdevKey); SG::WriteDecorHandle<xAOD::ZdcModuleContainer, unsigned int> centroidStatusHandle(m_centroidStatusKey); - for (const auto zdcSum: moduleSumContainer) { + for (const auto &zdcSum: moduleSumContainer) { int side = -1; if (zdcSum->zdcSide() == -1) { side = 0; } else if (zdcSum->zdcSide() == 1) { side = 1; } else { - ATH_MSG_WARNING("Invalid side value found for module number: " << zdcSum->zdcModule() << ", side value = " << side); continue; } - rpdSubAmp(*zdcSum) = m_ampSub.at(side); - rpdSubAmpSum(*zdcSum) = m_ampSumSub.at(side); - xCentroidHandle(*zdcSum) = m_xCentCor.at(side); - yCentroidHandle(*zdcSum) = m_yCentCor.at(side); - xDetCentroidHandle(*zdcSum) = m_xCent.at(side); - yDetCentroidHandle(*zdcSum) = m_yCent.at(side); - xDetCentroidUnsubHandle(*zdcSum) = m_xCentUnsub.at(side); - yDetCentroidUnsubHandle(*zdcSum) = m_yCentUnsub.at(side); - xDetRowCentroidHandle(*zdcSum) = m_xCentRow.at(side); - yDetColCentroidHandle(*zdcSum) = m_yCentCol.at(side); - xDetRowCentroidStdevHandle(*zdcSum) = m_xStdev.at(side); - yDetColCentroidStdevHandle(*zdcSum) = m_yStdev.at(side); - centroidStatusHandle(*zdcSum) = m_status.at(side); + rpdSubAmp(*zdcSum) = ampSub.at(side); + rpdSubAmpSum(*zdcSum) = ampSumSub.at(side); + xCentroidHandle(*zdcSum) = xCentCor.at(side); + yCentroidHandle(*zdcSum) = yCentCor.at(side); + xDetCentroidHandle(*zdcSum) = xCent.at(side); + yDetCentroidHandle(*zdcSum) = yCent.at(side); + xDetCentroidUnsubHandle(*zdcSum) = xCentUnsub.at(side); + yDetCentroidUnsubHandle(*zdcSum) = yCentUnsub.at(side); + xDetRowCentroidHandle(*zdcSum) = xCentRow.at(side); + yDetColCentroidHandle(*zdcSum) = yCentCol.at(side); + xDetRowCentroidStdevHandle(*zdcSum) = xStdev.at(side); + yDetColCentroidStdevHandle(*zdcSum) = yStdev.at(side); + centroidStatusHandle(*zdcSum) = status.at(side); } return StatusCode::SUCCESS; @@ -504,7 +514,7 @@ StatusCode RpdSubtractCentroidTool::reprocessZdc() return StatusCode::SUCCESS; } -float RpdSubtractCentroidTool::geometryCorrectionX(float x_rpd, float y_rpd, int side) { +float RpdSubtractCentroidTool::geometryCorrectionX(float x_rpd, float y_rpd, int side) const { // correct for rotation of RPD about z axis (in xy plane) float x_beamline = x_rpd*TMath::Cos(m_xyRotAngle.at(side)) - y_rpd*TMath::Sin(m_xyRotAngle.at(side)); // correct for offsest of RPD @@ -512,7 +522,7 @@ float RpdSubtractCentroidTool::geometryCorrectionX(float x_rpd, float y_rpd, int return x_beamline; } -float RpdSubtractCentroidTool::geometryCorrectionY(float x_rpd, float y_rpd, int side) { +float RpdSubtractCentroidTool::geometryCorrectionY(float x_rpd, float y_rpd, int side) const { // correct for rotation of RPD about z axis (in xy plane) float y_beamline = x_rpd*TMath::Sin(m_xyRotAngle.at(side)) + y_rpd*TMath::Cos(m_xyRotAngle.at(side)); // correct for rotation of RPD about x axis (in yz plane) diff --git a/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/RpdSubtractCentroidTool.h b/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/RpdSubtractCentroidTool.h index 35f2ace2133d1ac176ea0be203eaf4c241052af4..e6c6363791630326679688e2b2272c63d8cd6126 100644 --- a/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/RpdSubtractCentroidTool.h +++ b/ForwardDetectors/ZDC/ZdcAnalysis/ZdcAnalysis/RpdSubtractCentroidTool.h @@ -22,7 +22,7 @@ namespace ZDC { -class ATLAS_NOT_THREAD_SAFE RpdSubtractCentroidTool : public virtual IZdcAnalysisTool, public asg::AsgTool +class RpdSubtractCentroidTool : public virtual IZdcAnalysisTool, public asg::AsgTool { ASG_TOOL_CLASS(RpdSubtractCentroidTool, ZDC::IZdcAnalysisTool) @@ -80,7 +80,7 @@ private: * @param side side of RPD (C = 0, A = 1) * @return float x position in beamline coordinates */ - float geometryCorrectionX(float x_rpd, float y_rpd, int side); + float geometryCorrectionX(float x_rpd, float y_rpd, int side) const; /** * @brief Calculate the y position in beamline coordinates from a position in RPD detector * coordinates using the offset of the RPD center and the rotation of the RPD plane. @@ -90,7 +90,7 @@ private: * @param side side of RPD (C = 0, A = 1) * @return float y position in beamline coordinates */ - float geometryCorrectionY(float x_rpd, float y_rpd, int side); + float geometryCorrectionY(float x_rpd, float y_rpd, int side) const; // Data members // @@ -116,11 +116,6 @@ private: std::string m_zdcModuleContainerName; std::string m_zdcSumContainerName; - bool m_validInput; - unsigned int m_runNumber; - unsigned int m_lumiBlock; - - // Information from geometry // as in the ZDC, we use side C = 0, side A = 1 for indexing /** @@ -152,31 +147,6 @@ private: // std::array<float, 2> m_xCentAvg; std::array<float, 2> m_yCentAvg; - - // Analysis results - // ================ - std::array<unsigned int, 2> m_status; - std::array<float, 2> m_ampSum; // the amplitude sum on the given side - std::array<float, 2> m_ampSumSub; // the subtracted amplitude sum on the given side - std::array<std::vector<std::vector<float> >, 2> m_ampSub; // the subtracted amplitude for each channel first index row, second column - - std::array<float, 2> m_xCentUnsub; // x centroid, average not subtracted - std::array<float, 2> m_yCentUnsub; // y centroid, average not subtracted - std::array<float, 2> m_xCentUnsubCor; // x centroid, average not subtracted, with geometry corrections - std::array<float, 2> m_yCentUnsubCor; // y centroid, average not subtracted, with geometry corrections - std::array<float, 2> m_xCent; // x centroid, subtracted - std::array<float, 2> m_yCent; // y centroid, subtracted - std::array<float, 2> m_xCentCor; // x centroid, subtracted, with geometry corrections - std::array<float, 2> m_yCentCor; // y centroid, subtracted, with geometry corrections - - std::array<std::vector<float>, 2> m_xCentRowUnsub; // the x centroid for each row, using unsubtracted amplitudes (diagnostic) - std::array<std::vector<float>, 2> m_yCentColUnsub; // the y centroid for each column, using unsubtracted amplitudes (diagnostic) - std::array<std::vector<float>, 2> m_xCentRow; // the x centroid for each row (diagnostic) - std::array<std::vector<float>, 2> m_yCentCol; // the y centroid for each column (diagnostic) - - std::array<float, 2> m_xStdev; // x standard deviation - std::array<float, 2> m_yStdev; // y standard deviation - std::array<float, 2> m_xyCov; // x-y covariance // read handle keys SG::ReadHandleKey<xAOD::EventInfo> m_eventInfoKey { diff --git a/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py b/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py index c3fc792e864f0b76117fcdef00588edc85200dc8..2427d90121066f7464c679775366f9ab8cc0b1b6 100644 --- a/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py +++ b/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py @@ -1,7 +1,6 @@ # Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator -from AthenaConfiguration.ComponentFactory import CompFactory from AthenaConfiguration.Enums import Format from TrkConfig.TrackingPassFlags import printActiveConfig @@ -188,7 +187,7 @@ def ITkTrackRecoCfg(flags): flags_set[0], # Use cuts from primary pass TracksLocation=StatTrackCollections)) - if flags.Tracking.writeExtendedPRDInfo: + if flags.Tracking.writeExtendedSi_PRDInfo: from InDetConfig.InDetPrepRawDataToxAODConfig import ( ITkPixelPrepDataToxAODCfg, ITkStripPrepDataToxAODCfg) result.merge(ITkPixelPrepDataToxAODCfg( @@ -198,22 +197,15 @@ def ITkTrackRecoCfg(flags): result.merge(ITkStripPrepDataToxAODCfg(flags)) from DerivationFrameworkInDet.InDetToolsConfig import ( - ITkTrackStateOnSurfaceDecoratorCfg) - TrackStateOnSurfaceDecorator = result.getPrimaryAndMerge( - ITkTrackStateOnSurfaceDecoratorCfg( - flags, - name="ITkTrackStateOnSurfaceDecorator")) - - result.addEventAlgo( - CompFactory.DerivationFramework.CommonAugmentation( - "ITkCommonKernel", - AugmentationTools=[TrackStateOnSurfaceDecorator])) + ITkTSOS_CommonKernelCfg) + result.merge(ITkTSOS_CommonKernelCfg(flags)) if flags.Tracking.doStoreSiSPSeededTracks: from DerivationFrameworkInDet.InDetToolsConfig import ( ITkSiSPTrackStateOnSurfaceDecoratorCfg) SiSPTrackStateOnSurfaceDecorator = result.getPrimaryAndMerge( ITkSiSPTrackStateOnSurfaceDecoratorCfg(flags)) + from AthenaConfiguration.ComponentFactory import CompFactory result.addEventAlgo( CompFactory.DerivationFramework.CommonAugmentation( "SiSPITkCommonKernel", @@ -272,7 +264,7 @@ def ITkTrackRecoOutputCfg(flags): # exclude IDTIDE/IDTRKVALID decorations excludedAuxData += '.-TrkBLX.-TrkBLY.-TrkBLZ.-TrkIBLX.-TrkIBLY.-TrkIBLZ.-TrkL1X.-TrkL1Y.-TrkL1Z.-TrkL2X.-TrkL2Y.-TrkL2Z' - if not flags.Tracking.writeExtendedPRDInfo: + if not flags.Tracking.writeExtendedSi_PRDInfo: excludedAuxData += '.-msosLink' # Save PRD @@ -302,7 +294,7 @@ def ITkTrackRecoOutputCfg(flags): toAOD += [ f"xAOD::TrackParticleAuxContainer#InDetTrackParticlesAux.{excludedAuxData}"] - if flags.Tracking.writeExtendedPRDInfo: + if flags.Tracking.writeExtendedSi_PRDInfo: toAOD += [ "xAOD::TrackMeasurementValidationContainer#ITkPixelClusters", "xAOD::TrackMeasurementValidationAuxContainer#ITkPixelClustersAux.", diff --git a/InnerDetector/InDetConfig/python/TrackRecoConfig.py b/InnerDetector/InDetConfig/python/TrackRecoConfig.py index b0f983bac566808f848dd26345151260ce0da2d7..527d2fd74bb2a04f88b57966183b2ba2b71a2b1c 100644 --- a/InnerDetector/InDetConfig/python/TrackRecoConfig.py +++ b/InnerDetector/InDetConfig/python/TrackRecoConfig.py @@ -1,7 +1,6 @@ # Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator -from AthenaConfiguration.ComponentFactory import CompFactory from AthenaConfiguration.Enums import BeamType, Format from TrkConfig.TrackingPassFlags import printActiveConfig @@ -662,93 +661,73 @@ def InDetTrackRecoCfg(flags): # --- Extra optional decorations # --------------------------------------- - if flags.Tracking.writeExtendedPRDInfo: + if (flags.Tracking.writeExtendedSi_PRDInfo or + flags.Tracking.writeExtendedTRT_PRDInfo): if (flags.Tracking.doTIDE_AmbiTrackMonitoring or flags.Tracking.doPseudoTracking): - from InDetConfig.InDetPrepRawDataToxAODConfig import ( - InDetPixelPrepDataToxAOD_ExtraTruthCfg, - InDetSCT_PrepDataToxAOD_ExtraTruthCfg, - InDetTRT_PrepDataToxAOD_ExtraTruthCfg) - result.merge(InDetPixelPrepDataToxAOD_ExtraTruthCfg( - flags, - ClusterSplitProbabilityName=( - ClusterSplitProbabilityContainerName(flags)))) - result.merge(InDetSCT_PrepDataToxAOD_ExtraTruthCfg(flags)) - result.merge(InDetTRT_PrepDataToxAOD_ExtraTruthCfg(flags)) + if flags.Tracking.writeExtendedSi_PRDInfo: + from InDetConfig.InDetPrepRawDataToxAODConfig import ( + InDetPixelPrepDataToxAOD_ExtraTruthCfg, + InDetSCT_PrepDataToxAOD_ExtraTruthCfg) + result.merge(InDetPixelPrepDataToxAOD_ExtraTruthCfg( + flags, + ClusterSplitProbabilityName=( + ClusterSplitProbabilityContainerName(flags)))) + result.merge(InDetSCT_PrepDataToxAOD_ExtraTruthCfg(flags)) + + if flags.Tracking.writeExtendedTRT_PRDInfo: + from InDetConfig.InDetPrepRawDataToxAODConfig import ( + InDetTRT_PrepDataToxAOD_ExtraTruthCfg) + result.merge(InDetTRT_PrepDataToxAOD_ExtraTruthCfg(flags)) else: - from InDetConfig.InDetPrepRawDataToxAODConfig import ( - InDetPixelPrepDataToxAODCfg, - InDetSCT_PrepDataToxAODCfg, - InDetTRT_PrepDataToxAODCfg) - result.merge(InDetPixelPrepDataToxAODCfg( - flags, - ClusterSplitProbabilityName=( - ClusterSplitProbabilityContainerName(flags)))) - result.merge(InDetSCT_PrepDataToxAODCfg(flags)) - result.merge(InDetTRT_PrepDataToxAODCfg(flags)) + if flags.Tracking.writeExtendedSi_PRDInfo: + from InDetConfig.InDetPrepRawDataToxAODConfig import ( + InDetPixelPrepDataToxAODCfg, + InDetSCT_PrepDataToxAODCfg) + result.merge(InDetPixelPrepDataToxAODCfg( + flags, + ClusterSplitProbabilityName=( + ClusterSplitProbabilityContainerName(flags)))) + result.merge(InDetSCT_PrepDataToxAODCfg(flags)) + + if flags.Tracking.writeExtendedTRT_PRDInfo: + from InDetConfig.InDetPrepRawDataToxAODConfig import ( + InDetTRT_PrepDataToxAODCfg) + result.merge(InDetTRT_PrepDataToxAODCfg(flags)) from DerivationFrameworkInDet.InDetToolsConfig import ( - TrackStateOnSurfaceDecoratorCfg) + TSOS_CommonKernelCfg) # Setup one algorithm for each output tracking container - listOfExtensionsRequesting = [ e for e in _extensions_list if (e == '') or (flags.Tracking.__getattr__(e+'Pass').storeSiSPSeededTracks and flags.Tracking.__getattr__(e+'Pass').storeSeparateContainer) ] - listOfAugmTools = [] - for extension in listOfExtensionsRequesting: - TrackStateOnSurfaceDecorator = result.getPrimaryAndMerge( - TrackStateOnSurfaceDecoratorCfg( - flags, name = f"{extension}TrackStateOnSurfaceDecorator", - ContainerName = f"InDet{extension}TrackParticles", - PixelMsosName = f"{extension}Pixel_MSOSs", - SctMsosName = f"{extension}SCT_MSOSs", - TrtMsosName = f"{extension}TRT_MSOSs")) - TrackStateOnSurfaceDecorator.DecorationPrefix = "Reco_" - listOfAugmTools.append(TrackStateOnSurfaceDecorator) - result.addEventAlgo( - CompFactory.DerivationFramework.CommonAugmentation( - "InDetCommonKernel", - AugmentationTools=listOfAugmTools)) + listOfExtensionsRequesting = [ + e for e in _extensions_list if (e == '') or + (flags.Tracking.__getattr__(e+'Pass').storeSiSPSeededTracks and + flags.Tracking.__getattr__(e+'Pass').storeSeparateContainer) ] + result.merge(TSOS_CommonKernelCfg( + flags, listOfExtensions = listOfExtensionsRequesting)) if flags.Tracking.doTIDE_AmbiTrackMonitoring: from DerivationFrameworkInDet.InDetToolsConfig import ( - ObserverTrackStateOnSurfaceDecoratorCfg) - ObserverTrackStateOnSurfaceDecorator = result.getPrimaryAndMerge( - ObserverTrackStateOnSurfaceDecoratorCfg(flags)) - result.addEventAlgo( - CompFactory.DerivationFramework.CommonAugmentation( - "ObserverInDetCommonKernel", - AugmentationTools=[ObserverTrackStateOnSurfaceDecorator])) + ObserverTSOS_CommonKernelCfg) + result.merge(ObserverTSOS_CommonKernelCfg(flags)) if flags.Tracking.doPseudoTracking: from DerivationFrameworkInDet.InDetToolsConfig import ( - PseudoTrackStateOnSurfaceDecoratorCfg) - PseudoTrackStateOnSurfaceDecorator = result.getPrimaryAndMerge( - PseudoTrackStateOnSurfaceDecoratorCfg(flags)) - result.addEventAlgo( - CompFactory.DerivationFramework.CommonAugmentation( - "PseudoInDetCommonKernel", - AugmentationTools=[PseudoTrackStateOnSurfaceDecorator])) + PseudoTSOS_CommonKernelCfg) + result.merge(PseudoTSOS_CommonKernelCfg(flags)) if flags.Tracking.doStoreSiSPSeededTracks: from DerivationFrameworkInDet.InDetToolsConfig import ( - SiSPTrackStateOnSurfaceDecoratorCfg) + SiSPTSOS_CommonKernelCfg) # Setup one algorithm for each output tracking container - listOfExtensionsRequesting = [ e for e in _extensions_list if (e == '' or flags.Tracking.__getattr__(e+'Pass').storeSiSPSeededTracks) ] - listOfAugmTools = [] - for extension in listOfExtensionsRequesting: - SiSPTrackStateOnSurfaceDecorator = result.getPrimaryAndMerge( - SiSPTrackStateOnSurfaceDecoratorCfg(flags, name = f"SiSP{extension}TrackStateOnSurfaceDecorator", - ContainerName = f"SiSPSeededTracks{extension}TrackParticles", - PixelMsosName = f"SiSP{extension}_Pixel_MSOSs", - SctMsosName = f"SiSP{extension}_SCT_MSOSs", - TrtMsosName = f"SiSP{extension}_TRT_MSOSs")) - listOfAugmTools.append(SiSPTrackStateOnSurfaceDecorator) - result.addEventAlgo( - CompFactory.DerivationFramework.CommonAugmentation( - "SiSPInDetCommonKernel", - AugmentationTools=listOfAugmTools)) + listOfExtensionsRequesting = [ + e for e in _extensions_list if (e == '') or + flags.Tracking.__getattr__(e+'Pass').storeSiSPSeededTracks ] + result.merge(SiSPTSOS_CommonKernelCfg( + flags, listOfExtensions = listOfExtensionsRequesting)) if flags.Input.isMC: #check if we want to add it for other passes @@ -804,7 +783,8 @@ def InDetTrackRecoOutputCfg(flags): # exclude IDTIDE/IDTRKVALID decorations excludedAuxData += '.-TrkBLX.-TrkBLY.-TrkBLZ.-TrkIBLX.-TrkIBLY.-TrkIBLZ.-TrkL1X.-TrkL1Y.-TrkL1Z.-TrkL2X.-TrkL2Y.-TrkL2Z' - if not flags.Tracking.writeExtendedPRDInfo: + if not (flags.Tracking.writeExtendedSi_PRDInfo or + flags.Tracking.writeExtendedTRT_PRDInfo): excludedAuxData += '.-msosLink' # exclude IDTIDE decorations @@ -989,7 +969,8 @@ def InDetTrackRecoOutputCfg(flags): f"xAOD::TrackParticleContainer#SiSPSeedSegments{extension}TrackParticles", f"xAOD::TrackParticleAuxContainer#SiSPSeedSegments{extension}TrackParticlesAux." ] - if flags.Tracking.writeExtendedPRDInfo: + if (flags.Tracking.writeExtendedSi_PRDInfo or + flags.Tracking.writeExtendedTRT_PRDInfo): toAOD += [ "xAOD::TrackMeasurementValidationContainer#PixelClusters", "xAOD::TrackMeasurementValidationAuxContainer#PixelClustersAux.", diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/IDTIDE.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/IDTIDE.py index 1921102cbb376e27974d10354fa00c34862afe52..866c211ee519bd547e1fd873a8235f3878ab4a3f 100644 --- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/IDTIDE.py +++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/IDTIDE.py @@ -93,23 +93,17 @@ def IDTIDEKernelCfg(flags, name='IDTIDEKernel', **kwargs): from DerivationFrameworkInDet.InDetToolsConfig import ( TrackStateOnSurfaceDecoratorCfg) - from InDetConfig.TRT_ElectronPidToolsConfig import TRT_dEdxToolCfg - InDetTRT_dEdxTool = acc.popToolsAndMerge(TRT_dEdxToolCfg( - flags, name="InDetTRT_dEdxTool")) - acc.addPublicTool(InDetTRT_dEdxTool) DFTSOS = acc.getPrimaryAndMerge(TrackStateOnSurfaceDecoratorCfg( flags, name="DFTrackStateOnSurfaceDecorator", ContainerName="InDetTrackParticles", - IsSimulation=flags.Input.isMC, - DecorationPrefix="", + StorePixel=flags.Detector.EnablePixel, + StoreSCT=flags.Detector.EnableSCT, StoreTRT=flags.Detector.EnableTRT, # never decorate EventInfo with TRTPhase, doubt this is useful for IDTIDE AddExtraEventInfo=False, - TRT_ToT_dEdx=InDetTRT_dEdxTool, + DecorationPrefix="", PRDtoTrackMap="", # + InDetKeys.UnslimmedTracks() if jobproperties.PrimaryDPDFlags.WriteDAOD_IDTRKVALIDStream.get_Value() else "", - StoreSCT=flags.Detector.EnableSCT, - StorePixel=flags.Detector.EnablePixel, OutputLevel=INFO) ) tsos_augmentationTools.append(DFTSOS) diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetToolsConfig.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetToolsConfig.py index 66635051968df07c7b90b77b4e5aad3edb553b48..265df773f3cf068a40fc8c4b293d4565ec9324d3 100644 --- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetToolsConfig.py +++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/python/InDetToolsConfig.py @@ -7,6 +7,7 @@ from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator from AthenaConfiguration.ComponentFactory import CompFactory +from AthenaConfiguration.Enums import BeamType # Track collection merger @@ -47,26 +48,41 @@ def HardScatterVertexDecoratorCfg(flags, name = "DFCommonHSDecorator", **kwargs) # TrackStateOnSurface decorator - def TrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs): """Configure the TSOS decorator""" + acc = ComponentAccumulator() + # To produce SCT_DetectorElementCollection from SCT_GeoModel.SCT_GeoModelConfig import SCT_ReadoutGeometryCfg - acc = SCT_ReadoutGeometryCfg(flags) + acc.merge(SCT_ReadoutGeometryCfg(flags)) kwargs.setdefault("DecorationPrefix", "notSet") - from TrkConfig.AtlasExtrapolatorConfig import AtlasExtrapolatorCfg - AtlasExtrapolator = acc.popToolsAndMerge(AtlasExtrapolatorCfg(flags)) - acc.addPublicTool(AtlasExtrapolator) - kwargs.setdefault("TrackExtrapolator", AtlasExtrapolator) - - from InDetConfig.InDetTrackHoleSearchConfig import ( - InDetTrackHoleSearchToolCfg) - InDetHoleSearchTool = acc.popToolsAndMerge( - InDetTrackHoleSearchToolCfg(flags)) - acc.addPublicTool(InDetHoleSearchTool) - kwargs.setdefault("HoleSearch", InDetHoleSearchTool) + if "TrackExtrapolator" not in kwargs: + from TrkConfig.AtlasExtrapolatorConfig import AtlasExtrapolatorCfg + AtlasExtrapolator = acc.popToolsAndMerge(AtlasExtrapolatorCfg(flags)) + acc.addPublicTool(AtlasExtrapolator) + kwargs.setdefault("TrackExtrapolator", AtlasExtrapolator) + + if "HoleSearch" not in kwargs: + from InDetConfig.InDetTrackHoleSearchConfig import ( + InDetTrackHoleSearchToolCfg) + InDetHoleSearchTool = acc.popToolsAndMerge( + InDetTrackHoleSearchToolCfg(flags)) + acc.addPublicTool(InDetHoleSearchTool) + kwargs.setdefault("HoleSearch", InDetHoleSearchTool) + + kwargs.setdefault("IsSimulation", flags.Input.isMC) + kwargs.setdefault("StorePixel", flags.Tracking.writeExtendedSi_PRDInfo) + kwargs.setdefault("StoreSCT", flags.Tracking.writeExtendedSi_PRDInfo) + kwargs.setdefault("StoreTRT", flags.Tracking.writeExtendedTRT_PRDInfo) + kwargs.setdefault("AddExtraEventInfo", flags.Beam.Type is BeamType.Cosmics) + + if kwargs["StoreTRT"] and "TRT_ToT_dEdx" not in kwargs: + from InDetConfig.TRT_ElectronPidToolsConfig import TRT_dEdxToolCfg + InDetTRT_dEdxTool = acc.popToolsAndMerge(TRT_dEdxToolCfg(flags)) + acc.addPublicTool(InDetTRT_dEdxTool) + kwargs.setdefault("TRT_ToT_dEdx", InDetTRT_dEdxTool) kwargs.setdefault("DecorationPrefix", "") kwargs.setdefault("PRDtoTrackMap", "PRDtoTrackMapCombinedInDetTracks") @@ -76,6 +92,25 @@ def TrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs): name, **kwargs), primary=True) return acc +def TSOS_CommonKernelCfg(flags, name="TSOS_CommonKernel", + listOfExtensions=[]): + acc = ComponentAccumulator() + + listOfAugmTools = [] + for extension in listOfExtensions: + TrackStateOnSurfaceDecorator = acc.getPrimaryAndMerge( + TrackStateOnSurfaceDecoratorCfg( + flags, name = f"{extension}TrackStateOnSurfaceDecorator", + ContainerName = f"InDet{extension}TrackParticles", + PixelMsosName = f"{extension}Pixel_MSOSs", + SctMsosName = f"{extension}SCT_MSOSs", + TrtMsosName = f"{extension}TRT_MSOSs")) + TrackStateOnSurfaceDecorator.DecorationPrefix = "Reco_" + listOfAugmTools.append(TrackStateOnSurfaceDecorator) + + acc.addEventAlgo(CompFactory.DerivationFramework.CommonAugmentation( + name, AugmentationTools=listOfAugmTools)) + return acc def ObserverTrackStateOnSurfaceDecoratorCfg( flags, name="ObserverTrackStateOnSurfaceDecorator", **kwargs): @@ -88,6 +123,13 @@ def ObserverTrackStateOnSurfaceDecoratorCfg( kwargs.setdefault("StoreHoles", False) return TrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs) +def ObserverTSOS_CommonKernelCfg(flags, name="ObserverTSOS_CommonKernel"): + acc = ComponentAccumulator() + ObserverTrackStateOnSurfaceDecorator = acc.getPrimaryAndMerge( + ObserverTrackStateOnSurfaceDecoratorCfg(flags)) + acc.addEventAlgo(CompFactory.DerivationFramework.CommonAugmentation( + name, AugmentationTools=[ObserverTrackStateOnSurfaceDecorator])) + return acc def PseudoTrackStateOnSurfaceDecoratorCfg( flags, name="PseudoTrackStateOnSurfaceDecorator", **kwargs): @@ -100,6 +142,13 @@ def PseudoTrackStateOnSurfaceDecoratorCfg( kwargs.setdefault("StoreHoles", False) return TrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs) +def PseudoTSOS_CommonKernelCfg(flags, name="PseudoTSOS_CommonKernel"): + acc = ComponentAccumulator() + PseudoTrackStateOnSurfaceDecorator = acc.getPrimaryAndMerge( + PseudoTrackStateOnSurfaceDecoratorCfg(flags)) + acc.addEventAlgo(CompFactory.DerivationFramework.CommonAugmentation( + name, AugmentationTools=[PseudoTrackStateOnSurfaceDecorator])) + return acc def SiSPTrackStateOnSurfaceDecoratorCfg( flags, name="SiSPTrackStateOnSurfaceDecorator", **kwargs): @@ -112,6 +161,42 @@ def SiSPTrackStateOnSurfaceDecoratorCfg( kwargs.setdefault("StoreHoles", False) return TrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs) +def SiSPTSOS_CommonKernelCfg(flags, name="SiSPTSOS_CommonKernel", + listOfExtensions=[]): + acc = ComponentAccumulator() + + listOfAugmTools = [] + for extension in listOfExtensions: + SiSPTrackStateOnSurfaceDecorator = acc.getPrimaryAndMerge( + SiSPTrackStateOnSurfaceDecoratorCfg( + flags, name = f"SiSP{extension}TrackStateOnSurfaceDecorator", + ContainerName = f"SiSPSeededTracks{extension}TrackParticles", + PixelMsosName = f"SiSP{extension}_Pixel_MSOSs", + SctMsosName = f"SiSP{extension}_SCT_MSOSs", + TrtMsosName = f"SiSP{extension}_TRT_MSOSs")) + listOfAugmTools.append(SiSPTrackStateOnSurfaceDecorator) + + acc.addEventAlgo(CompFactory.DerivationFramework.CommonAugmentation( + name, AugmentationTools=listOfAugmTools)) + return acc + +def GSFTrackStateOnSurfaceDecoratorCfg( + flags, name="GSFTrackStateOnSurfaceDecorator", **kwargs): + kwargs.setdefault("ContainerName", "GSFTrackParticles") + kwargs.setdefault("DecorationPrefix", "GSF_") + kwargs.setdefault("PixelMsosName", "GSF_Pixel_MSOSs") + kwargs.setdefault("SctMsosName", "GSF_SCT_MSOSs") + kwargs.setdefault("TrtMsosName", "GSF_TRT_MSOSs") + kwargs.setdefault("PRDtoTrackMap", "") + return TrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs) + +def GSFTSOS_CommonKernelCfg(flags, name="GSFTSOS_CommonKernel"): + acc = ComponentAccumulator() + GSFTrackStateOnSurfaceDecorator = acc.getPrimaryAndMerge( + GSFTrackStateOnSurfaceDecoratorCfg(flags)) + acc.addEventAlgo(CompFactory.DerivationFramework.CommonAugmentation( + name, AugmentationTools=[GSFTrackStateOnSurfaceDecorator])) + return acc def ITkTrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs): """Configure the TSOS decorator""" @@ -157,6 +242,13 @@ def ITkSiSPTrackStateOnSurfaceDecoratorCfg( kwargs.setdefault("StoreHoles", False) return ITkTrackStateOnSurfaceDecoratorCfg(flags, name, **kwargs) +def ITkTSOS_CommonKernelCfg(flags, name="ITkTSOS_CommonKernel"): + acc = ComponentAccumulator() + ITkTrackStateOnSurfaceDecorator = acc.getPrimaryAndMerge( + ITkTrackStateOnSurfaceDecoratorCfg(flags)) + acc.addEventAlgo(CompFactory.DerivationFramework.CommonAugmentation( + name, AugmentationTools=[ITkTrackStateOnSurfaceDecorator])) + return acc # Expression of Z0 at the primary vertex diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/src/TrackStateOnSurfaceDecorator.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/src/TrackStateOnSurfaceDecorator.cxx index 68f1a424c9998c881b0f078ec39ac8f505c62238..98380845f7055aa2276e22a0b2f90ab78bfd51bb 100644 --- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/src/TrackStateOnSurfaceDecorator.cxx +++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkInDet/src/TrackStateOnSurfaceDecorator.cxx @@ -179,7 +179,7 @@ namespace DerivationFramework { ATH_CHECK( m_sctMsosName.initialize(m_storeSCT && m_addPRD) ); ATH_CHECK( m_trtMsosName.initialize(m_storeTRT && m_addPRD) ); - { + if (m_storePixel){ std::vector<std::string> names; names.resize(kNPixFloatDecor); names[kTrkIBLXDecor]="TrkIBLX"; @@ -196,6 +196,7 @@ namespace DerivationFramework { names[kTrkL2ZDecor]="TrkL2Z"; createDecoratorKeys(*this,m_containerName, m_sgName, names, m_trackPixFloatDecorKeys); } + m_trackTSOSMOSLinkDecorKey = m_containerName.key() + "." + m_sgName + "msosLink"; ATH_CHECK( m_trackTSOSMOSLinkDecorKey.initialize() ); @@ -348,113 +349,123 @@ namespace DerivationFramework { trackTRTFloatDecorators[kTRTusedHits_noHT_divByLDecor] (*track) = m_TRTdEdxTool->usedHits(trkTrack, false); } - if ( trkTrack->perigeeParameters() ){ - - if(m_pixelLayerRadii.size() < 4) ATH_MSG_WARNING("Too few layer radii set! Should be at least 4!"); - - Trk::CylinderSurface cylSurfIBL(m_pixelLayerRadii[0], 3000.0); - Trk::CylinderSurface cylSurfBL(m_pixelLayerRadii[1], 3000.0); - Trk::CylinderSurface cylSurfL1(m_pixelLayerRadii[2], 3000.0); - Trk::CylinderSurface cylSurfL2(m_pixelLayerRadii[3], 3000.0); - - bool allExtrapolationsSucceded = true; - Trk::PropDirection whichDir = Trk::alongMomentum; - Trk::MaterialUpdateMode whichMode = Trk::removeNoise; - //check the radius of the start parameters, to see which direction we need to go to the target surface - float startRadius = trkTrack->perigeeParameters()->associatedSurface().center().perp(); - ATH_MSG_VERBOSE("Start radius for extrapolating to layers: "<<startRadius); - //see if we go along or opposite momentum - if(startRadius>m_pixelLayerRadii[0]) {whichDir = Trk::oppositeMomentum; whichMode = Trk::addNoise;} - std::unique_ptr<const Trk::TrackParameters> outputParamsIBL( - m_extrapolator->extrapolate(ctx, - *(trkTrack->perigeeParameters()), - cylSurfIBL, - whichDir, - true, - Trk::pion, - whichMode)); - if(startRadius>m_pixelLayerRadii[1]) {whichDir = Trk::oppositeMomentum; whichMode = Trk::addNoise;} - std::unique_ptr<const Trk::TrackParameters> outputParamsBL( - m_extrapolator->extrapolate(ctx, - *(trkTrack->perigeeParameters()), - cylSurfBL, - whichDir, - true, - Trk::pion, - whichMode)); - if(startRadius>m_pixelLayerRadii[2]) {whichDir = Trk::oppositeMomentum; whichMode = Trk::addNoise;} - std::unique_ptr<const Trk::TrackParameters> outputParamsL1( - m_extrapolator->extrapolate(ctx, - *(trkTrack->perigeeParameters()), - cylSurfL1, - whichDir, - true, - Trk::pion, - whichMode)); - if(startRadius>m_pixelLayerRadii[2]) {whichDir = Trk::oppositeMomentum; whichMode = Trk::addNoise;} - std::unique_ptr<const Trk::TrackParameters> outputParamsL2( - m_extrapolator->extrapolate(ctx, - *(trkTrack->perigeeParameters()), - cylSurfL2, - whichDir, - true, - Trk::pion, - whichMode)); - - if (outputParamsIBL.get()) { - trackPixFloatDecorators[kTrkIBLXDecor](*track) = outputParamsIBL->position().x(); - trackPixFloatDecorators[kTrkIBLYDecor](*track) = outputParamsIBL->position().y(); - trackPixFloatDecorators[kTrkIBLZDecor](*track) = outputParamsIBL->position().z(); - } - else { - allExtrapolationsSucceded = false; - ATH_MSG_VERBOSE("Extrapolation to IBL failed..."); - trackPixFloatDecorators[kTrkIBLXDecor](*track) = 0.0; - trackPixFloatDecorators[kTrkIBLYDecor](*track) = 0.0; - trackPixFloatDecorators[kTrkIBLZDecor](*track) = 0.0; - } + if(m_storePixel){ + if ( trkTrack->perigeeParameters() ){ + + if(m_pixelLayerRadii.size() < 4) ATH_MSG_WARNING("Too few layer radii set! Should be at least 4!"); + + Trk::CylinderSurface cylSurfIBL(m_pixelLayerRadii[0], 3000.0); + Trk::CylinderSurface cylSurfBL(m_pixelLayerRadii[1], 3000.0); + Trk::CylinderSurface cylSurfL1(m_pixelLayerRadii[2], 3000.0); + Trk::CylinderSurface cylSurfL2(m_pixelLayerRadii[3], 3000.0); + + bool allExtrapolationsSucceded = true; + Trk::PropDirection whichDir = Trk::alongMomentum; + Trk::MaterialUpdateMode whichMode = Trk::removeNoise; + //check the radius of the start parameters, to see which direction we need to go to the target surface + float startRadius = trkTrack->perigeeParameters()->associatedSurface().center().perp(); + ATH_MSG_VERBOSE("Start radius for extrapolating to layers: "<<startRadius); + //see if we go along or opposite momentum + if(startRadius>m_pixelLayerRadii[0]) {whichDir = Trk::oppositeMomentum; whichMode = Trk::addNoise;} + std::unique_ptr<const Trk::TrackParameters> outputParamsIBL + (m_extrapolator->extrapolate(ctx, + *(trkTrack->perigeeParameters()), + cylSurfIBL, + whichDir, + true, + Trk::pion, + whichMode)); + if(startRadius>m_pixelLayerRadii[1]){ + whichDir = Trk::oppositeMomentum; + whichMode = Trk::addNoise; + } + std::unique_ptr<const Trk::TrackParameters> outputParamsBL + (m_extrapolator->extrapolate(ctx, + *(trkTrack->perigeeParameters()), + cylSurfBL, + whichDir, + true, + Trk::pion, + whichMode)); + if(startRadius>m_pixelLayerRadii[2]){ + whichDir = Trk::oppositeMomentum; + whichMode = Trk::addNoise; + } + std::unique_ptr<const Trk::TrackParameters> outputParamsL1 + (m_extrapolator->extrapolate(ctx, + *(trkTrack->perigeeParameters()), + cylSurfL1, + whichDir, + true, + Trk::pion, + whichMode)); + if(startRadius>m_pixelLayerRadii[2]){ + whichDir = Trk::oppositeMomentum; + whichMode = Trk::addNoise; + } + std::unique_ptr<const Trk::TrackParameters> outputParamsL2 + (m_extrapolator->extrapolate(ctx, + *(trkTrack->perigeeParameters()), + cylSurfL2, + whichDir, + true, + Trk::pion, + whichMode)); + + if (outputParamsIBL.get()) { + trackPixFloatDecorators[kTrkIBLXDecor](*track) = outputParamsIBL->position().x(); + trackPixFloatDecorators[kTrkIBLYDecor](*track) = outputParamsIBL->position().y(); + trackPixFloatDecorators[kTrkIBLZDecor](*track) = outputParamsIBL->position().z(); + } + else { + allExtrapolationsSucceded = false; + ATH_MSG_VERBOSE("Extrapolation to IBL failed..."); + trackPixFloatDecorators[kTrkIBLXDecor](*track) = 0.0; + trackPixFloatDecorators[kTrkIBLYDecor](*track) = 0.0; + trackPixFloatDecorators[kTrkIBLZDecor](*track) = 0.0; + } - if (outputParamsBL.get()) { - trackPixFloatDecorators[kTrkBLXDecor](*track) = outputParamsBL->position().x(); - trackPixFloatDecorators[kTrkBLYDecor](*track) = outputParamsBL->position().y(); - trackPixFloatDecorators[kTrkBLZDecor](*track) = outputParamsBL->position().z(); - } - else { - allExtrapolationsSucceded = false; - ATH_MSG_VERBOSE("Extrapolation to BLayer failed..."); - trackPixFloatDecorators[kTrkBLXDecor](*track) = 0.0; - trackPixFloatDecorators[kTrkBLYDecor](*track) = 0.0; - trackPixFloatDecorators[kTrkBLZDecor](*track) = 0.0; - } + if (outputParamsBL.get()) { + trackPixFloatDecorators[kTrkBLXDecor](*track) = outputParamsBL->position().x(); + trackPixFloatDecorators[kTrkBLYDecor](*track) = outputParamsBL->position().y(); + trackPixFloatDecorators[kTrkBLZDecor](*track) = outputParamsBL->position().z(); + } + else { + allExtrapolationsSucceded = false; + ATH_MSG_VERBOSE("Extrapolation to BLayer failed..."); + trackPixFloatDecorators[kTrkBLXDecor](*track) = 0.0; + trackPixFloatDecorators[kTrkBLYDecor](*track) = 0.0; + trackPixFloatDecorators[kTrkBLZDecor](*track) = 0.0; + } - if (outputParamsL1.get()) { - trackPixFloatDecorators[kTrkL1XDecor](*track) = outputParamsL1->position().x(); - trackPixFloatDecorators[kTrkL1YDecor](*track) = outputParamsL1->position().y(); - trackPixFloatDecorators[kTrkL1ZDecor](*track) = outputParamsL1->position().z(); - } - else { - allExtrapolationsSucceded = false; - ATH_MSG_VERBOSE("Extrapolation to L1 failed..."); - trackPixFloatDecorators[kTrkL1XDecor](*track) = 0.0; - trackPixFloatDecorators[kTrkL1YDecor](*track) = 0.0; - trackPixFloatDecorators[kTrkL1ZDecor](*track) = 0.0; - } + if (outputParamsL1.get()) { + trackPixFloatDecorators[kTrkL1XDecor](*track) = outputParamsL1->position().x(); + trackPixFloatDecorators[kTrkL1YDecor](*track) = outputParamsL1->position().y(); + trackPixFloatDecorators[kTrkL1ZDecor](*track) = outputParamsL1->position().z(); + } + else { + allExtrapolationsSucceded = false; + ATH_MSG_VERBOSE("Extrapolation to L1 failed..."); + trackPixFloatDecorators[kTrkL1XDecor](*track) = 0.0; + trackPixFloatDecorators[kTrkL1YDecor](*track) = 0.0; + trackPixFloatDecorators[kTrkL1ZDecor](*track) = 0.0; + } - if (outputParamsL2.get()) { - trackPixFloatDecorators[kTrkL2XDecor](*track) = outputParamsL2->position().x(); - trackPixFloatDecorators[kTrkL2YDecor](*track) = outputParamsL2->position().y(); - trackPixFloatDecorators[kTrkL2ZDecor](*track) = outputParamsL2->position().z(); - } - else { - allExtrapolationsSucceded = false; - ATH_MSG_VERBOSE("Extrapolation to L2 failed..."); - trackPixFloatDecorators[kTrkL2XDecor](*track) = 0.0; - trackPixFloatDecorators[kTrkL2YDecor](*track) = 0.0; - trackPixFloatDecorators[kTrkL2ZDecor](*track) = 0.0; - } - if(!allExtrapolationsSucceded) ATH_MSG_WARNING("At least one extrapolation to a Pixel layer failed!"); - } - else{ + if (outputParamsL2.get()) { + trackPixFloatDecorators[kTrkL2XDecor](*track) = outputParamsL2->position().x(); + trackPixFloatDecorators[kTrkL2YDecor](*track) = outputParamsL2->position().y(); + trackPixFloatDecorators[kTrkL2ZDecor](*track) = outputParamsL2->position().z(); + } + else { + allExtrapolationsSucceded = false; + ATH_MSG_VERBOSE("Extrapolation to L2 failed..."); + trackPixFloatDecorators[kTrkL2XDecor](*track) = 0.0; + trackPixFloatDecorators[kTrkL2YDecor](*track) = 0.0; + trackPixFloatDecorators[kTrkL2ZDecor](*track) = 0.0; + } + if(!allExtrapolationsSucceded) ATH_MSG_WARNING("At least one extrapolation to a Pixel layer failed!"); + } + else{ ATH_MSG_WARNING("No perigee TrackParameters found - filling positions on layers to (0,0,0)!"); //should decorate nonetheless, to make sure decorations are consistent across events trackPixFloatDecorators[kTrkIBLXDecor](*track) = 0.0; @@ -469,7 +480,9 @@ namespace DerivationFramework { trackPixFloatDecorators[kTrkL2XDecor](*track) = 0.0; trackPixFloatDecorators[kTrkL2YDecor](*track) = 0.0; trackPixFloatDecorators[kTrkL2ZDecor](*track) = 0.0; + } } + // -- Add Track states to the current track, filtering on their type std::vector<const Trk::TrackStateOnSurface*> tsoss; for (const auto *const trackState: *(trkTrack->trackStateOnSurfaces())){ diff --git a/Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecConfigCA.py b/Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecConfigCA.py index 25e7ef6d4a1981e9224dd0789bca810f69dc7241..9b710c005a60a4797fc3788d98812ad03b31e3c6 100644 --- a/Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecConfigCA.py +++ b/Reconstruction/HeavyIonRec/HIJetRec/python/HIJetRecConfigCA.py @@ -16,13 +16,13 @@ from AthenaCommon.Logging import logging __log = logging.getLogger('HIJetRecConfigCA') -def HIClusterMakerCfg(flags, save=True, **kwargs): +def HIClusterMakerCfg(flags, save=False, **kwargs): """Function to equip HI cluster builder from towers and cells, adds to output AOD stream.""" acc = ComponentAccumulator() kwargs.setdefault("CaloCellContainerKey", "AllCalo") - kwargs.setdefault("OutputContainerKey", flags.HeavyIon.Jet.ClusterKey) + kwargs.setdefault("OutputContainerKey", flags.HeavyIon.Jet.Internal.ClusterKey) # get towers from CaloRec.CaloRecoConfig import CaloRecoCfg @@ -48,8 +48,8 @@ def HIClusterMakerCfg(flags, save=True, **kwargs): def HICaloJetInputConstitSeq(flags, name="HICaloConstit", **kwargs): kwargs.setdefault("objtype", xAODType.CaloCluster) kwargs.setdefault("modifiers", []) - kwargs.setdefault("inputname", flags.HeavyIon.Jet.ClusterKey) - kwargs.setdefault("outputname", flags.HeavyIon.Jet.ClusterKey) + kwargs.setdefault("inputname", flags.HeavyIon.Jet.Internal.ClusterKey) + kwargs.setdefault("outputname", flags.HeavyIon.Jet.Internal.ClusterKey) kwargs.setdefault("label", "HI") jetConstit = JetInputConstitSeq(name, **kwargs) @@ -103,9 +103,9 @@ def HIPseudoJetAlgCfg(flags, **kwargs): """Creates a pseudo jet algorithm""" acc = ComponentAccumulator() - kwargs.setdefault("name", "pjcs"+flags.HeavyIon.Jet.ClusterKey) - kwargs.setdefault("InputContainer", flags.HeavyIon.Jet.ClusterKey) - kwargs.setdefault("OutputContainer", "PseudoJet"+flags.HeavyIon.Jet.ClusterKey) + kwargs.setdefault("name", "pjcs"+flags.HeavyIon.Jet.Internal.ClusterKey) + kwargs.setdefault("InputContainer", flags.HeavyIon.Jet.Internal.ClusterKey) + kwargs.setdefault("OutputContainer", "PseudoJet"+flags.HeavyIon.Jet.Internal.ClusterKey) kwargs.setdefault("Label", "LCTopo") kwargs.setdefault("SkipNegativeEnergy", False) kwargs.setdefault("TreatNegativeEnergyAsGhost", True) @@ -136,7 +136,7 @@ def HIJetClustererCfg(flags, name="builder", jetDef=None, **kwargs): kwargs.setdefault("JetRadius", jetDef.radius) kwargs.setdefault("PtMin", jetDef.ptmin) kwargs.setdefault("GhostArea", 0.01) - kwargs.setdefault("InputPseudoJets", "PseudoJet"+flags.HeavyIon.Jet.ClusterKey+"_GhostTracks") + kwargs.setdefault("InputPseudoJets", "PseudoJet"+flags.HeavyIon.Jet.Internal.ClusterKey+"_GhostTracks") acc.setPrivateTools(CompFactory.JetClusterer(name, **kwargs)) return acc @@ -205,9 +205,9 @@ def updateStdJetModifier(flags, name, **kwargs): stdJetModifiers.update( HIJetAssoc=JetModifier("HIJetDRAssociationTool", "HIJetDRAssociation", - ContainerKey=flags.HeavyIon.Jet.ClusterKey, + ContainerKey=flags.HeavyIon.Jet.Internal.ClusterKey, DeltaR=0.8, - AssociationName=flags.HeavyIon.Jet.ClusterKey+"_DR8Assoc")) + AssociationName=flags.HeavyIon.Jet.Internal.ClusterKey+"_DR8Assoc")) return if name == "HIJetMaxOverMean": @@ -405,7 +405,7 @@ def HIEventShapeJetIterationCfg(flags, suffix=None, useClusters=True, **kwargs): map_tool = acc.popToolsAndMerge(HIEventShapeMapToolCfg(flags)) kwargs.setdefault("EventShapeMapTool", map_tool) kwargs.setdefault("OutputEventShapeKey", out_shape_name) - kwargs.setdefault("AssociationKey", flags.HeavyIon.Jet.ClusterKey+"_DR8Assoc") + kwargs.setdefault("AssociationKey", flags.HeavyIon.Jet.Internal.ClusterKey+"_DR8Assoc") kwargs.setdefault("ModulationScheme", 1) kwargs.setdefault("RemodulateUE", True) kwargs.setdefault("ShallowCopy", False) @@ -482,7 +482,7 @@ def HISubtractionToClustersCfg(flags, name="HIClusterSubtraction", useClusters=T acc = ComponentAccumulator() kwargs.setdefault('EventShapeKey', 'EventShapeKey') - kwargs.setdefault('ClusterKey', flags.HeavyIon.Jet.ClusterKey) + kwargs.setdefault('ClusterKey', flags.HeavyIon.Jet.Internal.ClusterKey) kwargs.setdefault('OutClusterKey', 'ClusterKey_deep') kwargs.setdefault('UpdateOnly', False) kwargs.setdefault('ApplyOriginCorrection', True) @@ -517,7 +517,7 @@ def HIJetRecCfg(flags): acc.merge(HIEventShapeMakerCfg(flags, name="HIEventShapeMaker_Weighted", doWeighted=True, - InputTowerKey=flags.HeavyIon.Jet.ClusterKey, + InputTowerKey=flags.HeavyIon.Jet.Internal.ClusterKey, OutputContainerKey=eventshapeKey)) # get jet definition @@ -544,12 +544,12 @@ def HIJetRecCfg(flags): ## merge between PJHICluster and PJTracks - pjContNames = ["PseudoJet"+flags.HeavyIon.Jet.ClusterKey,pseudoGhostTrks] + pjContNames = ["PseudoJet"+flags.HeavyIon.Jet.Internal.ClusterKey,pseudoGhostTrks] mergeAlg = CompFactory.PseudoJetMerger( "PJmerge_HIGhostTrack", InputPJContainers = pjContNames, - OutputContainer = "PseudoJet"+flags.HeavyIon.Jet.ClusterKey+"_GhostTracks" + OutputContainer = "PseudoJet"+flags.HeavyIon.Jet.Internal.ClusterKey+"_GhostTracks" ) acc.addEventAlgo(mergeAlg) @@ -625,7 +625,7 @@ def HIJetRecCfg(flags): acc.addEventAlgo(CompFactory.JetAlgorithm("jetalgHI_iter1_egamma", Tools=[iter1_eg])) # constituents subtraction for egamma, cell-level - cluster_key_eGamma_deep = flags.HeavyIon.Jet.ClusterKey+"_eGamma_deep" + cluster_key_eGamma_deep = flags.HeavyIon.Jet.Internal.ClusterKey+"_eGamma_deep" subtrToCelltool = acc.popToolsAndMerge( HISubtractionToCellsCfg(flags, name="HIClusterSubtraction_egamma", @@ -642,13 +642,12 @@ def HIJetRecCfg(flags): updateStdJetModifier(flags, "subtr1", **jm_dict1) # constituents subtraction for jets, tower-level - cluster_key_final_deep = cluster_key_eGamma_deep+"_Cluster_deep" subtrToClusterTool = acc.popToolsAndMerge( HISubtractionToClustersCfg(flags, name="HIClusterSubtraction_final", EventShapeKey=jm_dict1["EventShapeKey"], ClusterKey=cluster_key_eGamma_deep, - OutClusterKey=cluster_key_final_deep, + OutClusterKey=flags.HeavyIon.Jet.ClusterKey, Modulator=jm_dict1["Modulator"], EventShapeMapTool=jm_dict1["EventShapeMapTool"], ApplyOriginCorrection=False) @@ -658,9 +657,16 @@ def HIJetRecCfg(flags): # jet modifier from the tower-level subtraction updateStdJetModifier(flags, "consmod", - ClusterKey=cluster_key_final_deep, + ClusterKey=flags.HeavyIon.Jet.ClusterKey, Subtractor=jm_dict1["Subtractor"]) + # store final version of HIClusters + if flags.HeavyIon.Jet.WriteHIClusters: + output_hicluster = ["xAOD::CaloClusterContainer#"+flags.HeavyIon.Jet.ClusterKey, + "xAOD::CaloClusterAuxContainer#"+flags.HeavyIon.Jet.ClusterKey+"Aux."] + acc.merge(addToESD(flags, output_hicluster)) + acc.merge(addToAOD(flags, output_hicluster)) + # configure final jets and store them extramods = ["Sort","Width","CaloEnergies","LArHVCorr","CaloQuality","TrackMoments","JVF","JVT"]# adding modifiers to final jets for jd in jetDef: diff --git a/Reconstruction/HeavyIonRec/HIJetRec/src/HIClusterSubtraction.cxx b/Reconstruction/HeavyIonRec/HIJetRec/src/HIClusterSubtraction.cxx index 64a98cb888f6c5b9df95ae893f30dabce741a868..9a462f5955c561f75a07f5deca07c6a111b5d725 100644 --- a/Reconstruction/HeavyIonRec/HIJetRec/src/HIClusterSubtraction.cxx +++ b/Reconstruction/HeavyIonRec/HIJetRec/src/HIClusterSubtraction.cxx @@ -129,7 +129,7 @@ int HIClusterSubtraction::execute() const const auto *originalCluster = readHandleClusters.cptr(); // Create the new container and its auxiliary store. xAOD::CaloClusterContainer* copyClusters = new xAOD::CaloClusterContainer(); - xAOD::AuxContainerBase* copyClustersAux = new xAOD::AuxContainerBase(); + xAOD::CaloClusterAuxContainer* copyClustersAux = new xAOD::CaloClusterAuxContainer(); copyClusters->setStore(copyClustersAux); copyClusters->reserve (originalCluster->size()); @@ -195,7 +195,7 @@ int HIClusterSubtraction::execute() const // Make sure that memory is managed safely std::unique_ptr<xAOD::CaloClusterContainer> outClusters(copyClusters); - std::unique_ptr<xAOD::AuxContainerBase> deepAux(copyClustersAux); + std::unique_ptr<xAOD::CaloClusterAuxContainer> deepAux(copyClustersAux); if(writeHandleDeepCopyClusters.record ( std::move(outClusters), std::move(deepAux)).isFailure() ){ ATH_MSG_ERROR("Unable to write DeepCopy Copy containers for subtracted clusters with key: " << m_outClusterKey.key()); diff --git a/Reconstruction/HeavyIonRec/HIRecConfig/python/HIModeFlags.py b/Reconstruction/HeavyIonRec/HIRecConfig/python/HIModeFlags.py index 302a8e9a4e6f7ebf0971a7c4f87a2ae713809cd4..c9d7bb76fe1efd663b095b41190c10db8e0c5532 100644 --- a/Reconstruction/HeavyIonRec/HIRecConfig/python/HIModeFlags.py +++ b/Reconstruction/HeavyIonRec/HIRecConfig/python/HIModeFlags.py @@ -34,20 +34,9 @@ def HIPmode(flags): flags.HeavyIon.Jet.TrackJetPtMin=4000 def UPCmode(flags): - flags.Reco.EnableHI=True - flags.Reco.EnableTau=True - flags.Reco.EnableJet=True - flags.Jet.WriteToAOD=True # this is to save "standard" jets and btagging to xAOD - flags.Reco.EnableMet=True - flags.MET.WritetoAOD=True - flags.Reco.EnableCaloRinger=False - flags.Reco.EnableBTagging=True - flags.Tracking.doUPC=True # only UPC - flags.Egamma.doLowMu=True # only UPC - flags.Tracking.doTrackSegmentsPixel=True #only UPC - flags.HeavyIon.Egamma.doSubtractedClusters=False - flags.HeavyIon.Jet.ApplyTowerEtaPhiCorrection=False - flags.HeavyIon.Jet.HarmonicsForSubtraction=[] - flags.HeavyIon.Jet.SeedPtMin=8000 - flags.HeavyIon.Jet.RecoOutputPtMin=8000 - flags.HeavyIon.Jet.TrackJetPtMin=4000 + HIPmode(flags) + #UPC dedicated flags + flags.Tracking.doUPC=True + flags.Egamma.doLowMu=True + flags.Tracking.doTrackSegmentsPixel=True + flags.HeavyIon.Jet.WriteHIClusters = False diff --git a/Reconstruction/HeavyIonRec/HIRecConfig/python/HIRecConfigFlags.py b/Reconstruction/HeavyIonRec/HIRecConfig/python/HIRecConfigFlags.py index 105a5047ce015a0bbd7c430584569628676c2dd7..f8c8a50ca0f7b63bedeb2a1f06fa1e996ccc941a 100644 --- a/Reconstruction/HeavyIonRec/HIRecConfig/python/HIRecConfigFlags.py +++ b/Reconstruction/HeavyIonRec/HIRecConfig/python/HIRecConfigFlags.py @@ -19,6 +19,8 @@ def createHIRecConfigFlags(): flags.addFlag("HeavyIon.Jet.TrackJetPtMin", 7000) flags.addFlag("HeavyIon.Jet.HIClusterGeoWeightFile", "auto") flags.addFlag("HeavyIon.Jet.ClusterKey", "HIClusters") + flags.addFlag("HeavyIon.Jet.Internal.ClusterKey", "HIClusters_temp") + flags.addFlag("HeavyIon.Jet.WriteHIClusters", True) flags.addFlag("HeavyIon.Egamma.doSubtractedClusters", lambda prevFlags: prevFlags.Reco.EnableHI) flags.addFlag("HeavyIon.Egamma.EventShape", "HIEventShape_iter_egamma") diff --git a/Reconstruction/egamma/egammaConfig/python/egammaOutputConfig.py b/Reconstruction/egamma/egammaConfig/python/egammaOutputConfig.py index 53586f02ea08a3056ff92b63ba42dbc1dffedf26..47b7bfacb9bb955566c502aa4457ba5defd14d15 100644 --- a/Reconstruction/egamma/egammaConfig/python/egammaOutputConfig.py +++ b/Reconstruction/egamma/egammaConfig/python/egammaOutputConfig.py @@ -101,6 +101,18 @@ def egammaOutputCfg(flags, name="EGOutputList"): f"xAOD::TrackParticleAuxContainer#{outFlags.GSFTrackParticles}" f"Aux.{outFlags.GSFTrackParticlesSuppAOD}"] + if (flags.Tracking.writeExtendedSi_PRDInfo or + flags.Tracking.writeExtendedTRT_PRDInfo): + extension = "GSF_" + toAOD += [ + f"xAOD::TrackStateValidationContainer#{extension}Pixel_MSOSs", + f"xAOD::TrackStateValidationAuxContainer#{extension}Pixel_MSOSsAux.", + f"xAOD::TrackStateValidationContainer#{extension}SCT_MSOSs", + f"xAOD::TrackStateValidationAuxContainer#{extension}SCT_MSOSsAux.", + f"xAOD::TrackStateValidationContainer#{extension}TRT_MSOSs", + f"xAOD::TrackStateValidationAuxContainer#{extension}TRT_MSOSsAux." + ] + if flags.Egamma.doConversionBuilding: toESD += [ f"xAOD::VertexContainer#{outFlags.ConversionVertices}", diff --git a/Reconstruction/egamma/egammaConfig/python/egammaReconstructionConfig.py b/Reconstruction/egamma/egammaConfig/python/egammaReconstructionConfig.py index cb573f6ab6f2db0d36b008ceec884b3d2bbdb114..2ca6c5ad700559d112ba750627cb9a2ab6a3e26c 100644 --- a/Reconstruction/egamma/egammaConfig/python/egammaReconstructionConfig.py +++ b/Reconstruction/egamma/egammaConfig/python/egammaReconstructionConfig.py @@ -30,7 +30,13 @@ def egammaReconstructionCfg(flags, name="egammaReconstruction"): EMBremCollectionBuilderCfg) acc.merge(EMBremCollectionBuilderCfg(flags)) - # Add e/gamma conversion finding. + if (flags.Tracking.writeExtendedSi_PRDInfo or + flags.Tracking.writeExtendedTRT_PRDInfo): + from DerivationFrameworkInDet.InDetToolsConfig import ( + GSFTSOS_CommonKernelCfg) + acc.merge(GSFTSOS_CommonKernelCfg(flags)) + + # Add e/gamma conversion finding if flags.Egamma.doConversionBuilding: from egammaAlgs.EMVertexBuilderConfig import ( EMVertexBuilderCfg) diff --git a/Tracking/TrkConfig/python/TrkConfigFlags.py b/Tracking/TrkConfig/python/TrkConfigFlags.py index c6310d405c2feab3f73104f836079b41b7f9e5ef..db39047a5c379f2da732530745ed42be1fc9d86d 100644 --- a/Tracking/TrkConfig/python/TrkConfigFlags.py +++ b/Tracking/TrkConfig/python/TrkConfigFlags.py @@ -154,7 +154,8 @@ def createTrackingConfigFlags(): # Turn writing of seed validation ntuple on and off icf.addFlag("Tracking.writeSeedValNtuple", False) # Save xAOD TrackMeasurementValidation + TrackStateValidation containers - icf.addFlag("Tracking.writeExtendedPRDInfo", False) + icf.addFlag("Tracking.writeExtendedSi_PRDInfo", False) + icf.addFlag("Tracking.writeExtendedTRT_PRDInfo", False) # Toggle track slimming icf.addFlag("Tracking.doSlimming", lambda prevFlags: diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXmetAlgo.cxx b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXmetAlgo.cxx index e81422ce7ab2a33b07aa331ef00f3577b1243c0c..13228aab1b1c2743df5b0261f36f1a4847e0b929 100644 --- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXmetAlgo.cxx +++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/src/jFEXmetAlgo.cxx @@ -180,7 +180,7 @@ void LVL1::jFEXmetAlgo::buildFWDmet() m_met[iphi]+=getTTowerET(m_FPGA_fcal[iphi][ieta]); } const LVL1::jTower * tmpTower = m_jTowerContainer->findTower(m_FPGA_fcal[iphi][0]); - m_met_angle[iphi]=(tmpTower->iPhi()/4)*(M_PI/8) + M_PI/16; + m_met_angle[iphi]=(static_cast<int>(tmpTower->iPhi()/4))*(M_PI/8) + M_PI/16; } buildMetXComponent(); buildMetYComponent(); diff --git a/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/TrigT1CaloDefs.h b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/TrigT1CaloDefs.h index 68994f169dfc26d988dd62c1aa04fe161b59b90e..631692925f8fd4721a0f0ad0dc4e733dcacb5bd8 100644 --- a/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/TrigT1CaloDefs.h +++ b/Trigger/TrigT1/TrigT1Interfaces/TrigT1Interfaces/TrigT1CaloDefs.h @@ -37,7 +37,7 @@ public: static const std::string xAODTriggerTowerRerunLocation; static const std::string CPMTowerLocation; static const std::string JetElementLocation; - static const std::string xAODZdcMoudleLocation; + static const std::string xAODZdcModuleLocation; static const std::string CPMCMXDataLocation; static const std::string JetCMXDataLocation; diff --git a/Trigger/TrigT1/TrigT1Interfaces/src/TrigT1CaloDefs.cxx b/Trigger/TrigT1/TrigT1Interfaces/src/TrigT1CaloDefs.cxx index e1d0b139528f72cd89d7c60e18ea21991f16f46b..4b4ca4003d1105b3a694d3e94c3baee614514445 100644 --- a/Trigger/TrigT1/TrigT1Interfaces/src/TrigT1CaloDefs.cxx +++ b/Trigger/TrigT1/TrigT1Interfaces/src/TrigT1CaloDefs.cxx @@ -32,7 +32,7 @@ const std::string TrigT1CaloDefs::xAODTriggerTowerLocation="xAODTriggerTowers"; const std::string TrigT1CaloDefs::xAODTriggerTowerRerunLocation="xAODTriggerTowers_rerun"; const std::string TrigT1CaloDefs::JetElementLocation="JetElements"; const std::string TrigT1CaloDefs::CPMTowerLocation="CPMTowers"; -const std::string TrigT1CaloDefs::xAODZdcMoudleLocation="ZdcModules"; +const std::string TrigT1CaloDefs::xAODZdcModuleLocation="ZdcModules"; const std::string TrigT1CaloDefs::CPMHitsLocation="CPMHits"; const std::string TrigT1CaloDefs::JEMHitsLocation="JEMHits"; diff --git a/Trigger/TrigT1/TrigT1ZDC/src/TrigT1ZDC.cxx b/Trigger/TrigT1/TrigT1ZDC/src/TrigT1ZDC.cxx index a5aea4466f725222b24c01418df9f17d8f80871f..bfd66f36b113ff6652e8fb756dc2758f1d395429 100644 --- a/Trigger/TrigT1/TrigT1ZDC/src/TrigT1ZDC.cxx +++ b/Trigger/TrigT1/TrigT1ZDC/src/TrigT1ZDC.cxx @@ -25,7 +25,8 @@ namespace LVL1 { StatusCode TrigT1ZDC::initialize() { ATH_CHECK(m_zdcCTPLocation.initialize()); - ATH_CHECK(m_zdcModuleDataLocation.initialize()); + ATH_CHECK(m_zdcModuleKey.initialize()); + ATH_CHECK(m_zdcModuleCalibEnergyKey.initialize()); // Find the full path to filename: std::string file = PathResolverFindCalibFile(m_lutFile); ATH_MSG_INFO("Reading file " << file); @@ -63,33 +64,35 @@ namespace LVL1 { StatusCode TrigT1ZDC::execute(const EventContext &ctx) const { // access ZDC modules - SG::ReadHandle<xAOD::ZdcModuleContainer> zdcModHandle = SG::makeHandle(m_zdcModuleDataLocation, ctx); + SG::ReadHandle<xAOD::ZdcModuleContainer> zdcModules(m_zdcModuleKey, ctx); + // access ZDC aux data + SG::ReadDecorHandle<xAOD::ZdcModuleContainer, float> zdcModuleCalibEnergyHandle( m_zdcModuleCalibEnergyKey, ctx); + // create vector to store module CalibEnergy std::vector<float> moduleEnergy = {0., 0., 0., 0., 0., 0., 0., 0.}; // Read Single Modules - if (zdcModHandle.isValid()) + if (zdcModules.isValid()) { - const xAOD::ZdcModuleContainer *zdcSingleModules = zdcModHandle.cptr(); - for (const auto zdcSM : *zdcSingleModules) + for (const auto zdcModule : *zdcModules) { - if (zdcSM->zdcType() == 0) + if (zdcModule->zdcType() == 0) { // type = 0 are big modules, type = 1 the pixels - ATH_MSG_DEBUG("ZDC Side " << zdcSM->zdcSide() << ", Module: " << zdcSM->zdcModule() << " and Energy: " << zdcSM->auxdataConst<float>("CalibEnergy")); + ATH_MSG_DEBUG("ZDC Side " << zdcModule->zdcSide() << ", Module: " << zdcModule->zdcModule() << " and Energy: " << zdcModuleCalibEnergyHandle(*zdcModule)); // Side A - if (zdcSM->zdcSide() > 0) + if (zdcModule->zdcSide() > 0) { - moduleEnergy.at(zdcSM->zdcModule()) = zdcSM->auxdataConst<float>("CalibEnergy"); + moduleEnergy.at(zdcModule->zdcModule()) = zdcModuleCalibEnergyHandle(*zdcModule); } // Side C - if (zdcSM->zdcSide() < 0) + if (zdcModule->zdcSide() < 0) { - moduleEnergy.at(zdcSM->zdcModule() + 4) = zdcSM->auxdataConst<float>("CalibEnergy"); + moduleEnergy.at(zdcModule->zdcModule() + 4) = zdcModuleCalibEnergyHandle(*zdcModule); } } } } - + // Get Output as an integer (0-7) m_modInputs_p->setData(moduleEnergy); @@ -111,7 +114,6 @@ namespace LVL1 { //record CTP object ATH_CHECK(zdcCTP.record(std::make_unique<ZdcCTP>(word0))); ATH_MSG_DEBUG("Stored ZDC CTP object with words " << std::hex << (zdcCTP->cableWord0()) << " from LUTOutput " << std::dec << wordOut); - return StatusCode::SUCCESS; } } diff --git a/Trigger/TrigT1/TrigT1ZDC/src/TrigT1ZDC.h b/Trigger/TrigT1/TrigT1ZDC/src/TrigT1ZDC.h index 49e1ce5cee8a05d4018db5ff82a9cdc467e1bbc6..4c7a96f08844a00cd294b370c75c9702b82c23b3 100644 --- a/Trigger/TrigT1/TrigT1ZDC/src/TrigT1ZDC.h +++ b/Trigger/TrigT1/TrigT1ZDC/src/TrigT1ZDC.h @@ -19,6 +19,8 @@ #include "GaudiKernel/ToolHandle.h" #include "AthContainers/DataVector.h" #include "StoreGate/ReadHandleKey.h" +#include "StoreGate/ReadDecorHandle.h" +#include "StoreGate/ReadDecorHandleKey.h" #include "StoreGate/WriteHandleKey.h" #include "PathResolver/PathResolver.h" @@ -47,9 +49,12 @@ namespace LVL1 { private : /* Input handles */ - SG::ReadHandleKey<xAOD::ZdcModuleContainer> m_zdcModuleDataLocation{ - this, "ZdcModuleLocation", TrigT1CaloDefs::xAODZdcMoudleLocation, + SG::ReadHandleKey<xAOD::ZdcModuleContainer> m_zdcModuleKey{ + this, "ZdcModuleLocation", TrigT1CaloDefs::xAODZdcModuleLocation, "Read handle key for ZdcModuleContainer"}; + + SG::ReadDecorHandleKey<xAOD::ZdcModuleContainer> m_zdcModuleCalibEnergyKey + {this, "ZdcModuleCalibEnergyKey", "ZdcModules.CalibEnergy", "ReadHandleKey for Zdc CalibEnergy AuxData"}; /* Output handles */ SG::WriteHandleKey<ZdcCTP> m_zdcCTPLocation{ diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/PhysicsP1_pp_lowMu_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/PhysicsP1_pp_lowMu_run3_v1.py index c3cd89b54024f61a10c04ef24c4e931dc2716261..0bc4812f3265de4b498bb995e933ffdd2ff7c4be 100644 --- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/PhysicsP1_pp_lowMu_run3_v1.py +++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/PhysicsP1_pp_lowMu_run3_v1.py @@ -107,13 +107,13 @@ def getLowMuPhysicsSignatures(): #--------- legacy physics electron chains - ChainProp(name='HLT_e15_lhloose_L1EM12', stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+PrimaryLegGroup, monGroups=['egammaMon:online','egammaMon:shifter_tag','egammaMon:shifter']), - ChainProp(name='HLT_e15_loose_L1EM12', stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+PrimaryLegGroup, monGroups=['egammaMon:online','egammaMon:shifter_tag','egammaMon:shifter']), + ChainProp(name='HLT_e15_lhloose_L1EM12', stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+PrimaryLegGroup, monGroups=['egammaMon:online','egammaMon:shifter']), + ChainProp(name='HLT_e15_loose_L1EM12', stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+PrimaryLegGroup, monGroups=['egammaMon:online','egammaMon:shifter']), ChainProp(name='HLT_e15_lhmedium_L1EM12', stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryLegGroup), ChainProp(name='HLT_e15_medium_L1EM12', stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryLegGroup), - ChainProp(name='HLT_e18_lhloose_L1EM15', stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryLegGroup, monGroups=['egammaMon:shifter_tp','egammaMon:shifter' ]), - ChainProp(name='HLT_e18_loose_L1EM15', stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryLegGroup, monGroups=['egammaMon:shifter_tp','egammaMon:shifter']), + ChainProp(name='HLT_e18_lhloose_L1EM15', stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryLegGroup, monGroups=['egammaMon:shifter']), + ChainProp(name='HLT_e18_loose_L1EM15', stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryLegGroup, monGroups=['egammaMon:shifter']), ChainProp(name='HLT_e18_lhmedium_L1EM15', stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryLegGroup), ChainProp(name='HLT_e18_medium_L1EM15', stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryLegGroup), @@ -131,8 +131,8 @@ def getLowMuPhysicsSignatures(): ChainProp(name='HLT_e20_idperf_loose_L1eEM18', stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+SupportPhIGroup, monGroups=['idMon:t0']), #--------- phase-1 physics electron chains - ChainProp(name='HLT_e15_lhloose_L1eEM15', stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+PrimaryPhIGroup, monGroups=['egammaMon:t0_tp','egammaMon:shifter']), - ChainProp(name='HLT_e15_loose_L1eEM15', stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+PrimaryPhIGroup, monGroups=['egammaMon:t0_tp','egammaMon:shifter']), + ChainProp(name='HLT_e15_lhloose_L1eEM15', stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+PrimaryPhIGroup, monGroups=['egammaMon:shifter']), + ChainProp(name='HLT_e15_loose_L1eEM15', stream=[PhysicsStream, 'express'], groups=SingleElectronGroup+PrimaryPhIGroup, monGroups=['egammaMon:shifter']), ChainProp(name='HLT_e15_lhmedium_L1eEM15', stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryPhIGroup), ChainProp(name='HLT_e15_medium_L1eEM15', stream=[PhysicsStream], groups=SingleElectronGroup+PrimaryPhIGroup),