39#define _USE_MATH_DEFINES
68 return gcd(iB, iA % iB);
79 for(qint32 i = 0; i < n; ++i)
94 int t_iNumOfCombination = (int)(n*(n-1)*0.5);
96 return t_iNumOfCombination;
102 const RowVectorXf ×,
103 const QPair<float,float>& baseline,
106 MatrixXd data_out = data;
107 QStringList valid_modes;
108 valid_modes <<
"logratio" <<
"ratio" <<
"zscore" <<
"mean" <<
"percent";
109 if(!valid_modes.contains(mode))
111 qWarning().noquote() <<
"[Numerics::rescale] Mode" << mode <<
"is not supported. Supported modes are:" << valid_modes <<
"Returning input data.";
115 qInfo().noquote() << QString(
"[Numerics::rescale] Applying baseline correction ... (mode: %1)").arg(mode);
118 qint32 imax = times.size();
120 if (baseline.second == baseline.first) {
123 float bmin = baseline.first;
124 for(qint32 i = 0; i < times.size(); ++i) {
125 if(times[i] >= bmin) {
132 float bmax = baseline.second;
134 if (baseline.second == baseline.first) {
138 for(qint32 i = times.size()-1; i >= 0; --i) {
139 if(times[i] <= bmax) {
146 qWarning() <<
"[Numerics::rescale] imax < imin. Returning input data.";
150 VectorXd mean = data_out.block(0, imin, data_out.rows(), imax-imin).rowwise().mean();
151 if(mode.compare(
"mean") == 0) {
152 data_out -= mean.rowwise().replicate(data.cols());
153 }
else if(mode.compare(
"logratio") == 0) {
154 for(qint32 i = 0; i < data_out.rows(); ++i)
155 for(qint32 j = 0; j < data_out.cols(); ++j)
156 data_out(i,j) = log10(data_out(i,j)/mean[i]);
157 }
else if(mode.compare(
"ratio") == 0) {
158 data_out = data_out.cwiseQuotient(mean.rowwise().replicate(data_out.cols()));
159 }
else if(mode.compare(
"zscore") == 0) {
160 MatrixXd std_mat = data.block(0, imin, data.rows(), imax-imin) - mean.rowwise().replicate(imax-imin);
161 std_mat = std_mat.cwiseProduct(std_mat);
162 VectorXd std_v = std_mat.rowwise().mean();
163 for(qint32 i = 0; i < std_v.size(); ++i)
164 std_v[i] = sqrt(std_v[i] / (
float)(imax-imin));
166 data_out -= mean.rowwise().replicate(data_out.cols());
167 data_out = data_out.cwiseQuotient(std_v.rowwise().replicate(data_out.cols()));
168 }
else if(mode.compare(
"percent") == 0) {
169 data_out -= mean.rowwise().replicate(data_out.cols());
170 data_out = data_out.cwiseQuotient(mean.rowwise().replicate(data_out.cols()));
179 const RowVectorXf& times,
180 const std::pair<float,float>& baseline,
181 const std::string& mode)
183 MatrixXd data_out = data;
184 std::vector<std::string> valid_modes{
"logratio",
"ratio",
"zscore",
"mean",
"percent"};
185 if(std::find(valid_modes.begin(), valid_modes.end(), mode) == valid_modes.end())
187 qWarning().noquote() <<
"[Numerics::rescale] Mode" << mode.c_str() <<
"is not supported. Supported modes are:";
188 for(
auto& m : valid_modes){
189 std::cout << m <<
" ";
191 std::cout <<
"\n" <<
"Returning input data.\n";
195 qInfo().noquote() << QString(
"[Numerics::rescale] Applying baseline correction ... (mode: %1)").arg(mode.c_str());
198 qint32 imax = times.size();
200 if (baseline.second == baseline.first) {
203 float bmin = baseline.first;
204 for(qint32 i = 0; i < times.size(); ++i) {
205 if(times[i] >= bmin) {
212 float bmax = baseline.second;
214 if (baseline.second == baseline.first) {
218 for(qint32 i = times.size()-1; i >= 0; --i) {
219 if(times[i] <= bmax) {
226 qWarning() <<
"[Numerics::rescale] imax < imin. Returning input data.";
230 VectorXd mean = data_out.block(0, imin, data_out.rows(), imax-imin).rowwise().mean();
231 if(mode.compare(
"mean") == 0) {
232 data_out -= mean.rowwise().replicate(data.cols());
233 }
else if(mode.compare(
"logratio") == 0) {
234 for(qint32 i = 0; i < data_out.rows(); ++i)
235 for(qint32 j = 0; j < data_out.cols(); ++j)
236 data_out(i,j) = log10(data_out(i,j)/mean[i]);
237 }
else if(mode.compare(
"ratio") == 0) {
238 data_out = data_out.cwiseQuotient(mean.rowwise().replicate(data_out.cols()));
239 }
else if(mode.compare(
"zscore") == 0) {
240 MatrixXd std_mat = data.block(0, imin, data.rows(), imax-imin) - mean.rowwise().replicate(imax-imin);
241 std_mat = std_mat.cwiseProduct(std_mat);
242 VectorXd std_v = std_mat.rowwise().mean();
243 for(qint32 i = 0; i < std_v.size(); ++i)
244 std_v[i] = sqrt(std_v[i] / (
float)(imax-imin));
246 data_out -= mean.rowwise().replicate(data_out.cols());
247 data_out = data_out.cwiseQuotient(std_v.rowwise().replicate(data_out.cols()));
248 }
else if(mode.compare(
"percent") == 0) {
249 data_out -= mean.rowwise().replicate(data_out.cols());
250 data_out = data_out.cwiseQuotient(mean.rowwise().replicate(data_out.cols()));
Numerics class declaration.
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
static int gcd(int iA, int iB)
static bool issparse(Eigen::VectorXd &v)
static Eigen::MatrixXd rescale(const Eigen::MatrixXd &data, const Eigen::RowVectorXf ×, const QPair< float, float > &baseline, QString mode)
static int nchoose2(int n)