wmglobalqueue 2.4.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- Utils/CPMetrics.py +270 -0
- Utils/CertTools.py +100 -0
- Utils/EmailAlert.py +50 -0
- Utils/ExtendedUnitTestCase.py +62 -0
- Utils/FileTools.py +182 -0
- Utils/IteratorTools.py +80 -0
- Utils/MathUtils.py +31 -0
- Utils/MemoryCache.py +119 -0
- Utils/Patterns.py +24 -0
- Utils/Pipeline.py +137 -0
- Utils/PortForward.py +97 -0
- Utils/ProcFS.py +112 -0
- Utils/ProcessStats.py +194 -0
- Utils/PythonVersion.py +17 -0
- Utils/Signals.py +36 -0
- Utils/TemporaryEnvironment.py +27 -0
- Utils/Throttled.py +227 -0
- Utils/Timers.py +130 -0
- Utils/Timestamps.py +86 -0
- Utils/TokenManager.py +143 -0
- Utils/Tracing.py +60 -0
- Utils/TwPrint.py +98 -0
- Utils/Utilities.py +318 -0
- Utils/__init__.py +11 -0
- Utils/wmcoreDTools.py +707 -0
- WMCore/ACDC/Collection.py +57 -0
- WMCore/ACDC/CollectionTypes.py +12 -0
- WMCore/ACDC/CouchCollection.py +67 -0
- WMCore/ACDC/CouchFileset.py +238 -0
- WMCore/ACDC/CouchService.py +73 -0
- WMCore/ACDC/DataCollectionService.py +485 -0
- WMCore/ACDC/Fileset.py +94 -0
- WMCore/ACDC/__init__.py +11 -0
- WMCore/Algorithms/Alarm.py +39 -0
- WMCore/Algorithms/MathAlgos.py +274 -0
- WMCore/Algorithms/MiscAlgos.py +67 -0
- WMCore/Algorithms/ParseXMLFile.py +115 -0
- WMCore/Algorithms/Permissions.py +27 -0
- WMCore/Algorithms/Singleton.py +58 -0
- WMCore/Algorithms/SubprocessAlgos.py +129 -0
- WMCore/Algorithms/__init__.py +7 -0
- WMCore/Cache/GenericDataCache.py +98 -0
- WMCore/Cache/WMConfigCache.py +572 -0
- WMCore/Cache/__init__.py +0 -0
- WMCore/Configuration.py +659 -0
- WMCore/DAOFactory.py +47 -0
- WMCore/DataStructs/File.py +177 -0
- WMCore/DataStructs/Fileset.py +140 -0
- WMCore/DataStructs/Job.py +182 -0
- WMCore/DataStructs/JobGroup.py +142 -0
- WMCore/DataStructs/JobPackage.py +49 -0
- WMCore/DataStructs/LumiList.py +734 -0
- WMCore/DataStructs/Mask.py +219 -0
- WMCore/DataStructs/MathStructs/ContinuousSummaryHistogram.py +197 -0
- WMCore/DataStructs/MathStructs/DiscreteSummaryHistogram.py +92 -0
- WMCore/DataStructs/MathStructs/SummaryHistogram.py +117 -0
- WMCore/DataStructs/MathStructs/__init__.py +0 -0
- WMCore/DataStructs/Pickleable.py +24 -0
- WMCore/DataStructs/Run.py +256 -0
- WMCore/DataStructs/Subscription.py +175 -0
- WMCore/DataStructs/WMObject.py +47 -0
- WMCore/DataStructs/WorkUnit.py +112 -0
- WMCore/DataStructs/Workflow.py +60 -0
- WMCore/DataStructs/__init__.py +8 -0
- WMCore/Database/CMSCouch.py +1430 -0
- WMCore/Database/ConfigDBMap.py +29 -0
- WMCore/Database/CouchMonitoring.py +450 -0
- WMCore/Database/CouchUtils.py +118 -0
- WMCore/Database/DBCore.py +198 -0
- WMCore/Database/DBCreator.py +113 -0
- WMCore/Database/DBExceptionHandler.py +59 -0
- WMCore/Database/DBFactory.py +117 -0
- WMCore/Database/DBFormatter.py +177 -0
- WMCore/Database/Dialects.py +13 -0
- WMCore/Database/ExecuteDAO.py +327 -0
- WMCore/Database/MongoDB.py +241 -0
- WMCore/Database/MySQL/Destroy.py +42 -0
- WMCore/Database/MySQL/ListUserContent.py +20 -0
- WMCore/Database/MySQL/__init__.py +9 -0
- WMCore/Database/MySQLCore.py +132 -0
- WMCore/Database/Oracle/Destroy.py +56 -0
- WMCore/Database/Oracle/ListUserContent.py +19 -0
- WMCore/Database/Oracle/__init__.py +9 -0
- WMCore/Database/ResultSet.py +44 -0
- WMCore/Database/Transaction.py +91 -0
- WMCore/Database/__init__.py +9 -0
- WMCore/Database/ipy_profile_couch.py +438 -0
- WMCore/GlobalWorkQueue/CherryPyThreads/CleanUpTask.py +29 -0
- WMCore/GlobalWorkQueue/CherryPyThreads/HeartbeatMonitor.py +105 -0
- WMCore/GlobalWorkQueue/CherryPyThreads/LocationUpdateTask.py +28 -0
- WMCore/GlobalWorkQueue/CherryPyThreads/ReqMgrInteractionTask.py +35 -0
- WMCore/GlobalWorkQueue/CherryPyThreads/__init__.py +0 -0
- WMCore/GlobalWorkQueue/__init__.py +0 -0
- WMCore/GroupUser/CouchObject.py +127 -0
- WMCore/GroupUser/Decorators.py +51 -0
- WMCore/GroupUser/Group.py +33 -0
- WMCore/GroupUser/Interface.py +73 -0
- WMCore/GroupUser/User.py +96 -0
- WMCore/GroupUser/__init__.py +11 -0
- WMCore/Lexicon.py +836 -0
- WMCore/REST/Auth.py +202 -0
- WMCore/REST/CherryPyPeriodicTask.py +166 -0
- WMCore/REST/Error.py +333 -0
- WMCore/REST/Format.py +642 -0
- WMCore/REST/HeartbeatMonitorBase.py +90 -0
- WMCore/REST/Main.py +636 -0
- WMCore/REST/Server.py +2435 -0
- WMCore/REST/Services.py +24 -0
- WMCore/REST/Test.py +120 -0
- WMCore/REST/Tools.py +38 -0
- WMCore/REST/Validation.py +250 -0
- WMCore/REST/__init__.py +1 -0
- WMCore/ReqMgr/DataStructs/RequestStatus.py +209 -0
- WMCore/ReqMgr/DataStructs/RequestType.py +13 -0
- WMCore/ReqMgr/DataStructs/__init__.py +0 -0
- WMCore/ReqMgr/__init__.py +1 -0
- WMCore/Services/AlertManager/AlertManagerAPI.py +111 -0
- WMCore/Services/AlertManager/__init__.py +0 -0
- WMCore/Services/CRIC/CRIC.py +238 -0
- WMCore/Services/CRIC/__init__.py +0 -0
- WMCore/Services/DBS/DBS3Reader.py +1044 -0
- WMCore/Services/DBS/DBSConcurrency.py +44 -0
- WMCore/Services/DBS/DBSErrors.py +112 -0
- WMCore/Services/DBS/DBSReader.py +23 -0
- WMCore/Services/DBS/DBSUtils.py +166 -0
- WMCore/Services/DBS/DBSWriterObjects.py +381 -0
- WMCore/Services/DBS/ProdException.py +133 -0
- WMCore/Services/DBS/__init__.py +8 -0
- WMCore/Services/FWJRDB/FWJRDBAPI.py +118 -0
- WMCore/Services/FWJRDB/__init__.py +0 -0
- WMCore/Services/HTTPS/HTTPSAuthHandler.py +66 -0
- WMCore/Services/HTTPS/__init__.py +0 -0
- WMCore/Services/LogDB/LogDB.py +201 -0
- WMCore/Services/LogDB/LogDBBackend.py +191 -0
- WMCore/Services/LogDB/LogDBExceptions.py +11 -0
- WMCore/Services/LogDB/LogDBReport.py +85 -0
- WMCore/Services/LogDB/__init__.py +0 -0
- WMCore/Services/MSPileup/__init__.py +0 -0
- WMCore/Services/MSUtils/MSUtils.py +54 -0
- WMCore/Services/MSUtils/__init__.py +0 -0
- WMCore/Services/McM/McM.py +173 -0
- WMCore/Services/McM/__init__.py +8 -0
- WMCore/Services/MonIT/Grafana.py +133 -0
- WMCore/Services/MonIT/__init__.py +0 -0
- WMCore/Services/PyCondor/PyCondorAPI.py +154 -0
- WMCore/Services/PyCondor/__init__.py +0 -0
- WMCore/Services/ReqMgr/ReqMgr.py +261 -0
- WMCore/Services/ReqMgr/__init__.py +0 -0
- WMCore/Services/ReqMgrAux/ReqMgrAux.py +419 -0
- WMCore/Services/ReqMgrAux/__init__.py +0 -0
- WMCore/Services/RequestDB/RequestDBReader.py +267 -0
- WMCore/Services/RequestDB/RequestDBWriter.py +39 -0
- WMCore/Services/RequestDB/__init__.py +0 -0
- WMCore/Services/Requests.py +624 -0
- WMCore/Services/Rucio/Rucio.py +1290 -0
- WMCore/Services/Rucio/RucioUtils.py +74 -0
- WMCore/Services/Rucio/__init__.py +0 -0
- WMCore/Services/RucioConMon/RucioConMon.py +121 -0
- WMCore/Services/RucioConMon/__init__.py +0 -0
- WMCore/Services/Service.py +400 -0
- WMCore/Services/StompAMQ/__init__.py +0 -0
- WMCore/Services/TagCollector/TagCollector.py +155 -0
- WMCore/Services/TagCollector/XMLUtils.py +98 -0
- WMCore/Services/TagCollector/__init__.py +0 -0
- WMCore/Services/UUIDLib.py +13 -0
- WMCore/Services/UserFileCache/UserFileCache.py +160 -0
- WMCore/Services/UserFileCache/__init__.py +8 -0
- WMCore/Services/WMAgent/WMAgent.py +63 -0
- WMCore/Services/WMAgent/__init__.py +0 -0
- WMCore/Services/WMArchive/CMSSWMetrics.py +526 -0
- WMCore/Services/WMArchive/DataMap.py +463 -0
- WMCore/Services/WMArchive/WMArchive.py +33 -0
- WMCore/Services/WMArchive/__init__.py +0 -0
- WMCore/Services/WMBS/WMBS.py +97 -0
- WMCore/Services/WMBS/__init__.py +0 -0
- WMCore/Services/WMStats/DataStruct/RequestInfoCollection.py +300 -0
- WMCore/Services/WMStats/DataStruct/__init__.py +0 -0
- WMCore/Services/WMStats/WMStatsPycurl.py +145 -0
- WMCore/Services/WMStats/WMStatsReader.py +445 -0
- WMCore/Services/WMStats/WMStatsWriter.py +273 -0
- WMCore/Services/WMStats/__init__.py +0 -0
- WMCore/Services/WMStatsServer/WMStatsServer.py +134 -0
- WMCore/Services/WMStatsServer/__init__.py +0 -0
- WMCore/Services/WorkQueue/WorkQueue.py +492 -0
- WMCore/Services/WorkQueue/__init__.py +0 -0
- WMCore/Services/__init__.py +8 -0
- WMCore/Services/pycurl_manager.py +574 -0
- WMCore/WMBase.py +50 -0
- WMCore/WMConnectionBase.py +164 -0
- WMCore/WMException.py +183 -0
- WMCore/WMExceptions.py +269 -0
- WMCore/WMFactory.py +76 -0
- WMCore/WMInit.py +377 -0
- WMCore/WMLogging.py +104 -0
- WMCore/WMSpec/ConfigSectionTree.py +442 -0
- WMCore/WMSpec/Persistency.py +135 -0
- WMCore/WMSpec/Steps/BuildMaster.py +87 -0
- WMCore/WMSpec/Steps/BuildTools.py +201 -0
- WMCore/WMSpec/Steps/Builder.py +97 -0
- WMCore/WMSpec/Steps/Diagnostic.py +89 -0
- WMCore/WMSpec/Steps/Emulator.py +62 -0
- WMCore/WMSpec/Steps/ExecuteMaster.py +208 -0
- WMCore/WMSpec/Steps/Executor.py +210 -0
- WMCore/WMSpec/Steps/StepFactory.py +213 -0
- WMCore/WMSpec/Steps/TaskEmulator.py +75 -0
- WMCore/WMSpec/Steps/Template.py +204 -0
- WMCore/WMSpec/Steps/Templates/AlcaHarvest.py +76 -0
- WMCore/WMSpec/Steps/Templates/CMSSW.py +613 -0
- WMCore/WMSpec/Steps/Templates/DQMUpload.py +59 -0
- WMCore/WMSpec/Steps/Templates/DeleteFiles.py +70 -0
- WMCore/WMSpec/Steps/Templates/LogArchive.py +84 -0
- WMCore/WMSpec/Steps/Templates/LogCollect.py +105 -0
- WMCore/WMSpec/Steps/Templates/StageOut.py +105 -0
- WMCore/WMSpec/Steps/Templates/__init__.py +10 -0
- WMCore/WMSpec/Steps/WMExecutionFailure.py +21 -0
- WMCore/WMSpec/Steps/__init__.py +8 -0
- WMCore/WMSpec/Utilities.py +63 -0
- WMCore/WMSpec/WMSpecErrors.py +12 -0
- WMCore/WMSpec/WMStep.py +347 -0
- WMCore/WMSpec/WMTask.py +1997 -0
- WMCore/WMSpec/WMWorkload.py +2288 -0
- WMCore/WMSpec/WMWorkloadTools.py +382 -0
- WMCore/WMSpec/__init__.py +9 -0
- WMCore/WorkQueue/DataLocationMapper.py +273 -0
- WMCore/WorkQueue/DataStructs/ACDCBlock.py +47 -0
- WMCore/WorkQueue/DataStructs/Block.py +48 -0
- WMCore/WorkQueue/DataStructs/CouchWorkQueueElement.py +148 -0
- WMCore/WorkQueue/DataStructs/WorkQueueElement.py +274 -0
- WMCore/WorkQueue/DataStructs/WorkQueueElementResult.py +152 -0
- WMCore/WorkQueue/DataStructs/WorkQueueElementsSummary.py +185 -0
- WMCore/WorkQueue/DataStructs/__init__.py +0 -0
- WMCore/WorkQueue/Policy/End/EndPolicyInterface.py +44 -0
- WMCore/WorkQueue/Policy/End/SingleShot.py +22 -0
- WMCore/WorkQueue/Policy/End/__init__.py +32 -0
- WMCore/WorkQueue/Policy/PolicyInterface.py +17 -0
- WMCore/WorkQueue/Policy/Start/Block.py +258 -0
- WMCore/WorkQueue/Policy/Start/Dataset.py +180 -0
- WMCore/WorkQueue/Policy/Start/MonteCarlo.py +131 -0
- WMCore/WorkQueue/Policy/Start/ResubmitBlock.py +171 -0
- WMCore/WorkQueue/Policy/Start/StartPolicyInterface.py +316 -0
- WMCore/WorkQueue/Policy/Start/__init__.py +34 -0
- WMCore/WorkQueue/Policy/__init__.py +57 -0
- WMCore/WorkQueue/WMBSHelper.py +772 -0
- WMCore/WorkQueue/WorkQueue.py +1237 -0
- WMCore/WorkQueue/WorkQueueBackend.py +750 -0
- WMCore/WorkQueue/WorkQueueBase.py +39 -0
- WMCore/WorkQueue/WorkQueueExceptions.py +44 -0
- WMCore/WorkQueue/WorkQueueReqMgrInterface.py +278 -0
- WMCore/WorkQueue/WorkQueueUtils.py +130 -0
- WMCore/WorkQueue/__init__.py +13 -0
- WMCore/Wrappers/JsonWrapper/JSONThunker.py +342 -0
- WMCore/Wrappers/JsonWrapper/__init__.py +7 -0
- WMCore/Wrappers/__init__.py +6 -0
- WMCore/__init__.py +10 -0
- wmglobalqueue-2.4.5.1.data/data/bin/wmc-dist-patch +15 -0
- wmglobalqueue-2.4.5.1.data/data/bin/wmc-dist-unpatch +8 -0
- wmglobalqueue-2.4.5.1.data/data/bin/wmc-httpd +3 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/.couchapprc +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/README.md +40 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/index.html +264 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/ElementInfoByWorkflow.js +96 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/StuckElementInfo.js +57 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/WorkloadInfoTable.js +80 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/dataTable.js +70 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/namespace.js +23 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/style/main.css +75 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/couchapp.json +4 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/filters/childQueueFilter.js +13 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/filters/filterDeletedDocs.js +3 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/filters/queueFilter.js +11 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/language +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lib/mustache.js +333 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lib/validate.js +27 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lib/workqueue_utils.js +61 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/elementsDetail.js +28 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/filter.js +86 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/stuckElements.js +38 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/workRestrictions.js +153 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/workflowSummary.js +28 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/rewrites.json +73 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/shows/redirect.js +23 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/shows/status.js +40 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/ElementSummaryByWorkflow.html +27 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/StuckElementSummary.html +26 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/TaskStatus.html +23 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/WorkflowSummary.html +27 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/partials/workqueue-common-lib.html +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/partials/yui-lib-remote.html +16 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/partials/yui-lib.html +18 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/updates/in-place.js +50 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/validate_doc_update.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/vendor/couchapp/_attachments/jquery.couch.app.js +235 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/vendor/couchapp/_attachments/jquery.pathbinder.js +173 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeData/reduce.js +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeParentData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeParentData/reduce.js +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activePileupData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activePileupData/reduce.js +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/analyticsData/map.js +11 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/analyticsData/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/availableByPriority/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/conflicts/map.js +5 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elements/map.js +5 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByParent/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByParentData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByPileupData/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByStatus/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsBySubscription/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByWorkflow/map.js +8 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByWorkflow/reduce.js +3 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsDetailByWorkflowAndStatus/map.js +26 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobInjectStatusByRequest/map.js +10 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobInjectStatusByRequest/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobStatusByRequest/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobStatusByRequest/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndPriority/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndPriority/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndStatus/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndStatus/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByRequest/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByRequest/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatus/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatus/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatusAndPriority/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatusAndPriority/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/openRequests/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/recent-items/map.js +5 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/siteWhitelistByRequest/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/siteWhitelistByRequest/reduce.js +1 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/specsByWorkflow/map.js +5 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/stuckElements/map.js +38 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsInjectStatusByRequest/map.js +12 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsInjectStatusByRequest/reduce.js +3 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrl/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrl/reduce.js +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrlByRequest/map.js +6 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrlByRequest/reduce.js +2 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/workflowSummary/map.js +9 -0
- wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/workflowSummary/reduce.js +10 -0
- wmglobalqueue-2.4.5.1.dist-info/METADATA +26 -0
- wmglobalqueue-2.4.5.1.dist-info/RECORD +347 -0
- wmglobalqueue-2.4.5.1.dist-info/WHEEL +5 -0
- wmglobalqueue-2.4.5.1.dist-info/licenses/LICENSE +202 -0
- wmglobalqueue-2.4.5.1.dist-info/licenses/NOTICE +16 -0
- wmglobalqueue-2.4.5.1.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,734 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
This is a direct copy of code in cmssw/FWCore/PythonUtilities/python/LumiList.py
|
|
5
|
+
It can be removed if we ever have a core set of code shared between DMWM and CMSSW
|
|
6
|
+
|
|
7
|
+
Handle lists of lumi sections. Constuct in several different formats and filter
|
|
8
|
+
(mask) a secondary list of lumis.
|
|
9
|
+
This class can also handle ranges of events as the structure is identical
|
|
10
|
+
or could be subclassed renaming a function or two.
|
|
11
|
+
|
|
12
|
+
This code began life in COMP/CRAB/python/LumiList.py
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
from builtins import zip, range, next, str, object
|
|
17
|
+
|
|
18
|
+
from future.utils import viewitems
|
|
19
|
+
|
|
20
|
+
from future import standard_library
|
|
21
|
+
standard_library.install_aliases()
|
|
22
|
+
|
|
23
|
+
import copy
|
|
24
|
+
import itertools
|
|
25
|
+
import json
|
|
26
|
+
import re
|
|
27
|
+
import urllib.request
|
|
28
|
+
from contextlib import closing
|
|
29
|
+
|
|
30
|
+
class LumiList(object):
|
|
31
|
+
"""
|
|
32
|
+
Deal with lists of lumis in several different forms:
|
|
33
|
+
Compact list:
|
|
34
|
+
{
|
|
35
|
+
'1': [[1, 33], [35, 35], [37, 47], [49, 75], [77, 130], [133, 136]],
|
|
36
|
+
'2':[[1,45],[50,80]]
|
|
37
|
+
}
|
|
38
|
+
where the first key is the run number, subsequent pairs are
|
|
39
|
+
ranges of lumis within that run that are desired
|
|
40
|
+
Runs and lumis:
|
|
41
|
+
{
|
|
42
|
+
'1': [1,2,3,4,6,7,8,9,10],
|
|
43
|
+
'2': [1,4,5,20]
|
|
44
|
+
}
|
|
45
|
+
where the first key is the run number and the list is a list of
|
|
46
|
+
individual lumi sections. This form also takes a list of these objects
|
|
47
|
+
which can be much faster than LumiList += LumiList
|
|
48
|
+
Run lumi pairs:
|
|
49
|
+
[[1,1], [1,2],[1,4], [2,1], [2,5], [1,10]]
|
|
50
|
+
where each pair in the list is an individual run&lumi
|
|
51
|
+
CMSSW representation:
|
|
52
|
+
'1:1-1:33,1:35,1:37-1:47,2:1-2:45,2:50-2:80'
|
|
53
|
+
The string used by CMSSW in lumisToProcess or lumisToSkip
|
|
54
|
+
is a subset of the compactList example above
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
def __init__(self, filename=None, lumis=None, runsAndLumis=None, runs=None, compactList=None, url=None,
|
|
58
|
+
wmagentFormat=None):
|
|
59
|
+
"""
|
|
60
|
+
Constructor takes filename (JSON), a list of run/lumi pairs,
|
|
61
|
+
or a dict with run #'s as the keys and a list of lumis as the values, or just a list of runs
|
|
62
|
+
"""
|
|
63
|
+
self.compactList = {}
|
|
64
|
+
self.duplicates = {}
|
|
65
|
+
if filename:
|
|
66
|
+
self.filename = filename
|
|
67
|
+
with open(self.filename,'r') as jsonFile:
|
|
68
|
+
self.compactList = json.load(jsonFile)
|
|
69
|
+
elif url:
|
|
70
|
+
self.url = url
|
|
71
|
+
with closing(urllib.request.urlopen(url)) as jsonFile:
|
|
72
|
+
self.compactList = json.load(jsonFile)
|
|
73
|
+
elif lumis:
|
|
74
|
+
runsAndLumis = {}
|
|
75
|
+
for (run, lumi) in lumis:
|
|
76
|
+
run = str(run)
|
|
77
|
+
if run not in runsAndLumis:
|
|
78
|
+
runsAndLumis[run] = []
|
|
79
|
+
runsAndLumis[run].append(lumi)
|
|
80
|
+
|
|
81
|
+
if isinstance(runsAndLumis, list):
|
|
82
|
+
queued = {}
|
|
83
|
+
for runLumiList in runsAndLumis:
|
|
84
|
+
for run, lumis in viewitems(runLumiList):
|
|
85
|
+
queued.setdefault(run, []).extend(lumis)
|
|
86
|
+
runsAndLumis = queued
|
|
87
|
+
|
|
88
|
+
if runsAndLumis:
|
|
89
|
+
for run in runsAndLumis:
|
|
90
|
+
runString = str(run)
|
|
91
|
+
lastLumi = -1000
|
|
92
|
+
lumiList = runsAndLumis[run]
|
|
93
|
+
if lumiList:
|
|
94
|
+
self.compactList[runString] = []
|
|
95
|
+
self.duplicates[runString] = []
|
|
96
|
+
for lumi in sorted(int(l) for l in lumiList):
|
|
97
|
+
if lumi == lastLumi:
|
|
98
|
+
self.duplicates[runString].append(lumi)
|
|
99
|
+
elif lumi != lastLumi + 1: # Break in lumi sequence
|
|
100
|
+
self.compactList[runString].append([lumi, lumi])
|
|
101
|
+
else:
|
|
102
|
+
nRange = len(self.compactList[runString])
|
|
103
|
+
self.compactList[runString][nRange-1][1] = lumi
|
|
104
|
+
lastLumi = lumi
|
|
105
|
+
if runs:
|
|
106
|
+
for run in runs:
|
|
107
|
+
runString = str(run)
|
|
108
|
+
self.compactList[runString] = [[1, 0xFFFFFFF]]
|
|
109
|
+
|
|
110
|
+
if compactList:
|
|
111
|
+
for run in compactList:
|
|
112
|
+
runString = str(run)
|
|
113
|
+
if compactList[run]:
|
|
114
|
+
self.compactList[runString] = compactList[run]
|
|
115
|
+
|
|
116
|
+
if wmagentFormat:
|
|
117
|
+
"""
|
|
118
|
+
Expecting a list or tuple of two elements. First is a list of run #s, the second is a list of strings.
|
|
119
|
+
Each string is a comma separated list of lumi numbers. Even numbers are the start of a lumi range,
|
|
120
|
+
odd numbers are the end of that lumi range.
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
if not isinstance(wmagentFormat, (list, tuple)) or len(wmagentFormat) != 2:
|
|
124
|
+
raise RuntimeError('Improper format for wmagentFormat. Must be list or tuple of lists')
|
|
125
|
+
|
|
126
|
+
runs, lumis = wmagentFormat
|
|
127
|
+
|
|
128
|
+
if len(runs) <= 0 or len(lumis) != len(runs):
|
|
129
|
+
raise RuntimeError('Improper format for wmagentFormat. # of lumi lists must match # of runs')
|
|
130
|
+
|
|
131
|
+
for run, lumiString in zip(runs, lumis):
|
|
132
|
+
runLumis = lumiString.split(',')
|
|
133
|
+
if str(run) not in self.compactList:
|
|
134
|
+
self.compactList[str(run)] = []
|
|
135
|
+
if len(runLumis) % 2:
|
|
136
|
+
raise RuntimeError('Improper format for wmagentFormat. Lumis must be in pairs')
|
|
137
|
+
|
|
138
|
+
# Walk through the list two at a time, get both values
|
|
139
|
+
it = iter(runLumis)
|
|
140
|
+
for beginLumi in it:
|
|
141
|
+
endLumi = next(it)
|
|
142
|
+
self.compactList[str(run)].append([int(beginLumi), int(endLumi)])
|
|
143
|
+
|
|
144
|
+
# Compact each run and make it unique
|
|
145
|
+
|
|
146
|
+
for run in self.compactList:
|
|
147
|
+
newLumis = []
|
|
148
|
+
for lumi in sorted(self.compactList[run]):
|
|
149
|
+
# If the next lumi starts inside or just after the last just change the endpoint of the first
|
|
150
|
+
if newLumis and newLumis[-1][0] <= lumi[0] <= newLumis[-1][1] + 1:
|
|
151
|
+
newLumis[-1][1] = max(newLumis[-1][1], lumi[1])
|
|
152
|
+
else:
|
|
153
|
+
newLumis.append(lumi)
|
|
154
|
+
self.compactList[run] = newLumis
|
|
155
|
+
|
|
156
|
+
def __sub__(self, other): # Things from self not in other
|
|
157
|
+
result = {}
|
|
158
|
+
for run in sorted(self.compactList.keys()):
|
|
159
|
+
alumis = sorted(self.compactList[run])
|
|
160
|
+
blumis = sorted(other.compactList.get(run, []))
|
|
161
|
+
alist = [] # verified part
|
|
162
|
+
for alumi in alumis:
|
|
163
|
+
tmplist = [alumi[0], alumi[1]] # may be part
|
|
164
|
+
for blumi in blumis:
|
|
165
|
+
if blumi[0] <= tmplist[0] and blumi[1] >= tmplist[1]: # blumi has all of alumi
|
|
166
|
+
tmplist = []
|
|
167
|
+
break # blumi is has all of alumi
|
|
168
|
+
if blumi[0] > tmplist[0] and blumi[1] < tmplist[1]: # blumi is part of alumi
|
|
169
|
+
alist.append([tmplist[0], blumi[0]-1])
|
|
170
|
+
tmplist = [blumi[1]+1, tmplist[1]]
|
|
171
|
+
elif blumi[0] <= tmplist[0] and blumi[1] < tmplist[1] and blumi[1]>=tmplist[0]: # overlaps start
|
|
172
|
+
tmplist = [blumi[1]+1, tmplist[1]]
|
|
173
|
+
elif blumi[0] > tmplist[0] and blumi[1] >= tmplist[1] and blumi[0]<=tmplist[1]: # overlaps end
|
|
174
|
+
alist.append([tmplist[0], blumi[0]-1])
|
|
175
|
+
tmplist = []
|
|
176
|
+
break
|
|
177
|
+
if tmplist:
|
|
178
|
+
alist.append(tmplist)
|
|
179
|
+
result[run] = alist
|
|
180
|
+
|
|
181
|
+
return LumiList(compactList = result)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def __and__(self, other): # Things in both
|
|
185
|
+
result = {}
|
|
186
|
+
aruns = set(self.compactList.keys())
|
|
187
|
+
bruns = set(other.compactList.keys())
|
|
188
|
+
for run in aruns & bruns:
|
|
189
|
+
lumiList = [] # List for this run
|
|
190
|
+
unique = [] # List for this run
|
|
191
|
+
for alumi in self.compactList[run]:
|
|
192
|
+
for blumi in other.compactList[run]:
|
|
193
|
+
if blumi[0] <= alumi[0] and blumi[1] >= alumi[1]: # blumi has all of alumi
|
|
194
|
+
lumiList.append(alumi)
|
|
195
|
+
if blumi[0] > alumi[0] and blumi[1] < alumi[1]: # blumi is part of alumi
|
|
196
|
+
lumiList.append(blumi)
|
|
197
|
+
elif blumi[0] <= alumi[0] and blumi[1] < alumi[1] and blumi[1] >= alumi[0]: # overlaps start
|
|
198
|
+
lumiList.append([alumi[0], blumi[1]])
|
|
199
|
+
elif blumi[0] > alumi[0] and blumi[1] >= alumi[1] and blumi[0] <= alumi[1]: # overlaps end
|
|
200
|
+
lumiList.append([blumi[0], alumi[1]])
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
if lumiList:
|
|
204
|
+
unique = [lumiList[0]]
|
|
205
|
+
for pair in lumiList[1:]:
|
|
206
|
+
if pair[0] == unique[-1][1]+1:
|
|
207
|
+
unique[-1][1] = copy.deepcopy(pair[1])
|
|
208
|
+
else:
|
|
209
|
+
unique.append(copy.deepcopy(pair))
|
|
210
|
+
|
|
211
|
+
result[run] = unique
|
|
212
|
+
return LumiList(compactList = result)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def __or__(self, other):
|
|
216
|
+
result = {}
|
|
217
|
+
aruns = list(self.compactList)
|
|
218
|
+
bruns = list(other.compactList)
|
|
219
|
+
runs = set(aruns + bruns)
|
|
220
|
+
for run in runs:
|
|
221
|
+
overlap = sorted(self.compactList.get(run, []) + other.compactList.get(run, []))
|
|
222
|
+
unique = [overlap[0]]
|
|
223
|
+
for pair in overlap[1:]:
|
|
224
|
+
if pair[0] >= unique[-1][0] and pair[0] <= unique[-1][1]+1 and pair[1] > unique[-1][1]:
|
|
225
|
+
unique[-1][1] = copy.deepcopy(pair[1])
|
|
226
|
+
elif pair[0] > unique[-1][1]:
|
|
227
|
+
unique.append(copy.deepcopy(pair))
|
|
228
|
+
result[run] = unique
|
|
229
|
+
return LumiList(compactList = result)
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def __add__(self, other):
|
|
233
|
+
# + is the same as |
|
|
234
|
+
return self.__or__(other)
|
|
235
|
+
|
|
236
|
+
def __len__(self):
|
|
237
|
+
'''Returns number of runs in list'''
|
|
238
|
+
return len(self.compactList)
|
|
239
|
+
|
|
240
|
+
def filterLumis(self, lumiList):
|
|
241
|
+
"""
|
|
242
|
+
Return a list of lumis that are in compactList.
|
|
243
|
+
lumilist is of the simple form
|
|
244
|
+
[(run1,lumi1),(run1,lumi2),(run2,lumi1)]
|
|
245
|
+
"""
|
|
246
|
+
filteredList = []
|
|
247
|
+
for (run, lumi) in lumiList:
|
|
248
|
+
runsInLumi = self.compactList.get(str(run), [[0, -1]])
|
|
249
|
+
for (first, last) in runsInLumi:
|
|
250
|
+
if lumi >= first and lumi <= last:
|
|
251
|
+
filteredList.append((run, lumi))
|
|
252
|
+
break
|
|
253
|
+
return filteredList
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def __str__ (self):
|
|
257
|
+
doubleBracketRE = re.compile (r']],')
|
|
258
|
+
return doubleBracketRE.sub (']],\n',
|
|
259
|
+
json.dumps (self.compactList,
|
|
260
|
+
sort_keys=True))
|
|
261
|
+
|
|
262
|
+
def getCompactList(self):
|
|
263
|
+
"""
|
|
264
|
+
Return the compact list representation
|
|
265
|
+
"""
|
|
266
|
+
return self.compactList
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def getDuplicates(self):
|
|
270
|
+
"""
|
|
271
|
+
Return the list of duplicates found during construction as a LumiList
|
|
272
|
+
"""
|
|
273
|
+
return LumiList(runsAndLumis = self.duplicates)
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def getLumis(self):
|
|
277
|
+
"""
|
|
278
|
+
Return the list of pairs representation
|
|
279
|
+
"""
|
|
280
|
+
theList = []
|
|
281
|
+
runs = list(self.compactList)
|
|
282
|
+
runs.sort(key=int)
|
|
283
|
+
for run in runs:
|
|
284
|
+
lumis = self.compactList[run]
|
|
285
|
+
for lumiPair in sorted(lumis):
|
|
286
|
+
for lumi in range(lumiPair[0], lumiPair[1]+1):
|
|
287
|
+
theList.append((int(run), lumi))
|
|
288
|
+
|
|
289
|
+
return theList
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def getRuns(self):
|
|
293
|
+
'''
|
|
294
|
+
return the sorted list of runs contained
|
|
295
|
+
'''
|
|
296
|
+
return sorted (self.compactList.keys())
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
def _getLumiParts(self):
|
|
300
|
+
"""
|
|
301
|
+
Turn compactList into a list of the format
|
|
302
|
+
[ 'R1:L1', 'R2:L2-R2:L3' ] which is used by getCMSSWString and getVLuminosityBlockRange
|
|
303
|
+
"""
|
|
304
|
+
|
|
305
|
+
parts = []
|
|
306
|
+
runs = list(self.compactList)
|
|
307
|
+
runs.sort(key=int)
|
|
308
|
+
for run in runs:
|
|
309
|
+
lumis = self.compactList[run]
|
|
310
|
+
for lumiPair in sorted(lumis):
|
|
311
|
+
if lumiPair[0] == lumiPair[1]:
|
|
312
|
+
parts.append("%s:%s" % (run, lumiPair[0]))
|
|
313
|
+
else:
|
|
314
|
+
parts.append("%s:%s-%s:%s" %
|
|
315
|
+
(run, lumiPair[0], run, lumiPair[1]))
|
|
316
|
+
return parts
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
def getCMSSWString(self):
|
|
320
|
+
"""
|
|
321
|
+
Turn compactList into a list of the format
|
|
322
|
+
R1:L1,R2:L2-R2:L3 which is acceptable to CMSSW LumiBlockRange variable
|
|
323
|
+
"""
|
|
324
|
+
|
|
325
|
+
parts = self._getLumiParts()
|
|
326
|
+
output = ','.join(parts)
|
|
327
|
+
return str(output)
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
def getVLuminosityBlockRange(self, tracked = False):
|
|
331
|
+
"""
|
|
332
|
+
Turn compactList into an (optionally tracked) VLuminosityBlockRange
|
|
333
|
+
"""
|
|
334
|
+
|
|
335
|
+
import FWCore.ParameterSet.Config as cms
|
|
336
|
+
parts = self._getLumiParts()
|
|
337
|
+
if tracked:
|
|
338
|
+
return cms.VLuminosityBlockRange(parts)
|
|
339
|
+
else:
|
|
340
|
+
return cms.untracked.VLuminosityBlockRange(parts)
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
def writeJSON(self, fileName):
|
|
344
|
+
"""
|
|
345
|
+
Write out a JSON file representation of the object
|
|
346
|
+
"""
|
|
347
|
+
with open(fileName,'w') as jsonFile:
|
|
348
|
+
jsonFile.write("%s\n" % self)
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
def removeRuns (self, runList):
|
|
352
|
+
'''
|
|
353
|
+
removes runs from runList from collection
|
|
354
|
+
'''
|
|
355
|
+
for run in runList:
|
|
356
|
+
run = str(run)
|
|
357
|
+
if run in self.compactList:
|
|
358
|
+
del self.compactList[run]
|
|
359
|
+
|
|
360
|
+
return
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
def selectRuns (self, runList):
|
|
364
|
+
'''
|
|
365
|
+
Selects only runs from runList in collection
|
|
366
|
+
'''
|
|
367
|
+
runsToDelete = []
|
|
368
|
+
for run in list(self.compactList):
|
|
369
|
+
if int(run) not in runList and run not in runList:
|
|
370
|
+
runsToDelete.append(run)
|
|
371
|
+
|
|
372
|
+
for run in runsToDelete:
|
|
373
|
+
del self.compactList[run]
|
|
374
|
+
|
|
375
|
+
return
|
|
376
|
+
|
|
377
|
+
def contains (self, run, lumiSection = None):
|
|
378
|
+
'''
|
|
379
|
+
returns true if the run, lumi section passed in is contained
|
|
380
|
+
in this lumiList. Input can be either:
|
|
381
|
+
- a single tuple of (run, lumi),
|
|
382
|
+
- separate run and lumi numbers
|
|
383
|
+
- a single run number (returns true if any lumi sections exist)
|
|
384
|
+
'''
|
|
385
|
+
if lumiSection is None:
|
|
386
|
+
# if this is an integer or a string, see if the run exists
|
|
387
|
+
if isinstance (run, int) or isinstance (run, str):
|
|
388
|
+
return str(run) in self.compactList
|
|
389
|
+
# if we're here, then run better be a tuple or list
|
|
390
|
+
try:
|
|
391
|
+
lumiSection = run[1]
|
|
392
|
+
run = run[0]
|
|
393
|
+
except:
|
|
394
|
+
raise RuntimeError("Improper format for run '%s'" % run)
|
|
395
|
+
lumiRangeList = self.compactList.get( str(run) )
|
|
396
|
+
if not lumiRangeList:
|
|
397
|
+
# the run isn't there, so no need to look any further
|
|
398
|
+
return False
|
|
399
|
+
for lumiRange in lumiRangeList:
|
|
400
|
+
# we want to make this as found if either the lumiSection
|
|
401
|
+
# is inside the range OR if the lumi section is greater
|
|
402
|
+
# than or equal to the lower bound of the lumi range and
|
|
403
|
+
# the upper bound is 0 (which means extends to the end of
|
|
404
|
+
# the run)
|
|
405
|
+
if lumiRange[0] <= lumiSection and \
|
|
406
|
+
(0 == lumiRange[1] or lumiSection <= lumiRange[1]):
|
|
407
|
+
# got it
|
|
408
|
+
return True
|
|
409
|
+
return False
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
def __contains__ (self, runTuple):
|
|
413
|
+
return self.contains (runTuple)
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
'''
|
|
418
|
+
# Unit test code
|
|
419
|
+
import unittest
|
|
420
|
+
import FWCore.ParameterSet.Config as cms
|
|
421
|
+
|
|
422
|
+
class LumiListTest(unittest.TestCase):
|
|
423
|
+
"""
|
|
424
|
+
_LumiListTest_
|
|
425
|
+
|
|
426
|
+
"""
|
|
427
|
+
|
|
428
|
+
def testRead(self):
|
|
429
|
+
"""
|
|
430
|
+
Test reading from JSON
|
|
431
|
+
"""
|
|
432
|
+
exString = "1:1-1:33,1:35,1:37-1:47,2:49-2:75,2:77-2:130,2:133-2:136"
|
|
433
|
+
exDict = {'1': [[1, 33], [35, 35], [37, 47]],
|
|
434
|
+
'2': [[49, 75], [77, 130], [133, 136]]}
|
|
435
|
+
exVLBR = cms.VLuminosityBlockRange('1:1-1:33', '1:35', '1:37-1:47', '2:49-2:75', '2:77-2:130', '2:133-2:136')
|
|
436
|
+
|
|
437
|
+
jsonList = LumiList(filename = 'lumiTest.json')
|
|
438
|
+
lumiString = jsonList.getCMSSWString()
|
|
439
|
+
lumiList = jsonList.getCompactList()
|
|
440
|
+
lumiVLBR = jsonList.getVLuminosityBlockRange(True)
|
|
441
|
+
|
|
442
|
+
self.assertTrue(lumiString == exString)
|
|
443
|
+
self.assertTrue(lumiList == exDict)
|
|
444
|
+
self.assertTrue(lumiVLBR == exVLBR)
|
|
445
|
+
|
|
446
|
+
def testList(self):
|
|
447
|
+
"""
|
|
448
|
+
Test constucting from list of pairs
|
|
449
|
+
"""
|
|
450
|
+
|
|
451
|
+
listLs1 = range(1, 34) + [35] + range(37, 48)
|
|
452
|
+
listLs2 = range(49, 76) + range(77, 131) + range(133, 137)
|
|
453
|
+
lumis = zip([1]*100, listLs1) + zip([2]*100, listLs2)
|
|
454
|
+
|
|
455
|
+
jsonLister = LumiList(filename = 'lumiTest.json')
|
|
456
|
+
jsonString = jsonLister.getCMSSWString()
|
|
457
|
+
jsonList = jsonLister.getCompactList()
|
|
458
|
+
|
|
459
|
+
pairLister = LumiList(lumis = lumis)
|
|
460
|
+
pairString = pairLister.getCMSSWString()
|
|
461
|
+
pairList = pairLister.getCompactList()
|
|
462
|
+
|
|
463
|
+
self.assertTrue(jsonString == pairString)
|
|
464
|
+
self.assertTrue(jsonList == pairList)
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
def testRuns(self):
|
|
468
|
+
"""
|
|
469
|
+
Test constucting from run and list of lumis
|
|
470
|
+
"""
|
|
471
|
+
runsAndLumis = {
|
|
472
|
+
1: range(1, 34) + [35] + range(37, 48),
|
|
473
|
+
2: range(49, 76) + range(77, 131) + range(133, 137)
|
|
474
|
+
}
|
|
475
|
+
runsAndLumis2 = {
|
|
476
|
+
'1': range(1, 34) + [35] + range(37, 48),
|
|
477
|
+
'2': range(49, 76) + range(77, 131) + range(133, 137)
|
|
478
|
+
}
|
|
479
|
+
blank = {
|
|
480
|
+
'1': [],
|
|
481
|
+
'2': []
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
jsonLister = LumiList(filename = 'lumiTest.json')
|
|
485
|
+
jsonString = jsonLister.getCMSSWString()
|
|
486
|
+
jsonList = jsonLister.getCompactList()
|
|
487
|
+
|
|
488
|
+
runLister = LumiList(runsAndLumis = runsAndLumis)
|
|
489
|
+
runString = runLister.getCMSSWString()
|
|
490
|
+
runList = runLister.getCompactList()
|
|
491
|
+
|
|
492
|
+
runLister2 = LumiList(runsAndLumis = runsAndLumis2)
|
|
493
|
+
runList2 = runLister2.getCompactList()
|
|
494
|
+
|
|
495
|
+
runLister3 = LumiList(runsAndLumis = blank)
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
self.assertTrue(jsonString == runString)
|
|
499
|
+
self.assertTrue(jsonList == runList)
|
|
500
|
+
self.assertTrue(runList2 == runList)
|
|
501
|
+
self.assertTrue(len(runLister3) == 0)
|
|
502
|
+
|
|
503
|
+
def testFilter(self):
|
|
504
|
+
"""
|
|
505
|
+
Test filtering of a list of lumis
|
|
506
|
+
"""
|
|
507
|
+
runsAndLumis = {
|
|
508
|
+
1: range(1, 34) + [35] + range(37, 48),
|
|
509
|
+
2: range(49, 76) + range(77, 131) + range(133, 137)
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
completeList = zip([1]*150, range(1, 150)) + \
|
|
513
|
+
zip([2]*150, range(1, 150)) + \
|
|
514
|
+
zip([3]*150, range(1, 150))
|
|
515
|
+
|
|
516
|
+
smallList = zip([1]*50, range(1, 10)) + zip([2]*50, range(50, 70))
|
|
517
|
+
overlapList = zip([1]*150, range(30, 40)) + \
|
|
518
|
+
zip([2]*150, range(60, 80))
|
|
519
|
+
overlapRes = zip([1]*9, range(30, 34)) + [(1, 35)] + \
|
|
520
|
+
zip([1]*9, range(37, 40)) + \
|
|
521
|
+
zip([2]*30, range(60, 76)) + \
|
|
522
|
+
zip([2]*9, range(77, 80))
|
|
523
|
+
|
|
524
|
+
runLister = LumiList(runsAndLumis = runsAndLumis)
|
|
525
|
+
|
|
526
|
+
# Test a list to be filtered which is a superset of constructed list
|
|
527
|
+
filterComplete = runLister.filterLumis(completeList)
|
|
528
|
+
# Test a list to be filtered which is a subset of constructed list
|
|
529
|
+
filterSmall = runLister.filterLumis(smallList)
|
|
530
|
+
# Test a list to be filtered which is neither
|
|
531
|
+
filterOverlap = runLister.filterLumis(overlapList)
|
|
532
|
+
|
|
533
|
+
self.assertTrue(filterComplete == runLister.getLumis())
|
|
534
|
+
self.assertTrue(filterSmall == smallList)
|
|
535
|
+
self.assertTrue(filterOverlap == overlapRes)
|
|
536
|
+
|
|
537
|
+
def testDuplicates(self):
|
|
538
|
+
"""
|
|
539
|
+
Test a list with lots of duplicates
|
|
540
|
+
"""
|
|
541
|
+
result = zip([1]*100, range(1, 34) + range(37, 48))
|
|
542
|
+
lumis = zip([1]*100, range(1, 34) + range(37, 48) + range(5, 25))
|
|
543
|
+
|
|
544
|
+
lister = LumiList(lumis = lumis)
|
|
545
|
+
self.assertTrue(lister.getLumis() == result)
|
|
546
|
+
|
|
547
|
+
def testNull(self):
|
|
548
|
+
"""
|
|
549
|
+
Test a null list
|
|
550
|
+
"""
|
|
551
|
+
|
|
552
|
+
runLister = LumiList(lumis = None)
|
|
553
|
+
|
|
554
|
+
self.assertTrue(runLister.getCMSSWString() == '')
|
|
555
|
+
self.assertTrue(runLister.getLumis() == [])
|
|
556
|
+
self.assertTrue(runLister.getCompactList() == {})
|
|
557
|
+
|
|
558
|
+
def testSubtract(self):
|
|
559
|
+
"""
|
|
560
|
+
a-b for lots of cases
|
|
561
|
+
"""
|
|
562
|
+
|
|
563
|
+
alumis = {'1' : range(2,20) + range(31,39) + range(45,49),
|
|
564
|
+
'2' : range(6,20) + range (30,40),
|
|
565
|
+
'3' : range(10,20) + range (30,40) + range(50,60),
|
|
566
|
+
}
|
|
567
|
+
blumis = {'1' : range(1,6) + range(12,13) + range(16,30) + range(40,50) + range(33,36),
|
|
568
|
+
'2' : range(10,35),
|
|
569
|
+
'3' : range(10,15) + range(35,40) + range(45,51) + range(59,70),
|
|
570
|
+
}
|
|
571
|
+
clumis = {'1' : range(1,6) + range(12,13) + range(16,30) + range(40,50) + range(33,36),
|
|
572
|
+
'2' : range(10,35),
|
|
573
|
+
}
|
|
574
|
+
result = {'1' : range(6,12) + range(13,16) + range(31,33) + range(36,39),
|
|
575
|
+
'2' : range(6,10) + range(35,40),
|
|
576
|
+
'3' : range(15,20) + range(30,35) + range(51,59),
|
|
577
|
+
}
|
|
578
|
+
result2 = {'1' : range(6,12) + range(13,16) + range(31,33) + range(36,39),
|
|
579
|
+
'2' : range(6,10) + range(35,40),
|
|
580
|
+
'3' : range(10,20) + range (30,40) + range(50,60),
|
|
581
|
+
}
|
|
582
|
+
a = LumiList(runsAndLumis = alumis)
|
|
583
|
+
b = LumiList(runsAndLumis = blumis)
|
|
584
|
+
c = LumiList(runsAndLumis = clumis)
|
|
585
|
+
r = LumiList(runsAndLumis = result)
|
|
586
|
+
r2 = LumiList(runsAndLumis = result2)
|
|
587
|
+
|
|
588
|
+
self.assertTrue((a-b).getCMSSWString() == r.getCMSSWString())
|
|
589
|
+
self.assertTrue((a-b).getCMSSWString() != (b-a).getCMSSWString())
|
|
590
|
+
# Test where c is missing runs from a
|
|
591
|
+
self.assertTrue((a-c).getCMSSWString() == r2.getCMSSWString())
|
|
592
|
+
self.assertTrue((a-c).getCMSSWString() != (c-a).getCMSSWString())
|
|
593
|
+
# Test empty lists
|
|
594
|
+
self.assertTrue(str(a-a) == '{}')
|
|
595
|
+
self.assertTrue(len(a-a) == 0)
|
|
596
|
+
|
|
597
|
+
def testOr(self):
|
|
598
|
+
"""
|
|
599
|
+
a|b for lots of cases
|
|
600
|
+
"""
|
|
601
|
+
|
|
602
|
+
alumis = {'1' : range(2,20) + range(31,39) + range(45,49),
|
|
603
|
+
'2' : range(6,20) + range (30,40),
|
|
604
|
+
'3' : range(10,20) + range (30,40) + range(50,60),
|
|
605
|
+
}
|
|
606
|
+
blumis = {'1' : range(1,6) + range(12,13) + range(16,30) + range(40,50) + range(39,80),
|
|
607
|
+
'2' : range(10,35),
|
|
608
|
+
'3' : range(10,15) + range(35,40) + range(45,51) + range(59,70),
|
|
609
|
+
}
|
|
610
|
+
clumis = {'1' : range(1,6) + range(12,13) + range(16,30) + range(40,50) + range(39,80),
|
|
611
|
+
'2' : range(10,35),
|
|
612
|
+
}
|
|
613
|
+
result = {'1' : range(2,20) + range(31,39) + range(45,49) + range(1,6) + range(12,13) + range(16,30) + range(40,50) + range(39,80),
|
|
614
|
+
'2' : range(6,20) + range (30,40) + range(10,35),
|
|
615
|
+
'3' : range(10,20) + range (30,40) + range(50,60) + range(10,15) + range(35,40) + range(45,51) + range(59,70),
|
|
616
|
+
}
|
|
617
|
+
a = LumiList(runsAndLumis = alumis)
|
|
618
|
+
b = LumiList(runsAndLumis = blumis)
|
|
619
|
+
c = LumiList(runsAndLumis = blumis)
|
|
620
|
+
r = LumiList(runsAndLumis = result)
|
|
621
|
+
self.assertTrue((a|b).getCMSSWString() == r.getCMSSWString())
|
|
622
|
+
self.assertTrue((a|b).getCMSSWString() == (b|a).getCMSSWString())
|
|
623
|
+
self.assertTrue((a|b).getCMSSWString() == (a+b).getCMSSWString())
|
|
624
|
+
|
|
625
|
+
# Test list constuction (faster)
|
|
626
|
+
|
|
627
|
+
multiple = [alumis, blumis, clumis]
|
|
628
|
+
easy = LumiList(runsAndLumis = multiple)
|
|
629
|
+
hard = a + b
|
|
630
|
+
hard += c
|
|
631
|
+
self.assertTrue(hard.getCMSSWString() == easy.getCMSSWString())
|
|
632
|
+
|
|
633
|
+
def testAnd(self):
|
|
634
|
+
"""
|
|
635
|
+
a&b for lots of cases
|
|
636
|
+
"""
|
|
637
|
+
|
|
638
|
+
alumis = {'1' : range(2,20) + range(31,39) + range(45,49),
|
|
639
|
+
'2' : range(6,20) + range (30,40),
|
|
640
|
+
'3' : range(10,20) + range (30,40) + range(50,60),
|
|
641
|
+
'4' : range(1,100),
|
|
642
|
+
}
|
|
643
|
+
blumis = {'1' : range(1,6) + range(12,13) + range(16,25) + range(25,40) + range(40,50) + range(33,36),
|
|
644
|
+
'2' : range(10,35),
|
|
645
|
+
'3' : range(10,15) + range(35,40) + range(45,51) + range(59,70),
|
|
646
|
+
'5' : range(1,100),
|
|
647
|
+
}
|
|
648
|
+
result = {'1' : range(2,6) + range(12,13) + range(16,20) + range(31,39) + range(45,49),
|
|
649
|
+
'2' : range(10,20) + range(30,35),
|
|
650
|
+
'3' : range(10,15) + range(35,40) + range(50,51)+ range(59,60),
|
|
651
|
+
}
|
|
652
|
+
a = LumiList(runsAndLumis = alumis)
|
|
653
|
+
b = LumiList(runsAndLumis = blumis)
|
|
654
|
+
r = LumiList(runsAndLumis = result)
|
|
655
|
+
self.assertTrue((a&b).getCMSSWString() == r.getCMSSWString())
|
|
656
|
+
self.assertTrue((a&b).getCMSSWString() == (b&a).getCMSSWString())
|
|
657
|
+
self.assertTrue((a|b).getCMSSWString() != r.getCMSSWString())
|
|
658
|
+
|
|
659
|
+
def testRemoveSelect(self):
|
|
660
|
+
"""
|
|
661
|
+
a-b for lots of cases
|
|
662
|
+
"""
|
|
663
|
+
|
|
664
|
+
alumis = {'1' : range(2,20) + range(31,39) + range(45,49),
|
|
665
|
+
'2' : range(6,20) + range (30,40),
|
|
666
|
+
'3' : range(10,20) + range (30,40) + range(50,60),
|
|
667
|
+
'4' : range(10,20) + range (30,80),
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
result = {'2' : range(6,20) + range (30,40),
|
|
671
|
+
'4' : range(10,20) + range (30,80),
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
rem = LumiList(runsAndLumis = alumis)
|
|
675
|
+
sel = LumiList(runsAndLumis = alumis)
|
|
676
|
+
res = LumiList(runsAndLumis = result)
|
|
677
|
+
|
|
678
|
+
rem.removeRuns([1,3])
|
|
679
|
+
sel.selectRuns([2,4])
|
|
680
|
+
|
|
681
|
+
self.assertTrue(rem.getCMSSWString() == res.getCMSSWString())
|
|
682
|
+
self.assertTrue(sel.getCMSSWString() == res.getCMSSWString())
|
|
683
|
+
self.assertTrue(sel.getCMSSWString() == rem.getCMSSWString())
|
|
684
|
+
|
|
685
|
+
def testURL(self):
|
|
686
|
+
URL = 'https://cms-service-dqm.web.cern.ch/cms-service-dqm/CAF/certification/Collisions12/8TeV/Reprocessing/Cert_190456-195530_8TeV_08Jun2012ReReco_Collisions12_JSON.txt'
|
|
687
|
+
ll = LumiList(url=URL)
|
|
688
|
+
self.assertTrue(len(ll) > 0)
|
|
689
|
+
|
|
690
|
+
|
|
691
|
+
def testWrite(self):
|
|
692
|
+
alumis = {'1' : range(2,20) + range(31,39) + range(45,49),
|
|
693
|
+
'2' : range(6,20) + range (30,40),
|
|
694
|
+
'3' : range(10,20) + range (30,40) + range(50,60),
|
|
695
|
+
'4' : range(1,100),
|
|
696
|
+
}
|
|
697
|
+
a = LumiList(runsAndLumis = alumis)
|
|
698
|
+
a.writeJSON('newFile.json')
|
|
699
|
+
|
|
700
|
+
|
|
701
|
+
if __name__ == '__main__':
|
|
702
|
+
with open('lumiTest.json','w') as jsonFile:
|
|
703
|
+
jsonFile.write('{"1": [[1, 33], [35, 35], [37, 47]], "2": [[49, 75], [77, 130], [133, 136]]}')
|
|
704
|
+
unittest.main()
|
|
705
|
+
'''
|
|
706
|
+
# Test JSON file
|
|
707
|
+
|
|
708
|
+
#{"1": [[1, 33], [35, 35], [37, 47]], "2": [[49, 75], [77, 130], [133, 136]]}
|
|
709
|
+
|
|
710
|
+
if __name__ == '__main__':
|
|
711
|
+
#############################################
|
|
712
|
+
## Load and save command line history when ##
|
|
713
|
+
## running interactively. ##
|
|
714
|
+
#############################################
|
|
715
|
+
import os, readline
|
|
716
|
+
import atexit
|
|
717
|
+
historyPath = os.path.expanduser("~/.pyhistory")
|
|
718
|
+
|
|
719
|
+
|
|
720
|
+
def save_history(historyPath=historyPath):
|
|
721
|
+
import readline
|
|
722
|
+
readline.write_history_file(historyPath)
|
|
723
|
+
if os.path.exists(historyPath):
|
|
724
|
+
readline.read_history_file(historyPath)
|
|
725
|
+
|
|
726
|
+
|
|
727
|
+
atexit.register(save_history)
|
|
728
|
+
readline.parse_and_bind("set show-all-if-ambiguous on")
|
|
729
|
+
readline.parse_and_bind("tab: complete")
|
|
730
|
+
if os.path.exists (historyPath) :
|
|
731
|
+
readline.read_history_file(historyPath)
|
|
732
|
+
readline.set_history_length(-1)
|
|
733
|
+
|
|
734
|
+
|