Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-12-17 09:19:47

0001 #include "MvtxRawDefs.h"
0002 
0003 #include <fun4all/DBInterface.h>
0004 
0005 #include <odbc++/resultset.h>
0006 #include <odbc++/statement.h>  // for Statement
0007 
0008 #include <cmath>
0009 #include <iostream>
0010 #include <limits>
0011 #include <memory>
0012 #include <stdexcept>
0013 #include <string>
0014 
0015 uint8_t MvtxRawDefs::getStaveIndex(const uint8_t& lyrId, const uint8_t& stvId)
0016 {
0017   return firstStaveIndex[lyrId] + stvId;
0018 };
0019 
0020 std::pair<uint8_t, uint8_t> const& MvtxRawDefs::get_flx_endpoint(const uint8_t& lyrId, const uint8_t& stvId)
0021 {
0022   return stave_felix_map.at(getStaveIndex(lyrId, stvId));
0023 };
0024 
0025 MvtxRawDefs::linkId_t MvtxRawDefs::decode_feeid(const uint16_t feeid)
0026 {
0027   linkId_t ret = {};
0028   // the static_cast< uint16_t> is needed to because the result of (feeid >> 12U)
0029   // is promoted to int which then triggers a (correct) clang-tidy warning that
0030   // a bitwise operation is performed on a signed integer
0031   ret.layer = static_cast<uint16_t>(feeid >> 12U) & 0x7U;
0032   ret.stave = feeid & 0x1FU;
0033   ret.gbtid = static_cast<uint16_t>(feeid >> 8U) & 0x3U;
0034   return ret;
0035 };
0036 
0037 // anonymous namespace
0038 namespace
0039 {
0040   float getStrobeLengthFromOCDB(const int& runNumber)
0041   {
0042     odbc::Statement *statement = DBInterface::instance()->getStatement("mvtx_read");
0043 
0044     std::string sqlcmd = "SELECT strobe FROM mvtx_strobe_offline WHERE runnumber = " + std::to_string(runNumber);
0045 
0046     std::unique_ptr<odbc::ResultSet> resultSet(statement->executeQuery(sqlcmd));
0047 
0048     if (resultSet && resultSet->next())
0049     {
0050       float strobe = resultSet->getFloat("strobe");
0051       return strobe;
0052     }
0053 
0054     return std::numeric_limits<float>::quiet_NaN();
0055   }
0056 
0057   float getStrobeLengthFromDAQ(const int& runNumber)
0058   {
0059     float strobeWidth = std::numeric_limits<float>::quiet_NaN();
0060     odbc::Statement *statement = DBInterface::instance()->getStatement("daq");
0061     std::string sqlcmd = "SELECT strobe FROM mvtx_strobe WHERE hostname = 'mvtx0' AND runnumber = " + std::to_string(runNumber);
0062     std::unique_ptr<odbc::ResultSet> resultSet(statement->executeQuery(sqlcmd));
0063     if (resultSet && resultSet->next())
0064     {
0065       strobeWidth = resultSet->getFloat("strobe");
0066     }
0067     return strobeWidth;
0068   }
0069 }  // namespace
0070 
0071 float MvtxRawDefs::getStrobeLength(const int& runNumber)
0072 {
0073   {
0074     float strobe_length = getStrobeLengthFromOCDB(runNumber);
0075     return (!std::isnan(strobe_length)) ? strobe_length : getStrobeLengthFromDAQ(runNumber);
0076   }
0077 }