20 #include <structmember.h>
112 typedef struct {
const char* variable;
hc_set_int_function set_func;} __hc_set_int_function;
142 return (PyObject*)hc;
179 return (PyObject*)hc;
259 PyObject* key = Py_BuildValue(
"iii", spill, event_num, part_num);
262 PyErr_SetString(PyExc_TypeError,
263 "Hit spill, event_number or particle_number was not an integer during weight lookup");
273 double global_weight = 0.;
283 int err = PyArg_ParseTuple(value,
"d", &global_weight);
289 return global_weight;
322 if(func != NULL)
return func(
self);
356 int dbl_i=0, int_i=0, j=0;
359 PyObject* list = PyList_New(dbl_i+int_i);
368 const char* variable_name;
373 error = PyArg_ParseTuple(args,
"s", &variable_name);
377 if(error >= 0)
return Py_BuildValue(
"d", value_dbl);
380 if(error >= 0)
return Py_BuildValue(
"i", value_int);
383 PyErr_SetString(PyExc_KeyError,
"Failed to parse variable in function Hitcore.get");
425 PyObject* value = Py_BuildValue(
"(d)", global_weight);
435 int int_i=0, dbl_i=0, j=0;
438 PyObject* list = PyList_New(dbl_i+int_i);
457 if(func == NULL) {*ierr = -1;
return;}
458 return func(
self, value);
475 if(func == NULL) {*ierr = -1;
return;}
476 return func(
self, value);
484 const char* variable_name;
487 error = PyArg_ParseTuple(args,
"sd", &variable_name, &value);
491 if(error >= 0) { Py_INCREF(Py_None);
return Py_None;}
494 if(error >= 0) { Py_INCREF(Py_None);
return Py_None;}
498 PyErr_SetString(PyExc_KeyError,
"Failed to parse variable in function Hitcore.set");
505 {
"x", T_DOUBLE, offsetof(
Hitcore, x), 0,
"x position"},
506 {
"y", T_DOUBLE, offsetof(
Hitcore, y), 0,
"y position"},
507 {
"z", T_DOUBLE, offsetof(
Hitcore, z), 0,
"z position"},
508 {
"t", T_DOUBLE, offsetof(
Hitcore, t), 0,
"time"},
509 {
"px", T_DOUBLE, offsetof(
Hitcore, px), 0,
"x momentum"},
510 {
"py", T_DOUBLE, offsetof(
Hitcore, py), 0,
"y momentum"},
511 {
"pz", T_DOUBLE, offsetof(
Hitcore, pz), 0,
"z momentum"},
512 {
"energy", T_DOUBLE, offsetof(
Hitcore, energy), 0,
"energy"},
513 {
"mass", T_DOUBLE, offsetof(
Hitcore, mass), 0,
"mass"},
514 {
"local_weight", T_DOUBLE, offsetof(
Hitcore, weight), 0,
"local_weight"},
515 {
"bx", T_DOUBLE, offsetof(
Hitcore, bx), 0,
"x magnetic field"},
516 {
"by", T_DOUBLE, offsetof(
Hitcore, by), 0,
"y magnetic field"},
517 {
"bz", T_DOUBLE, offsetof(
Hitcore, bz), 0,
"z magnetic field"},
518 {
"ex", T_DOUBLE, offsetof(
Hitcore, ex), 0,
"x electric field"},
519 {
"ey", T_DOUBLE, offsetof(
Hitcore, ey), 0,
"y electric field"},
520 {
"ez", T_DOUBLE, offsetof(
Hitcore, ez), 0,
"z electric field"},
521 {
"sx", T_DOUBLE, offsetof(
Hitcore, sx), 0,
"x spin"},
522 {
"sy", T_DOUBLE, offsetof(
Hitcore, sy), 0,
"y spin"},
523 {
"sz", T_DOUBLE, offsetof(
Hitcore, sz), 0,
"z spin"},
524 {
"path_length", T_DOUBLE, offsetof(
Hitcore, pl), 0,
"path length"},
525 {
"proper_time", T_DOUBLE, offsetof(
Hitcore, tau), 0,
"proper time"},
526 {
"e_dep", T_DOUBLE, offsetof(
Hitcore, e_dep), 0,
"energy deposited"},
527 {
"charge", T_DOUBLE, offsetof(
Hitcore, charge), 0,
"particle charge"},
528 {
"pid", T_INT, offsetof(
Hitcore, pid), 0,
"PDG particle ID"},
529 {
"spill", T_INT, offsetof(
Hitcore, spill), 0,
"spill number"},
530 {
"event_number", T_INT, offsetof(
Hitcore, event), 0,
"event number"},
531 {
"particle_number", T_INT, offsetof(
Hitcore, particle), 0,
"particle number (>0 if more than one particle in each event)"},
532 {
"status", T_INT, offsetof(
Hitcore, status), 0,
"status - has particle stopped, died, decayed, etc"},
533 {
"station", T_INT, offsetof(
Hitcore, station), 0,
"station or region"},
538 {
"get", (PyCFunction)
hc_get_python, METH_VARARGS,
"Get variable data"},
539 {
"get_variables", (PyCFunction)
hc_get_variables_to_python, METH_STATIC,
"List of <var> strings appropriate for calls to get(<var>)"},
540 {
"set", (PyCFunction)
hc_set_python, METH_VARARGS,
"Set variable data"},
541 {
"set_variables", (PyCFunction)
hc_set_variables_to_python, METH_STATIC,
"List of <var> strings appropriate for calls to get(<var>)"},
543 {
"get_weight_dict", (PyCFunction)
hc_get_global_weight_dict, METH_STATIC,
"Get the dictionary containing global weights - please don't edit unless you know what you are doing"},
544 {
"integrity_test", (PyCFunction)
hc_integrity_test, METH_STATIC,
"Internal integrity check for Hitcore"},
552 PyErr_SetString(PyExc_KeyError,
"Internal error - Hitcore::get_function_list array failed integrity_test");
557 PyErr_SetString(PyExc_KeyError,
"Internal error - Hitcore::get_function_list array failed integrity_test");
563 PyErr_SetString(PyExc_KeyError,
"Internal error - Hitcore::set_function_list array failed integrity_test");
568 PyErr_SetString(PyExc_KeyError,
"Internal error - Hitcore::set_function_list array failed integrity_test");
577 PyObject_HEAD_INIT(NULL)
597 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
621 HitcoreType.tp_new = PyType_GenericNew;
622 if (PyType_Ready(&HitcoreType) < 0)
return;
624 PyObject* m = Py_InitModule3(
"Hitcore", NULL,
"Core module wrapped by Hit");
625 if (m == NULL)
return;
628 Py_INCREF(&HitcoreType);
629 PyModule_AddObject(m,
"Hitcore", (PyObject *)&HitcoreType);
631 static void *hc_api[11] = {
645 PyObject* c_api_object = PyCObject_FromVoidPtr((
void *)hc_api, NULL);
646 PyObject* hitcore_dict = PyModule_GetDict(m);
647 PyDict_SetItemString(hitcore_dict,
"HITCORE_C_API", c_api_object);
659 printf(
"Failed to allocate memory in initHitcore - trouble coming");
671 static vector*
vector_init (
void* data,
size_t data_length,
size_t allocd_length,
size_t object_size)
673 if(object_size == 0)
return NULL;
675 if(vec == NULL)
return NULL;
685 if(object_size == 0)
return NULL;
687 if(vec == NULL)
return NULL;
692 if(vec->
data == NULL) {free(vec);
return NULL;}
698 if(vec == NULL)
return NULL;
702 if(vec->
data == NULL) {free(vec);
return NULL;}
710 if(vec->
data != NULL) free(vec->
data);
719 size_t new_data_length = vec->
data_length+(end-start);
721 if (new_alloc == 0) new_alloc = 1;
722 while(new_alloc < new_data_length) new_alloc *= 2;
723 vec->
data = realloc(vec->
data, new_alloc);
727 int move_size = end-start;
729 memmove(vec->
data+insert_point+move_size, vec->
data+insert_point, move_size);
732 memmove(vec->
data+insert_point, start, end-start);
744 if(element < 0 || vec->object_size*element >= vec->
data_length)