Back to home page

sPhenix code displayed by LXR

 
 

    


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   // Create the TriggerRunInfo object and add it to the RUN node
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   // Retrieve the TriggerRunInfo object
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   // Fetch trigger prescales and fill the TriggerRunInfo object
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   // Fetch trigger scalers and fill the TriggerRunInfo object
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     // Iterate over the columns and fill the TriggerRunInfo object
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{};  // initialize to zero
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     // Iterate over the columns and fill the TriggerRunInfo object
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 }