// Copyright (C) 2010, Guy Barrand. All rights reserved. // See the file tools.license for terms. #ifndef tools_carray #define tools_carray //fixed array manips namespace tools { template inline void destroy(T*& a_v){ delete [] a_v; a_v = 0; } template inline bool carray_copy(T*& a_v,I a_n,const T* a_from){ delete [] a_v; a_v = 0; if(a_n) { a_v = new T[a_n]; if(!a_v) return false; } for(I i=0;i inline bool copy(T*& a_v,I a_n,const T* a_from) {return carray_copy(a_v,a_n,a_from);} /* template inline T value(const T* a_v, unsigned int a_q, unsigned int a_i,unsigned int a_j){ // to get value in the case a x[p][q] is stored in a x[p*q]. // (used in hep/polyhedron_arb8) // WARNING : no check is done on a_i, a_j return a_v[a_i*a_q+a_j]; } template inline bool normalize(I a_n,T*& a_v,T(*a_sqrt)(T)){ T sz = T(); I i; for(i=0;i inline T value(const T* a_v, unsigned int a_q, unsigned int a_i,unsigned int a_j){ // to get value x[i][j] in the case a x[p][q] is stored in a x[p*q]. // (used in hep/polyhedron_arb8) // WARNING : no check is done on a_i, a_j return a_v[a_i*a_q+a_j]; } */ } #include "mnmx" namespace tools { template inline bool min_max(I a_n,const void* a_v,TO& a_mn,TO& a_mx){ if(a_n<=I(0)) {a_mn = TO(0);a_mx = TO(0);return false;} T* pos = (T*)a_v; a_mn = *pos; a_mx = *pos; for(I i=0;i(a_mn,*pos); a_mx = mx(a_mx,*pos); } return true; } template inline bool min_max_S_S2(I a_n,const void* a_v,TO& a_mn,TO& a_mx,TO& a_S,TO& a_S2){ if(a_n<=0) {a_mn = TO(0);a_mx = TO(0);a_S=TO(0);a_S2=TO(0);return false;} T* pos = (T*)a_v; a_mn = *pos; a_mx = *pos; a_S = TO(0); a_S2 = TO(0); for(I i=0;i(a_mn,*pos); a_mx = mx(a_mx,*pos); a_S += TO(*pos); a_S2 += TO(*pos) * TO(*pos); } return true; } template inline bool min_max_mean_rms(I a_n,const void* a_v,TO& a_mn,TO& a_mx,TO& a_mean,TO& a_rms, TO(*a_sqrt)(TO),TO(*a_fabs)(TO)){ TO S = TO(0); TO S2 = TO(0); if(!min_max_S_S2(a_n,a_v,a_mn,a_mx,S,S2)) { a_mn = TO(0);a_mx = TO(0);a_mean=TO(0);a_rms=TO(0); return false; } a_mean = S/TO(a_n); a_rms = a_sqrt(a_fabs(S2/TO(a_n) - a_mean * a_mean)); return true; } template inline bool h1_fill(I a_n,const void* a_v,HISTO& a_histo) { a_histo.reset(); if(a_n<=0) return false; typedef typename HISTO::coordinate_t TC; T* pos = (T*)a_v; for(I i=0;i inline T* _4s_to_3s(const T* a_4s,const I& a_w,const I& a_h) { T* _3s = new T[a_w*a_h*3]; if(!_3s) return 0; T* pfrom = (T*)a_4s; T* pto = _3s; {I _sz = a_w*a_h*4; for(I i=0;i<_sz;i+=4) { *(pto+0) = *(pfrom+0); *(pto+1) = *(pfrom+1); *(pto+2) = *(pfrom+2); pfrom += 4; pto += 3; }} return _3s; } } #endif