double getTime(TString logfile, TString module) {

    gSystem->Exec("grep TimeReport "+logfile+" | grep "+module+" | tail -1 >& tmp1.log");
    gSystem->Exec("echo >> tmp1.log");

    ifstream inlimits("tmp1.log");
    string line;
    double imas = 0;
    if (inlimits.is_open()) {
        while ( inlimits.good() ) {
            getline (inlimits,line);
            TString myline(line);
            if ((*myline.Tokenize(' ')).GetEntries()<8) continue;
            TString value( ((TObjString*) (*myline.Tokenize(' '))[5])->GetString().Data() );
            imas = value.Atof();
            //cout << line << endl;
        }
        inlimits.close();
    }
    gSystem->Exec("rm tmp1.log");
    //cout << "inlimits.is_open(): " << inlimits.is_open() << endl;
    //cout<<"returning: " << imas << endl;
    return imas;

}
Exemple #2
0
static store_error_t store_get_span(const store_t *store, uint64_t irecord,
                             int32_t *itmin, int32_t *nsamples, int *is_zero) {
    record_t *record;

    if (irecord >= store->nrecords) {
        return INVALID_RECORD;
    }

    record = &store->records[irecord];
    *itmin = xe32toh(record->itmin);
    *nsamples = xe32toh(record->nsamples);
    *is_zero = REC_ZERO == xe64toh(record->data_offset);

    if (!inlimits(*itmin) || !inposlimits(*nsamples)) {
        return BAD_RECORD;
    }

    return SUCCESS;
}
Exemple #3
0
static PyObject* w_store_get(PyObject *dummy, PyObject *args) {
    PyObject *capsule;
    uint64_t irecord;
    store_t *store;
    gf_dtype *adata;
    trace_t trace;
    PyArrayObject *array = NULL;
    npy_intp array_dims[1] = {0};
    int32_t itmin;
    int32_t nsamples;
    int i;
    store_error_t err;

    (void)dummy; /* silence warning */

    if (!PyArg_ParseTuple(args, "OKii", &capsule, &irecord, &itmin, &nsamples)) {
        PyErr_SetString(StoreExtError, "usage store_get(cstore, irecord, itmin, nsamples)");
        return NULL;
    }
#ifdef HAVE_CAPSULE
    if (!PyCapsule_IsValid(capsule, NULL)) {
#else
    if (!PyCObject_Check(capsule)) {
#endif
        PyErr_SetString(StoreExtError, "invalid cstore argument");
        return NULL;
    }
    if (!inlimits(itmin)) {
        PyErr_SetString(StoreExtError, "invalid itmin argument");
        return NULL;
    }
    if (!(inposlimits(nsamples) || -1 == nsamples)) {
        PyErr_SetString(StoreExtError, "invalid nsamples argument");
        return NULL;
    }

#ifdef HAVE_CAPSULE
    store = (store_t*)PyCapsule_GetPointer(capsule, NULL);
#else
    store = (store_t*)PyCObject_AsVoidPtr(capsule);
#endif

    err = store_get(store, irecord, &trace);
    if (SUCCESS != err) {
        PyErr_SetString(StoreExtError, store_error_names[err]);
        return NULL;
    }

    if (-1 != nsamples) {
        trace_trim(&trace, itmin, nsamples);
    }

    array_dims[0] = trace.nsamples;
    array = (PyArrayObject*)PyArray_EMPTY(1, array_dims, NPY_FLOAT32, 0);
    adata = (gf_dtype*)PyArray_DATA(array);
    for (i=0; i<trace.nsamples; i++) {
        adata[i] = fe32toh(trace.data[i]);
    }

    return Py_BuildValue("Nififf", array, trace.itmin, store->deltat,
                         trace.is_zero, trace.begin_value, trace.end_value);
}

static PyObject* w_store_sum(PyObject *dummy, PyObject *args) {
    PyObject *capsule, *irecords_arr, *delays_arr, *weights_arr;
    store_t *store;
    gf_dtype *adata;
    trace_t result;
    PyArrayObject *array = NULL;
    npy_intp array_dims[1] = {0};
    PyArrayObject *c_irecords_arr, *c_delays_arr, *c_weights_arr;
    uint64_t *irecords;
    float32_t *delays, *weights;
    npy_intp n, n1, n2;
    int32_t itmin;
    int32_t nsamples;
    store_error_t err;

    (void)dummy; /* silence warning */

    if (!PyArg_ParseTuple(args, "OOOOii", &capsule, &irecords_arr, &delays_arr,
                                     &weights_arr, &itmin, &nsamples)) {
        PyErr_SetString(StoreExtError,
            "usage: store_sum(cstore, irecords, delays, weights, itmin, nsamples)");

        return NULL;
    }

#ifdef HAVE_CAPSULE
    if (!PyCapsule_IsValid(capsule, NULL)) {
#else
    if (!PyCObject_Check(capsule)) {
#endif
        PyErr_SetString(StoreExtError, "invalid cstore argument");
        return NULL;
    }
    if (!PyArray_Check(irecords_arr) ||
            NPY_UINT64 != PyArray_TYPE((PyArrayObject*)irecords_arr)) {
        PyErr_SetString(StoreExtError,
            "store_sum: 'irecords' must be a NumPy array of type uint64");
        return NULL;
    }
    if (!PyArray_Check(delays_arr) ||
            NPY_FLOAT32 != PyArray_TYPE((PyArrayObject*)delays_arr)) {
        PyErr_SetString(StoreExtError,
            "store_sum: 'delays' must be a NumPy array of type float32");
        return NULL;
    }
    if (!PyArray_Check(weights_arr) ||
            NPY_FLOAT32 != PyArray_TYPE((PyArrayObject*)weights_arr)) {
        PyErr_SetString(StoreExtError,
            "store_sum: 'weights' must be a NumPy array of type float32");
        return NULL;
    }
    if (!inlimits(itmin)) {
        PyErr_SetString(StoreExtError, "invalid itmin argument");
        return NULL;
    }
    if (!(inposlimits(nsamples) || -1 == nsamples)) {
        PyErr_SetString(StoreExtError, "invalid nsamples argument");
        return NULL;
    }
#ifdef HAVE_CAPSULE
    store = (store_t*)PyCapsule_GetPointer(capsule, NULL);
#else
    store = (store_t*)PyCObject_AsVoidPtr(capsule);
#endif

    c_irecords_arr = PyArray_GETCONTIGUOUS((PyArrayObject*)irecords_arr);
    c_delays_arr = PyArray_GETCONTIGUOUS((PyArrayObject*)delays_arr);
    c_weights_arr = PyArray_GETCONTIGUOUS((PyArrayObject*)weights_arr);

    n = PyArray_SIZE(c_irecords_arr);
    n1 = PyArray_SIZE(c_delays_arr);
    n2 = PyArray_SIZE(c_weights_arr);

    if (n != n1 || n != n2) {
        PyErr_SetString(StoreExtError,
            "store_sum: 'irecords', 'delays', and 'weights' must have same length");
        return NULL;
    }

    irecords = PyArray_DATA(c_irecords_arr);
    delays = PyArray_DATA(c_delays_arr);
    weights = PyArray_DATA(c_weights_arr);

    err = store_sum(store, irecords, delays, weights, n, itmin, nsamples, &result);
    if (SUCCESS != err) {
        PyErr_SetString(StoreExtError, store_error_names[err]);
        return NULL;
    }

    Py_DECREF(c_irecords_arr);
    Py_DECREF(c_delays_arr);
    Py_DECREF(c_weights_arr);

    array_dims[0] = result.nsamples;
    array = (PyArrayObject*)PyArray_EMPTY(1, array_dims, NPY_FLOAT32, 0);
    adata = (gf_dtype*)PyArray_DATA(array);
    memcpy(adata, result.data, result.nsamples*sizeof(gf_dtype));
    free(result.data);

    return Py_BuildValue("Nififf", array, result.itmin, store->deltat,
                         result.is_zero, result.begin_value, result.end_value);
}


static PyMethodDef StoreExtMethods[] = {
    {"store_init",  w_store_init, METH_VARARGS,
        "Initialize store struct." },

    {"store_get", w_store_get, METH_VARARGS,
        "Get a GF trace." },

    {"store_sum", w_store_sum, METH_VARARGS,
        "Get weight-and-delay-sum of GF traces." },

    {NULL, NULL, 0, NULL}        /* Sentinel */
};

PyMODINIT_FUNC
initstore_ext(void)
{
    PyObject *m;

    m = Py_InitModule("store_ext", StoreExtMethods);
    if (m == NULL) return;
    import_array();

    StoreExtError = PyErr_NewException("store_ext.error", NULL, NULL);
    Py_INCREF(StoreExtError);  /* required, because other code could remove `error`
                               from the module, what would create a dangling
                               pointer. */
    PyModule_AddObject(m, "StoreExtError", StoreExtError);
}
Exemple #4
0
static store_error_t store_sum(
        const store_t *store,
        const uint64_t *irecords,
        const float32_t *delays,
        const float32_t *weights,
        int32_t n,
        int32_t itmin,
        int32_t nsamples,
        trace_t *result) {

    int32_t itmax;
    int is_zero;
    float itmin_d, itmax_d;
    float32_t weight, delay;
    trace_t trace;
    float32_t deltat = store->deltat;
    gf_dtype begin_value, end_value;
    gf_dtype *out;
    int ilo;
    /*int32_t ifloor, iceil;*/
    int i, j;
    int idelay_floor, idelay_ceil;
    int ihave;
    float w1, w2;
    store_error_t err;

    *result = ZERO_TRACE;
    if (0 == n) {
        return SUCCESS;
    }

    if (-1 == nsamples) {
        itmin_d = itmax_d = 0.;
        ihave = 0;
        for (j=0; j<n; j++) {
            err = store_get_span(store, irecords[j], &itmin, &nsamples, &is_zero);
            if (SUCCESS != err) {
                return err;
            }

            itmax = itmin + nsamples - 1;

            if (ihave) {
                itmin_d = min(itmin_d, itmin + delays[j]/deltat);
                itmax_d = max(itmax_d, itmax + delays[j]/deltat);
            }
            else {
                itmin_d = itmin + delays[j]/deltat;
                itmax_d = itmax + delays[j]/deltat;
                ihave = 1;
            }
        }

        itmin = floor(itmin_d);
        nsamples = ceil(itmax_d) - itmin + 1;
    }

    if (!inlimits(itmin) || !inposlimits(nsamples)) {
        return BAD_REQUEST;
    }

    out = NULL;
    if (0 != nsamples) {
        out = (gf_dtype*)calloc(nsamples, sizeof(gf_dtype));
        if (out == NULL) {
            return ALLOC_FAILED;
        }
    }

    begin_value = 0.0;
    end_value = 0.0;

    for (j=0; j<n; j++) {

        delay = delays[j];
        weight = weights[j];
        idelay_floor = (int)floor(delay/deltat);
        idelay_ceil = (int)ceil(delay/deltat);
        if (!inlimits(idelay_floor) || !inlimits(idelay_ceil)) {
            free(out);
            return BAD_REQUEST;
        }

        if (0.0 == weight) {
            continue;
        }

        err = store_get(store, irecords[j], &trace);
        if (SUCCESS != err) {
            free(out);
            return err;
        }
        if (trace.is_zero) {
            continue;
        }

        trace_trim_sticky(&trace, itmin - idelay_ceil, nsamples + idelay_ceil - idelay_floor);

        if (idelay_floor == idelay_ceil) {
            ilo = itmin - idelay_floor - trace.itmin;
            /*for (i=0; i<nsamples; i++) {
                ifloor = i + ilo;
                ifloor = max(0, min(ifloor, trace.nsamples-1));
                out[i] += fe32toh(trace.data[ifloor]) * weight;
            } // version below is a bit faster */
            for (i=0; i<min(-ilo,nsamples); i++) {
                out[i] += fe32toh(trace.data[0]) * weight;
            }
            for (i=max(0,-ilo); i<min(nsamples, trace.nsamples-ilo); i++) {
                out[i] += fe32toh(trace.data[i+ilo]) * weight;
            }
            for (i=max(0,trace.nsamples-ilo); i<nsamples; i++) {
                out[i] += fe32toh(trace.data[trace.nsamples-1]) * weight;
            }
        } else {
            ilo = itmin - idelay_floor - trace.itmin;
            /*ihi = ilo - 1;*/
            w1 = (idelay_ceil - delay/deltat) * weight;
            w2 = (delay/deltat - idelay_floor) * weight;
            /*for (i=0; i<nsamples; i++) {
                ifloor = i + ilo;
                iceil = i + ihi;
                ifloor = max(0, min(ifloor, trace.nsamples-1));
                iceil = max(0, min(iceil, trace.nsamples-1));
                out[i] += fe32toh(trace.data[ifloor]) * w1;
                out[i] += fe32toh(trace.data[iceil]) * w2;
            } // version below is a bit faster */
            for (i=0; i<min(-ilo,nsamples); i++) {
                out[i] += fe32toh(trace.data[0]) * weight;
            }
            for (i=max(0,-ilo); i<min(nsamples, -ilo+1); i++) {
                out[i] += fe32toh(trace.data[i+ilo])*w1
                          + fe32toh(trace.data[0])*w2;
            }
            for (i=max(0,-ilo+1); i<min(nsamples, trace.nsamples-ilo); i++) {
                out[i] += fe32toh(trace.data[i+ilo])*w1
                          + fe32toh(trace.data[i+ilo-1])*w2;
            }
            for (i=max(0,trace.nsamples-ilo);
                 i<min(nsamples, trace.nsamples-ilo+1); i++) {
                out[i] += fe32toh(trace.data[trace.nsamples-1]) * w1
                          + fe32toh(trace.data[i+ilo-1])*w2;
            }
            for (i=max(0,trace.nsamples-ilo+1); i<nsamples; i++) {
                out[i] += fe32toh(trace.data[trace.nsamples-1]) * weight;
            }
        }

        begin_value += trace.begin_value * weight;
        end_value += trace.end_value * weight;
    }

    result->is_zero = 0;
    result->itmin = itmin;
    result->nsamples = nsamples;
    result->begin_value = begin_value;
    result->end_value = end_value;
    result->data = out;

    return SUCCESS;
}
Exemple #5
0
static store_error_t store_get(
        const store_t *store,
        uint64_t irecord,
        trace_t *trace) {

    record_t *record;
    uint64_t data_offset;
    store_error_t err;
    size_t nbytes;

    if (irecord >= store->nrecords) {
        *trace = ZERO_TRACE;
        return INVALID_RECORD;
    }

    record = &store->records[irecord];
    data_offset = xe64toh(record->data_offset);
    trace->itmin = xe32toh(record->itmin);
    trace->nsamples = xe32toh(record->nsamples);
    trace->begin_value = fe32toh(record->begin_value);
    trace->end_value = fe32toh(record->end_value);

    if (!inlimits(trace->itmin) || !inposlimits(trace->nsamples) ||
            data_offset >= UINT64_MAX - SLIMIT * sizeof(gf_dtype)) {
        return BAD_RECORD;
    }

    if (REC_EMPTY == data_offset) {
        *trace = ZERO_TRACE;
        return EMPTY_RECORD;
    }

    if (REC_ZERO == data_offset) {
        *trace = ZERO_TRACE;
        trace->itmin = xe32toh(record->itmin);
        return SUCCESS;
    }

    trace->is_zero = 0;

    if (data_offset + trace->nsamples*sizeof(gf_dtype) > store->data_size) {
        *trace = ZERO_TRACE;
        return BAD_DATA_OFFSET;
    }

    if (REC_SHORT == data_offset) {
        trace->data = &record->begin_value;
    } else {
        if (NULL != store->data) {
            trace->data = &store->data[data_offset/sizeof(gf_dtype)];
        } else {
            if (NULL == store->memdata[irecord]) {
                nbytes = trace->nsamples * sizeof(gf_dtype);
                store->memdata[irecord] = (gf_dtype*)malloc(nbytes);
                if (NULL == store->memdata[irecord]) {
                    *trace = ZERO_TRACE;
                    return ALLOC_FAILED;
                }
                err = store_read(store, data_offset, nbytes, store->memdata[irecord]);
                if (SUCCESS != err) {
                    free(store->memdata[irecord]);
                    store->memdata[irecord] = NULL;
                    *trace = ZERO_TRACE;
                    return err;
                }
            }
            trace->data = store->memdata[irecord];
        }
    }

    return SUCCESS;
}