File indexing completed on 2025-08-06 08:18:39
0001 #include "TriggerRunInfoReco.h"
0002 #include "TriggerRunInfov1.h"
0003
0004 #include <fun4all/Fun4AllReturnCodes.h>
0005
0006 #include <phool/PHCompositeNode.h>
0007 #include <phool/PHIODataNode.h>
0008 #include <phool/PHNodeIterator.h>
0009 #include <phool/PHObject.h>
0010 #include <phool/getClass.h>
0011 #include <phool/recoConsts.h>
0012
0013 #include <odbc++/connection.h>
0014 #include <odbc++/drivermanager.h>
0015 #include <odbc++/resultset.h>
0016 #include <odbc++/statement.h>
0017 #include <odbc++/types.h>
0018
0019 #include <array>
0020 #include <cstdint>
0021 #include <iostream>
0022
0023 TriggerRunInfoReco::TriggerRunInfoReco(const std::string &name)
0024 : SubsysReco(name)
0025 {
0026 }
0027
0028 int TriggerRunInfoReco::Init(PHCompositeNode *topNode)
0029 {
0030 PHNodeIterator iter(topNode);
0031 PHCompositeNode *runNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "RUN"));
0032 if (!runNode)
0033 {
0034 std::cout << "RUN node not found!" << std::endl;
0035 return Fun4AllReturnCodes::ABORTEVENT;
0036 }
0037
0038
0039 TriggerRunInfo *triggerRunInfo = new TriggerRunInfov1();
0040 PHIODataNode<PHObject> *newNode = new PHIODataNode<PHObject>(triggerRunInfo, "TriggerRunInfo", "PHObject");
0041 runNode->addNode(newNode);
0042
0043 return Fun4AllReturnCodes::EVENT_OK;
0044 }
0045
0046 int TriggerRunInfoReco::InitRun(PHCompositeNode *topNode)
0047 {
0048 recoConsts *rc = recoConsts::instance();
0049 int runnumber = rc->get_IntFlag("RUNNUMBER");
0050
0051
0052 TriggerRunInfo *triggerRunInfo = findNode::getClass<TriggerRunInfo>(topNode, "TriggerRunInfo");
0053 if (!triggerRunInfo)
0054 {
0055 std::cout << "TriggerRunInfo object not found!" << std::endl;
0056 return Fun4AllReturnCodes::ABORTEVENT;
0057 }
0058
0059 if (m_useEmulator)
0060 {
0061 SetTriggerEmulator(triggerRunInfo);
0062 if (Verbosity())
0063 {
0064 triggerRunInfo->identify();
0065 }
0066
0067 return Fun4AllReturnCodes::EVENT_OK;
0068 }
0069
0070 if (fetchTriggerPrescales(runnumber, triggerRunInfo) != 0)
0071 {
0072 std::cout << "Failed to fetch trigger prescales for run number " << runnumber << std::endl;
0073 return Fun4AllReturnCodes::ABORTEVENT;
0074 }
0075
0076
0077 if (fetchTriggerScalers(runnumber, triggerRunInfo) != 0)
0078 {
0079 std::cout << "Failed to fetch trigger prescales for run number " << runnumber << std::endl;
0080 return Fun4AllReturnCodes::ABORTEVENT;
0081 }
0082
0083 if (Verbosity())
0084 {
0085 triggerRunInfo->identify();
0086 }
0087 return Fun4AllReturnCodes::EVENT_OK;
0088 }
0089 void TriggerRunInfoReco::SetTriggerEmulator(TriggerRunInfo *triggerRunInfo)
0090 {
0091 std::string names[64];
0092 for (int i = 0; i < 64; i++)
0093 {
0094 names[i] = "unknown" + std::to_string(i);
0095 }
0096 for (int i = 0; i < 64; i++)
0097 {
0098 triggerRunInfo->setTrigger(i, "unknown", i, 0);
0099 }
0100
0101 triggerRunInfo->setTrigger(28, "Photon 2 GeV", 28, 1);
0102 triggerRunInfo->setTrigger(29, "Photon 3 GeV", 29, 1);
0103 triggerRunInfo->setTrigger(30, "Photon 4 GeV", 30, 1);
0104 triggerRunInfo->setTrigger(31, "Photon 5 GeV", 31, 1);
0105 triggerRunInfo->setTrigger(20, "Jet 6 GeV", 20, 1);
0106 triggerRunInfo->setTrigger(21, "Jet 8 GeV", 21, 1);
0107 triggerRunInfo->setTrigger(22, "Jet 10 GeV", 22, 1);
0108 triggerRunInfo->setTrigger(23, "Jet 12 GeV", 23, 1);
0109
0110 return;
0111 }
0112
0113 int TriggerRunInfoReco::fetchTriggerPrescales(int runnumber, TriggerRunInfo *triggerRunInfo)
0114 {
0115 odbc::Connection *dbConnection = nullptr;
0116 try
0117 {
0118 dbConnection = odbc::DriverManager::getConnection("daq", "", "");
0119 }
0120 catch (odbc::SQLException &e)
0121 {
0122 std::cout << "Database connection failed: " << e.getMessage() << std::endl;
0123 return 1;
0124 }
0125
0126 std::string sql = "SELECT * FROM gl1_scaledown WHERE runnumber = " + std::to_string(runnumber) + ";";
0127 odbc::Statement *stmt = dbConnection->createStatement();
0128 odbc::ResultSet *resultSet = stmt->executeQuery(sql);
0129 int prescales[64];
0130 std::string names[64];
0131 for (int i = 0; i < 64; i++)
0132 {
0133 names[i] = "unknown" + std::to_string(i);
0134 }
0135
0136 if (resultSet && resultSet->next())
0137 {
0138
0139 for (int bit = 0; bit < 64; ++bit)
0140 {
0141 std::string columnName = std::string("scaledown") + (bit < 10 ? "0" : "") + std::to_string(bit);
0142 prescales[bit] = resultSet->getInt(columnName);
0143 }
0144 }
0145 else
0146 {
0147 std::cout << "No data found for run number " << runnumber << std::endl;
0148 delete resultSet;
0149 delete stmt;
0150 delete dbConnection;
0151 return 1;
0152 }
0153
0154 sql = "SELECT * FROM gl1_triggernames WHERE runnumber_last > " + std::to_string(runnumber) + " AND runnumber < " + std::to_string(runnumber) + ";";
0155 stmt = dbConnection->createStatement();
0156 resultSet = stmt->executeQuery(sql);
0157
0158 while (resultSet && resultSet->next())
0159 {
0160 int bit = resultSet->getInt("index");
0161 names[bit] = resultSet->getString("triggername");
0162 }
0163
0164 for (int bit = 0; bit < 64; bit++)
0165 {
0166 triggerRunInfo->setTrigger(bit, names[bit], bit, prescales[bit]);
0167 }
0168
0169 delete resultSet;
0170 delete stmt;
0171 delete dbConnection;
0172 return 0;
0173 }
0174
0175 int TriggerRunInfoReco::fetchTriggerScalers(int runnumber, TriggerRunInfo *triggerRunInfo)
0176 {
0177 odbc::Connection *dbConnection = nullptr;
0178 try
0179 {
0180 dbConnection = odbc::DriverManager::getConnection("daq", "", "");
0181 }
0182 catch (odbc::SQLException &e)
0183 {
0184 std::cout << "Database connection failed: " << e.getMessage() << std::endl;
0185 return 1;
0186 }
0187
0188 std::string sql = "SELECT * FROM gl1_scalers WHERE runnumber = " + std::to_string(runnumber) + ";";
0189 odbc::Statement *stmt = dbConnection->createStatement();
0190 odbc::ResultSet *resultSet = stmt->executeQuery(sql);
0191 std::array<std::array<uint64_t, 3>, 64> scalers{};
0192 if (!resultSet)
0193 {
0194 std::cout << "No data found for run number " << runnumber << std::endl;
0195 delete resultSet;
0196 delete stmt;
0197 delete dbConnection;
0198 return 1;
0199 }
0200
0201 while (resultSet->next())
0202 {
0203 int index = resultSet->getInt("index");
0204
0205 scalers[index][0] = resultSet->getLong("scaled");
0206 scalers[index][1] = resultSet->getLong("live");
0207 scalers[index][2] = resultSet->getLong("raw");
0208 }
0209
0210 delete resultSet;
0211 delete stmt;
0212 delete dbConnection;
0213
0214 for (int i = 0; i < 64; i++)
0215 {
0216 for (int j = 0; j < 3; j++)
0217 {
0218 triggerRunInfo->setTriggerScalers(i, j, scalers[i][j]);
0219 }
0220 double scaled = static_cast<double>(scalers[i][0]);
0221 double live = static_cast<double>(scalers[i][1]);
0222 double prescale = -1;
0223 if (scaled >= 1)
0224 {
0225 prescale = live / scaled;
0226 }
0227 triggerRunInfo->setTriggerPrescale(i, prescale);
0228 }
0229
0230 return 0;
0231 }