1 #include "SpectrumParameters.h" 3 #include "TLinearFitter.h" 5 #include "AnalysisConfig.h" 8 #ifdef UCORRELATOR_OPENMP 20 static TLinearFitter ** fitters;
28 #ifdef UCORRELATOR_OPENMP 29 nthreads = omp_get_max_threads();
33 fitters =
new TLinearFitter * [nthreads];
34 for (
int i = 0; i < nthreads; i++)
36 fitters[i] =
new TLinearFitter(1,
"1++x",
"");
37 double dummy_x[5] = {0};
38 double dummy_y[5] = {0};
40 fitters[i]->AssignData(5,1,dummy_x,dummy_y);
45 void UCorrelator::spectrum::fillSpectrumParameters(
const TGraph * spectrum,
const TGraph * average,
47 const AnalysisConfig * config)
49 TLinearFitter* fitter;
51 #ifdef UCORRELATOR_OPENMP 52 fitter = fitters[omp_get_thread_num()];
59 double lower_limit = config->spectral_fit_start;
60 double upper_limit = config->spectral_fit_stop;
62 double df = spectrum->GetX()[1]-spectrum->GetX()[0];
63 double f0 = spectrum->GetX()[0];
65 int low = (lower_limit - f0) / df;
66 int high = (upper_limit - f0) / df + 0.5;
67 if (high > spectrum->GetN()) high = spectrum->GetN();
69 int N = high - low +1;
72 std::vector<double> x(N);
73 std::vector<double> y(N);
75 const double * xx = spectrum->GetX() + low;
76 const double * yy = spectrum->GetY() + low;
78 memcpy(&x[0], xx, N *
sizeof(
double));
79 memcpy(&y[0], yy, N *
sizeof(
double));
83 for (
size_t i = 0; i < x.size(); i++)
85 y[i] -= average->Eval(x[i]);
91 std::vector<bool> used(x.size(),
false);
95 double max_val = -DBL_MAX;
98 for (
unsigned j = 0; j < x.size(); j++)
100 if (used[j])
continue;
112 int index_bounds[2] = {max_j,max_j};
113 double power = TMath::Power(10,max_val/10);
115 for (
int sign = -1; sign <=1; sign+=2)
120 int jj = max_j + how_far * sign;
121 double val = jj>=0 && jj < N ? y[jj] : 0;
123 if (jj <= 0 || jj >=N-1 || max_val - val > config->bw_ndb || used[jj])
125 index_bounds[(sign+1)/2] = jj;
128 power += TMath::Power(10,val/10);
134 int start = index_bounds[0];
135 int end = index_bounds[1];
136 if (start < 0) start = 0;
137 if (end >= (
int) x.size()) end = x.size()-1;
138 int difference = end - start - 1;
142 winfo->peakPower[i] = 10 * log10(power/difference);
144 winfo->
bandwidth[i] = x[end] - x[start] - 0.01;
148 winfo->peakFrequency[i] = (x[start] + x[end])/2;
158 for (
int u= start; u < end; u++) used[u] =
true;
164 fitter->ClearPoints();
167 fitter->AssignData(x.size(),1,&x[0] ,&y[0]);
170 m = fitter->GetParameter(1);
171 b = fitter->GetParameter(0);
173 winfo->spectrumSlope = m;
174 winfo->spectrumIntercept = b;
struct __attribute__((packed))
Debugging use only TURF scaler data.
static const Int_t peaksPerSpectrum
The maximum number of hypotheses storable per polarization */.