5
5
6
6
import numpy
7
7
8
- import vector .compute
8
+ import vector .backends .object_
9
+ import vector .geometry
10
+ import vector .methods
11
+
12
+
13
+ def getitem (array , where , object_type ):
14
+ if isinstance (where , str ):
15
+ return array .view (numpy .ndarray )[where ]
16
+ else :
17
+ out = numpy .ndarray .__getitem__ (array , where )
18
+ if isinstance (out , numpy .void ):
19
+ return object_type (* out )
20
+ else :
21
+ return out
9
22
10
23
11
24
class AzimuthalNumpy :
@@ -21,98 +34,130 @@ class TemporalNumpy:
21
34
22
35
23
36
class AzimuthalNumpyXY (numpy .ndarray , AzimuthalNumpy , vector .geometry .AzimuthalXY ):
24
- def __iter__ ( self ):
25
- yield self [ "x" ]. view ( numpy . ndarray )
26
- yield self ["y" ]. view ( numpy . ndarray )
37
+ @ property
38
+ def elements ( self ):
39
+ return ( self ["x" ], self [ " y" ])
27
40
28
41
@property
29
42
def x (self ):
30
- return self ["x" ]. view ( numpy . ndarray )
43
+ return self ["x" ]
31
44
32
45
@property
33
46
def y (self ):
34
- return self ["y" ].view (numpy .ndarray )
47
+ return self ["y" ]
48
+
49
+ def __getitem__ (self , where ):
50
+ return getitem (self , where , vector .backends .object_ .AzimuthalObjectXY )
35
51
36
52
37
53
class AzimuthalNumpyRhoPhi (
38
54
numpy .ndarray , AzimuthalNumpy , vector .geometry .AzimuthalRhoPhi
39
55
):
40
- def __iter__ ( self ):
41
- yield self [ "rho" ]. view ( numpy . ndarray )
42
- yield self ["phi" ]. view ( numpy . ndarray )
56
+ @ property
57
+ def elements ( self ):
58
+ return ( self ["rho" ], self [ " phi" ])
43
59
44
60
@property
45
61
def rho (self ):
46
- return self ["rho" ]. view ( numpy . ndarray )
62
+ return self ["rho" ]
47
63
48
64
@property
49
65
def phi (self ):
50
- return self ["phi" ].view (numpy .ndarray )
66
+ return self ["phi" ]
67
+
68
+ def __getitem__ (self , where ):
69
+ return getitem (self , where , vector .backends .object_ .AzimuthalObjectRhoPhi )
51
70
52
71
53
72
class LongitudinalNumpyZ (
54
73
numpy .ndarray , LongitudinalNumpy , vector .geometry .LongitudinalZ
55
74
):
56
- def __iter__ (self ):
57
- yield self ["z" ].view (numpy .ndarray )
75
+ @property
76
+ def elements (self ):
77
+ return (self ["z" ],)
58
78
59
79
@property
60
80
def z (self ):
61
- return self ["z" ].view (numpy .ndarray )
81
+ return self ["z" ]
82
+
83
+ def __getitem__ (self , where ):
84
+ return getitem (self , where , vector .backends .object_ .LongitudinalObjectZ )
62
85
63
86
64
87
class LongitudinalNumpyTheta (
65
88
numpy .ndarray , LongitudinalNumpy , vector .geometry .LongitudinalTheta
66
89
):
67
- def __iter__ (self ):
68
- yield self ["theta" ].view (numpy .ndarray )
90
+ @property
91
+ def elements (self ):
92
+ return (self ["theta" ],)
69
93
70
94
@property
71
95
def theta (self ):
72
- return self ["theta" ].view (numpy .ndarray )
96
+ return self ["theta" ]
97
+
98
+ def __getitem__ (self , where ):
99
+ return getitem (self , where , vector .backends .object_ .LongitudinalObjectTheta )
73
100
74
101
75
102
class LongitudinalNumpyEta (
76
103
numpy .ndarray , LongitudinalNumpy , vector .geometry .LongitudinalEta
77
104
):
78
- def __iter__ (self ):
79
- yield self ["eta" ].view (numpy .ndarray )
105
+ @property
106
+ def elements (self ):
107
+ return (self ["eta" ],)
80
108
81
109
@property
82
110
def eta (self ):
83
- return self ["eta" ].view (numpy .ndarray )
111
+ return self ["eta" ]
112
+
113
+ def __getitem__ (self , where ):
114
+ return getitem (self , where , vector .backends .object_ .LongitudinalObjectEta )
84
115
85
116
86
117
class LongitudinalNumpyW (
87
118
numpy .ndarray , LongitudinalNumpy , vector .geometry .LongitudinalW
88
119
):
89
- def __iter__ (self ):
90
- yield self ["w" ].view (numpy .ndarray )
120
+ @property
121
+ def elements (self ):
122
+ return (self ["w" ],)
91
123
92
124
@property
93
125
def w (self ):
94
- return self ["w" ].view (numpy .ndarray )
126
+ return self ["w" ]
127
+
128
+ def __getitem__ (self , where ):
129
+ return getitem (self , where , vector .backends .object_ .LongitudinalObjectW )
95
130
96
131
97
132
class TemporalNumpyT (numpy .ndarray , TemporalNumpy , vector .geometry .TemporalT ):
98
- def __iter__ (self ):
99
- yield self ["t" ].view (numpy .ndarray )
133
+ @property
134
+ def elements (self ):
135
+ return (self ["t" ],)
100
136
101
137
@property
102
138
def t (self ):
103
- return self ["t" ].view (numpy .ndarray )
139
+ return self ["t" ]
140
+
141
+ def __getitem__ (self , where ):
142
+ return getitem (self , where , vector .backends .object_ .TemporalObjectT )
104
143
105
144
106
145
class TemporalNumpyTau (numpy .ndarray , TemporalNumpy , vector .geometry .TemporalTau ):
107
- def __iter__ (self ):
108
- yield self ["tau" ].view (numpy .ndarray )
146
+ @property
147
+ def elements (self ):
148
+ return (self ["tau" ],)
109
149
110
150
@property
111
151
def tau (self ):
112
- return self ["tau" ].view (numpy .ndarray )
152
+ return self ["tau" ]
153
+
154
+ def __getitem__ (self , where ):
155
+ return getitem (self , where , vector .backends .object_ .TemporalObjectTau )
156
+
113
157
158
+ class PlanarNumpy (numpy .ndarray , vector .methods .Planar ):
159
+ lib = numpy
114
160
115
- class PlanarVectorNumpy (numpy .ndarray , vector .geometry .Planar , vector .geometry .Vector ):
116
161
def __new__ (cls , * args , ** kwargs ):
117
162
return numpy .array (* args , ** kwargs ).view (cls )
118
163
@@ -131,34 +176,64 @@ def __array_finalize__(self, obj):
131
176
def azimuthal (self ):
132
177
return self .view (self ._azimuthal_type )
133
178
134
- @property
135
- def x (self ):
136
- return vector .compute .planar .x .dispatch (numpy , self )
137
179
138
- @ property
139
- def y (self ):
140
- return vector .compute . planar . y . dispatch ( numpy , self )
180
+ class PlanarVectorNumpy ( vector . geometry . PlanarVector , PlanarNumpy ):
181
+ def __getitem__ (self , where ):
182
+ return getitem ( self , where , vector .backends . object_ . PlanarVectorObject )
141
183
142
- @property
143
- def rho (self ):
144
- return vector .compute .planar .rho .dispatch (numpy , self )
145
184
146
- @property
147
- def phi (self ):
148
- return vector .compute .planar .phi .dispatch (numpy , self )
185
+ class SpatialNumpy (numpy .ndarray , vector .methods .Spatial ):
186
+ lib = numpy
149
187
150
- @property
151
- def rho2 (self ):
152
- return vector .compute .planar .rho2 .dispatch (numpy , self )
188
+ def __new__ (cls , * args , ** kwargs ):
189
+ return numpy .array (* args , ** kwargs ).view (cls )
153
190
154
191
155
- class SpatialVectorNumpy (
156
- numpy .ndarray , vector .geometry .Spatial , vector .geometry .Vector
157
- ):
158
- pass
192
+ class SpatialVectorNumpy (vector .geometry .SpatialVector , SpatialNumpy ):
193
+ def __getitem__ (self , where ):
194
+ return getitem (self , where , vector .backends .object_ .SpatialVectorObject )
159
195
160
196
161
- class LorentzVectorNumpy (
162
- numpy .ndarray , vector .geometry .Lorentz , vector .geometry .Vector
163
- ):
164
- pass
197
+ class LorentzNumpy (numpy .ndarray , vector .methods .Lorentz ):
198
+ lib = numpy
199
+
200
+ def __new__ (cls , * args , ** kwargs ):
201
+ return numpy .array (* args , ** kwargs ).view (cls )
202
+
203
+ def __array_finalize__ (self , obj ):
204
+ raise NotImplementedError
205
+
206
+
207
+ class LorentzVectorNumpy (vector .geometry .LorentzVector , LorentzNumpy ):
208
+ def __getitem__ (self , where ):
209
+ return getitem (self , where , vector .backends .object_ .LorentzVectorObject )
210
+
211
+
212
+ class TransformNumpy :
213
+ lib = numpy
214
+
215
+
216
+ class Transform2DNumpy (numpy .ndarray , TransformNumpy , vector .methods .Transform2D ):
217
+ def __new__ (cls , * args , ** kwargs ):
218
+ return numpy .array (* args , ** kwargs ).view (cls )
219
+
220
+ def __array_finalize__ (self , obj ):
221
+ if self .dtype .names != ("xx" , "xy" , "yx" , "yy" ):
222
+ raise TypeError (
223
+ f"{ type (self ).__name__ } must have a structured dtype with fields "
224
+ '("xx", "xy", "yx", "yy")'
225
+ )
226
+
227
+ def __getitem__ (self , where ):
228
+ return getitem (self , where , vector .backends .object_ .Transform2DObject )
229
+
230
+ @property
231
+ def elements (self ):
232
+ return tuple (self [x ] for x in ("xx" , "xy" , "yx" , "yy" ))
233
+
234
+ def apply (self , v ):
235
+ x , y = vector .methods .Transform2D .apply (self , v )
236
+ out = numpy .empty (x .shape , dtype = [("x" , x .dtype ), ("y" , y .dtype )])
237
+ out ["x" ] = x
238
+ out ["y" ] = y
239
+ return out .view (PlanarVectorNumpy )
0 commit comments