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.
Files changed (347) hide show
  1. Utils/CPMetrics.py +270 -0
  2. Utils/CertTools.py +100 -0
  3. Utils/EmailAlert.py +50 -0
  4. Utils/ExtendedUnitTestCase.py +62 -0
  5. Utils/FileTools.py +182 -0
  6. Utils/IteratorTools.py +80 -0
  7. Utils/MathUtils.py +31 -0
  8. Utils/MemoryCache.py +119 -0
  9. Utils/Patterns.py +24 -0
  10. Utils/Pipeline.py +137 -0
  11. Utils/PortForward.py +97 -0
  12. Utils/ProcFS.py +112 -0
  13. Utils/ProcessStats.py +194 -0
  14. Utils/PythonVersion.py +17 -0
  15. Utils/Signals.py +36 -0
  16. Utils/TemporaryEnvironment.py +27 -0
  17. Utils/Throttled.py +227 -0
  18. Utils/Timers.py +130 -0
  19. Utils/Timestamps.py +86 -0
  20. Utils/TokenManager.py +143 -0
  21. Utils/Tracing.py +60 -0
  22. Utils/TwPrint.py +98 -0
  23. Utils/Utilities.py +318 -0
  24. Utils/__init__.py +11 -0
  25. Utils/wmcoreDTools.py +707 -0
  26. WMCore/ACDC/Collection.py +57 -0
  27. WMCore/ACDC/CollectionTypes.py +12 -0
  28. WMCore/ACDC/CouchCollection.py +67 -0
  29. WMCore/ACDC/CouchFileset.py +238 -0
  30. WMCore/ACDC/CouchService.py +73 -0
  31. WMCore/ACDC/DataCollectionService.py +485 -0
  32. WMCore/ACDC/Fileset.py +94 -0
  33. WMCore/ACDC/__init__.py +11 -0
  34. WMCore/Algorithms/Alarm.py +39 -0
  35. WMCore/Algorithms/MathAlgos.py +274 -0
  36. WMCore/Algorithms/MiscAlgos.py +67 -0
  37. WMCore/Algorithms/ParseXMLFile.py +115 -0
  38. WMCore/Algorithms/Permissions.py +27 -0
  39. WMCore/Algorithms/Singleton.py +58 -0
  40. WMCore/Algorithms/SubprocessAlgos.py +129 -0
  41. WMCore/Algorithms/__init__.py +7 -0
  42. WMCore/Cache/GenericDataCache.py +98 -0
  43. WMCore/Cache/WMConfigCache.py +572 -0
  44. WMCore/Cache/__init__.py +0 -0
  45. WMCore/Configuration.py +659 -0
  46. WMCore/DAOFactory.py +47 -0
  47. WMCore/DataStructs/File.py +177 -0
  48. WMCore/DataStructs/Fileset.py +140 -0
  49. WMCore/DataStructs/Job.py +182 -0
  50. WMCore/DataStructs/JobGroup.py +142 -0
  51. WMCore/DataStructs/JobPackage.py +49 -0
  52. WMCore/DataStructs/LumiList.py +734 -0
  53. WMCore/DataStructs/Mask.py +219 -0
  54. WMCore/DataStructs/MathStructs/ContinuousSummaryHistogram.py +197 -0
  55. WMCore/DataStructs/MathStructs/DiscreteSummaryHistogram.py +92 -0
  56. WMCore/DataStructs/MathStructs/SummaryHistogram.py +117 -0
  57. WMCore/DataStructs/MathStructs/__init__.py +0 -0
  58. WMCore/DataStructs/Pickleable.py +24 -0
  59. WMCore/DataStructs/Run.py +256 -0
  60. WMCore/DataStructs/Subscription.py +175 -0
  61. WMCore/DataStructs/WMObject.py +47 -0
  62. WMCore/DataStructs/WorkUnit.py +112 -0
  63. WMCore/DataStructs/Workflow.py +60 -0
  64. WMCore/DataStructs/__init__.py +8 -0
  65. WMCore/Database/CMSCouch.py +1430 -0
  66. WMCore/Database/ConfigDBMap.py +29 -0
  67. WMCore/Database/CouchMonitoring.py +450 -0
  68. WMCore/Database/CouchUtils.py +118 -0
  69. WMCore/Database/DBCore.py +198 -0
  70. WMCore/Database/DBCreator.py +113 -0
  71. WMCore/Database/DBExceptionHandler.py +59 -0
  72. WMCore/Database/DBFactory.py +117 -0
  73. WMCore/Database/DBFormatter.py +177 -0
  74. WMCore/Database/Dialects.py +13 -0
  75. WMCore/Database/ExecuteDAO.py +327 -0
  76. WMCore/Database/MongoDB.py +241 -0
  77. WMCore/Database/MySQL/Destroy.py +42 -0
  78. WMCore/Database/MySQL/ListUserContent.py +20 -0
  79. WMCore/Database/MySQL/__init__.py +9 -0
  80. WMCore/Database/MySQLCore.py +132 -0
  81. WMCore/Database/Oracle/Destroy.py +56 -0
  82. WMCore/Database/Oracle/ListUserContent.py +19 -0
  83. WMCore/Database/Oracle/__init__.py +9 -0
  84. WMCore/Database/ResultSet.py +44 -0
  85. WMCore/Database/Transaction.py +91 -0
  86. WMCore/Database/__init__.py +9 -0
  87. WMCore/Database/ipy_profile_couch.py +438 -0
  88. WMCore/GlobalWorkQueue/CherryPyThreads/CleanUpTask.py +29 -0
  89. WMCore/GlobalWorkQueue/CherryPyThreads/HeartbeatMonitor.py +105 -0
  90. WMCore/GlobalWorkQueue/CherryPyThreads/LocationUpdateTask.py +28 -0
  91. WMCore/GlobalWorkQueue/CherryPyThreads/ReqMgrInteractionTask.py +35 -0
  92. WMCore/GlobalWorkQueue/CherryPyThreads/__init__.py +0 -0
  93. WMCore/GlobalWorkQueue/__init__.py +0 -0
  94. WMCore/GroupUser/CouchObject.py +127 -0
  95. WMCore/GroupUser/Decorators.py +51 -0
  96. WMCore/GroupUser/Group.py +33 -0
  97. WMCore/GroupUser/Interface.py +73 -0
  98. WMCore/GroupUser/User.py +96 -0
  99. WMCore/GroupUser/__init__.py +11 -0
  100. WMCore/Lexicon.py +836 -0
  101. WMCore/REST/Auth.py +202 -0
  102. WMCore/REST/CherryPyPeriodicTask.py +166 -0
  103. WMCore/REST/Error.py +333 -0
  104. WMCore/REST/Format.py +642 -0
  105. WMCore/REST/HeartbeatMonitorBase.py +90 -0
  106. WMCore/REST/Main.py +636 -0
  107. WMCore/REST/Server.py +2435 -0
  108. WMCore/REST/Services.py +24 -0
  109. WMCore/REST/Test.py +120 -0
  110. WMCore/REST/Tools.py +38 -0
  111. WMCore/REST/Validation.py +250 -0
  112. WMCore/REST/__init__.py +1 -0
  113. WMCore/ReqMgr/DataStructs/RequestStatus.py +209 -0
  114. WMCore/ReqMgr/DataStructs/RequestType.py +13 -0
  115. WMCore/ReqMgr/DataStructs/__init__.py +0 -0
  116. WMCore/ReqMgr/__init__.py +1 -0
  117. WMCore/Services/AlertManager/AlertManagerAPI.py +111 -0
  118. WMCore/Services/AlertManager/__init__.py +0 -0
  119. WMCore/Services/CRIC/CRIC.py +238 -0
  120. WMCore/Services/CRIC/__init__.py +0 -0
  121. WMCore/Services/DBS/DBS3Reader.py +1044 -0
  122. WMCore/Services/DBS/DBSConcurrency.py +44 -0
  123. WMCore/Services/DBS/DBSErrors.py +112 -0
  124. WMCore/Services/DBS/DBSReader.py +23 -0
  125. WMCore/Services/DBS/DBSUtils.py +166 -0
  126. WMCore/Services/DBS/DBSWriterObjects.py +381 -0
  127. WMCore/Services/DBS/ProdException.py +133 -0
  128. WMCore/Services/DBS/__init__.py +8 -0
  129. WMCore/Services/FWJRDB/FWJRDBAPI.py +118 -0
  130. WMCore/Services/FWJRDB/__init__.py +0 -0
  131. WMCore/Services/HTTPS/HTTPSAuthHandler.py +66 -0
  132. WMCore/Services/HTTPS/__init__.py +0 -0
  133. WMCore/Services/LogDB/LogDB.py +201 -0
  134. WMCore/Services/LogDB/LogDBBackend.py +191 -0
  135. WMCore/Services/LogDB/LogDBExceptions.py +11 -0
  136. WMCore/Services/LogDB/LogDBReport.py +85 -0
  137. WMCore/Services/LogDB/__init__.py +0 -0
  138. WMCore/Services/MSPileup/__init__.py +0 -0
  139. WMCore/Services/MSUtils/MSUtils.py +54 -0
  140. WMCore/Services/MSUtils/__init__.py +0 -0
  141. WMCore/Services/McM/McM.py +173 -0
  142. WMCore/Services/McM/__init__.py +8 -0
  143. WMCore/Services/MonIT/Grafana.py +133 -0
  144. WMCore/Services/MonIT/__init__.py +0 -0
  145. WMCore/Services/PyCondor/PyCondorAPI.py +154 -0
  146. WMCore/Services/PyCondor/__init__.py +0 -0
  147. WMCore/Services/ReqMgr/ReqMgr.py +261 -0
  148. WMCore/Services/ReqMgr/__init__.py +0 -0
  149. WMCore/Services/ReqMgrAux/ReqMgrAux.py +419 -0
  150. WMCore/Services/ReqMgrAux/__init__.py +0 -0
  151. WMCore/Services/RequestDB/RequestDBReader.py +267 -0
  152. WMCore/Services/RequestDB/RequestDBWriter.py +39 -0
  153. WMCore/Services/RequestDB/__init__.py +0 -0
  154. WMCore/Services/Requests.py +624 -0
  155. WMCore/Services/Rucio/Rucio.py +1290 -0
  156. WMCore/Services/Rucio/RucioUtils.py +74 -0
  157. WMCore/Services/Rucio/__init__.py +0 -0
  158. WMCore/Services/RucioConMon/RucioConMon.py +121 -0
  159. WMCore/Services/RucioConMon/__init__.py +0 -0
  160. WMCore/Services/Service.py +400 -0
  161. WMCore/Services/StompAMQ/__init__.py +0 -0
  162. WMCore/Services/TagCollector/TagCollector.py +155 -0
  163. WMCore/Services/TagCollector/XMLUtils.py +98 -0
  164. WMCore/Services/TagCollector/__init__.py +0 -0
  165. WMCore/Services/UUIDLib.py +13 -0
  166. WMCore/Services/UserFileCache/UserFileCache.py +160 -0
  167. WMCore/Services/UserFileCache/__init__.py +8 -0
  168. WMCore/Services/WMAgent/WMAgent.py +63 -0
  169. WMCore/Services/WMAgent/__init__.py +0 -0
  170. WMCore/Services/WMArchive/CMSSWMetrics.py +526 -0
  171. WMCore/Services/WMArchive/DataMap.py +463 -0
  172. WMCore/Services/WMArchive/WMArchive.py +33 -0
  173. WMCore/Services/WMArchive/__init__.py +0 -0
  174. WMCore/Services/WMBS/WMBS.py +97 -0
  175. WMCore/Services/WMBS/__init__.py +0 -0
  176. WMCore/Services/WMStats/DataStruct/RequestInfoCollection.py +300 -0
  177. WMCore/Services/WMStats/DataStruct/__init__.py +0 -0
  178. WMCore/Services/WMStats/WMStatsPycurl.py +145 -0
  179. WMCore/Services/WMStats/WMStatsReader.py +445 -0
  180. WMCore/Services/WMStats/WMStatsWriter.py +273 -0
  181. WMCore/Services/WMStats/__init__.py +0 -0
  182. WMCore/Services/WMStatsServer/WMStatsServer.py +134 -0
  183. WMCore/Services/WMStatsServer/__init__.py +0 -0
  184. WMCore/Services/WorkQueue/WorkQueue.py +492 -0
  185. WMCore/Services/WorkQueue/__init__.py +0 -0
  186. WMCore/Services/__init__.py +8 -0
  187. WMCore/Services/pycurl_manager.py +574 -0
  188. WMCore/WMBase.py +50 -0
  189. WMCore/WMConnectionBase.py +164 -0
  190. WMCore/WMException.py +183 -0
  191. WMCore/WMExceptions.py +269 -0
  192. WMCore/WMFactory.py +76 -0
  193. WMCore/WMInit.py +377 -0
  194. WMCore/WMLogging.py +104 -0
  195. WMCore/WMSpec/ConfigSectionTree.py +442 -0
  196. WMCore/WMSpec/Persistency.py +135 -0
  197. WMCore/WMSpec/Steps/BuildMaster.py +87 -0
  198. WMCore/WMSpec/Steps/BuildTools.py +201 -0
  199. WMCore/WMSpec/Steps/Builder.py +97 -0
  200. WMCore/WMSpec/Steps/Diagnostic.py +89 -0
  201. WMCore/WMSpec/Steps/Emulator.py +62 -0
  202. WMCore/WMSpec/Steps/ExecuteMaster.py +208 -0
  203. WMCore/WMSpec/Steps/Executor.py +210 -0
  204. WMCore/WMSpec/Steps/StepFactory.py +213 -0
  205. WMCore/WMSpec/Steps/TaskEmulator.py +75 -0
  206. WMCore/WMSpec/Steps/Template.py +204 -0
  207. WMCore/WMSpec/Steps/Templates/AlcaHarvest.py +76 -0
  208. WMCore/WMSpec/Steps/Templates/CMSSW.py +613 -0
  209. WMCore/WMSpec/Steps/Templates/DQMUpload.py +59 -0
  210. WMCore/WMSpec/Steps/Templates/DeleteFiles.py +70 -0
  211. WMCore/WMSpec/Steps/Templates/LogArchive.py +84 -0
  212. WMCore/WMSpec/Steps/Templates/LogCollect.py +105 -0
  213. WMCore/WMSpec/Steps/Templates/StageOut.py +105 -0
  214. WMCore/WMSpec/Steps/Templates/__init__.py +10 -0
  215. WMCore/WMSpec/Steps/WMExecutionFailure.py +21 -0
  216. WMCore/WMSpec/Steps/__init__.py +8 -0
  217. WMCore/WMSpec/Utilities.py +63 -0
  218. WMCore/WMSpec/WMSpecErrors.py +12 -0
  219. WMCore/WMSpec/WMStep.py +347 -0
  220. WMCore/WMSpec/WMTask.py +1997 -0
  221. WMCore/WMSpec/WMWorkload.py +2288 -0
  222. WMCore/WMSpec/WMWorkloadTools.py +382 -0
  223. WMCore/WMSpec/__init__.py +9 -0
  224. WMCore/WorkQueue/DataLocationMapper.py +273 -0
  225. WMCore/WorkQueue/DataStructs/ACDCBlock.py +47 -0
  226. WMCore/WorkQueue/DataStructs/Block.py +48 -0
  227. WMCore/WorkQueue/DataStructs/CouchWorkQueueElement.py +148 -0
  228. WMCore/WorkQueue/DataStructs/WorkQueueElement.py +274 -0
  229. WMCore/WorkQueue/DataStructs/WorkQueueElementResult.py +152 -0
  230. WMCore/WorkQueue/DataStructs/WorkQueueElementsSummary.py +185 -0
  231. WMCore/WorkQueue/DataStructs/__init__.py +0 -0
  232. WMCore/WorkQueue/Policy/End/EndPolicyInterface.py +44 -0
  233. WMCore/WorkQueue/Policy/End/SingleShot.py +22 -0
  234. WMCore/WorkQueue/Policy/End/__init__.py +32 -0
  235. WMCore/WorkQueue/Policy/PolicyInterface.py +17 -0
  236. WMCore/WorkQueue/Policy/Start/Block.py +258 -0
  237. WMCore/WorkQueue/Policy/Start/Dataset.py +180 -0
  238. WMCore/WorkQueue/Policy/Start/MonteCarlo.py +131 -0
  239. WMCore/WorkQueue/Policy/Start/ResubmitBlock.py +171 -0
  240. WMCore/WorkQueue/Policy/Start/StartPolicyInterface.py +316 -0
  241. WMCore/WorkQueue/Policy/Start/__init__.py +34 -0
  242. WMCore/WorkQueue/Policy/__init__.py +57 -0
  243. WMCore/WorkQueue/WMBSHelper.py +772 -0
  244. WMCore/WorkQueue/WorkQueue.py +1237 -0
  245. WMCore/WorkQueue/WorkQueueBackend.py +750 -0
  246. WMCore/WorkQueue/WorkQueueBase.py +39 -0
  247. WMCore/WorkQueue/WorkQueueExceptions.py +44 -0
  248. WMCore/WorkQueue/WorkQueueReqMgrInterface.py +278 -0
  249. WMCore/WorkQueue/WorkQueueUtils.py +130 -0
  250. WMCore/WorkQueue/__init__.py +13 -0
  251. WMCore/Wrappers/JsonWrapper/JSONThunker.py +342 -0
  252. WMCore/Wrappers/JsonWrapper/__init__.py +7 -0
  253. WMCore/Wrappers/__init__.py +6 -0
  254. WMCore/__init__.py +10 -0
  255. wmglobalqueue-2.4.5.1.data/data/bin/wmc-dist-patch +15 -0
  256. wmglobalqueue-2.4.5.1.data/data/bin/wmc-dist-unpatch +8 -0
  257. wmglobalqueue-2.4.5.1.data/data/bin/wmc-httpd +3 -0
  258. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/.couchapprc +1 -0
  259. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/README.md +40 -0
  260. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/index.html +264 -0
  261. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/ElementInfoByWorkflow.js +96 -0
  262. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/StuckElementInfo.js +57 -0
  263. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/WorkloadInfoTable.js +80 -0
  264. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/dataTable.js +70 -0
  265. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/js/namespace.js +23 -0
  266. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/_attachments/style/main.css +75 -0
  267. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/couchapp.json +4 -0
  268. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/filters/childQueueFilter.js +13 -0
  269. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/filters/filterDeletedDocs.js +3 -0
  270. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/filters/queueFilter.js +11 -0
  271. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/language +1 -0
  272. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lib/mustache.js +333 -0
  273. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lib/validate.js +27 -0
  274. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lib/workqueue_utils.js +61 -0
  275. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/elementsDetail.js +28 -0
  276. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/filter.js +86 -0
  277. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/stuckElements.js +38 -0
  278. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/workRestrictions.js +153 -0
  279. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/lists/workflowSummary.js +28 -0
  280. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/rewrites.json +73 -0
  281. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/shows/redirect.js +23 -0
  282. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/shows/status.js +40 -0
  283. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/ElementSummaryByWorkflow.html +27 -0
  284. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/StuckElementSummary.html +26 -0
  285. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/TaskStatus.html +23 -0
  286. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/WorkflowSummary.html +27 -0
  287. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/partials/workqueue-common-lib.html +2 -0
  288. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/partials/yui-lib-remote.html +16 -0
  289. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/templates/partials/yui-lib.html +18 -0
  290. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/updates/in-place.js +50 -0
  291. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/validate_doc_update.js +8 -0
  292. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/vendor/couchapp/_attachments/jquery.couch.app.js +235 -0
  293. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/vendor/couchapp/_attachments/jquery.pathbinder.js +173 -0
  294. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeData/map.js +8 -0
  295. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeData/reduce.js +2 -0
  296. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeParentData/map.js +8 -0
  297. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activeParentData/reduce.js +2 -0
  298. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activePileupData/map.js +8 -0
  299. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/activePileupData/reduce.js +2 -0
  300. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/analyticsData/map.js +11 -0
  301. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/analyticsData/reduce.js +1 -0
  302. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/availableByPriority/map.js +6 -0
  303. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/conflicts/map.js +5 -0
  304. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elements/map.js +5 -0
  305. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByData/map.js +8 -0
  306. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByParent/map.js +8 -0
  307. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByParentData/map.js +8 -0
  308. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByPileupData/map.js +8 -0
  309. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByStatus/map.js +8 -0
  310. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsBySubscription/map.js +6 -0
  311. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByWorkflow/map.js +8 -0
  312. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsByWorkflow/reduce.js +3 -0
  313. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/elementsDetailByWorkflowAndStatus/map.js +26 -0
  314. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobInjectStatusByRequest/map.js +10 -0
  315. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobInjectStatusByRequest/reduce.js +1 -0
  316. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobStatusByRequest/map.js +6 -0
  317. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobStatusByRequest/reduce.js +1 -0
  318. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndPriority/map.js +6 -0
  319. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndPriority/reduce.js +1 -0
  320. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndStatus/map.js +6 -0
  321. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByChildQueueAndStatus/reduce.js +1 -0
  322. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByRequest/map.js +6 -0
  323. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByRequest/reduce.js +1 -0
  324. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatus/map.js +6 -0
  325. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatus/reduce.js +1 -0
  326. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatusAndPriority/map.js +6 -0
  327. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/jobsByStatusAndPriority/reduce.js +1 -0
  328. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/openRequests/map.js +6 -0
  329. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/recent-items/map.js +5 -0
  330. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/siteWhitelistByRequest/map.js +6 -0
  331. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/siteWhitelistByRequest/reduce.js +1 -0
  332. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/specsByWorkflow/map.js +5 -0
  333. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/stuckElements/map.js +38 -0
  334. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsInjectStatusByRequest/map.js +12 -0
  335. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsInjectStatusByRequest/reduce.js +3 -0
  336. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrl/map.js +6 -0
  337. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrl/reduce.js +2 -0
  338. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrlByRequest/map.js +6 -0
  339. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/wmbsUrlByRequest/reduce.js +2 -0
  340. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/workflowSummary/map.js +9 -0
  341. wmglobalqueue-2.4.5.1.data/data/data/couchapps/WorkQueue/views/workflowSummary/reduce.js +10 -0
  342. wmglobalqueue-2.4.5.1.dist-info/METADATA +26 -0
  343. wmglobalqueue-2.4.5.1.dist-info/RECORD +347 -0
  344. wmglobalqueue-2.4.5.1.dist-info/WHEEL +5 -0
  345. wmglobalqueue-2.4.5.1.dist-info/licenses/LICENSE +202 -0
  346. wmglobalqueue-2.4.5.1.dist-info/licenses/NOTICE +16 -0
  347. 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
+