-
Notifications
You must be signed in to change notification settings - Fork 1
/
tools.cpp
94 lines (74 loc) · 2.97 KB
/
tools.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include "tools.h"
DataCluster * Init_Data(DataSet *dataset){
DataCluster * datacluster = new DataCluster[1];
/*
* Get dataspace of the dataset.
*/
datacluster->dataset = dataset;
datacluster->dataspace = datacluster->dataset->getSpace();
/*
* Get the dimension size of each dimension in the dataspace and
* display them.
*/
hsize_t dims_out[2];
datacluster->dataspace.getSimpleExtentDims( dims_out, NULL);
datacluster->trace_length = (unsigned long)(dims_out[1]);
datacluster->n_traces = (unsigned long)(dims_out[0]);
// Data Buffer
datacluster->data_out = new char[datacluster->trace_length]; // Scope data is size char
for (unsigned long i = 0; i < datacluster->trace_length; i++) datacluster->data_out[i]= 0;
/*
* Define hyperslab in the dataset.
*/
datacluster->offset[0] = 0;
datacluster->offset[1] = 0;
datacluster->count[0] = 1;
datacluster->count[1] = datacluster->trace_length;
datacluster->dataspace.selectHyperslab( H5S_SELECT_SET, datacluster->count, datacluster->offset );
/*
* Define the memory dataspace.
*/
hsize_t dimsm[2]; /* memory space dimensions */
dimsm[0] = dims_out[0];
dimsm[1] = dims_out[1];
datacluster->memspace = DataSpace( RANK_OUT, dimsm );
/*
* Define memory hyperslab.
*/
datacluster->offset_out[0] = 0;
datacluster->offset_out[1] = 0;
datacluster->count_out[0] = 1;
datacluster->count_out[1] = datacluster->trace_length;
datacluster->memspace.selectHyperslab( H5S_SELECT_SET, datacluster->count_out, datacluster->offset_out );
return datacluster;
}
/* Method: Read_Trace(DataCluster *datacluster, unsigned long trace_index)
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Updates a DataCluster datacluster so that its buffer contains trace number trace_index
*/
int Read_Trace(DataCluster *datacluster, unsigned long trace_index){
datacluster->offset[0]= (hsize_t)trace_index;
datacluster->dataspace.selectHyperslab( H5S_SELECT_SET, datacluster->count, datacluster->offset );
datacluster->memspace.selectHyperslab( H5S_SELECT_SET, datacluster->count_out, datacluster->offset_out );
datacluster->dataset->read( datacluster->data_out, PredType::NATIVE_CHAR, datacluster->memspace, datacluster->dataspace );
return 0; // No protection...
}
double Lognormal(double t, double tau, double sigma, double mag){
double q = exp(-0.5 * pow(log(t / tau) / sigma, 2.0));
q *= mag / (t * sigma * sqrt(2 * TMath::Pi()));
return -q;
}
double SingleLognormal(double* x, double* par){
return Lognormal(x[0], par[0], par[1], par[2]);
}
double DoubleLognormal(double* x, double* par){
double q = Lognormal(x[0], par[0], par[1], par[2]);
q += Lognormal(x[0], par[3], par[4], par[5]);
return q;
}
double TripleLognormal(double* x, double* par){
double q = Lognormal(x[0], par[0], par[1], par[2]);
q += Lognormal(x[0], par[3], par[4], par[5]);
q += Lognormal(x[0], par[6], par[7], par[8]);
return q;
}