8#include "GaudiKernel/Bootstrap.h"
9#include "GaudiKernel/IOpaqueAddress.h"
10#include "GaudiKernel/GenericAddress.h"
11#include "GaudiKernel/IAddressCreator.h"
12#include "GaudiKernel/ISvcLocator.h"
15#include "CoolKernel/IObject.h"
16#include "CoolKernel/IObjectIterator.h"
17#include "CoolKernel/IRecord.h"
18#include "CoolKernel/IRecordIterator.h"
19#include "CoralBase/AttributeList.h"
20#include "CoralBase/AttributeListSpecification.h"
21#include "CoralBase/Attribute.h"
22#include "CoralBase/AttributeSpecification.h"
23#include "CoralBase/Blob.h"
24#include "TStopwatch.h"
57#include "CrestApi/CrestApiFs.h"
66 const std::string fileSuffix{
".json"};
74 const bool checklock,
const bool outputToFile,
75 const std::string & source,
76 const std::string & crestServer,
77 const std::string & crestTag,
78 const bool crestCoolToFile):
118 std::string chanspec;
119 if (folderprop.
getKey(
"channelSelection",
"",chanspec) && !chanspec.empty()) {
128 m_chansel = cool::ChannelSelection(i.first,i.second);
133 }
catch (cool::Exception& e) {
134 ATH_MSG_ERROR(
"defining channel range (must be given in ascending order)");
192 const unsigned int lumiblock,
193 const unsigned int time) {
204 if (
run!=0 || lumiblock!=0) {
206 ATH_MSG_INFO(
"Override run/LB number to [" <<
run <<
":" << lumiblock <<
226 const unsigned int cacheDiv,
227 const std::string& globalTag,
228 const bool ignoreMissChan) {
235 TStopwatch cachetimer;
236 const auto & [cachestart, cachestop] =
m_iovs.getCacheBounds();
238 bool vectorPayload{};
242 vectorPayload =
m_crest_mng.value().isVectorPayload();
257 auto [changedCacheLo, changedCacheHi] =
m_iovs.getCacheBounds();
261 if (cacheq>0) changedCacheLo=vkey - vkey % cacheq;
267 changedCacheLo=vkey & (0x7FFFFFFFLL << 32);
273 if (changedCacheHi>cool::ValidityKeyMax) changedCacheHi=cool::ValidityKeyMax;
278 const auto & [since, until] =
m_iovs.getCacheBounds();
279 ATH_MSG_DEBUG(
"IOVDbFolder:loadCache limits set to [" << since <<
"," << until <<
"]" );
304 bool retrievedone=
false;
309 ATH_MSG_FATAL(
"Conditions database connection " <<
m_conn->name() <<
" cannot be opened - STOP" );
313 unsigned int attempts=0;
315 ATH_MSG_DEBUG(
"loadCache: Expecting to see " << nChannelsExpected <<
" channels" );
317 while (attempts<2 && !retrievedone) {
324 if (not
m_conn->valid())
throw std::runtime_error(
"COOL database pointer invalidated");
330 if (!
resolveTag(folder,globalTag))
return false;
338 auto [since,until] =
m_iovs.getCacheBounds();
340 while (itr->hasNext()) {
364 auto [since,until] =
m_iovs.getCacheBounds();
365 cool::IObjectIteratorPtr itr=folder->browseObjects(since,until,
m_chansel,
m_tag);
374 while (itr->goToNext()) {
375 const cool::IObject&
ref=itr->currentRef();
383 cool::IRecordIterator& pitr=
ref.payloadIterator();
384 const cool::IRecordVectorPtr&
pvec=pitr.fetchAllAsVector();
385 for (cool::IRecordVector::const_iterator vitr=
pvec->begin();vitr!=
pvec->end();++vitr) {
386 const coral::AttributeList& atrlist=(*vitr)->attributeList();
401 const coral::AttributeList& atrlist=
ref.payload().attributeList();
416 }
catch (std::exception& e) {
417 ATH_MSG_WARNING(
"COOL retrieve attempt " << attempts <<
" failed: " << e.what() );
419 if (not
m_conn->dropAndReconnect())
ATH_MSG_ERROR(
"Tried to reconnect in 'loadCache' but failed");
425 unsigned int iadd = 0;
426 auto [since,until] =
m_iovs.getCacheBounds();
430 for(
const auto & [iov, hash] : iovs) {
432 const auto & channelNumbers=
m_crest_mng.value().channelIds(iov.first);
433 for (
auto const & chan: channelNumbers){
436 std::istringstream tokenStream(chan);
437 std::getline(tokenStream, token,
':');
442 for (
const auto & attList:vPayload){
468 const auto & [since,until] =
m_iovs.getCacheBounds();
471 "," << until <<
"]" );
476 const auto & [nChannelsLo, nChannelsHi] =
m_iovs.numberOfIovsOnBoundaries();
477 const auto missing=std::pair<unsigned int, unsigned int>(nChannelsExpected-nChannelsLo, nChannelsExpected-nChannelsHi);
478 ATH_MSG_DEBUG(
"Cache retrieve missing " << missing.first <<
" lower and " << missing.second <<
" upper channels" );
480 const auto & span =
m_iovs.getMinimumStraddlingSpan();
481 const auto & [cacheStart, cacheStop] =
m_iovs.getCacheBounds();
483 if ((missing.first==0 or ignoreMissChan) and
m_iovs.extendCacheLo()){
484 ATH_MSG_DEBUG(
"Lower cache limit extended from " << cacheStart <<
" to " << span.first );
487 if ((missing.second==0 or ignoreMissChan) and
m_iovs.extendCacheHi()){
488 ATH_MSG_DEBUG(
"Upper cache limit extended from " << cacheStop <<
" tp " << span.second );
492 const float timeinc=cachetimer.RealTime();
495 m_iovs.size() <<
" objects stored in" << std::fixed <<
496 std::setw(8) << std::setprecision(2) << timeinc <<
" s" );
501 const std::string& globalTag,
502 const cool::IDatabasePtr& ,
511 unsigned int attempts = 0;
512 bool retrievedone =
false;
515 ATH_MSG_DEBUG(
"loadCacheIfDbChanged: Expecting to see " << nChannelsExpected <<
" channels" );
517 while (attempts<2 && !retrievedone) {
525 if (!
resolveTag(folder,globalTag))
return false;
528 const auto & [since,until] =
m_iovs.getCacheBounds();
544 cool::IObjectIteratorPtr itr=folder->browseObjects(vkey+1, vkey+2,
m_chansel,
m_tag);
546 const cool::IObject&
ref=itr->currentRef();
553 ATH_MSG_DEBUG(
"Need a special update for " << counter <<
" objects " );
555 }
catch (std::exception& e) {
556 ATH_MSG_WARNING(
"COOL retrieve attempt " << attempts <<
" failed: " << e.what() );
557 if (not
m_conn->dropAndReconnect())
ATH_MSG_ERROR(
"Tried reconnecting in loadCacheIfDbChanged but failed");
569 if (StatusCode::SUCCESS != iovSvc->setRange(
clid(),
key(), range,
eventStore())) {
570 ATH_MSG_ERROR(
"IOVDbFolder::specialCacheUpdate - setRange failed for folder "
595 if (StatusCode::SUCCESS != iovSvc->setRange(
clid(),
key(), range,
eventStore())) {
596 ATH_MSG_ERROR(
"IOVDbFolder::specialCacheUpdate - setRange failed for folder "
603 const coral::AttributeList& atrlist =
ref.payload().attributeList();
626 IAddressCreator* persSvc,
627 const unsigned int poolSvcContext,
628 std::unique_ptr<IOpaqueAddress>& address,
629 IOVRange& range,
bool& poolPayloadReq) {
633 std::string strAddress;
637 cool::ValidityKey naystart=0;
638 cool::ValidityKey naystop=cool::ValidityKeyMax;
642 if (not readFromMetaData.
isValid()){
651 range = readFromMetaData.
range();
668 std::tie(naystart, naystop) =
m_iovs.getCacheBounds();
670 for (
unsigned int ic=0; ic!=
m_iovs.size();++ic) {
671 const auto & thisIov =
m_iovs.at(ic);
672 if (thisIov.first<=reftime && reftime<thisIov.second) {
678 strAddress=
"POOLContainer_AthenaAttributeList][CLID=x";
696 ATH_MSG_ERROR(
"Writing of CoraCool folders to file metadata not implemented");
703 }
else if (thisIov.second<=reftime && thisIov.second>naystart) {
704 naystart=thisIov.second;
705 }
else if (thisIov.first>reftime && thisIov.first<naystop) {
706 naystop=thisIov.first;
713 std::vector<std::string>::const_iterator nitr=
m_channames.begin();
714 for (std::vector<cool::ChannelId>::const_iterator chitr=
m_channums.begin();
716 attrListColl->
add(*chitr,*nitr);
721 strAddress=
"POOLContainer_CondAttrListCollection][CLID=x";
724 strAddress=
"POOLContainer_CondAttrListVec][CLID=x";
728 ATH_MSG_ERROR(
"COOL object not found in single-channel retrieve, folder "
733 " valid objects found for single-channel retrieve, folder " <<
739 <<
" at IOV " << reftime <<
" channels " << nobj <<
" has range "
746 if (tnaystart > rstart || rstop > tnaystop) {
748 <<
" from [" << rstart <<
":" << rstop <<
"] to ["
749 << tnaystart <<
":" << tnaystop <<
"]" );
750 if (tnaystart > rstart) rstart=tnaystart;
751 if (tnaystop < rstop) rstop=tnaystop;
770 IOpaqueAddress* addrp =
nullptr;
771 if (StatusCode::SUCCESS!=persSvc->createAddress(0,0,strAddress,addrp)) {
772 ATH_MSG_ERROR(
"Could not get IOpaqueAddress from string address "<< strAddress );
775 address = std::unique_ptr<IOpaqueAddress>(addrp);
776 GenericAddress* gAddr=
dynamic_cast<GenericAddress*
>(address.get());
778 ATH_MSG_ERROR(
"Could not cast IOpaqueAddress to GenericAddress");
783 auto addr = std::make_unique<CondAttrListCollAddress>(*gAddr);
784 addr->setAttrListColl(attrListColl);
785 address = std::move(addr);
787 auto addr = std::make_unique<CondAttrListCollAddress>(gAddr->svcType(),
788 gAddr->clID(),gAddr->par()[0],gAddr->par()[1],
789 poolSvcContext,gAddr->ipar()[1]);
791 addr->setAttrListColl(attrListColl);
793 address = std::move(addr);
796 auto addr = std::make_unique<AthenaAttrListAddress>(*gAddr);
797 addr->setAttrList(attrList);
798 address = std::move(addr);
800 auto addr = std::make_unique<CondAttrListVecAddress>(*gAddr);
801 addr->setAttrListVec(attrListVec);
802 address = std::move(addr);
815 << std::setprecision(2) <<
m_readtime <<
" ))s" );
828 if (
auto newkey=parsedDescription.
key(); not newkey.empty() and not
m_jokey) {
830 m_key=std::move(newkey);
839 if (
auto newAddrHeader = parsedDescription.
addressHeader();not newAddrHeader.empty()){
864std::unique_ptr<SG::TransientAddress>
866 auto tad = std::make_unique<SG::TransientAddress>(
m_clid,
m_key);
868 for (
const auto & linkname:symlinks){
869 if (not linkname.empty()) {
871 if (StatusCode::SUCCESS==
p_clidSvc->getIDOfTypeName(linkname,sclid)) {
872 tad->setTransientID(sclid);
875 ATH_MSG_ERROR(
"Could not get clid for symlink: "<< linkname );
883std::unique_ptr<SG::TransientAddress>
937 const auto & linknameVector = folderpar.
symLinks();
949 if (timeIs_nsOfEpoch){
950 long long int clen=600;
959 ATH_MSG_DEBUG(
"Cache length set to " << clen <<
" seconds" );
971 ATH_MSG_DEBUG(
"Cache length set to " <<
run <<
" runs " << lumi <<
" lumiblocks" );
992 if (tag==
"HEAD")
return true;
993 if (tag.empty()) tag=globalTag;
995 ATH_MSG_ERROR(
"No IOVDbSvc.GlobalTag specified on job options or input file" );
1008 const std::vector<std::string>& taglist=
fptr->listTags();
1009 if (
find(taglist.begin(),taglist.end(),tag)!=taglist.end()) {
1015 std::string restag=
fptr->resolveTag(tag);
1019 tag=std::move(restag);
1020 }
catch (cool::Exception& e) {
1029 if (not tagLock.has_value()){
1030 ATH_MSG_ERROR(
"Could not check tag lock status for " << tag );
1033 if (not tagLock.value()){
1034 ATH_MSG_ERROR(
"Tag " << tag <<
" is not locked and IOVDbSvc.CheckLock is set" );
1045 return (not tag.empty());
1057 tmpColl.
add(0xFFFF,atrlist);
1058 tmpColl.
add(0xFFFF,range);
1078 m_cachespec=
new coral::AttributeListSpecification;
1079 for (
const auto & attribute:atrlist){
1080 const coral::AttributeSpecification& aspec=attribute.specification();
1084 " in folder " <<
m_foldername <<
" will not be counted for bytes-read statistics" );
1093 ATH_MSG_DEBUG(
"Adding IOV to cache, from "<<since<<
" to "<<until);
1094 m_iovs.addIov(since, until);
1099 const auto & [since,until] =
m_iovs.getCacheBounds();
1103 const auto & iovs =
m_iovs.vectorStore();
1104 std::vector<cool::ChannelId>::iterator ci=
m_cachechan.begin();
1105 for (
const auto & iov:iovs){
1106 ATH_MSG_DEBUG(
"channelID:\t"<<(*ci++)<<
"\t since: "<<iov.first<<
"\t until: "<<iov.second);
1114 std::vector<IOVHash>
result;
1117 std::vector<std::pair<cool::ValidityKey,std::string>> crestIOVs =
m_crest_mng.value().getIovsForTag(since,until);
1118 size_t nIOVs = crestIOVs.size();
1119 if(crestIOVs.empty()){
1126 for(
size_t ind=0; ind<nIOVs-1; ++ind) {
1127 result.emplace_back(
IovStore::Iov_t(crestIOVs[ind].first, crestIOVs[ind+1].first),crestIOVs[ind].second);
1130 result.emplace_back(
IovStore::Iov_t(crestIOVs[nIOVs-1].first, cool::ValidityKeyMax),crestIOVs[nIOVs-1].second);
1137 ,
const cool::ValidityKey& vkey
1141 ,
const cool::ValidityKey crestVkey
1144 std::ofstream myFile;
1145 std::string fMain(dumpName);
1147 const std::string fabricatedName=sanitisedFolder+delimiter+std::to_string(vkey)+fileSuffix;
1148 std::filesystem::create_directory(fMain);
1152 myFile.open(fabricatedName,std::ios::out);
1153 if (not myFile.is_open()) {
1154 std::string errorMessage{
"File creation for "+fabricatedName+
" failed."};
1156 throw std::runtime_error(errorMessage);
1170 myFile<<
json->payload()<<std::endl;
1176 myFile<<
"\"data_array\" : "<<mng->
dumpPayload(crestVkey)<<std::endl;
1183 std::vector<IOVDbFolder::IOVHash> iovHashVect =
fetchCrestIOVs(since,until);
1184 if(iovHashVect.empty() || until<=iovHashVect[0].first.first) {
1185 if(iovHashVect.empty()) {
1195 unsigned indIOVStart = 0;
1196 for(
const auto& iovhash : iovHashVect) {
1197 if(vkey>=iovhash.first.first && vkey<iovhash.first.second)
1201 unsigned indIOVEnd = indIOVStart;
1202 while(indIOVEnd < iovHashVect.size()) {
1203 if(iovHashVect[indIOVEnd].first.first < until
1204 && iovHashVect[indIOVEnd].first.second >= until) {
1209 std::vector<IOVDbFolder::IOVHash> resIovHashVect;
1210 for(
unsigned ind = indIOVStart; ind <= indIOVEnd; ++ind) {
1211 std::vector<uint64_t> resIovs=
m_crest_mng.value().loadPayloadForHash(iovHashVect[ind].first.first,iovHashVect[ind].second);
1212 if(resIovs.size()>1){
1213 uint64_t sTmp=iovHashVect[ind].first.first;
1215 for(
unsigned int i=1;i<resIovs.size();i++){
1217 resIovHashVect.emplace_back(
IovStore::Iov_t(sTmp, uTmp),iovHashVect[ind].second);
1220 if(sTmp!=iovHashVect[ind].first.second){
1221 resIovHashVect.emplace_back(
IovStore::Iov_t(sTmp, iovHashVect[ind].first.second),iovHashVect[ind].second);
1224 else if(resIovs.size()==1){
1225 resIovHashVect.emplace_back(
IovStore::Iov_t(resIovs[0],iovHashVect[ind].first.second),iovHashVect[ind].second);
1231 for(
const auto& iovhash : resIovHashVect) {
1232 if(vkey>=iovhash.first.first && vkey<iovhash.first.second)
1234 if(indIOVStart+1<resIovHashVect.size())
1238 dumpFile(
"crest_dump",vkey,
nullptr,
false,&
m_crest_mng.value(),resIovHashVect[indIOVStart].first.first);
1240 return resIovHashVect;
const boost::regex ref(r_ef)
#define ATH_MSG_WARNING(x)
This file contains the class definition for the AthenaAttrListAddress class.
This file contains the class definition for the CondAttrListCollAddress class.
This file defines the class for a collection of AttributeLists where each one is associated with a ch...
This file contains the class definition for the CondAttrListVecAddress class.
A CondAttrListVec is an Athena DataObject holding a vector of CORAL AttributeLists,...
boost::shared_ptr< CoraCoolObject > CoraCoolObjectPtr
boost::shared_ptr< CoraCoolObjectIter > CoraCoolObjectIterPtr
boost::shared_ptr< CoraCoolDatabase > CoraCoolDatabasePtr
boost::shared_ptr< CoraCoolFolder > CoraCoolFolderPtr
uint32_t CLID
The Class ID type.
char data[hepevt_bytes_allocation_ATLAS]
void setLevel(MSG::Level lvl)
Change the current logging level.
MsgStream & msg() const
The standard message stream.
AthMessaging(IMessageSvc *msgSvc, const std::string &name)
Constructor.
An AttributeList represents a logical row of attributes in a metadata table.
This class is a collection of AttributeLists where each one is associated with a channel number.
void addNewStart(const IOVTime &start)
Add new start time to minRange - make sure that start is >= to new start.
bool add(ChanNum chanNum, const AttributeList &attributeList)
Adding in chan/attrList pairs.
void addNewStop(const IOVTime &stop)
Add new stop time to minRange - make sure that stop is <= to new stop.
const IOVRange & minRange() const
Current minimal IOVRange.
void addShared(ChanNum chanNum, const AttributeList &attributeList)
Adding in chan/attrList pairs with shared data.
void addSlice(const IOVRange &range, const unsigned int chan, const std::vector< coral::AttributeList > &data, const unsigned int datastart, const unsigned int dataend)
const IOVRange & minRange() const
AttrListVec::const_iterator const_iterator
std::string dumpPayload(cool::ValidityKey since)
std::string getPayloadSpec()
const bool m_crestCoolToFile
std::vector< unsigned int > m_cacheccend
std::vector< std::string > m_channames
coral::AttributeListSpecification * m_cachespec
const std::string m_crestServer
ITagInfoMgr * p_tagInfoMgr
IOVDbFolder(IOVDbConn *conn, const IOVDbParser &folderprop, MsgStream &msg, IClassIDSvc *clidsvc, IIOVDbMetaDataTool *metadatatool, const bool checklock, const bool outputToFile=false, const std::string &source="COOL_DATABASE", const std::string &crestServer="", const std::string &crestTag="", const bool crestCoolToFile=false)
cool::ValidityKey m_cachelength
bool loadCacheIfDbChanged(const cool::ValidityKey vkey, const std::string &globalTag, const cool::IDatabasePtr &dbPtr, const ServiceHandle< IIOVSvc > &iovSvc)
std::vector< IOVHash > fetchCrestObjects(cool::ValidityKey since, cool::ValidityKey until, cool::ValidityKey vkey)
std::vector< coral::AttributeList > m_cacheattr
const std::string m_crestTag
unsigned int cacheUpdateImplementation(T &obj, const ServiceHandle< IIOVSvc > &iovSvc)
void specialCacheUpdate(CoraCoolObject &obj, const ServiceHandle< IIOVSvc > &iovSvc)
void dumpFile(const std::string &dumpName, const cool::ValidityKey &vkey, IOVDbNamespace::Cool2Json *json, bool skipCoolIoV, CoralCrestManager *mng=NULL, const cool::ValidityKey crestVkey=0) const
bool magicTag(std::string &tag)
cool::ValidityKey m_iovoverride
IOVDbNamespace::FolderType m_foldertype
std::optional< CoralCrestManager > m_crest_mng
bool objectIteratorIsValid(cool::IObjectIteratorPtr &objItr)
bool overrideOptionsFromParsedDescription(const IOVDbParser &parsedDescription)
cool::ValidityKey iovTime(const IOVTime &reftime) const
void setTagOverride(const std::string &tag, const bool setFlag)
bool addMetaAttrList(const coral::AttributeList &atrlist, const IOVRange &range)
void setCacheLength(const bool timeIs_nsOfEpoch, const unsigned int cacheRun, const unsigned int cacheTime)
std::vector< IOVHash > fetchCrestIOVs(cool::ValidityKey since, cool::ValidityKey until)
unsigned long long m_nbytesread
const std::string & key() const
std::vector< cool::ChannelId > m_cachechan
std::string m_folderDescription
bool loadCache(const cool::ValidityKey vkey, const unsigned int cacheDiv, const std::string &globalTag, const bool ignoreMissChan)
void setIOVOverride(const unsigned int run, const unsigned int lumiblock, const unsigned int time)
std::unique_ptr< SG::TransientAddress > createTransientAddress(const std::vector< std::string > &symlinks)
IIOVDbMetaDataTool * p_metaDataTool
std::unique_ptr< SG::TransientAddress > preLoadFolder(ITagInfoMgr *tagInfoMgr, const unsigned int cacheRun, const unsigned int cacheTime)
bool addMetaAttrListColl(const CondAttrListCollection *coll)
void addIOVtoCache(cool::ValidityKey since, cool::ValidityKey until)
std::vector< unsigned int > m_cacheccstart
bool getAddress(const cool::ValidityKey reftime, IAddressCreator *persSvc, const unsigned int poolSvcContext, std::unique_ptr< IOpaqueAddress > &address, IOVRange &range, bool &poolPayloadRequested)
bool resolveTag(const cool::IFolderPtr &fptr, const std::string &globalTag)
const std::string & eventStore() const
const bool m_outputToFile
std::vector< cool::ChannelId > m_channums
unsigned int m_ncacheread
cool::ChannelSelection m_chansel
IOVDbNamespace::IovStore m_iovs
void setSharedSpec(const coral::AttributeList &atrlist)
const std::string m_source
std::vector< ChanRange > m_chanrange
const std::string & folderName() const
std::pair< cool::ValidityKey, cool::ValidityKey > Iov_t
std::vector< std::string > symLinks() const
std::string cache() const
CLID classId(MsgStream &msg) const
bool onlyReadMetadata() const
bool getKey(const std::string &key, const std::string &devvalue, std::string &value) const
original 'getKey' method, now implemented using 'at'
std::string eventStoreName() const
bool timebaseIs_nsOfEpoch() const
unsigned long long iovOverrideValue(MsgStream &msg) const
bool overridesIov(MsgStream &msg) const
return true if this description overrides the timestamp or runlumi
bool noTagOverride() const
std::string addressHeader() const
std::string folderName() const
give the folder name contained in the parsed description
Basic time unit for IOVSvc.
uint64_t timestamp() const noexcept
uint64_t re_time() const noexcept
This is a Athena service which manages detector description tag information.
std::vector< TFile * > fptr
std::string find(const std::string &s)
return a remapped string
std::string resolveUsingTagInfo(const std::string &tag, const ITagInfoMgr *tagInfoMgr)
FolderType determineFolderType(const std::string &folderDescription, const std::string &spec, const std::vector< cool::ChannelId > &chans)
Determine folder type with optional check using clid service to check clid matches typename.
int countSelectedChannels(const std::vector< cool::ChannelId > &channels, const cool::ChannelSelection &selected)
Count the number of selected channels in a vector of channels according to cool::Channel selection.
std::vector< std::pair< IntType, IntType > > parseChannelSpec(const std::string &chanspecString)
Parse a channel specification string of the format ":3, 65:67,100:120, 130: " into a vector of pairs.
std::string sanitiseFilename(const std::string &fname)
Replace the '/' of a file path with '^'.
std::string folderTypeName(const FolderType f)
Give a string name for the folder type.
unsigned int attributeListSize(const coral::AttributeList &atrlist)
return the size (in bytes) of an AttributeList
std::pair< unsigned long long, unsigned long long > runLumiFromIovTime(const unsigned long long iovTime)
Return a [run,lumi] pair from an IOV time.
bool typeSizeIsKnown(const coral::Attribute &attribute)
Return a bool indicating whether the size of a given Attribute can be determined.
std::pair< bool, std::string > folderMetadata(IOVDbConn *pConnection, const std::string &folderName)
Retrieve (bool) multiversion flag and folder description.
IOVTime makeEpochOrRunLumi(const cool::ValidityKey key, const bool timeIsEpoch)
Create an IOVTime in ns of epoch or run-lumi (determined by the bool) from a ValidityKey.
std::string spaceStrip(const std::string &input)
Trim leading and trailing spaces,return a new trimmed string.
std::pair< std::vector< cool::ChannelId >, std::vector< std::string > > channelList(IOVDbConn *pConnection, const std::string &folderName, const bool named)
Retrieve channel information.
bool replaceServiceType71(std::string &addrHeader)
static const std::string s_delimiterJson
json standard delimiter ', '
unsigned long long iovTimeFromSeconds(const unsigned long long seconds)
Create a long long time in ns from s.
std::optional< bool > checkTagLock(const cool::IFolderPtr &fptr, const std::string &tag)
Check whether a tag is locked on a folder, if possible.
constexpr unsigned long long ALL_LUMI_BLOCKS
All the lumi blocks in one run.
bool looksLikeMagicTag(const std::string &candidateTag)
Looks like it should be magic.
unsigned long long iovTimeFromRunLumi(const unsigned long long run, const unsigned long long lumi)
Create a long long representing the IOV from run, lumi.
static const std::string s_closeJson
json close tag, '}'
IOVRange makeRange(const cool::ValidityKey since, const cool::ValidityKey until, const bool timeIsEpoch)
Make an IOVRange from two validity keys.
static const std::string s_openJson
json open tag, '{'
DataModel_detail::iterator< DVL > remove(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end, const T &value)
Specialization of remove for DataVector/List.