Go to the documentation of this file.00001
00017
00018 #include "L1Trigger/GlobalTriggerAnalyzer/interface/L1GtPatternWriter.h"
00019
00020
00021 #include <iostream>
00022 #include <iomanip>
00023 #include <algorithm>
00024
00025
00026 #include "L1Trigger/GlobalTriggerAnalyzer/interface/L1GtPatternMap.h"
00027 #include "L1Trigger/GlobalTriggerAnalyzer/interface/L1GtPatternWriter.h"
00028 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00029
00030 L1GtPatternWriter::L1GtPatternWriter(std::ostream& destination, const std::string& header,
00031 const std::string& footer, const std::vector<std::string> columns,
00032 const std::vector<uint32_t>& lengths, const std::vector<uint32_t>& defaults,
00033 const std::vector<int>& bx, bool debug) :
00034 m_dest(destination),
00035 m_header(header),
00036 m_footer(footer),
00037 m_columns(columns),
00038 m_lengths(lengths),
00039 m_defaults(defaults),
00040 m_bx(bx),
00041 m_debug(debug),
00042 m_lineNo(0)
00043
00044 {
00045 m_dest << m_header;
00046 }
00047
00048 void L1GtPatternWriter::writePatterns(const L1GtPatternMap& patterns) {
00049 for(L1GtPatternMap::LineMap::const_iterator it = patterns.begin(); it != patterns.end() ; ++it) {
00050 int event = it->first.first;
00051 int bx = it->first.second;
00052
00053 if(edm::isDebugEnabled() && m_debug) {
00054 std::stringstream dump;
00055 patterns.print(dump);
00056 LogTrace("L1GtPatternGenerator") << dump.str();
00057 }
00058
00059 if(m_bx.empty() || std::find(m_bx.begin(), m_bx.end(), bx) != m_bx.end()) {
00060 if(m_debug) {
00061 m_dest << "# Event " << std::dec << event << ", bx " << bx << std::endl;
00062 }
00063 writePatternLine(it->second);
00064 ++m_lineNo;
00065 } else {
00066 LogTrace("L1GtPatternGenerator") << "Skipping event " << it->first.first << " bx " << it->first.second << " because of bx filter";
00067 }
00068 }
00069 }
00070
00071 void L1GtPatternWriter::writePatternLine(const L1GtPatternLine& line) {
00072 m_dest << std::setfill('0');
00073
00074
00075 m_dest << std::dec << std::setw(4) << m_lineNo << ' ' << std::hex ;
00076
00077 for(uint32_t i = 0 ; i < m_columns.size() ; ++i) {
00078
00079 if(i) m_dest << ' ';
00080
00081
00082 uint32_t value;
00083 if(line.has(m_columns[i])) {
00084
00085 value = line.get(m_columns[i]);
00086 } else if(m_defaults.size() > i) {
00087
00088 value = m_defaults[i];
00089 } else {
00090
00091 value = 0;
00092 }
00093 uint32_t digits = (m_lengths[i]+3)/4;
00094
00095
00096 m_dest << std::setw(digits) << (value & mask(m_lengths[i]));
00097 }
00098
00099
00100 m_dest << std::endl;
00101 }
00102
00103 void L1GtPatternWriter::close() {
00104 if(m_dest) {
00105 m_dest << m_footer;
00106 }
00107 }
00108
00109
00110 L1GtPatternWriter::~L1GtPatternWriter() {
00111 close();
00112 }
00113
00114 uint32_t L1GtPatternWriter::mask(uint32_t length) {
00115 if(length < 32) {
00116 return ~((~0) << length);
00117 } else {
00118 return ~0;
00119 }
00120 }