ATLAS Offline Software
Loading...
Searching...
No Matches
pool_uuid.py
Go to the documentation of this file.
1#!/usr/bin/env python
2
3# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
4
5import sys
6import datetime, time
7import uuid
8
9version_str = ('Unused', 'Gregorian time based', 'DCE', 'MD5 based', 'RNG based', 'SHA',
10 'Reordered Gregorian', 'Epoch time based', 'Custom') + ('Reserved',)*7
11
12def uuid_to_ts( myuuid ) :
13 # from web.archive.org/web/20110817134817/http://www.gossamer-threads.com:80/lists/python/dev/670680
14 DTD_DELTA = ( datetime.datetime( *time.gmtime(0)[0:3] ) -
15 datetime.datetime( 1582, 10, 15 ) )
16 DTD_SECS_DELTA = DTD_DELTA.days * 86400 # 0x01b21dd213814000/1e7
17 secs = myuuid.time / 1e7
18 secs_epoch = secs - DTD_SECS_DELTA
19 return datetime.datetime.fromtimestamp( secs_epoch )
20
21def uuid_split( guid ):
22 fields = guid.split('-')
23 if len(fields) != 5: raise ValueError( f"Wrong number of fields in '{guid}'" )
24 if len(fields[0]) != 8: raise ValueError( f"Wrong length of field#0: '{fields[0]}'" )
25 if len(fields[1]) != 4: raise ValueError( f"Wrong length of field#1: '{fields[1]}'" )
26 if len(fields[2]) != 4: raise ValueError( f"Wrong length of field#2: '{fields[2]}'" )
27 if len(fields[3]) != 4: raise ValueError( f"Wrong length of field#3: '{fields[3]}'" )
28 if len(fields[4]) != 12: raise ValueError( f"Wrong length of field#4: '{fields[4]}'" )
29 return (fields[0], fields[1], fields[2], fields[3], fields[4])
30
31# DDCCBBAA-FFEE-HHGG-IIJJ-KKLLMMNNOOPP to AABBCCDD-EEFF-GGHH-IIJJ-KKLLMMNNOOPP
32def pool_to_uuid( mypool ) :
33 print('POOL guid:', mypool)
34 f0, f1, f2, f3, f4 = uuid_split(mypool)
35 myuuid = '%s%s%s%s-%s%s-%s%s-%s-%s'\
36 %(f0[6:8],f0[4:6],f0[2:4],f0[0:2],\
37 f1[2:4],f1[0:2],f2[2:4],f2[0:2],f3,f4)
38 print('UUID guid:', myuuid)
39 return myuuid
40
41# AABBCCDD-EEFF-GHIJ-xxxx-xxxxxxxxxxxx to HIJEEFFAABBCCDD
42def timorder_uuid( myuuid ) :
43 f0, f1, f2, f3, f4 = uuid_split(myuuid)
44 myuuidto = '%s%s%s'%(f2[1:4],f1,f0)
45 myUUID=uuid.UUID(myuuid)
46 print('UUID:', myUUID)
47 print('UUID time (100ns intervals since 15 Oct 1582):', myUUID.time, "hex:", hex(myUUID.time))
48 print('UUID timeordered:', myuuidto)
49 print('UUID timestamp:', uuid_to_ts(myUUID))
50 return myuuidto
51
52# DDCCBBAA-FFEE-IJGH-xxxx-xxxxxxxxxxxx to HIJEEFFAABBCCDD
53def timorder_pool( mypool ) :
54 print('POOL guid:', mypool)
55 f0, f1, f2, f3, f4 = uuid_split(mypool)
56 myuuidto = '%s%s%s%s%s%s%s%s'\
57 %(f2[2:3],f2[0:2],f1[2:4],f1[0:2],\
58 f0[6:8],f0[4:6],f0[2:4],f0[0:2],)
59 print('UUID timeordered:', myuuidto)
60 return myuuidto
61
62
63def printuuid( myuuid ) :
64 myUUID=uuid.UUID(myuuid)
65 print('UUID:', myUUID)
66 print('UUID variant:', myUUID.variant)
67 print('UUID version:', myUUID.version, '-',version_str[myUUID.version])
68 print('UUID field#0 (time_low): %12.8x (%12.8x)'\
69 %( myUUID.fields[0], myUUID.time_low ))
70 print('UUID field#1 (time_mid): %12.4x (%12.4x)'\
71 %( myUUID.fields[1], myUUID.time_mid ))
72 print('UUID field#2 (time_hi_version): %12.4x (%12.4x)'\
73 %( myUUID.fields[2], myUUID.time_hi_version ))
74 print('UUID field#3 (clock_seq_hi_variant): %12.2x (%12.2x)'\
75 %( myUUID.fields[3], myUUID.clock_seq_hi_variant ))
76 print('UUID field#4 (clock_seq_low): %12.2x (%12.2x)'\
77 %( myUUID.fields[4], myUUID.clock_seq_low ))
78 print('UUID field#5 (node): %12.12x (%12.12x)'\
79 %( myUUID.fields[5], myUUID.node ))
80 if myUUID.version == 1:
81 timorder_uuid( myuuid )
82 print('================================================')
83
84def usage():
85 print(sys.argv[0],"-h | [-u] UUID")
86 print(" -u : assume uuidgen standard format (not POOL)")
87 sys.exit(0)
88
89def example():
90 # [avalassi@lxplus248 tcsh] ~ > date ; pool_gen_uuid ; uuidgen -t
91 # A2E338DD-2265-DF11-AFE1-001E4F3E5C33
92 # DD3A5AAC-6522-11DF-82EB-001E4F3E5C33
93
94 guid1='DD3A5AAC-6522-11DF-82EB-001E4F3E5C33' # from uuidgen
95 guid2='A2E338DD-2265-DF11-AFE1-001E4F3E5C33' # from POOL
96 guid3='A2E338DD-2265-D011-AFE1-001E4F3E5C33' # POOL token for the year 1997
97 printuuid( guid1 )
98 printuuid( pool_to_uuid( guid2 ) )
99 printuuid( pool_to_uuid( guid3 ) )
100
101
102if __name__ == "__main__":
103 regular = False
104 if len(sys.argv) > 1:
105 if sys.argv[1] == '-u':
106 sys.argv.pop(1)
107 regular = True
108 if sys.argv[1] == '-h':
109 usage()
110 if len(sys.argv) < 2:
111 usage()
112 guid = sys.argv[1]
113 if not regular:
114 # assume POOL format
115 guid = pool_to_uuid( guid )
116 printuuid( guid )
117 else:
118 example()
119
void print(char *figname, TCanvas *c1)
timorder_uuid(myuuid)
Definition pool_uuid.py:42
pool_to_uuid(mypool)
Definition pool_uuid.py:32
uuid_to_ts(myuuid)
Definition pool_uuid.py:12
uuid_split(guid)
Definition pool_uuid.py:21
timorder_pool(mypool)
Definition pool_uuid.py:53
printuuid(myuuid)
Definition pool_uuid.py:63