31#define _USE_MATH_DEFINES
60 return gcd(iB, iA % iB);
71 for(qint32 i = 0; i < n; ++i)
86 int t_iNumOfCombination =
static_cast<int>(n*(n-1)*0.5);
88 return t_iNumOfCombination;
94 const RowVectorXf ×,
95 const QPair<float,float>& baseline,
98 MatrixXd data_out = data;
99 QStringList valid_modes;
100 valid_modes <<
"logratio" <<
"ratio" <<
"zscore" <<
"mean" <<
"percent";
101 if(!valid_modes.contains(mode))
103 qWarning().noquote() <<
"[Numerics::rescale] Mode" << mode <<
"is not supported. Supported modes are:" << valid_modes <<
"Returning input data.";
107 qInfo().noquote() << QString(
"[Numerics::rescale] Applying baseline correction ... (mode: %1)").arg(mode);
110 qint32 imax = times.size();
112 if (baseline.second == baseline.first) {
115 float bmin = baseline.first;
116 for(qint32 i = 0; i < times.size(); ++i) {
117 if(times[i] >= bmin) {
124 float bmax = baseline.second;
126 if (baseline.second == baseline.first) {
130 for(qint32 i = times.size()-1; i >= 0; --i) {
131 if(times[i] <= bmax) {
138 qWarning() <<
"[Numerics::rescale] imax < imin. Returning input data.";
142 VectorXd mean = data_out.block(0, imin, data_out.rows(), imax-imin).rowwise().mean();
143 if(mode.compare(
"mean") == 0) {
144 data_out -= mean.rowwise().replicate(data.cols());
145 }
else if(mode.compare(
"logratio") == 0) {
146 for(qint32 i = 0; i < data_out.rows(); ++i)
147 for(qint32 j = 0; j < data_out.cols(); ++j)
148 data_out(i,j) = log10(data_out(i,j)/mean[i]);
149 }
else if(mode.compare(
"ratio") == 0) {
150 data_out = data_out.cwiseQuotient(mean.rowwise().replicate(data_out.cols()));
151 }
else if(mode.compare(
"zscore") == 0) {
152 MatrixXd std_mat = data.block(0, imin, data.rows(), imax-imin) - mean.rowwise().replicate(imax-imin);
153 std_mat = std_mat.cwiseProduct(std_mat);
154 VectorXd std_v = std_mat.rowwise().mean();
155 for(qint32 i = 0; i < std_v.size(); ++i)
156 std_v[i] = sqrt(std_v[i] /
static_cast<float>(imax-imin));
158 data_out -= mean.rowwise().replicate(data_out.cols());
159 data_out = data_out.cwiseQuotient(std_v.rowwise().replicate(data_out.cols()));
160 }
else if(mode.compare(
"percent") == 0) {
161 data_out -= mean.rowwise().replicate(data_out.cols());
162 data_out = data_out.cwiseQuotient(mean.rowwise().replicate(data_out.cols()));
171 const RowVectorXf& times,
172 const std::pair<float,float>& baseline,
173 const std::string& mode)
175 MatrixXd data_out = data;
176 std::vector<std::string> valid_modes{
"logratio",
"ratio",
"zscore",
"mean",
"percent"};
177 if(std::find(valid_modes.begin(), valid_modes.end(), mode) == valid_modes.end())
179 qWarning().noquote() <<
"[Numerics::rescale] Mode" << mode.c_str() <<
"is not supported. Supported modes are:";
180 for(
auto& m : valid_modes){
181 std::cout << m <<
" ";
183 std::cout <<
"\n" <<
"Returning input data.\n";
187 qInfo().noquote() << QString(
"[Numerics::rescale] Applying baseline correction ... (mode: %1)").arg(mode.c_str());
190 qint32 imax = times.size();
192 if (baseline.second == baseline.first) {
195 float bmin = baseline.first;
196 for(qint32 i = 0; i < times.size(); ++i) {
197 if(times[i] >= bmin) {
204 float bmax = baseline.second;
206 if (baseline.second == baseline.first) {
210 for(qint32 i = times.size()-1; i >= 0; --i) {
211 if(times[i] <= bmax) {
218 qWarning() <<
"[Numerics::rescale] imax < imin. Returning input data.";
222 VectorXd mean = data_out.block(0, imin, data_out.rows(), imax-imin).rowwise().mean();
223 if(mode.compare(
"mean") == 0) {
224 data_out -= mean.rowwise().replicate(data.cols());
225 }
else if(mode.compare(
"logratio") == 0) {
226 for(qint32 i = 0; i < data_out.rows(); ++i)
227 for(qint32 j = 0; j < data_out.cols(); ++j)
228 data_out(i,j) = log10(data_out(i,j)/mean[i]);
229 }
else if(mode.compare(
"ratio") == 0) {
230 data_out = data_out.cwiseQuotient(mean.rowwise().replicate(data_out.cols()));
231 }
else if(mode.compare(
"zscore") == 0) {
232 MatrixXd std_mat = data.block(0, imin, data.rows(), imax-imin) - mean.rowwise().replicate(imax-imin);
233 std_mat = std_mat.cwiseProduct(std_mat);
234 VectorXd std_v = std_mat.rowwise().mean();
235 for(qint32 i = 0; i < std_v.size(); ++i)
236 std_v[i] = sqrt(std_v[i] /
static_cast<float>(imax-imin));
238 data_out -= mean.rowwise().replicate(data_out.cols());
239 data_out = data_out.cwiseQuotient(std_v.rowwise().replicate(data_out.cols()));
240 }
else if(mode.compare(
"percent") == 0) {
241 data_out -= mean.rowwise().replicate(data_out.cols());
242 data_out = data_out.cwiseQuotient(mean.rowwise().replicate(data_out.cols()));
General numerical helpers: GCD, log2, histogram binning, baseline rescaling, sparsity tests.
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)