@@ -58,7 +58,7 @@ static PyObject * anglesToGVec(PyObject * self, PyObject * args)
5858
5959 double * angs_ptr , * bHat_l_ptr , * eHat_l_ptr , * rMat_c_ptr ;
6060 double * gVec_c_ptr ;
61-
61+
6262 /* Parse arguments */
6363 if ( !PyArg_ParseTuple (args ,"OOOdO" ,
6464 & angs ,
@@ -71,7 +71,7 @@ static PyObject * anglesToGVec(PyObject * self, PyObject * args)
7171 nbhat = PyArray_NDIM (bHat_l );
7272 nehat = PyArray_NDIM (eHat_l );
7373 nrmat = PyArray_NDIM (rMat_c );
74-
74+
7575 assert ( nangs == 2 && nbhat == 1 && nehat == 1 && nrmat == 2 );
7676
7777 /* Verify dimensions of input arrays */
@@ -86,7 +86,7 @@ static PyObject * anglesToGVec(PyObject * self, PyObject * args)
8686 assert ( da1 == 3 );
8787 assert ( db1 == 3 && de1 == 3 );
8888 assert ( dr1 == 3 && dr2 == 3 );
89-
89+
9090 /* Allocate C-style array for return data */
9191 rdims [0 ] = nvecs ; rdims [1 ] = 3 ;
9292 gVec_c = (PyArrayObject * )PyArray_EMPTY (2 ,rdims ,NPY_DOUBLE ,0 );
@@ -103,7 +103,7 @@ static PyObject * anglesToGVec(PyObject * self, PyObject * args)
103103 bHat_l_ptr , eHat_l_ptr ,
104104 chi , rMat_c_ptr ,
105105 gVec_c_ptr );
106-
106+
107107 /* Build and return the nested data structure */
108108 return ((PyObject * )gVec_c );
109109}
@@ -136,18 +136,18 @@ static PyObject * makeGVector(PyObject * self, PyObject * args)
136136static PyObject * gvecToDetectorXY (PyObject * self , PyObject * args )
137137{
138138 PyArrayObject * gVec_c ,
139- * rMat_d , * rMat_s , * rMat_c ,
140- * tVec_d , * tVec_s , * tVec_c ,
141- * beamVec ;
139+ * rMat_d , * rMat_s , * rMat_c ,
140+ * tVec_d , * tVec_s , * tVec_c ,
141+ * beamVec ;
142142 PyArrayObject * result ;
143143
144144 int dgc , drd , drs , drc , dtd , dts , dtc , dbv ;
145145 npy_intp npts , dims [2 ];
146146
147147 double * gVec_c_Ptr ,
148- * rMat_d_Ptr , * rMat_s_Ptr , * rMat_c_Ptr ,
149- * tVec_d_Ptr , * tVec_s_Ptr , * tVec_c_Ptr ,
150- * beamVec_Ptr ;
148+ * rMat_d_Ptr , * rMat_s_Ptr , * rMat_c_Ptr ,
149+ * tVec_d_Ptr , * tVec_s_Ptr , * tVec_c_Ptr ,
150+ * beamVec_Ptr ;
151151 double * result_Ptr ;
152152
153153 /* Parse arguments */
@@ -256,18 +256,18 @@ static PyObject * gvecToDetectorXY(PyObject * self, PyObject * args)
256256static PyObject * gvecToDetectorXYArray (PyObject * self , PyObject * args )
257257{
258258 PyArrayObject * gVec_c ,
259- * rMat_d , * rMat_s , * rMat_c ,
260- * tVec_d , * tVec_s , * tVec_c ,
261- * beamVec ;
259+ * rMat_d , * rMat_s , * rMat_c ,
260+ * tVec_d , * tVec_s , * tVec_c ,
261+ * beamVec ;
262262 PyArrayObject * result ;
263263
264264 int dgc , drd , drs , drc , dtd , dts , dtc , dbv ;
265265 npy_intp npts , dims [2 ];
266266
267267 double * gVec_c_Ptr ,
268- * rMat_d_Ptr , * rMat_s_Ptr , * rMat_c_Ptr ,
269- * tVec_d_Ptr , * tVec_s_Ptr , * tVec_c_Ptr ,
270- * beamVec_Ptr ;
268+ * rMat_d_Ptr , * rMat_s_Ptr , * rMat_c_Ptr ,
269+ * tVec_d_Ptr , * tVec_s_Ptr , * tVec_c_Ptr ,
270+ * beamVec_Ptr ;
271271 double * result_Ptr ;
272272
273273 /* Parse arguments */
@@ -300,7 +300,7 @@ static PyObject * gvecToDetectorXYArray(PyObject * self, PyObject * args)
300300
301301 if (npts != PyArray_DIM (rMat_s , 0 )) {
302302 PyErr_Format (PyExc_ValueError , "gVec_c and rMat_s length mismatch %d vs %d" ,
303- (int )PyArray_DIM (gVec_c , 0 ), (int )PyArray_DIM (rMat_s , 0 ));
303+ (int )PyArray_DIM (gVec_c , 0 ), (int )PyArray_DIM (rMat_s , 0 ));
304304 return NULL ;
305305 }
306306 assert ( PyArray_DIMS (gVec_c )[1 ] == 3 );
@@ -386,15 +386,16 @@ static PyObject * detectorXYToGvec(PyObject * self, PyObject * args)
386386{
387387 PyArrayObject * xy_det , * rMat_d , * rMat_s ,
388388 * tVec_d , * tVec_s , * tVec_c ,
389- * beamVec , * etaVec ;
389+ * beamVec , * etaVec ;
390390 PyArrayObject * tTh , * eta , * gVec_l ;
391+ PyObject * inner_tuple , * outer_tuple ;
391392
392393 int dxy , drd , drs , dtd , dts , dtc , dbv , dev ;
393394 npy_intp npts , dims [2 ];
394395
395396 double * xy_Ptr , * rMat_d_Ptr , * rMat_s_Ptr ,
396- * tVec_d_Ptr , * tVec_s_Ptr , * tVec_c_Ptr ,
397- * beamVec_Ptr , * etaVec_Ptr ;
397+ * tVec_d_Ptr , * tVec_s_Ptr , * tVec_c_Ptr ,
398+ * beamVec_Ptr , * etaVec_Ptr ;
398399 double * tTh_Ptr , * eta_Ptr , * gVec_l_Ptr ;
399400
400401 /* Parse arguments */
@@ -464,22 +465,30 @@ static PyObject * detectorXYToGvec(PyObject * self, PyObject * args)
464465 tTh_Ptr , eta_Ptr , gVec_l_Ptr );
465466
466467 /* Build and return the nested data structure */
467- return (Py_BuildValue ("OO" ,Py_BuildValue ("OO" ,tTh ,eta ),gVec_l ));
468+ /* Note that Py_BuildValue with 'O' increases reference count */
469+ inner_tuple = Py_BuildValue ("OO" ,tTh ,eta );
470+ outer_tuple = Py_BuildValue ("OO" , inner_tuple , gVec_l );
471+ Py_DECREF (inner_tuple );
472+ Py_DECREF (tTh );
473+ Py_DECREF (eta );
474+ Py_DECREF (gVec_l );
475+ return outer_tuple ;
468476}
469477
470478static PyObject * oscillAnglesOfHKLs (PyObject * self , PyObject * args )
471479{
472480 PyArrayObject * hkls , * rMat_c , * bMat ,
473- * vInv_s , * beamVec , * etaVec ;
481+ * vInv_s , * beamVec , * etaVec ;
474482 PyFloatObject * chi , * wavelength ;
475483 PyArrayObject * oangs0 , * oangs1 ;
484+ PyObject * return_tuple ;
476485
477486 int dhkls , drc , dbm , dvi , dbv , dev ;
478487 npy_intp npts , dims [2 ];
479488
480489 double * hkls_Ptr , chi_d ,
481- * rMat_c_Ptr , * bMat_Ptr , wavelen_d ,
482- * vInv_s_Ptr , * beamVec_Ptr , * etaVec_Ptr ;
490+ * rMat_c_Ptr , * bMat_Ptr , wavelen_d ,
491+ * vInv_s_Ptr , * beamVec_Ptr , * etaVec_Ptr ;
483492 double * oangs0_Ptr , * oangs1_Ptr ;
484493
485494 /* Parse arguments */
@@ -542,10 +551,14 @@ static PyObject * oscillAnglesOfHKLs(PyObject * self, PyObject * args)
542551 // printf("chi = %g, wavelength = %g\n",PyFloat_AsDouble((PyObject*)chi),PyFloat_AsDouble((PyObject*)wavelength));
543552 /*
544553np.ascontiguousarray(hkls),chi,rMat_c,bMat,wavelength,
545- beamVec.flatten(),etaVec.flatten()
554+ beamVec.flatten(),etaVec.flatten()
546555 */
547556 /* Build and return the list data structure */
548- return (Py_BuildValue ("OO" ,oangs0 ,oangs1 ));
557+ return_tuple = Py_BuildValue ("OO" ,oangs0 ,oangs1 );
558+ Py_DECREF (oangs1 );
559+ Py_DECREF (oangs0 );
560+
561+ return return_tuple ;
549562}
550563
551564/******************************************************************************/
0 commit comments