18#include <nlohmann/json.hpp>
21#include "CoolKernel/DatabaseId.h"
22#include "CoolKernel/Exception.h"
23#include "CoolKernel/IDatabaseSvc.h"
24#include "CoolKernel/IDatabase.h"
25#include "CoolKernel/IFolder.h"
26#include "CoolKernel/FolderSpecification.h"
27#include "CoolKernel/IFolderSet.h"
28#include "CoolKernel/IObject.h"
29#include "CoolKernel/IObjectIterator.h"
30#include "CoolKernel/IRecordIterator.h"
31#include "CoolApplication/Application.h"
32#include "CoralBase/AttributeListException.h"
36#include "RelationalAccess/ConnectionService.h"
37#include "RelationalAccess/IConnectionServiceConfiguration.h"
38#include "RelationalAccess/ISessionProxy.h"
39#include "RelationalAccess/ITransaction.h"
40#include "RelationalAccess/ISchema.h"
41#include "RelationalAccess/ITable.h"
42#include "RelationalAccess/IQuery.h"
43#include "RelationalAccess/ICursor.h"
59#include "TObjString.h"
62 size_t newLength =
size * nmemb;
66 s->append((
char *)
contents, newLength);
68 catch (std::bad_alloc &e)
79 AtlCoolCopy(
const std::string& sourcedb,
const std::string& destdb,
80 bool allowcreate=
false);
82 bool addFolder(
const std::string& folder,
const bool onlyTags);
85 (
const std::string& folder,
const std::vector<std::string>& taglist);
87 int setOpts(
int argc,
const char* argv[]);
91 bool openConnections(
const std::string& sourcedb,
const std::string& destdb,
96 std::vector<std::string>& folders);
97 static std::string
transConn(
const std::string& inconn);
99 static cool::ChannelId
channelID(
const cool::IFolderPtr& folder,
100 const std::string& chanstring);
102 (
const std::string& folder,
const std::string& destfolder,
105 const std::string& sourcetag,
const std::string& desttag,
106 const cool::ValidityKey since,
const cool::ValidityKey until,
107 bool timestamp,
bool checkrefs,
bool iscora,
108 const cool::PayloadMode::Mode paymode,
bool created);
109 void adjustIOVs(
const cool::ValidityKey& since,
110 const cool::ValidityKey& until,
111 const cool::ValidityKey& qsince,
112 const cool::ValidityKey& quntil,
113 cool::ValidityKey& newsince,
114 cool::ValidityKey& newuntil,
115 const bool timestamp)
const;
117 const cool::IFolderPtr& sourcefl,
const std::string& sourcetag,
118 const cool::ValidityKey since,
const cool::ValidityKey until,
123 const std::string& sourcetag,
124 const cool::ValidityKey since,
const cool::ValidityKey until,
125 const bool checkrefs,
const bool iscora,
126 const cool::PayloadMode::Mode paymode);
127 int rootIOVs(
const std::string& folder,
128 const cool::IFolderPtr& sourcefl,
const std::string& sourcetag,
129 const cool::ValidityKey since,
const cool::ValidityKey until,
130 const bool timestamp);
131 std::string
rootDirs(
const std::string& folder,
const std::string& toproot);
132 bool rootAllocate(
const cool::IFieldSpecification& spec,
133 void*& sptr,
char& rootID)
const;
134 void rootWrite(
void* sptr,
const cool::IField& field)
const;
135 static bool isNumeric(
const char* input);
137 const cool::IRecord& rhs);
139 const cool::IFolderPtr& sourcefl,
const std::string& sourcetag,
140 const cool::ValidityKey since,
const cool::ValidityKey until,
141 const bool timestamp);
142 static TH1F*
bookOrFindTH1F(
const std::string& hID,
const std::string& htitle,
143 const int chan,
const float xlow,
const float xhigh);
144 static cool::ValidityKey
timeVal(
const char* input);
145 static std::string
timeString(
const cool::ValidityKey iovtime);
146 static cool::ValidityKey
runLBVal(
const char* input1,
const char* input2);
152 static int getUpdateMode(std::string_view desc, std::string_view tag);
155 const cool::IFolderPtr& sourcefl,
const cool::IFolderPtr& destfl,
157 void checkRef(
const cool::IRecord& payload,
158 const std::string& folder,
const std::string& tag);
265 typedef std::map<std::string,PoolMapElement>
PoolMap;
269 using HiTagMap = std::map<std::string, std::string>;
331 coral::IConnectionServiceConfiguration& csconfig=
m_coralsvc.configuration();
332 csconfig.disablePoolAutomaticCleanUp();
333 csconfig.setConnectionTimeOut(0);
337 const std::string& destdb,
bool allowcreate) {
343 coral::IConnectionServiceConfiguration& csconfig=
m_coralsvc.configuration();
344 csconfig.setReplicaSortingAlgorithm(*
m_repsort);
348 std::cout <<
"Open source database: " << sourcedb << std::endl;
349 if (!
m_sourceread) std::cout <<
"... in UPDATE mode" << std::endl;
353 catch (std::exception& e) {
354 std::cout <<
"Cool exception caught: " << e.what() << std::endl;
362 std::cout <<
"Open destination ROOT file: " << destdb << std::endl;
363 p_rootfile=
new TFile(destdb.c_str(),
"RECREATE");
364 if (
p_rootfile==
nullptr) std::cout <<
"ERROR: Could not open ROOT file" <<
370 std::cout <<
"Open destination database: " << tdestdb << std::endl;
377 "Forcing recreation of destination database - deleting existing data!"
380 m_dbSvc->dropDatabase(tdestdb);
382 throw cool::DatabaseDoesNotExist(
"old database deleted");
385 catch (std::exception& e) {
386 std::cout <<
"COOL exception caught: " << e.what() << std::endl;
389 std::cout <<
"Try to create new conditions DB" << std::endl;
392 std::cout <<
"Creation succeeded" << std::endl;
394 catch (cool::Exception& e) {
395 std::cout <<
"Creation failed" << std::endl;
408 std::cout <<
"Attempt to open source CoraCool DB " <<
m_sourcedb <<
412 std::cout <<
"Opened CoraCool source DB" << std::endl;
417 std::cout <<
"Attempt to open destination CoraCool DB " <<
m_destdb <<
421 std::cout <<
"Opened CoraCool dest DB" << std::endl;
429 cool::IFolderSetPtr topfolder=
m_sourceDbPtr->getFolderSet(
"/");
430 const std::vector<std::string>& toptaglist=topfolder->listTags();
431 for (std::vector<std::string>::const_iterator toptag=toptaglist.begin();
432 toptag!=toptaglist.end();++toptag) {
433 cool::HvsTagLock::Status tstat=topfolder->tagLockStatus(*toptag);
434 if (tstat==cool::HvsTagLock::LOCKED ||
435 tstat==cool::HvsTagLock::PARTIALLYLOCKED) {
436 std::cout <<
"Top-level tag " << *toptag <<
" will be copied" <<
438 m_tags.push_back(*toptag);
441 std::cout <<
"Total of " <<
m_tags.size() <<
" top-level tags to be copied"
449 if (inconn.find(
'/')==std::string::npos) {
450 return "sqlite://X;schema=mycool.db;dbname="+inconn;
458 std::cout <<
"Add folders in path:" << folder <<
" [ ";
459 const std::vector<std::string> nodelist=
m_sourceDbPtr->listAllNodes();
461 for (std::vector<std::string>::const_iterator nodeitr=nodelist.begin();
462 nodeitr!=nodelist.end();++nodeitr) {
466 if (*nodeitr==folder || folder==
"/" ||
467 (nodeitr->compare(0,folder.size(),folder)==0 &&
468 nodeitr->size()>folder.size() && nodeitr->compare(folder.size(),1,
"/")==0)) {
471 for (std::vector<std::string>::const_iterator iexcl=
m_folderexcl.begin();
473 if (iexcl->compare(0,1,
"/")==0) {
486 std::cout << *nodeitr <<
" ";
493 const std::vector<std::string> foldersettags=
495 if (!foldersettags.empty()) {
496 for (std::vector<std::string>::const_iterator
497 itr=foldersettags.begin();itr!=foldersettags.end();++itr) {
504 cool::IFolderSetPtr sfolder=
m_sourceDbPtr->getFolderSet(*nodeitr);
505 for (std::vector<std::string>::const_iterator toptag=
m_tags.begin();
506 toptag!=
m_tags.end();++toptag) {
508 std::string rtag=sfolder->resolveTag(*toptag);
515 catch (std::exception& e) {}
521 std::cout <<
"]" << std::endl;
526 std::cout <<
"Adding folder to exclude list: " << folder << std::endl;
532 (
const std::string& folder,
const std::vector<std::string>& taglist) {
534 cool::IFolderPtr sourcefl,destfl;
537 sourcefl=m_sourceDbPtr->getFolder(folder);
539 catch (cool::Exception& e) {
540 std::cout <<
"Could not get source folder: " << folder << std::endl;
543 const std::string& sourcedesc=sourcefl->description();
545 if (m_skiprep && sourcedesc.find(
"<norep/>")!=std::string::npos) {
546 std::cout <<
"Folder " << folder <<
547 " skipped due to <norep/> metadata" << std::endl;
550 const bool iscora=(m_coracool &&
551 sourcedesc.find(
"<coracool")!=std::string::npos);
555 sourceflc=m_sourceCoraPtr->getFolder(folder);
558 setChannelRange(sourcefl);
560 cool::FolderVersioning::Mode vermode=sourcefl->versioningMode();
561 cool::FolderVersioning::Mode dvermode=vermode;
563 dvermode=cool::FolderVersioning::SINGLE_VERSION;
564 std::cout <<
"Forcing destination folder to singleversion" << std::endl;
567 dvermode=cool::FolderVersioning::MULTI_VERSION;
568 std::cout <<
"Forcing destination folder to multiversion" << std::endl;
571 const cool::PayloadMode::Mode spaymode=
572 sourcefl->folderSpecification().payloadMode();
573 cool::PayloadMode::Mode dpaymode=spaymode;
576 std::string destfolder=folder;
577 if (!m_outfolder.empty()) {
578 destfolder=m_outfolder;
579 std::cout <<
"Destination folder will be renamed to " << destfolder <<
585 if (!m_nocopy && !m_root && !m_analyse) {
586 if (!m_destDbPtr->existsFolder(destfolder) && !m_verify) {
587 std::cout <<
"Creating folder " << destfolder <<
" payload-type " <<
588 dpaymode <<
" on destination" << std::endl;
590 std::string metadata=sourcedesc;
591 if (m_forcerune || m_forcetime) {
592 std::string newmeta=m_forcerune ?
"run-lumi" :
"time";
593 std::string::size_type p1,p2;
594 p1=metadata.find(
"<timeStamp>");
595 p2=metadata.find(
"</timeStamp>");
596 if (p1!=std::string::npos && p2!=std::string::npos) {
597 metadata.replace(0,p2,
"<timeStamp>"+newmeta);
598 std::cout <<
"Forced destination folder to " << newmeta <<
" : "
599 << metadata << std::endl;
602 "ERROR: Could not parse metadata string to force timestamp type"
607 if (m_forcepay && spaymode!=cool::PayloadMode::VECTORPAYLOAD)
608 dpaymode=cool::PayloadMode::SEPARATEPAYLOAD;
609 if (m_forcenopay && spaymode!=cool::PayloadMode::VECTORPAYLOAD)
610 dpaymode=cool::PayloadMode::INLINEPAYLOAD;
614 destflc=m_destCoraPtr->createFolder(destfolder,
615 sourceflc->coralTableName(),
616 sourceflc->fkSpecification(),
617 sourceflc->payloadSpecification(),
618 sourceflc->coralFKey(),
619 sourceflc->coralPKey(),
620 metadata,dvermode,
true);
621 std::cout <<
"Created CoraCool folder" << std::endl;
622 destfl=m_destDbPtr->getFolder(destfolder);
624 destfl=m_destDbPtr->createFolder(destfolder,
625 cool::FolderSpecification(dvermode,
626 sourcefl->payloadSpecification(),dpaymode),
630 catch (cool::Exception&e ) {
631 std::cout <<
"Create folder failed - aborting" << std::endl;
638 if (iscora) destflc=m_destCoraPtr->getFolder(destfolder);
639 destfl=m_destDbPtr->getFolder(destfolder);
641 catch (cool::Exception& e) {
642 std::cout <<
"Could not get destination folder: " << destfolder
647 const cool::IRecordSpecification& sourcespec=
648 sourcefl->payloadSpecification();
649 const cool::IRecordSpecification& destspec=
650 destfl->payloadSpecification();
651 if (!(sourcespec==destspec)) {
656 "WARNING Source and destination folder specifications differ" <<
658 for (
unsigned int i=0;i<sourcespec.size();++i) {
659 const std::string& sname=sourcespec[i].name();
660 if (!destspec.exists(sname)) {
661 std::cout <<
"ERROR: Field " << sname <<
" absent from destination"
671 "ERROR Source and destination folder specifications differ"
677 const std::string& destdesc=destfl->description();
678 if (sourcedesc!=destdesc) {
679 std::cout <<
"WARNING: Source and destination folder descriptions (meta-data) differ" << std::endl;
680 std::cout <<
"Source folder: " << sourcedesc << std::endl;
681 std::cout <<
"Destn folder: " << destdesc << std::endl;
684 const cool::PayloadMode::Mode dpaymode=
685 destfl->folderSpecification().payloadMode();
686 if (spaymode!=dpaymode) {
687 std::cout <<
"WARNING: Source (" << spaymode <<
") and destination (" <<
688 dpaymode <<
" folder payload modes differ" << std::endl;
693 if (!checkChannels(folder,sourcefl,destfl,created))
return 23;
697 if (m_nodata)
return 0;
699 std::cout <<
"Start to process folder: " << folder;
701 bool timestamp=(sourcefl->description().
find(
"<timeStamp>time")!=
703 cool::ValidityKey since,until;
707 std::cout <<
" (timestamp)" << std::endl;
711 std::cout <<
" (run/lumi)" << std::endl;
713 if (m_alliov || m_truncate)
714 std::cout <<
"Output IOVs will be modified" << std::endl;
716 std::cout <<
"IOVs extending outside selection range will be skipped"
719 bool checkrefs=
false;
720 const std::string name0=sourcefl->payloadSpecification()[0].name();
721 if (m_checkrefs && (name0==
"PoolRef" || name0==
"fileGUID")) {
723 std::cout <<
"Check POOL references in folder " << folder << std::endl;
727 if (m_checkrefs && m_nocopy && !checkrefs)
return 0;
731 (m_skiprep && (sourcedesc.find(
"<fullrep/>")!=std::string::npos));
732 if (copyall) std::cout <<
733 "All tags in folder will be copied due to <fullrep/> metadata" << std::endl;
736 std::vector<std::string>
tags;
737 if (vermode==cool::FolderVersioning::SINGLE_VERSION) {
738 std::cout <<
"Single version folder" << std::endl;
739 tags.emplace_back(
"HEAD");
741 std::cout <<
"Multi version folder: consider tags [ ";
743 const std::vector<std::string> foldertags=sourcefl->listTags();
744 for (std::vector<std::string>::const_iterator itag=foldertags.begin();
745 itag!=foldertags.end();++itag) {
748 if (taglist.empty() ||
749 find(taglist.begin(),taglist.end(),*itag)!=taglist.end())
751 for (std::vector<std::string>::const_iterator imtag=m_magic.begin();
752 imtag!=m_magic.end();++imtag) {
753 if (itag->find(*imtag)!=std::string::npos) copyit=
true;
756 tags.push_back(*itag);
757 std::cout << *itag <<
" ";
762 if (
tags.empty() || m_hitag) {
763 for (std::vector<std::string>::const_iterator itag=taglist.begin();
764 itag!=taglist.end();++itag) {
766 std::string htag=sourcefl->resolveTag(*itag);
768 std::cout << *itag <<
"=" << htag <<
" ";
769 tags.push_back(std::move(htag));
776 catch (std::exception& e) { }
779 std::cout <<
"]" << std::endl;
782 if (((
tags.empty() || m_includehead) && !m_excludehead) ||
784 tags.emplace_back(
"HEAD");
787 sourcefl->setPrefetchAll(
false);
788 for (std::vector<std::string>::const_iterator itag=
tags.begin();
789 itag!=
tags.end();++itag) {
790 std::string outtag=*itag;
791 if (!m_outtag.empty()) outtag=m_outtag;
799 retcode=verifyIOVs(folder,sourcefl,sourceflc,destfl,destflc,
800 *itag,since,until,checkrefs,iscora,spaymode);
802 }
else if (m_nocopy) {
803 retcode=nocopyIOVs(folder,sourcefl,*itag,since,until,checkrefs);
805 retcode=rootIOVs(folder,sourcefl,*itag,since,until,timestamp);
806 }
else if (m_analyse) {
807 retcode=analyseIOVs(folder,sourcefl,*itag,since,until,timestamp);
809 retcode=copyIOVs(folder,destfolder,sourcefl,sourceflc,destfl,destflc,
810 *itag,outtag,since,until,timestamp,checkrefs,iscora,
814 std::cout <<
"ERROR operation failed for folder " << folder <<
" tag " <<
830 for (
size_t i=0;i<nChanRange;i++) {
835 " to channel selection" << std::endl;
846 std::cout <<
"Adding channel range " << c1 <<
" to " << c2 <<
847 " to channel selection" << std::endl;
858 const std::string& chanstring) {
859 const char* cstr=chanstring.c_str();
862 return cool::ChannelId(strtoul(cstr,
nullptr,10));
864 cool::ChannelId chan=0;
866 chan=folder->channelId(chanstring);
867 std::cout <<
"Channel name " << chanstring <<
" maps to channelID "
868 << chan << std::endl;
870 catch (cool::Exception& e) {
871 std::cout <<
"ERROR: Channel name " << chanstring <<
872 " not defined in folder " << std::endl;
880 (
const std::string& folder,
881 const std::string& destfolder,
884 const std::string& sourcetag,
const std::string& desttag,
885 const cool::ValidityKey since,
const cool::ValidityKey until,
886 bool timestamp,
bool checkrefs,
bool iscora,
887 const cool::PayloadMode::Mode paymode ,
bool created) {
889 std::cout <<
"Copying tag " << sourcetag <<
" of folder " << folder <<
890 " to destination tag " << desttag << std::endl;
891 cool::FolderVersioning::Mode vermode=sourcefl->versioningMode();
892 cool::FolderVersioning::Mode dvermode=destfl->versioningMode();
894 int updatemode=getUpdateMode(destfl->description(),desttag);
895 std::vector<std::string> dtaglist=destfl->listTags();
898 if (updatemode==1 && m_destdb.find(
"oracle")!=std::string::npos &&
899 (!m_getonline || (!m_truncate && !m_alliov))) {
901 std::cout <<
"Folder is online (UPD1) mode but IGNORING PROTECTION"
904 if(
find(dtaglist.begin(),dtaglist.end(),desttag)!=dtaglist.end()) {
905 std::cout <<
"Folder is online mode (UPD1) and tag already exist - -getonline and -truncate or -alliov options MUST be used" << std::endl;
909 std::cout <<
"Folder is online mode (UPD1), new tag will be created" << std::endl;
915 if (updatemode==4 && m_destdb.find(
"oracle")!=std::string::npos &&
916 (!m_getbulk || (!m_truncate && !m_alliov))) {
918 std::cout <<
"Folder is bulkreco (UPD4) mode but IGNORING PROTECTION"
921 if(
find(dtaglist.begin(),dtaglist.end(),desttag)!=dtaglist.end()) {
922 std::cout <<
"Folder is bulkreco mode (UPD4) - -getbulk and -truncate or -alliov options MUST be used" << std::endl;
925 std::cout <<
"Folder is bulkreco mode (UPD4), new tag will be created" << std::endl;
934 if (m_checkdesttag) {
935 if (
find(dtaglist.begin(),dtaglist.end(),desttag)!=dtaglist.end()
936 || (desttag==
"HEAD" && !created)) {
937 std::cout <<
"Destination tag " << desttag <<
938 " already exists in folder " << folder <<
" - skip copy" << std::endl;
944 if ((m_applock || (updatemode==1 && m_getonline) || updatemode==2 ||
945 (updatemode==4 && m_getbulk)) &&
946 dvermode==cool::FolderVersioning::MULTI_VERSION) {
948 std::vector<std::string> dtaglist=destfl->listTags();
949 for (std::vector<std::string>::const_iterator itr=dtaglist.begin();
950 itr!=dtaglist.end();++itr) {
955 if (destfl->tagLockStatus(desttag)==cool::HvsTagLock::LOCKED) {
956 std::cout <<
"Unlocking destination tag " << desttag <<
957 " for append or UPDx access" << std::endl;
959 std::cout <<
"Appending according to SV folder rules" << std::endl;
962 "ERROR: Only allowed for UPD3 mode tags" << std::endl;
966 destfl->setTagLockStatus(desttag,cool::HvsTagLock::UNLOCKED);
977 std::string localtag=
"";
978 if (dvermode==cool::FolderVersioning::MULTI_VERSION &&
979 desttag!=
"HEAD" && m_usertags) localtag=desttag;
984 sourceflc->setPrefetchAll(
false);
986 if (vermode==cool::FolderVersioning::SINGLE_VERSION) {
987 sourceitr=sourceflc->browseObjects(since,until,m_chansel);
989 sourceitr=sourceflc->browseObjects(since,until,m_chansel,sourcetag);
992 std::map<int,int> insertkeymap;
994 while (sourceitr->hasNext()) {
998 (obj->since()<m_srunemin || obj->until()>m_srunemax)) {
1003 if (!m_excludechans.empty()) {
1004 if (
find(m_excludechans.begin(),m_excludechans.end(),
1005 obj->channelId())!=m_excludechans.end()) {
1011 if (m_debug) std::cout <<
1012 "Setup new CoraCool storage buffer at object " << nobj << std::endl;
1013 destflc->setupStorageBuffer();
1015 cool::ValidityKey newsince,newuntil;
1016 adjustIOVs(obj->since(),obj->until(),since,until,newsince,newuntil,
1019 if (newsince>=newuntil) {
1020 std::cout <<
"WARNING: Skipping IOV with since " << newsince <<
1021 ">= until" << newuntil << std::endl;
1028 std::map<int,int>::const_iterator ikey=insertkeymap.end();
1029 bool foundkey=
false;
1032 if (obj->size()>0) {
1033 oldfk=sourceflc->getAttrKey(
1034 (*obj->begin())[sourceflc->coralFKey()]);
1035 ikey=insertkeymap.find(oldfk);
1038 if (ikey==insertkeymap.end()) {
1040 destflc->storeObject(newsince,newuntil,obj->begin(),obj->end(),
1041 obj->channelId(),localtag,
1042 (!m_userupdatehead && !localtag.empty()));
1043 if (foundkey) insertkeymap[oldfk]=newfk;
1045 destflc->referenceObject(newsince,newuntil,ikey->second,
1046 obj->channelId(),localtag,
1047 (!m_userupdatehead && !localtag.empty()));
1052 if (nbuf==m_bufsize) {
1053 if (m_debug) std::cout <<
"Flush buffer after " << nobj <<
"," <<
1054 nbuf <<
" objects " << std::endl;
1056 destflc->flushStorageBuffer();
1057 destflc->setupStorageBuffer();
1063 if (nref>0) std::cout <<
"Reference-to-existing used for " << nref
1064 <<
" payload objects" << std::endl;
1066 if (m_debug) std::cout <<
"Final buffer flush at " << nobj <<
1067 "," << nbuf << std::endl;
1068 destflc->flushStorageBuffer();
1072 cool::IObjectIteratorPtr sourceitr;
1073 if (vermode==cool::FolderVersioning::SINGLE_VERSION) {
1074 sourceitr=sourcefl->browseObjects(since,until,m_chansel);
1076 sourceitr=sourcefl->browseObjects(since,until,m_chansel,sourcetag);
1078 while (sourceitr->goToNext()) {
1079 const cool::IObject& obj=sourceitr->currentRef();
1081 if (m_skipout && (obj.since()<m_srunemin || obj.until()>m_srunemax)) {
1086 if (!m_excludechans.empty()) {
1087 if (
find(m_excludechans.begin(),m_excludechans.end(),
1088 obj.channelId())!=m_excludechans.end()) {
1094 if (m_debug) std::cout <<
"Setup new storage buffer at object " <<
1096 destfl->setupStorageBuffer();
1098 cool::ValidityKey newsince;
1099 cool::ValidityKey newuntil;
1100 adjustIOVs(obj.since(),obj.until(),since,until,newsince,newuntil,
1103 if (newsince>=newuntil) {
1104 std::cout <<
"WARNING: Skipping IOV with since " << newsince <<
1105 ">= until" << newuntil << std::endl;
1109 if (checkrefs) checkRef(obj.payload(),folder,sourcetag);
1115 if (newuntil!=cool::ValidityKeyMax) {
1116 std::cout <<
"New IOVs must have until=cool::ValidityKeyMax" << std::endl;
1117 throw cool::Exception(
"Illegal insert over locked IOV",
1120 cool::IObjectIteratorPtr checkitr=destfl->browseObjects(newsince,
1121 newuntil,obj.channelId(),desttag);
1122 while (checkitr->goToNext()) {
1123 const cool::IObject& checkobj=checkitr->currentRef();
1124 if (checkobj.since()>=newsince) {
1125 std::cout <<
"ERROR:: Attempt to insert SV overlapping IOV whilst appending to locked tag" << std::endl;
1126 throw cool::Exception(
"Illegal insert over locked IOV",
1129 if (checkobj.until()!=cool::ValidityKeyMax) {
1130 std::cout <<
"Existing IOVs must have until=cool::ValidityKeyMax" << std::endl;
1131 throw cool::Exception(
"Illegal insert over locked IOV",
1136 }
else if (m_applock) {
1138 const unsigned int nexist=
1139 destfl->countObjects(newsince,newuntil,obj.channelId(),desttag);
1141 std::cout <<
"ERROR: Attempt to insert IOV over " << nexist <<
1142 " objects whilst appending to locked tag" << std::endl;
1143 throw cool::Exception(
"Illegal insert over locked IOV",
1146 }
else if (updatemode==2) {
1150 throw cool::Exception(
1151 "Attempt to insert into locked UPD2 tag with timestamp format",
1153 unsigned int run1=newsince >> 32;
1154 unsigned int run2=(newuntil-1) >> 32;
1155 for (
unsigned int irun=run1;irun<=run2;++irun) {
1156 if (!std::binary_search(m_runlist.begin(),m_runlist.end(),irun))
1158 std::cout <<
"Run " << irun <<
" from range [" << run1 <<
","
1159 << run2 <<
"] not found in runfile list" << std::endl;
1160 throw cool::Exception(
"Illegal insert over locked IOV",
1167 if (paymode==cool::PayloadMode::VECTORPAYLOAD) {
1169 cool::IRecordIterator& pitr=obj.payloadIterator();
1170 const cool::IRecordVectorPtr vptr=pitr.fetchAllAsVector();
1171 destfl->storeObject(newsince,newuntil,
1172 *vptr,obj.channelId(),localtag,
1173 (!m_userupdatehead && !localtag.empty()));
1178 destfl->storeObject(newsince,newuntil,
1179 obj.payload(),obj.channelId(),localtag,
1180 (!m_userupdatehead && !localtag.empty()));
1184 if (nbuf>=m_bufsize) {
1185 if (m_debug) std::cout <<
"Flush buffer after " << nobj <<
"," <<
1186 nbuf <<
" objects " << std::endl;
1187 destfl->flushStorageBuffer();
1195 if (m_debug) std::cout <<
"Final buffer flush at " << nobj <<
1196 "," << nbuf << std::endl;
1197 destfl->flushStorageBuffer();
1200 std::cout <<
"Folder copied with " << nobj <<
" objects" << std::endl;
1201 if (nskip>0) std::cout << nskip <<
1202 " objects were skipped extending outside IOV selection or excluded channel"
1204 if (nbad>0) std::cout << nbad <<
1205 " objects were skipped having zero or negative IOV lengths" << std::endl;
1208 catch (cool::Exception& e) {
1209 std::cout <<
"Exception thrown from copy loop: " << e.what() <<
1212 std::cout <<
"Relocking destination tag " << desttag << std::endl;
1213 destfl->setTagLockStatus(desttag,cool::HvsTagLock::LOCKED);
1219 std::cout <<
"Relocking destination tag " << desttag << std::endl;
1220 destfl->setTagLockStatus(desttag,cool::HvsTagLock::LOCKED);
1223 if (dvermode==cool::FolderVersioning::MULTI_VERSION && desttag!=
"HEAD") {
1226 std::cout <<
"Tag folder with HEAD-style tagging for tag: " << desttag
1229 destfl->tagCurrentHead(desttag,sourcefl->tagDescription(sourcetag));
1231 catch (cool::Exception& e) {
1232 std::cout <<
"Exception thrown in HEAD-style folder-tag: " <<
1233 e.what() << std::endl;
1238 if (m_copytaginfo) m_cooltagmap.insert(
1239 CoolTagMap::value_type(desttag,
CoolTagInfo(m_sourceDbPtr,folder,
1240 destfolder,sourcetag,desttag,m_taglabel)));
1242 if (!m_hitagmap.empty()) {
1243 for (HiTagMap::const_iterator imap=m_hitagmap.begin();
1244 imap!=m_hitagmap.end();++imap) {
1246 if (sourcefl->findTagRelation(imap->first)==sourcetag) {
1247 std::cout <<
"Create hierarchical tag between " << desttag <<
1248 " and " << imap->first <<
" in folder " << imap->second <<
1252 std::string etag=destfl->resolveTag(imap->first);
1253 if (etag==desttag) {
1254 std::cout <<
"This relation has already been created" << std::endl;
1256 std::cout <<
"ERROR: Tag in parent already related to " <<
1257 desttag << std::endl;
1260 catch (cool::Exception& e ) {
1263 destfl->createTagRelation(imap->first,desttag);
1266 if (
find(m_hiparent.begin(),m_hiparent.end(),imap->second)==
1267 m_hiparent.end()) m_hiparent.push_back(imap->second);
1270 if (m_copytaginfo &&
1271 m_cooltagmap.find(imap->first)==m_cooltagmap.end())
1272 m_cooltagmap.insert(CoolTagMap::value_type(imap->first,
1273 CoolTagInfo(m_sourceDbPtr,imap->second,imap->second,
1274 imap->first,imap->first)));
1276 catch (cool::Exception& e) {
1277 std::cout <<
"Cool exception " << e.what() <<
1278 "thrown in hierarchical tag creation" << std::endl;
1284 catch (cool::Exception& e) {
1293 const cool::ValidityKey& until,
1294 const cool::ValidityKey& qsince,
1295 const cool::ValidityKey& quntil,
1296 cool::ValidityKey& newsince,
1297 cool::ValidityKey& newuntil,
1298 bool timestamp)
const {
1315 if (newsince<qsince) newsince=qsince;
1316 if (newuntil>quntil) newuntil=quntil;
1319 if (newuntil<newsince)
throw cool::Exception(
1320 "Attempt to insert IOV with -ve length",
"AtlCoolCopy::adjustIOVs");
1324 const cool::IFolderPtr& sourcefl,
const std::string& sourcetag,
1325 const cool::ValidityKey since,
const cool::ValidityKey until,
1328 std::cout <<
"Reading tag " << sourcetag <<
" of folder " << folder <<
1329 " (no copy)" << std::endl;
1330 cool::FolderVersioning::Mode vermode=sourcefl->versioningMode();
1332 cool::IObjectIteratorPtr sourceitr;
1333 if (vermode==cool::FolderVersioning::SINGLE_VERSION) {
1334 sourceitr=sourcefl->browseObjects(since,until,
m_chansel);
1336 sourceitr=sourcefl->browseObjects(since,until,
m_chansel,sourcetag);
1339 while (sourceitr->goToNext()) {
1340 const cool::IObject& obj=sourceitr->currentRef();
1341 if (checkrefs)
checkRef(obj.payload(),folder,sourcetag);
1344 std::cout <<
"Folder scanned with " << nobj <<
" objects" << std::endl;
1347 catch (cool::Exception& e) {
1348 std::cout <<
"Exception thrown from read loop: " << e.what() <<
1360 const std::string& sourcetag,
1361 const cool::ValidityKey since,
const cool::ValidityKey until,
1362 const bool checkrefs,
const bool iscora,
1363 const cool::PayloadMode::Mode paymode) {
1365 std::cout <<
"Verifying tag " << sourcetag <<
" of folder " << folder <<
1367 destfl->setPrefetchAll(
false);
1368 cool::FolderVersioning::Mode vermode=sourcefl->versioningMode();
1370 cool::IObjectIteratorPtr sourceitr,destitr;
1372 std::string tag=sourcetag;
1373 if (vermode==cool::FolderVersioning::SINGLE_VERSION || sourcetag==
"HEAD")
1377 sourceflc->setPrefetchAll(
false);
1378 csourceitr=sourceflc->browseObjects(since,until,
m_chansel,tag);
1379 cdestitr=destflc->browseObjects(since,until,
m_chansel,tag);
1381 sourceitr=sourcefl->browseObjects(since,until,
m_chansel,tag);
1382 destitr=destfl->browseObjects(since,until,
m_chansel,tag);
1385 catch (std::exception& e) {
1386 std::cout <<
"Exception thrown from verify iterator setup: " << e.what() <<
1395 const std::string& cfkey=sourceflc->coralFKey();
1396 const std::string& cpkey=sourceflc->coralPKey();
1397 while (csourceitr->hasNext()) {
1406 if (cdestitr->hasNext()) {
1411 if (sobj->since()!=dobj->since() || sobj->until()!=dobj->until())
1414 if (sobj->channelId()!=dobj->channelId())
1417 if (sobj->size()!=dobj->size()) {
1418 std::cout <<
"ERROR CoraCool object " << nobj <<
1419 " sizes do not match: " << sobj->size() <<
" " << dobj->size()
1426 sitr!=sobj->end();++sitr,++ditr) {
1428 for (coral::AttributeList::const_iterator aitr=sitr->begin();
1429 aitr!=sitr->end();++aitr) {
1430 const std::string& aname=aitr->specification().name();
1431 if (aname!=cfkey && aname!=cpkey) {
1433 if (*aitr!=(*ditr)[aname]) {
1434 std::cout <<
"ERROR Values of attriute " << aname <<
1435 " differ" << std::endl;
1439 catch (coral::AttributeListException& e) {
1440 std::cout <<
"ERROR: CoraCool attribute " << aname <<
1441 " not found in destination!" << std::endl;
1448 std::cout <<
"ERROR database entries do not match: since: " <<
1449 sobj->since() <<
"," << dobj->since() <<
" until: " <<
1450 sobj->until() <<
"," << dobj->until() <<
" channel: " <<
1451 sobj->channelId() <<
"," << dobj->channelId() << std::endl;
1456 "ERROR destination folder no matching CoraCool iterator for object "
1457 << nobj << std::endl;
1463 while (sourceitr->goToNext()) {
1464 const cool::IObject& sobj=sourceitr->currentRef();
1472 if (checkrefs)
checkRef(sobj.payload(),folder,sourcetag);
1473 if (destitr->goToNext()) {
1474 const cool::IObject& dobj=destitr->currentRef();
1478 if (sobj.since()!=dobj.since() || sobj.until()!=dobj.until())
1481 if (sobj.channelId()!=dobj.channelId())
1486 if (paymode==cool::PayloadMode::VECTORPAYLOAD) {
1487 cool::IRecordIterator& spitr=sobj.payloadIterator();
1488 const cool::IRecordVectorPtr svptr=spitr.fetchAllAsVector();
1489 cool::IRecordIterator& dpitr=dobj.payloadIterator();
1490 const cool::IRecordVectorPtr dvptr=dpitr.fetchAllAsVector();
1491 if (svptr->size()!=dvptr->size()) {
1496 cool::IRecordVector::const_iterator svitr=svptr->begin();
1497 cool::IRecordVector::const_iterator svend=svptr->end();
1498 cool::IRecordVector::const_iterator dvitr=dvptr->begin();
1499 for (;svitr!=svend;++svitr,++dvitr) {
1504 std::cout <<
"ERROR vector payloads do not match (size " << svptr->size() <<
"," << dvptr->size() <<
")" << std::endl;
1509 if (!
equalRecord(sobj.payload(),dobj.payload())) iret=102;
1513 std::cout <<
"ERROR database entries do not match: since: " <<
1514 sobj.since() <<
"," << dobj.since() <<
" until: " <<
1515 sobj.until() <<
"," << dobj.until() <<
" channel: " <<
1516 sobj.channelId() <<
"," << dobj.channelId() << std::endl;
1517 std::cout <<
"Source payload:" << std::endl;
1518 sobj.payload().attributeList().toOutputStream(std::cout);
1519 std::cout << std::endl <<
"Destination payload:" << std::endl;
1520 dobj.payload().attributeList().toOutputStream(std::cout);
1521 std::cout << std::endl;
1526 "ERROR destination folder no matching iterator for object "
1527 << nobj << std::endl;
1534 catch (cool::Exception& e) {
1535 std::cout <<
"Exception thrown from verify loop: " << e.what() <<
1545 std::cout <<
"Verification of folder " << folder <<
" tag " <<
1546 sourcetag <<
" OK (" << nobj <<
" objects)" << std::endl;
1553 const cool::IFolderPtr& sourcefl,
const std::string& sourcetag,
1554 const cool::ValidityKey since,
const cool::ValidityKey until,
1555 const bool timestamp) {
1557 std::cout <<
"Write tag " << sourcetag <<
" of folder " << folder <<
1558 " to ROOT file" << std::endl;
1561 bool timestamp2=timestamp;
1564 cool::FolderVersioning::Mode vermode=sourcefl->versioningMode();
1567 TTree*
tree=
static_cast<TTree*
>(gDirectory->FindObject(
treename.c_str()));
1568 if (
tree==
nullptr) {
1569 std::cout <<
"Book TTree " <<
treename << std::endl;
1581 if (vermode==cool::FolderVersioning::MULTI_VERSION)
1584 const cool::IRecordSpecification& spec=
1585 (sourcefl->folderSpecification()).payloadSpecification();
1586 unsigned int ncolumns=spec.size();
1592 for (
unsigned int icol=0;icol<ncolumns;++icol) {
1593 const cool::IFieldSpecification& fieldspec=spec[icol];
1597 tree->Branch(fieldspec.name().c_str(),ptr,
1598 (fieldspec.name()+
"/"+rootID).c_str());
1599 if (
m_debug) std::cout <<
"Defining column for " << spec[icol].name()
1600 <<
" of type " << spec[icol].storageType().name() << std::endl;
1602 std::cout <<
"Attribute " << spec[icol].name() <<
" of type " <<
1603 spec[icol].storageType().name() <<
" will be skipped" << std::endl;
1608 std::cout <<
"TTree " <<
treename <<
" already exists" << std::endl;
1611 (sourcefl->folderSpecification()).payloadSpecification().size();
1613 std::cout <<
"ERROR in tree buffer definition: expect " <<
treename <<
1622 cool::IObjectIteratorPtr sourceitr;
1624 if (vermode==cool::FolderVersioning::SINGLE_VERSION) {
1625 sourceitr=sourcefl->browseObjects(since,until,
m_chansel);
1627 sourceitr=sourcefl->browseObjects(since,until,
m_chansel,sourcetag);
1630 catch (cool::Exception& e) {
1631 std::cout <<
"Exception thrown from ROOT copy iterator setup: " <<
1632 e.what() << std::endl;
1637 while (sourceitr->goToNext()) {
1638 const cool::IObject& sobj=sourceitr->currentRef();
1649 if (vermode==cool::FolderVersioning::MULTI_VERSION) {
1652 std::string sourcetag2=sourcetag.substr(0,255);
1658 const cool::IRecord& record=sobj.payload();
1659 for (
unsigned int icol=0;icol<record.size();++icol) {
1665 catch (cool::Exception& e) {
1672 std::cout <<
"Written " << nobj <<
" objects to ROOT TTree with " << nex
1673 <<
" nulls/exceptions" << std::endl;
1675 catch (cool::Exception& e) {
1676 std::cout <<
"Exception thrown from ROOT file writing loop: " <<
1677 e.what() << std::endl;
1684 const std::string& toproot) {
1689 if (
p_rootfile->FindObject(toproot.c_str())==
nullptr) {
1691 std::cout <<
"Made top directory " << toproot << std::endl;
1693 gDirectory->cd(toproot.c_str());
1696 std::string::size_type iofs1=1;
1697 std::string::size_type iofs2=1;
1699 while (iofs2!=std::string::npos) {
1700 iofs2=folder.find(
'/',iofs1);
1701 if (iofs2==std::string::npos) {
1705 std::string
dirname=folder.substr(iofs1,iofs2-iofs1);
1707 if (gDirectory->FindObject(
dirname.c_str())==
nullptr) {
1708 std::cout <<
"Make directory " <<
dirname << std::endl;
1709 gDirectory->mkdir(
dirname.c_str());
1711 gDirectory->cd(
dirname.c_str());
1718 void*& sptr,
char& rootID)
const {
1719 const cool::StorageType& stype=spec.storageType();
1722 if (stype==cool::StorageType::Bool) {
1724 sptr=
static_cast<void*
>(
new unsigned int(0));
1726 }
else if (stype==cool::StorageType::UChar) {
1727 sptr=
static_cast<void*
>(
new unsigned char(
' '));
1729 }
else if (stype==cool::StorageType::Int16) {
1730 sptr=
static_cast<void*
>(
new short(0));
1732 }
else if (stype==cool::StorageType::UInt16) {
1733 sptr=
static_cast<void*
>(
new unsigned short(0));
1735 }
else if (stype==cool::StorageType::Int32) {
1736 sptr=
static_cast<void*
>(
new int(0));
1738 }
else if (stype==cool::StorageType::UInt32) {
1739 sptr=
static_cast<void*
>(
new unsigned int(0));
1741 }
else if (stype==cool::StorageType::Int64) {
1742 sptr=
static_cast<void*
>(
new long long int(0));
1744 }
else if (stype==cool::StorageType::UInt63) {
1745 sptr=
static_cast<void*
>(
new unsigned long long int(0));
1747 }
else if (stype==cool::StorageType::Float) {
1748 sptr=
static_cast<void*
>(
new float(0.));
1750 }
else if (stype==cool::StorageType::Double) {
1751 sptr=
static_cast<void*
>(
new double(0.));
1753 }
else if (stype==cool::StorageType::String4k ||
1754 stype==cool::StorageType::String255) {
1755 sptr=
static_cast<void*
>(
new char[4100]);
1757 }
else if (stype==cool::StorageType::String64k && !
m_noclobroot) {
1758 sptr=
static_cast<void*
>(
new char[65536]);
1760 }
else if (stype==cool::StorageType::String16M && !
m_noclobroot) {
1761 sptr=
static_cast<void*
>(
new char[67108864]);
1763 }
else if (stype==cool::StorageType::Blob64k && !
m_noclobroot) {
1764 sptr=
static_cast<void*
>(
new char[65536]);
1767 std::cout <<
"rootAllocate: Unsupported storage type for attribute: " <<
1768 spec.name() << std::endl;
1770 return (sptr!=
nullptr);
1776 const cool::StorageType& stype=field.storageType();
1777 if (stype==cool::StorageType::Bool) {
1779 *(
static_cast<int*
>(sptr))=0;
1781 *(
static_cast<int*
>(sptr))=(field.data<
bool>() ? 1 : 0);
1783 }
else if (stype==cool::StorageType::UChar) {
1785 *(
static_cast<unsigned char*
>(sptr))=0;
1787 *(
static_cast<unsigned char*
>(sptr))=field.data<
unsigned char>();
1789 }
else if (stype==cool::StorageType::Int16) {
1791 *(
static_cast<short*
>(sptr))=0;
1793 *(
static_cast<short*
>(sptr))=field.data<
short>();
1795 }
else if (stype==cool::StorageType::UInt16) {
1797 *(
static_cast<unsigned short*
>(sptr))=0;
1799 *(
static_cast<unsigned short*
>(sptr))=field.data<
unsigned short>();
1801 }
else if (stype==cool::StorageType::Int32) {
1803 *(
static_cast<int*
>(sptr))=0;
1805 *(
static_cast<int*
>(sptr))=field.data<
int>();
1807 }
else if (stype==cool::StorageType::UInt32) {
1809 *(
static_cast<unsigned int*
>(sptr))=0;
1811 *(
static_cast<unsigned int*
>(sptr))=field.data<
unsigned int>();
1813 }
else if (stype==cool::StorageType::Int64) {
1815 *(
static_cast<long long*
>(sptr))=0;
1817 *(
static_cast<long long*
>(sptr))=field.data<
long long>();
1819 }
else if (stype==cool::StorageType::UInt63) {
1821 *(
static_cast<unsigned long long*
>(sptr))=0;
1823 *(
static_cast<unsigned long long*
>(sptr))=field.data<
unsigned long long>();
1825 }
else if (stype==cool::StorageType::Float) {
1827 *(
static_cast<float*
>(sptr))=0.;
1829 *(
static_cast<float*
>(sptr))=field.data<
float>();
1831 }
else if (stype==cool::StorageType::Double) {
1833 *(
static_cast<double*
>(sptr))=0.;
1835 *(
static_cast<double*
>(sptr))=field.data<
double>();
1837 }
else if (stype==cool::StorageType::String255 ||
1838 stype==cool::StorageType::String4k ||
1839 stype==cool::StorageType::String64k ||
1840 stype==cool::StorageType::String16M) {
1842 strcpy(
static_cast<char*
>(sptr),
"NULL");
1844 strcpy(
static_cast<char*
>(sptr),field.data<std::string>().c_str());
1846 }
else if (stype==cool::StorageType::Blob64k && !
m_noclobroot) {
1848 strcpy(
static_cast<char*
>(sptr),
"NULL");
1850 auto blob = field.data<coral::Blob>();
1851 std::string blobStr((
char*)blob.startingAddress(), blob.size());
1852 strcpy(
static_cast<char*
>(sptr), blobStr.c_str());
1855 std::cout <<
"ERROR: Unknown storage type in rootWrite!" << std::endl;
1860 const cool::IFolderPtr& sourcefl,
const std::string& sourcetag,
1861 const cool::ValidityKey since,
const cool::ValidityKey until,
1862 const bool timestamp) {
1864 std::cout <<
"Analyse tag " << sourcetag <<
" of folder " << folder <<
1868 std::cout <<
"Analyse time structures with tolerance of " <<
1869 m_anadelt/1.E9 <<
" seconds " << std::endl;
1873 if (gDirectory->FindObject(
dirname.c_str())==
nullptr) {
1874 std::cout <<
"Make directory " <<
dirname << std::endl;
1875 gDirectory->mkdir(
dirname.c_str());
1877 gDirectory->cd(
dirname.c_str());
1879 std::vector<cool::ChannelId> channels=sourcefl->listChannels();
1880 unsigned int nchan=channels.size();
1882 long long* lastiov=
new long long[nchan];
1883 long long* iovtotlen=
new long long[nchan];
1884 long long* iovtotgap=
new long long[nchan];
1885 int* iovn=
new int[nchan];
1886 for (
unsigned int i=0;i<nchan;++i) {
1892 cool::ValidityKey globsince=cool::ValidityKeyMax;
1893 cool::ValidityKey globuntil=cool::ValidityKeyMin;
1896 TH1F* h_iovchan=
bookOrFindTH1F(
"IOVSperChannel",
"IOVs per channel",
1897 nchan,-0.5,nchan-0.5);
1899 "IOVs per channel-name (copy of IOVSperChannel)",
1900 nchan,-0.5,nchan-0.5);
1901 TH1F* h_iovlength=
bookOrFindTH1F(
"IOVLogLength",
"IOV log10 length",
1903 TH1F* h_iovgap=
bookOrFindTH1F(
"IOVLogGapLength",
"IOV log10 gap length",
1906 TH1F* h_anadelt=
nullptr;
1907 TH1F* h_chandelt=
nullptr;
1909 h_anadelt=
bookOrFindTH1F(
"IOVAlignLogDelT",
"IOV alignment log deltaT",
1913 h_chandelt=
bookOrFindTH1F(
"AlignedChanPerIOV",
"Aligned channels per IOV",
1914 nchan*2,0.5,nchan*2-0.5);
1916 std::cout <<
"Booked histograms for folder with " << nchan <<
" channels"
1919 using IOVTimeMap = std::map<cool::ValidityKey, int>;
1920 IOVTimeMap iov_time_map;
1924 cool::FolderVersioning::Mode vermode=sourcefl->versioningMode();
1925 cool::IObjectIteratorPtr sourceitr;
1927 if (vermode==cool::FolderVersioning::SINGLE_VERSION) {
1928 sourceitr=sourcefl->browseObjects(since,until,
m_chansel);
1930 sourceitr=sourcefl->browseObjects(since,until,
m_chansel,sourcetag);
1933 catch (cool::Exception& e) {
1934 std::cout <<
"Exception thrown from analysis copy iterator setup: " <<
1935 e.what() << std::endl;
1939 std::map<cool::ChannelId,std::string>
1940 chanmap=sourcefl->listChannelsWithNames();
1943 while (sourceitr->goToNext()) {
1944 const cool::IObject& sobj=sourceitr->currentRef();
1946 cool::ChannelId ichanid=sobj.channelId();
1947 const std::string& cname=chanmap[ichanid];
1948 std::pair<std::vector<cool::ChannelId>::iterator,
1949 std::vector<cool::ChannelId>::iterator > chanitr=
1950 std::equal_range(channels.begin(),channels.end(),ichanid);
1951 if (chanitr.first!=chanitr.second) {
1952 cool::ChannelId ichan=std::distance(channels.begin(),chanitr.first);
1953 Int_t
bin=h_iovchan->Fill(ichan);
1954 if (ichan && !h_iovname->GetBinContent(
bin)) {
1955 h_iovname->GetXaxis()->SetBinLabel(
bin,cname.c_str());
1957 h_iovname->Fill(ichan);
1959 cool::ValidityKey since2=sobj.since();
1960 cool::ValidityKey until2=sobj.until();
1961 if (since2<globsince) globsince=since2;
1963 if (until2!=cool::ValidityKeyMax) {
1964 if (until2>globuntil) globuntil=until2;
1965 long long len=until2-since2;
1966 h_iovlength->Fill(log10(len));
1968 iovtotlen[ichan]+=len;
1970 if (lastiov[ichan]<
static_cast<long long>(since2) &&
1971 lastiov[ichan]>=0) {
1973 long long gap=since2-lastiov[ichan];
1974 iovtotgap[ichan]+=gap;
1975 h_iovgap->Fill(log10(gap));
1976 std::cout <<
"Gap of " << gap << std::endl;
1978 if (until2!=cool::ValidityKeyMax) {
1979 lastiov[ichan]=until2;
1981 lastiov[ichan]=since2;
1989 IOVTimeMap::iterator hiitr=iov_time_map.lower_bound(since2);
1990 IOVTimeMap::iterator lowitr=hiitr;
1991 if (hiitr!=iov_time_map.end()) {
1993 del1=hiitr->first-since2;
1995 if (lowitr!=iov_time_map.begin()) {
1998 del2=since2-lowitr->first;
2001 IOVTimeMap::iterator moditr;
2003 if (del1<=m_anadelt && del1>-1) {
2008 if (del2<=m_anadelt && del2>-1 && (del2<del || del==-1)) {
2016 h_anadelt->Fill(log10(del));
2018 h_anadelt->Fill(0.);
2021 iov_time_map[since2]=0;
2026 std::cout <<
"ERROR :Channel " << ichanid <<
2027 " not found in channel list - ignored" << std::endl;
2031 std::cout <<
"Finished analysis with " << nobj <<
" objects" << std::endl;
2033 std::cout <<
"IOV timestamp range: " << globsince <<
" " <<
2034 timeString(globsince) <<
"to " << globuntil <<
" " <<
2037 std::cout <<
"IOV run/LB range [" << (globsince >> 32) <<
"," <<
2038 (globsince & 0xFFFFFFFF) <<
"] to [" << (globuntil >> 32) <<
"," <<
2039 (globuntil & 0xFFFFFFFF) <<
"]" << std::endl;
2042 TH1F* h_iovoccchan=
bookOrFindTH1F(
"ChannelOcc",
"Channel Occupancy",
2043 nchan,-0.5,nchan-0.5);
2045 "Mean IOV length per channel",nchan,-0.5,nchan-0.5);
2046 for (
unsigned int i=0;i<nchan;++i) {
2050 occ=1.-float(iovtotgap[i])/float(iovtotlen[i]+iovtotgap[i]);
2051 avlen=float(iovtotlen[i])/iovn[i];
2053 h_iovoccchan->Fill(i,occ);
2054 h_iovlenchan->Fill(i,avlen);
2057 std::cout <<
"Alignment analysis: " << iov_time_map.size()
2058 <<
" seperate IOV starts (tolerance " <<
m_anadelt/1.E9 <<
2059 " seconds)" << std::endl;
2061 for (IOVTimeMap::const_iterator itr=iov_time_map.begin();
2062 itr!=iov_time_map.end();++itr) {
2063 h_chandelt->Fill(itr->second);
2067 catch (cool::Exception& e) {
2068 std::cout <<
"Exception thrown from folder analysis reading loop: " <<
2069 e.what() << std::endl;
2074 delete [] iovtotlen;
2075 delete [] iovtotgap;
2076 delete[] iovn; iovn=
nullptr;
2081 const std::string& htitle,
2082 const int nchan,
const float xlow,
const float xhigh) {
2085 TObject* obj=gDirectory->FindObject(hID.c_str());
2087 return new TH1F(hID.c_str(),htitle.c_str(),nchan,xlow,xhigh);
2089 return static_cast<TH1F*
>(obj);
2098 for (std::vector<std::string>::const_iterator ifolder=
2099 m_folderlist.begin();ifolder!=m_folderlist.end();++ifolder) {
2100 int code=copyFolder(*ifolder,m_tags);
2101 if (code>retcode) retcode=code;
2103 if (!m_hiparent.empty()) {
2105 int code=tagParents();
2106 if (code>retcode) retcode=code;
2108 if (m_copytaginfo) {
2110 int code=writeTagInfo();
2111 if (code>retcode) retcode=code;
2115 if (m_poolcat.empty()) {
2116 code=listPoolRefs();
2117 if (!m_checkoutputfile.empty()) filePoolRefs();
2119 code=resolvePoolRefs();
2121 if (code>retcode) retcode=code;
2124 p_rootfile->Write();
2134 std::vector<std::string>& folders) {
2140 std::string_view par0=argv[ic];
2142 if (par0.compare(0,2,
"--")==0) par0=par0.substr(1);
2143 if ((par0==
"-f" || par0==
"-folder") &&
ir>1) {
2144 folders.emplace_back(argv[ic+1]);
2146 }
else if ((par0==
"-e" || par0==
"-exclude") &&
ir>1) {
2149 }
else if ((par0==
"-t" || par0==
"-tag") &&
ir>1) {
2150 m_tags.emplace_back(argv[ic+1]);
2152 }
else if ((par0==
"-mt" || par0==
"-magic") &&
ir>1) {
2153 m_magic.push_back(
"_"+std::string(argv[ic+1]));
2155 }
else if ((par0==
"-of" || par0==
"-outfolder") &&
ir>1) {
2158 }
else if ((par0==
"-ot" || par0==
"-outtag") &&
ir>1) {
2161 }
else if ((par0==
"-bs" || par0==
"-buffersize") &&
ir>1) {
2164 }
else if ((par0==
"-sl" || par0==
"-seal") &&
ir>1) {
2167 }
else if ((par0==
"-rls" || par0==
"-runlumisince") &&
ir>2) {
2170 }
else if ((par0==
"-rlu" || par0==
"-runlumiuntil") &&
ir>2) {
2173 }
else if ((par0==
"-nrls" || par0==
"-newrunlumisince") &&
ir>2) {
2176 }
else if ((par0==
"-nrlu" || par0==
"-newrunlumiuntil") &&
ir>2) {
2179 }
else if ((par0==
"-srls" || par0==
"-skiprunlumisince") &&
ir>2) {
2183 }
else if ((par0==
"-srlu" || par0==
"-skiprunlumiuntil") &&
ir>2) {
2187 }
else if (par0==
"-ro" || par0==
"-root") {
2189 }
else if (par0==
"-zn" || par0==
"-zeronull") {
2191 }
else if (par0==
"-ana" || par0==
"-analyse") {
2193 float ttime=atof(argv[ic+1])*1.E9;
2194 m_anadelt=
static_cast<long long>(ttime);
2196 }
else if ((par0==
"-rs" || par0==
"-runsince") &&
ir>1) {
2197 m_runemin=(
static_cast<long long>(atol(argv[ic+1])) << 32);
2199 }
else if ((par0==
"-ru" || par0==
"-rununtil") &&
ir>1) {
2200 m_runemax=(
static_cast<long long>(1+atol(argv[ic+1])) << 32)-1;
2202 }
else if ((par0==
"-r" || par0==
"-run") &&
ir>1) {
2203 m_runemin=(
static_cast<long long>(atol(argv[ic+1])) << 32);
2204 m_runemax=(
static_cast<long long>(1+atol(argv[ic+1])) << 32)-1;
2206 }
else if ((par0==
"-ts" || par0==
"-timesince") &&
ir>1) {
2209 }
else if ((par0==
"-tu" || par0==
"-timeuntil") &&
ir>1) {
2212 }
else if ((par0==
"-nts" || par0==
"-newtimesince") &&
ir>1) {
2215 }
else if ((par0==
"-ntu" || par0==
"-newtimeuntil") &&
ir>1) {
2218 }
else if (par0==
"-c" || par0==
"-create") {
2220 }
else if ((par0==
"-ch" || par0==
"-channel") &&
ir>1) {
2223 }
else if ((par0==
"-ch1" || par0==
"-channel1") &&
ir>1) {
2226 }
else if ((par0==
"-ch2" || par0==
"-channel2") &&
ir>1) {
2229 }
else if (par0==
"-chd" || par0==
"-channeldesc") {
2232 }
else if (par0==
"-forcerecreate") {
2234 }
else if (par0==
"-d" || par0==
"-debug") {
2236 }
else if (par0==
"-a" || par0==
"-alliov") {
2238 }
else if (par0==
"-ih" || par0==
"-includehead") {
2240 }
else if (par0==
"-eh" || par0==
"-excludehead") {
2242 }
else if (par0==
"-ht" || par0==
"-headtag") {
2244 }
else if (par0==
"-uht" || par0==
"-userheadtag") {
2246 }
else if (par0==
"-v" || par0==
"-verify") {
2248 }
else if (par0==
"-nc" || par0==
"-nocopy") {
2250 }
else if (par0==
"-noc" || par0==
"-nocoracool") {
2252 }
else if (par0==
"-nch" || par0==
"-nochannel") {
2254 }
else if (par0==
"-ncr" || par0==
"-noclobroot") {
2256 }
else if (par0==
"-nd" || par0==
"-nodata") {
2258 }
else if (par0==
"-nh" || par0==
"-nohitag") {
2260 }
else if (par0==
"-hi" || par0==
"-hitag") {
2262 }
else if ((par0==
"-ec" || par0==
"-excludechannel") &&
ir>1) {
2265 }
else if (par0==
"-fs" || par0==
"-forcesingle") {
2267 }
else if (par0==
"-fm" || par0==
"-forcemulti") {
2269 }
else if (par0==
"-frl" || par0==
"-forcerunlumi") {
2271 }
else if (par0==
"-ftm" || par0==
"-forcetime") {
2273 }
else if (par0==
"-fp" || par0==
"-forcepayload") {
2275 }
else if (par0==
"-fnp" || par0==
"-forcenopayload") {
2277 }
else if (par0==
"-cr" || par0==
"-checkrefs") {
2279 }
else if (par0==
"-lp" || par0==
"-listpfn") {
2282 }
else if (par0==
"-cf" || par0==
"-checkfiles") {
2285 }
else if (par0==
"-pa" || par0==
"-poolall") {
2287 }
else if ((par0==
"-co" || par0==
"-checkoutput") &&
ir>1) {
2290 }
else if ((par0==
"-pc" || par0==
"-poolcat") &&
ir>1) {
2293 }
else if ((par0==
"-mc" || par0==
"-mergecat") &&
ir>1) {
2296 }
else if ((par0==
"-ds" || par0==
"-dataset") &&
ir>1) {
2299 }
else if (par0==
"-us" || par0==
"-updatesource") {
2301 }
else if (par0==
"-cd" || par0==
"-checkdest") {
2303 }
else if (par0==
"-tr" || par0==
"-truncate") {
2305 }
else if (par0==
"-al" || par0==
"-appendlocked") {
2307 }
else if (par0==
"-alsv" || par0==
"-appendlockedsv") {
2310 }
else if (par0==
"-rdo" || par0==
"-readoracle") {
2312 }
else if (par0==
"-skiprep" || par0==
"-sr") {
2314 }
else if (par0==
"-go" || par0==
"-getonline") {
2316 }
else if (par0==
"-onr" || par0==
"-onlinerun") {
2318 }
else if (par0==
"-gb" || par0==
"-getbulk") {
2320 }
else if (par0==
"-gt" || par0==
"-gettime") {
2322 }
else if ((par0==
"-tdb" || par0==
"-timedb") &&
ir>1) {
2325 }
else if (par0==
"-ignoremode" &&
ir>1) {
2326 std::cout <<
"Ignoremode password is " << argv[ic+1] <<
":end" << std::endl;
2327 if (strcmp(argv[ic+1],
"BackDoor")==0) {
2330 std::cout <<
"ERROR: Incorrect password for -ignoremode" << std::endl;
2334 }
else if (par0==
"-is" || par0==
"-ignorespec") {
2336 }
else if (par0==
"-pt" || par0==
"-prunetags") {
2339 }
else if (par0==
"-lo" || par0==
"-lockedonly") {
2343 }
else if (par0==
"-cti" || par0==
"-copytaginfo") {
2345 }
else if (par0==
"-ctl" || par0==
"-copytaglock") {
2348 }
else if ((par0==
"-tl" || par0==
"-taglabel") &&
ir>1) {
2352 }
else if ((par0==
"-ag" || par0==
"-addguid") &&
ir>1) {
2355 }
else if ((par0==
"-alf" || par0==
"-addlfn") &&
ir>1) {
2358 }
else if ((par0==
"-pf" || par0==
"-parfile") &&
ir>1) {
2361 }
else if ((par0==
"-rf" || par0==
"-runfile") &&
ir>1) {
2364 }
else if ((par0==
"-ws" || par0==
"-runinfohost") &&
ir>1) {
2367 }
else if (par0==
"-h" || par0==
"-help") {
2371 std::cout <<
"Parameter error for argument: " << par0 << std::endl;
2382 std::vector<std::string> folders;
2387 for (std::vector<std::string>::const_iterator ifile=
m_parfile.begin();
2389 std::cout <<
"Reading parameters from file " << *ifile << std::endl;
2390 FILE* p_inp=fopen(ifile->c_str(),
"r");
2391 if (p_inp==
nullptr) {
2392 std::cout <<
"File not found" << std::endl;
2395 std::vector<char> p_buf (999);
2396 while (!feof(p_inp)) {
2397 char* p_line=fgets(p_buf.data(),p_buf.size(),p_inp);
2398 if (p_line!=
nullptr) {
2400 const char* fargv[99];
2402 char* p_start=
nullptr;
2403 while (*p_line!=
'\0') {
2404 if (*p_line==
' ' || *p_line==
'\n') {
2406 if (p_start!=
nullptr) {
2409 fargv[fargc]=p_start;
2415 if (p_start==
nullptr) p_start=p_line;
2427 std::cout <<
"Close file" << std::endl;
2433 std::cout <<
"Problem opening connections" << std::endl;
2442 if (folders.empty()) {
2447 for (std::vector<std::string>::const_iterator ifold=folders.begin();
2448 ifold!=folders.end();++ifold)
addFolder(*ifold,
false);
2467 std::cout <<
"Source run/LB range [" << (
m_runemin >> 32) <<
"," <<
2469 (
m_runemax & 0xFFFFFFFF) <<
"]" << std::endl;
2471 std::cout <<
"Source timestamp range " <<
m_timemin <<
" " <<
2475 std::cout <<
"Change o/p run/LB range [" << (
m_newrunemin >> 32) <<
"," <<
2479 std::cout <<
"Change o/p timestamp range " <<
m_newtimemin <<
" " <<
2483 std::cout <<
"Skip IOVs extending outside run/LB range [" <<
2489 for (std::vector<cool::ChannelId>::const_iterator itr=
2491 std::cout <<
"Channel " << *itr <<
" will be excluded" << std::endl;
2493 if (
m_hitag) std::cout <<
"All hierarchical tags connecting to referenced tags will be copied" << std::endl;
2494 if (
m_nohitag) std::cout <<
"Hierarchical tag relations will not be copied"
2502 const char*
cptr=input;
2503 while (*
cptr!=
'\0') {
2504 if (!isdigit(*
cptr)) { isnum=
false;
break;}
2511 const cool::IRecord& rhs) {
2514 if (lhs.size()!=rhs.size())
return false;
2515 for (
size_t i=0;i<lhs.size();++i) {
2517 if (lhs[i].specification().storageType()!=
2518 rhs[i].specification().storageType())
2521 if (lhs[i]!=rhs[i]) {
2524 const cool::StorageType& stype=lhs[i].specification().storageType();
2525 if (stype==cool::StorageType::String255 ||
2526 stype==cool::StorageType::String4k ||
2527 stype==cool::StorageType::String64k ||
2528 stype==cool::StorageType::String16M) {
2548 return static_cast<long long>(atol(input))*
2549 static_cast<long long>(1.E9);
2551 struct tm mytm{},mytm2{};
2552 char* result=strptime(input,
"%Y-%m-%d:%T",&mytm);
2553 if (result!=
nullptr) {
2559 time_t tm = mktime(&mytm);
2560 if (tm ==
static_cast<time_t
>(-1)) {
2562 "ERROR in mktime" << std::endl;
2565 cool::ValidityKey itime=
static_cast<cool::ValidityKey
>(tm);
2566 strptime(
"1970-01-02:00:00:00",
"%Y-%m-%d:%T",&mytm2);
2567 time_t tm2 = mktime(&mytm2);
2568 if (tm2 ==
static_cast<time_t
>(-1)) {
2570 "ERROR in mktime" << std::endl;
2573 cool::ValidityKey caltime=
static_cast<cool::ValidityKey
>(tm2);
2574 itime+=24*60*60-caltime;
2575 return itime*
static_cast<cool::ValidityKey
>(1.E9);
2578 "ERROR in format of time value, use e.g. 2007-05-25:14:01:00" <<
2586 if (iovtime==cool::ValidityKeyMin) {
2587 return "ValidityKeyMin ";
2588 }
else if (iovtime==cool::ValidityKeyMax) {
2589 return "ValidityKeyMax ";
2591 time_t time=
static_cast<time_t
>(iovtime/1E9);
2594 return "UTC "+std::string(asctime_r(gmtime_r(&time, &result), buf));
2601 cool::ValidityKey val;
2602 if (input1[0]==
'M' || input1[0]==
'm') {
2603 val=((1LL << 31)-1) << 32;
2605 val=
static_cast<long long>(atol(input1)) << 32;
2607 if (input2[0]==
'M' || input2[0]==
'm') {
2612 if (val>cool::ValidityKeyMax) val=cool::ValidityKeyMax;
2630 std::string sorfolder=
"/TDAQ/RunCtrl/SOR_Params";
2631 std::string eorfolder=
"/TDAQ/RunCtrl/EOR_Params";
2632 if (
m_timedb.find (
"CONDBR2")!=std::string::npos) {
2633 sorfolder=
"/TDAQ/RunCtrl/SOR";
2634 eorfolder=
"/TDAQ/RunCtrl/EOR";
2636 std::cout <<
"Extracting times for run range [" << (
m_runemin >> 32) <<
2638 " folder " << sorfolder << std::endl;
2640 std::cout <<
"ERROR: Run range not correctly specified" << std::endl;
2644 cool::IDatabasePtr tdaqdb;
2647 std::cout <<
"Opened database connection" << std::endl;
2649 catch (std::exception& e) {
2650 std::cout <<
"COOL exception caught: " << e.what() << std::endl;
2655 cool::IFolderPtr folder=tdaqdb->getFolder(sorfolder);
2658 cool::ChannelSelection::all());
2660 while (itr->goToNext()) {
2661 const cool::IRecord& payload=itr->currentRef().payload();
2662 m_timemin=payload[
"SORTime"].data<
unsigned long long>();
2667 std::cout <<
"ERROR: Found " << nobj <<
" SOR records" << std::endl;
2671 catch (std::exception& e) {
2672 std::cout <<
"Exception accessing SOR information: " << e.what() <<
2678 cool::IFolderPtr folder=tdaqdb->getFolder(eorfolder);
2680 cool::IObjectIteratorPtr itr=folder->browseObjects(((
m_runemax >> 32) << 32),((
m_runemax >> 32) << 32),
2681 cool::ChannelSelection::all());
2683 while (itr->goToNext()) {
2684 const cool::IRecord& payload=itr->currentRef().payload();
2685 m_timemax=payload[
"EORTime"].data<
unsigned long long>();
2690 std::cout <<
"ERROR: Found " << nobj <<
" EOR records" << std::endl;
2694 catch (std::exception& e) {
2695 std::cout <<
"Exception accessing SOR information: " << e.what() <<
2699 tdaqdb->closeDatabase();
2700 std::cout <<
"Timestamp range set to " <<
m_timemin <<
" " <<
2710 std::cout <<
"Extracting current run-number from ATLAS_RUN_NUMBER @ ATONR_ADG ... " <<
2712 curl_global_init(CURL_GLOBAL_ALL);
2713 using uniqueCurl_t = std::unique_ptr<CURL,
decltype(&curl_easy_cleanup)>;
2714 uniqueCurl_t curl(curl_easy_init(), curl_easy_cleanup);
2715 CURLcode
res = CURLE_OK;
2717 std::string url =
m_runinfohost +
"/runs?sort=runnumber:DESC&size=1";
2719 res = curl_easy_setopt(curl.get(), CURLOPT_URL, url.c_str());
2720 if (
res != CURLE_OK) {
2721 std::cerr <<
"Failed to perform request: curl_easy_setopt, line "<<__LINE__<<std::endl;
2725 res = curl_easy_setopt(curl.get(), CURLOPT_FOLLOWLOCATION, 1L);
2726 if (
res != CURLE_OK) {
2727 std::cerr <<
"Failed to perform request: curl_easy_setopt, line "<<__LINE__<<std::endl;
2735 if (
res != CURLE_OK) {
2736 std::cerr <<
"Failed to perform request: curl_easy_setopt, line "<<__LINE__<<std::endl;
2739 res = curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &
response);
2740 if (
res != CURLE_OK) {
2741 std::cerr <<
"Failed to perform request: curl_easy_setopt, line "<<__LINE__<<std::endl;
2746 res = curl_easy_perform(curl.get());
2747 if (
res != CURLE_OK) {
2748 std::cerr <<
"Failed to perform request: " << curl_easy_strerror(
res) <<
":" << url << std::endl;
2752 std::cout <<
"Response: " << std::endl;
2753 std::cout <<
response << std::endl;
2756 nlohmann::json jsonData = nlohmann::json::parse(
response);
2759 int runNumber = jsonData[
"resources"][0][
"runnumber"];
2760 int nextrun=runNumber+1;
2761 std::cout <<
"Next run started will be " << nextrun << std::endl;
2762 const long long rtime=time(
nullptr);
2763 std::cout <<
"Epoch time extracted " << rtime << std::endl;
2770 m_runemin=(
static_cast<long long>(nextrun)) << 32;
2771 m_timemin=rtime*
static_cast<long long>(1E9);
2774 }
catch (nlohmann::json::parse_error& e) {
2775 std::cerr <<
"Failed to parse JSON response: " << e.what() << std::endl;
2777 }
catch (nlohmann::json::type_error& e) {
2778 std::cerr <<
"Failed to extract data from JSON response: " << e.what() << std::endl;
2780 }
catch (std::exception& e) {
2781 std::cerr <<
"Failed to extract run and timestamp from JSON response: " << e.what() << std::endl;
2787 std::cerr <<
"Failed to initialize libcurl." << std::endl;
2791 curl_global_cleanup();
2797 std::cout <<
"ERROR: -getonline and -getbulk cannot be used simultaneously"
2801 std::cout <<
"Call getbulk using URL" << std::endl;
2803 curl_global_init(CURL_GLOBAL_ALL);
2804 using uniqueCurl_t = std::unique_ptr<CURL,
decltype(&curl_easy_cleanup)>;
2805 uniqueCurl_t curl(curl_easy_init(), curl_easy_cleanup);
2807 CURLcode
res = CURLE_OK;
2812 res = curl_easy_setopt(curl.get(), CURLOPT_URL, url.c_str());
2813 if (
res != CURLE_OK) {
2814 std::cerr <<
"Failed to perform request: curl_easy_setopt, line "<<__LINE__<<std::endl;
2818 res = curl_easy_setopt(curl.get(), CURLOPT_FOLLOWLOCATION, 1L);
2819 if (
res != CURLE_OK) {
2820 std::cerr <<
"Failed to perform request: curl_easy_setopt, line "<<__LINE__<<std::endl;
2828 if (
res != CURLE_OK) {
2829 std::cerr <<
"Failed to perform request: curl_easy_setopt, line "<<__LINE__<<std::endl;
2832 res = curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &
response);
2833 if (
res != CURLE_OK) {
2834 std::cerr <<
"Failed to perform request: curl_easy_setopt, line "<<__LINE__<<std::endl;
2838 res = curl_easy_perform(curl.get());
2839 if (
res != CURLE_OK) {
2840 std::cerr <<
"Failed to perform request: " << curl_easy_strerror(
res) <<
":" << url << std::endl;
2844 std::cout <<
"Response: " << std::endl;
2845 std::cout <<
response << std::endl;
2848 nlohmann::json jsonData = nlohmann::json::parse(
response);
2850 int nextrun = jsonData[
"run"];
2851 long long rtime = jsonData[
"timestamp"];
2852 std::cout <<
"Next run started will be " << nextrun << std::endl;
2853 std::cout <<
"Epoch time extracted " << rtime << std::endl;
2860 m_runemin=(
static_cast<long long>(nextrun)) << 32;
2861 m_timemin=rtime*
static_cast<long long>(1E9);
2864 }
catch (nlohmann::json::parse_error& e) {
2865 std::cerr <<
"Failed to parse JSON response: " << e.what() << std::endl;
2867 }
catch (nlohmann::json::type_error& e) {
2868 std::cerr <<
"Failed to extract data from JSON response: " << e.what() << std::endl;
2870 }
catch (std::exception& e) {
2871 std::cerr <<
"Failed to extract run and timestamp from JSON response: " << e.what() << std::endl;
2877 std::cerr <<
"Failed to initialize libcurl." << std::endl;
2881 curl_global_cleanup();
2888 for (std::vector<std::string>::const_iterator itr=
m_runfile.begin();
2890 std::cout <<
"Reading allowed run numbers from file " << *itr << std::endl;
2891 FILE* p_inp=fopen(itr->c_str(),
"r");
2892 if (p_inp==
nullptr) {
2893 std::cout <<
"File not found" << std::endl;
2896 std::vector<char> p_buf (999);
2897 while (!feof(p_inp)) {
2898 char* p_line=fgets(p_buf.data(),p_buf.size(),p_inp);
2899 if (p_line!=
nullptr) {
2900 unsigned int run=atoi(p_line);
2907 std::cout <<
"Read list of " <<
m_runlist.size() <<
" runs from " <<
2908 m_runfile.size() <<
" input runlist files" << std::endl;
2909 for (std::vector<unsigned int>::const_iterator itr=
m_runlist.begin();
2910 itr!=
m_runlist.end();++itr) std::cout <<
2911 "Update allowed for run " << *itr << std::endl;
2916 std::string_view tag) {
2919 std::string_view modestr=
"";
2921 std::string::size_type iofs1=desc.find(
"<updateMode>");
2922 std::string::size_type iofs2=desc.find(
"</updateMode>");
2923 if (iofs1!=std::string::npos && iofs2!=std::string::npos && iofs2>iofs1)
2924 modestr=desc.substr(iofs1+12,iofs2-iofs1-12);
2925 if (modestr==
"UPD1" || tag.find(
"UPD1")!=std::string::npos) mode=1;
2926 if (modestr==
"UPD2" || tag.find(
"UPD2")!=std::string::npos) mode=2;
2927 if (modestr==
"UPD3" || tag.find(
"UPD3")!=std::string::npos) mode=3;
2928 if (modestr==
"UPD4" || tag.find(
"UPD4")!=std::string::npos) mode=4;
2934 const cool::IFolderPtr& sourcefl,
const cool::IFolderPtr& destfl,
2940 const std::map<cool::ChannelId,std::string> chanmap=
2941 sourcefl->listChannelsWithNames();
2942 if (
m_debug) std::cout <<
"Checking channels table for folder " << folder
2943 <<
" with " << chanmap.size() <<
" channels" << std::endl;
2947 for (std::map<cool::ChannelId,std::string>::const_iterator
2948 itr=chanmap.begin();itr!=chanmap.end();++itr) {
2950 const cool::ChannelId chan=itr->first;
2956 if (!
m_chansel.inSelection(chan))
continue;
2958 const std::string& sourcename=itr->second;
2960 std::string sourcedesc=
"";
2961 if (
m_chdesc) sourcedesc=sourcefl->channelDescription(chan);
2963 if (!newfolder && destfl->existsChannel(chan)) {
2964 const std::string & destname=destfl->channelName(chan);
2965 std::string destdesc=
"";
2966 if (
m_chdesc) destdesc=destfl->channelDescription(chan);
2968 if (sourcename!=destname && !sourcename.empty()) {
2971 std::cout <<
"ERROR: Channel " << chan <<
" names differ: " <<
2972 sourcename <<
" " << destname << std::endl;
2975 destfl->setChannelName(chan,sourcename);
2976 std::cout <<
"Modify channel " << chan <<
" name from "
2977 << destname <<
" to " << sourcename << std::endl;
2980 if (sourcedesc!=destdesc && !sourcedesc.empty()) {
2983 std::cout <<
"ERROR: Channel " << chan <<
" descriptions differ: "
2984 << sourcedesc <<
" " << destdesc << std::endl;
2987 std::cout <<
"Modify channel " << chan <<
" description from "
2988 << sourcedesc <<
" to " << destdesc << std::endl;
2989 destfl->setChannelDescription(chan,sourcedesc);
2996 if (
m_debug) std::cout <<
"Create new channel " << chan <<
" name "
2997 << sourcename <<
" description" << sourcedesc << std::endl;
2998 destfl->createChannel(chan,sourcename,sourcedesc);
3002 if (ncreate>0) std::cout <<
"Created " << ncreate <<
" new channels for "
3003 << folder << std::endl;
3004 if (nmodify>0) std::cout <<
"Modified " << nmodify <<
" channel info for "
3005 << folder << std::endl;
3011 const std::string& folder,
const std::string& tag) {
3012 const std::string name=payload[0].name();
3013 if (name==
"PoolRef" || name==
"fileGUID") {
3014 std::string poolref;
3015 std::string addr=payload[0].data<std::string>();
3016 if (name==
"PoolRef") {
3017 std::string::size_type iofs1=addr.find(
"[DB=");
3018 std::string::size_type iofs2=addr.find(
']',iofs1);
3019 if (iofs1!=std::string::npos && iofs2!=std::string::npos && iofs2>iofs1) {
3020 poolref=addr.substr(iofs1+4,iofs2-iofs1-4);
3022 std::cout <<
"ERROR: Badly formed POOL object reference " <<
3027 poolref=std::move(addr);
3029 std::string foldertag=folder+
":"+tag;
3048 std::cout <<
"Copying additional hierarchical tags of parent folders"
3056 cool::IFolderSetPtr sourcefl=
m_sourceDbPtr->getFolderSet(folderset);
3057 cool::IFolderSetPtr destfl=
m_destDbPtr->getFolderSet(folderset);
3058 std::cout <<
"Processing folderset " << folderset << std::endl;
3059 for (HiTagMap::const_iterator imap=
m_hitagmap.begin();
3063 std::string sourcetag=sourcefl->findTagRelation(imap->first);
3064 std::cout <<
"Create hierarchical tag between " << sourcetag <<
3065 " and " << imap->first <<
" in folder " << imap->second <<
3069 std::string etag=destfl->resolveTag(imap->first);
3070 if (etag==sourcetag) {
3071 std::cout <<
"This relation has already been created" << std::endl;
3073 std::cout <<
"ERROR: Tag in parent already related to " <<
3078 catch (cool::Exception& e ) {
3081 destfl->createTagRelation(imap->first,sourcetag);
3087 m_cooltagmap.insert(CoolTagMap::value_type(imap->first,
3089 imap->first,imap->first)));
3091 catch (cool::Exception& e) {
3092 std::cout <<
"Cool exception " << e.what() <<
3093 "thrown in hierarchical tag creation" << std::endl;
3099 catch (cool::Exception& e) { }
3102 std::cout <<
"ERROR Folderset " << folderset <<
" not found" <<
3110 std::cout <<
"Write tag description ";
3112 std::cout <<
"for " <<
m_cooltagmap.size() <<
" tags" << std::endl;
3113 for (CoolTagMap::const_iterator itr=
m_cooltagmap.begin();
3121 std::cout <<
"Total of " <<
m_poolrefs.size() <<
" POOL files referenced"
3123 for (PoolMap::const_iterator ipool=
m_poolrefs.begin();
3125 std::cout <<
"Ref " << ipool->first <<
" (" << ipool->second.count()
3126 <<
")" << std::endl;
3132 std::cout <<
"Total of " << m_poolrefs.size() <<
" POOL Files referenced"
3135 if (catalog==
nullptr)
return 110;
3139 pool_utility.startSession();
3142 if (!m_addguid.empty()) {
3143 for (std::vector<std::string>::const_iterator itr=m_addguid.begin();
3144 itr!=m_addguid.end();++itr) {
3146 std::cout <<
"Added POOL file GUID: " << *itr << std::endl;
3149 if (!m_addlfn.empty()) {
3150 for (std::vector<std::string>::const_iterator itr=m_addlfn.begin();
3151 itr!=m_addlfn.end();++itr) {
3154 std::cout <<
"Add POOL file GUID: " <<
guid <<
" from LFN " << *itr
3161 using LFNGVec = std::vector<std::pair<std::string, std::string> >;
3163 bool dscopy=!m_newdataset.empty();
3167 for (PoolMap::iterator ipool=m_poolrefs.begin();
3168 ipool!=m_poolrefs.end();++ipool) {
3171 catalog->
getLFNs( guid, lfns );
3172 if( !lfns.empty() ) {
3174 const std::string
lfn = lfns[0].first;
3175 ipool->second.setlfn(lfn);
3176 std::cout <<
"LFN: " <<
lfn <<
" (" << ipool->second.count()
3177 <<
")" << std::endl;
3179 dsfound.push_back(std::pair<std::string,std::string>(lfn,guid));
3182 if (!m_listpfn) ipool->second.setErrorBit(0);
3184 if (m_listpfn || m_poolopen) {
3185 std::string pfn, tech;
3187 if( !pfn.empty() ) {
3188 ipool->second.setpfn(pfn);
3189 std::cout <<
"PFN: " << pfn <<
" (" << ipool->second.count()
3190 <<
")" << std::endl;
3193 std::string hguid=getCoolHistGUID(pfn);
3194 if (!hguid.empty()) {
3196 if (hguid!=ipool->first) {
3197 std::cout <<
"ERROR File CoolHist GUID " << hguid <<
3198 " inconsistent with catalogue " << ipool->first << std::endl;
3199 ipool->second.setErrorBit(3);
3204 const std::string fid = pool_utility.
readFileGUID( pfn );
3205 if( fid != ipool->first ) {
3206 std::cout <<
"ERROR File GUID " << fid <<
3207 " inconsistent with catalogue " << ipool->first << std::endl;
3209 ipool->second.setErrorBit(3);
3212 catch( std::runtime_error& e ) {
3213 std::cout <<
"Cannot open file for reading!" << std::endl;
3214 std::cout <<
e.what() << std::endl;
3216 ipool->second.setErrorBit(2);
3222 ipool->second.setErrorBit(1);
3226 if (ipool->second.errcode()>0) ++nbad;
3236 catalog=setupCatalog(m_mergecat);
3237 if (catalog==
nullptr)
return 110;
3238 const std::string dssname=
"register.sh";
3239 std::cout <<
"Write DQ2 registerFileInDataset commands to " << dssname
3240 <<
" for registration in dataset " << m_newdataset << std::endl;
3241 std::ofstream dsstream(dssname.c_str());
3242 for (LFNGVec::const_iterator itr=dsfound.begin();
3243 itr!=dsfound.end();++itr) {
3244 const std::string&
lfn=itr->first;
3245 const std::string&
guid=itr->second;
3247 catalog->
getLFNs( guid, lfns );
3248 if( !lfns.empty() ) {
3250 const std::string lfn2 = lfns[0].first;
3251 if (lfn2!=lfn) std::cout <<
"WARNING: LFNs for GUID " <<
guid <<
3252 " differ in input/merge datasets: " <<
lfn <<
" vs "
3253 << lfn2 << std::endl;
3256 dsstream <<
"dq2-register-files " << m_newdataset <<
" "
3257 <<
lfn <<
" " <<
guid << std::endl;
3266 std::cout <<
"All POOL references were resolved by catalogues"
3269 std::cout <<
"ERROR Could not resolve " << nbad <<
" files" << std::endl;
3272 if (nbad>0 || m_poolall) filePoolRefs();
3278 std::string hguid=
"";
3279 TFile* myfile=TFile::Open(
file.c_str(),
"READ");
3280 if (myfile!=
nullptr) {
3282 myfile->GetObject(
"fileGUID",oguid);
3283 if (oguid!=
nullptr) {
3284 hguid=oguid->GetString();
3285 std::cout <<
"CoolHist GUID found to be " << hguid << std::endl;
3301 std::cout <<
"ErrCode GUID Count LFN PFN Folders ..." << std::endl;
3302 for (PoolMap::const_iterator ipool=
m_poolrefs.begin();
3304 if (
m_poolall || ipool->second.errcode()>0) {
3305 std::ostringstream line;
3307 line << ipool->second.errcode() <<
" " << ipool->first <<
" " <<
3308 ipool->second.count() <<
" ";
3309 if (!ipool->second.lfn().empty()) {
3310 line << ipool->second.lfn() <<
" ";
3314 if (!ipool->second.pfn().empty()) {
3315 line << ipool->second.pfn() <<
" ";
3319 for (std::vector<std::string>::const_iterator
3320 itr=ipool->second.foldertag().begin();
3321 itr!=ipool->second.foldertag().end();++itr)
3322 line << *itr <<
" ";
3323 std::cout << line.str() << std::endl;
3324 chkostream << line.str() << std::endl;
3330 const std::vector<std::string>& catvec) {
3334 for (std::vector<std::string>::const_iterator icat=catvec.begin();
3335 icat!=catvec.end();++icat) {
3336 std::cout <<
"Add catalogue: " << *icat << std::endl;
3338 if (icat->find(
':')==std::string::npos) {
3347 catch (std::exception& e) {
3348 std::cout <<
"Could not setup POOL catalogues, exception:" << e.what()
3355 std::cout <<
"usage: AtlCoolCopy.exe <sourceCoolDB> <destinationCoolDB> { <options> }" << std::endl;
3356 std::cout <<
"Options are (see doc/mainpage.h for more):" << std::endl <<
3357 "-a, -alliov : set IOVs on destination to [ValidityKeyMin, ValidityKeyMax]" << std::endl <<
" or following settings of -nrls,-nrlu,-nts,-ntu" <<
3359 "-ag, -addguid <guid> : Add GUID to list accessed for POOL checks" <<
3361 "-alf, -addlfn <LFN> : Add LFN to list accessed for POOL checks" <<
3363 "-al, -appendlocked : Allow locked tags to be updated if no overlap" <<
3365 "-alsv, -appendlockedsv : Allow locked tag update for openended IOVs" <<
3367 "-ana, -analyse <delta_t>: produce analysis ROOT file (filename = dest DB argument)" << std::endl <<
3368"-bs, -buffersize <size> : set size of bulkstorage output buf to <size> objs"
3370 "-c, -create : create destination DB if not already existing"
3372 "-cd, -checkdest : Check destination DB and skip already existing tags"
3374 "-ch, -channel : restrict selection to given channel or range specified as c1:c2" << std::endl <<
3375 "-ch1, -channel1 : specify start of a range of channels" << std::endl <<
3376 "-ch2, -channel2 : specify end of a range of channels" << std::endl <<
3377 "-cf, -checkfiles : check POOL files can be opened and have correct GUID"
3379 "-co, -checkoutput <file> : write POOL file check output on file"
3380 << std::endl <<
"-cti, -copytaginfo : Copy tag descriptions"
3381 << std::endl <<
"-ctl, -copytaglock : Copy tag locked status and descriptions"
3382 << std::endl <<
"-cr, -checkrefs : check POOL references"
3383 << std::endl <<
"-d, -debug : produce debug output" << std::endl;
3385 "-ds, -dataset : output register.sh for creating DQ2 datasets "
3387 "-ec, -excludechannel : exclude given channel from copy" << std::endl <<
3388 "-eh, -excludehead : exclude HEAD tag even if no tags found in MV folders"
3390 "-ih, -includehead : include HEAD as well as any tags in MV folders" <<
3392 "-e, -exclude <pattern> : exclude folders" << std::endl <<
3393 "-f, -folder <pattern> : include folders" << std::endl <<
3394 "-fs, -forcesingle : force destination folder to be singleversion"
3396 "-fm, -forcemulti : force destination folder to be multiversion"
3398 "-frl, -forcerunlumi : force destination folder to be run/LB indexed"
3400 "-ftm, -forcetime : force destination folder to be timestamp indexed"
3402 "-fp, -forcepayload : Force destn folders to be created with payload tbl" << std::endl <<
3403 "-fnp, -forcenopayload : Force destn folders to be created without payload tbl" << std::endl <<
3404 "-forcerecreate : delete and recreate destination database" << std::endl;
3405 std::cout <<
"-ht, -headtag : Use HEAD-style tagging"
3407 "-go, -getonline : Set minimum run number (-rls setting) to next ONLINE run"
3409 "-gb, -getbulk : Set minimum run number (-rls setting) to next bulk reco run"
3411 "-gt, -gettime : Extract timestamp information for given run number range"
3413 "-h, -help : print help and exit" << std::endl <<
3414 "-hi, -hitag : Copy hierrchical tags inclusively" << std::endl <<
3415 "-ignoremode <pwd> : Ignore UPDx mode protection (experts only)"
3417 "-is, -ignorespec : Ignore differences in folder spec if names are all equal" << std::endl <<
3418 "-lo, -lockedonly : Only copy locked/partially-locked top-level tags"
3420 "-nc, -nocopy : Do not actually copy, just read source DB" << std::endl <<
3421 "-nch, -nochannel : Do not check or copy channel information" << std::endl
3422<<
"-ncr, -noclobroot: Do not copy CLOB data into ROOT files" << std::endl
3423<<
"-noc, -nocoracool : Do not copy Coracool structure payloads " << std::endl <<
3424 "-nd, -nodata : Copy only folder structures, not data" << std::endl <<
3425 "-nh, -nohitag : Do not follow hierarchical tag relations" << std::endl <<
3426"-mc, -mergecat <catfile> : specify POOL file catalogue for new dataset making"
3428 std::cout <<
"-of, -outfolder <folder> : rename folder on output"
3430 "-onr, -onlinerun : Retrieve run number from online server (not replica)" <<std::endl <<
3431 "-ot, -outtag : " <<
"Rename tag on output" << std::endl;
3433 "-pa, -poolall : Output all POOL files (incl good) when checking files"
3435"-pc, -poolcat <catfile> : specify POOL file catalogue for ref checking"
3437 "-pf, -parfile <file> : Read additional options/parameters from file" <<
3439"-pt, -prunetags : Copy only hierarchical tags descending from specified toptags"
3441"-rdo, -readoracle : force data to be read from Oracle, using dbreplica.config"
3443 "-sl, -seal <val>: Set SEAL (hence COOL/POOL) output level to <val>"
3445 "-sr, -skiprep : Skip folders having <norep/> folder metadata tag" <<
3447 "-t, -tag <tag> : Copy multiversion data with tag <tag>" << std::endl <<
3448 "-mt, -magic <tag> : Include magic tags involving the given pattern " << std::endl <<
3449"-tr, -truncate : Set destination IOVs outside query interval to query interval"
3451"-tl, -taglabel : Specify tag description to enter in destination DB"
3453 "-uht, -userheadtag : Also copy user tag data to the HEAD" << std::endl <<
3454 "-v, -verify : Verify data present on destination rather than copying" <<
3456 "-ro, -root : Produce ROOT output file instead of copying to COOL"
3458 "-zn, -zeronull : Zero NULLs in ROOT file instead of skipping them" <<
3460 "-rls, -runlumisince <run> <LB> : Set minimum IOV interval" << std::endl <<
3461 "-rlu, -runlumiuntil <run> <LB> : Set maximum IOV interval" << std::endl <<
3462 "-rs, -runsince <run> : Set minimum IOV interval" << std::endl <<
3463 "-ru, -rununtil <run> : Set maximum IOV interval" << std::endl <<
3464 "-r, -run <run> : Copy only run <run>" << std::endl <<
3465"-srls, -skiprunlumisince <run> <LB> : Set minimum IOV for skipping IOV in copy"
3467"-srlu, -skiprunlumiuntil <run> <LB> : Set maximum IOV for skipping IOV in copy"
3469 "-tdb, -timedb <dbconn> : Set database connection for time information" <<
3470 "-ts, -timesince <time> : Set minimum IOV interval (UTC SECONDs or UTC YYYY-MM-DD:hh:mm:ss)" <<
3472 "-tu, -timeuntil <time> : Set maximum IOV interval (UTC SECONDs or UTC YYYY-MM-DD:hh:mm:ss)" <<
3475 "-nrls, -newrunlumisince <run> <LB> : Set minimum of output IOV interval (use with -alliov)" << std::endl <<
3476 "-nrlu, -newrunlumiuntil <run> <LB> : Set maximum of output IOV interval (use with --aliov)" << std::endl <<
3477 "-nts, -newtimesince <time> : Set minimum of outputIOV interval (UTC SECONDs or UTC YYYY-MM-DD:hh:mm:ss) (use with --alliov)" <<
3479 "-ntu, -newtimeuntil <time> : Set maximum of output IOV interval (UTC SECONDs or UTC YYYY-MM-DD:hh:mm:ss) (use with --alliov)" <<
3481 std::cout <<
"See http://twiki.cern.ch/twiki/bin/view/Atlas/AtlCoolCopy for more details" << std::endl;
3491 retcode=mycopy.
setOpts(argc-3,&argv[3]);
3496 if (retcode==0) retcode=mycopy.doCopy();
3498 if (retcode>0) std::cout <<
"ERROR AtlCoolCopy.exe fails with exit code " <<
3499 retcode << std::endl;
ElementConstPointer cptr() const
Return a pointer to the referenced element.
int AtlCoolCopy::doCopy ATLAS_NOT_THREAD_SAFE()
Install fatal handler with default options.
size_t WriteCallback(void *contents, size_t size, size_t nmemb, std::string *s)
boost::shared_ptr< CoraCoolObject > CoraCoolObjectPtr
boost::shared_ptr< CoraCoolObjectIter > CoraCoolObjectIterPtr
boost::shared_ptr< CoraCoolDatabase > CoraCoolDatabasePtr
boost::shared_ptr< CoraCoolFolder > CoraCoolFolderPtr
int main(int, char **)
Main class for all the CppUnit test classes.
char data[hepevt_bytes_allocation_ATLAS]
std::pair< std::vector< unsigned int >, bool > res
size_t size() const
Number of registered mappings.
Define macros for attributes used to control the static checker.
static bool equalRecord(const cool::IRecord &lhs, const cool::IRecord &rhs)
cool::IDatabasePtr m_destDbPtr
void setChannelRange(const cool::IFolderPtr &sourcefl)
cool::ValidityKey m_newrunemin
AtlCoolCopy(const std::string &sourcedb, const std::string &destdb, bool allowcreate=false)
std::vector< std::string > m_folderexcl
static std::string timeString(const cool::ValidityKey iovtime)
int resolvePoolRefs ATLAS_NOT_THREAD_SAFE()
cool::ValidityKey m_timemax
cool::ValidityKey m_newrunemax
cool::Application m_coolapp
std::vector< std::string > m_channelRange
std::string rootDirs(const std::string &folder, const std::string &toproot)
std::vector< cool::ChannelId > m_excludechans
std::map< std::string, CoolTagInfo > CoolTagMap
std::vector< std::string > m_tags
cool::ValidityKey m_runemax
bool openConnections(const std::string &sourcedb, const std::string &destdb, bool allowcreate)
CoraCoolDatabasePtr m_destCoraPtr
cool::ValidityKey m_srunemax
cool::ValidityKey m_timemin
std::vector< std::string > m_parfile
bool addExclude(const std::string &folder)
void rootWrite(void *sptr, const cool::IField &field) const
PoolMap::iterator m_poollast
std::string m_nt_treename
bool addFolder(const std::string &folder, const bool onlyTags)
std::vector< std::string > m_hiparent
int verifyIOVs(const std::string &folder, const cool::IFolderPtr &sourcefl, const CoraCoolFolderPtr &sourceflc, const cool::IFolderPtr &destfl, const CoraCoolFolderPtr &destflc, const std::string &sourcetag, const cool::ValidityKey since, const cool::ValidityKey until, const bool checkrefs, const bool iscora, const cool::PayloadMode::Mode paymode)
int copyFolder ATLAS_NOT_THREAD_SAFE(const std::string &folder, const std::vector< std::string > &taglist)
std::vector< void * > m_nt_bufferptr
static std::string getCoolHistGUID(const std::string &file)
static std::string transConn(const std::string &inconn)
int copyIOVs ATLAS_NOT_THREAD_SAFE(const std::string &folder, const std::string &destfolder, const cool::IFolderPtr &sourcefl, const CoraCoolFolderPtr &sourceflc, const cool::IFolderPtr &destfl, const CoraCoolFolderPtr &destflc, const std::string &sourcetag, const std::string &desttag, const cool::ValidityKey since, const cool::ValidityKey until, bool timestamp, bool checkrefs, bool iscora, const cool::PayloadMode::Mode paymode, bool created)
std::vector< std::string > m_poolcat
int doCopy ATLAS_NOT_THREAD_SAFE()
cool::ChannelSelection m_chansel
int rootIOVs(const std::string &folder, const cool::IFolderPtr &sourcefl, const std::string &sourcetag, const cool::ValidityKey since, const cool::ValidityKey until, const bool timestamp)
void adjustIOVs(const cool::ValidityKey &since, const cool::ValidityKey &until, const cool::ValidityKey &qsince, const cool::ValidityKey &quntil, cool::ValidityKey &newsince, cool::ValidityKey &newuntil, const bool timestamp) const
cool::IDatabaseSvc * m_dbSvc
std::vector< std::string > m_mergecat
CoraCoolDatabasePtr m_sourceCoraPtr
bool rootAllocate(const cool::IFieldSpecification &spec, void *&sptr, char &rootID) const
int setOpts(int argc, const char *argv[])
coral::ConnectionService m_coralsvc
cool::ValidityKey m_newtimemax
static pool::IFileCatalog * setupCatalog(const std::vector< std::string > &catvec)
bool procOptVector(const int argc, const char *argv[], std::vector< std::string > &folders)
std::vector< std::string > m_addguid
std::map< std::string, std::string > HiTagMap
cool::ValidityKey m_runemin
std::string m_checkoutputfile
void checkRef(const cool::IRecord &payload, const std::string &folder, const std::string &tag)
std::vector< std::string > m_magic
static cool::ValidityKey runLBVal(const char *input1, const char *input2)
std::vector< unsigned int > m_runlist
std::vector< std::string > m_folderlist
std::vector< std::string > m_runfile
static TH1F * bookOrFindTH1F(const std::string &hID, const std::string &htitle, const int chan, const float xlow, const float xhigh)
static bool isNumeric(const char *input)
std::string m_runinfohost
cool::ValidityKey m_srunemin
static int getUpdateMode(std::string_view desc, std::string_view tag)
cool::IDatabasePtr m_sourceDbPtr
static cool::ChannelId channelID(const cool::IFolderPtr &folder, const std::string &chanstring)
int nocopyIOVs(const std::string &folder, const cool::IFolderPtr &sourcefl, const std::string &sourcetag, const cool::ValidityKey since, const cool::ValidityKey until, bool checkrefs)
static cool::ValidityKey timeVal(const char *input)
std::vector< std::string > m_addlfn
std::map< std::string, PoolMapElement > PoolMap
ReplicaSorter * m_repsort
bool checkChannels(const std::string &folder, const cool::IFolderPtr &sourcefl, const cool::IFolderPtr &destfl, bool newfolder)
cool::ValidityKey m_newtimemin
int analyseIOVs(const std::string &folder, const cool::IFolderPtr &sourcefl, const std::string &sourcetag, const cool::ValidityKey since, const cool::ValidityKey until, const bool timestamp)
AttrListVec::const_iterator const_iterator
void start()
redirect to init() for Gaudi FC
void commit()
Save catalog to file.
void addReadCatalog(const std::string &connect)
Add new catalog, identified by name, to the existing ones.
void getFirstPFN(const std::string &fid, std::string &pfn, std::string &tech) const
Get the first PFN + filetype for the given FID.
Gaudi::IFileCatalog::Files Files
void setWriteCatalog(const std::string &connect)
Establish the writable catalog, identified by name.
void getLFNs(const std::string &fid, Files &files) const
Get all logical names for a given FID. Return pairs <LFN,FID>.
void lookupFileByLFN(const std::string &lfn, std::string &fid) const
Lookup file identified by logical file name.
Common base class for POOL utilities.
virtual std::string readFileGUID(const std::string &pfn)
void contents(std::vector< std::string > &keys, TDirectory *td, const std::string &directory, const std::string &pattern, const std::string &path)
int ir
counter of the current depth
std::vector< std::string > tags
std::string find(const std::string &s)
return a remapped string
std::set< std::string > exclude
list of directories to be excluded
static std::string treename
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
int run(int argc, char *argv[])
std::string dirname(std::string name)