inline size_t idx2idx_shift(const size_t idx, struct shift_t delta, const struct bbox_t *bbox) { return shift2idx(shiftdelta(idx2shift(idx,bbox),delta),bbox); }
bool RtDesignMatrix::buildDesignMatrix() { numAddedColumns = 0; // TODO this will need to get called by unserializeXML as well // fill the rest of the measurements as periodic stim if (loadDesignMatrixFromFile) { if (padConditionWithZeros) { // TODO } else { unsigned int i = blockLen - 1; for (; i < numMeas; i++) { inputConditions.put( i, numInputConditions - 1, inputConditions.get( i % blockLen, numInputConditions - 1)); } } } // the rest was originally in build() // setup the size unsigned int numConditions = getNumConditionBases(); unsigned int numNuisance = getNumNuisanceBases(); columnNames.clear(); columnNames.reserve(numConditions + numNuisance); set_size(numMeas, numConditions + numNuisance); // set neural condition regressors buildHrf(); // store the new condition names as we go along vector<string> inputConditionNames = conditionNames; // build shifted delta for potential condition shifting vnl_vector<double> shiftdelta(numMeas, 0.0); if (conditionShift > 0 && conditionShift < numMeas) { shiftdelta.put(conditionShift, 1); } else { shiftdelta.put(0, 1); } // consider each input condition individually for (unsigned int cond = 0; cond < numConditions; cond++) { vnl_vector<double> basis = inputConditions.get_column(cond); // incorporate condition shift via convolution with shifted delta if (conditionShift > 0 && conditionShift < numMeas) { vnl_vector<double> shiftcol = vnl_convolve(basis, shiftdelta); basis.update(shiftcol.extract(basis.size())); } // build block-wise condition vectors if required if (modelEachBlock) { unsigned int numBlocks = ceil((double) ((numMeas - conditionShift) / blockLen)); // create a design matrix column per block for (unsigned int block = 0; block <= numBlocks; block++) { vnl_vector<double> blockCol(numMeas, 0); // copy the entire block from the input condition vector for (unsigned int meas = conditionShift + block * blockLen; meas < conditionShift + (block + 1) * blockLen && meas < numMeas; meas++) { blockCol.put(meas, basis[meas]); } string blockStr; RtConfigVal::convertToString<unsigned int>(blockStr, block); addColumn(convolveVecWithHrf(blockCol), inputConditionNames[cond] + "_block" + blockStr, conditionInterestIndicator[cond]); // add columns for temporal derivatives if required if (modelTemporalDerivatives) { addColumn(convolveVecWithTemporalDerivative(blockCol), inputConditionNames[cond] + "_block" + blockStr + "_deriv", conditionInterestIndicator[cond]); } } } else { // no block splitting necessary addColumn(convolveVecWithHrf(basis), inputConditionNames[cond], conditionInterestIndicator[cond]); // add columns for temporal derivatives if required if (modelTemporalDerivatives) { addColumn(convolveVecWithTemporalDerivative(basis), inputConditionNames[cond] + "_deriv", conditionInterestIndicator[cond]); } } } // build the nuisance columns // fill the trend colums for (unsigned int i = 0; i <= maxTrendOrder; i++) { vnl_vector<double> trend(numMeas, 0); for (unsigned int j = 0; j < numMeas; j++) { switch (i) { case 0: // mean trend.put(j, 1.0); break; case 1: // linear trend.put(j, j + 1); break; default: // higher trend.put(j, pow((double) j - numMeas / 2, (int) i)); break; } } string order; RtConfigVal::convertToString(order, i); addColumn(trend, string("trend_order_") + order, false); } // name the motion columns vnl_vector<double> motStub(numMeas, 0); if (modelMotionParameters) { addColumn(motStub, "motion_tx", false); addColumn(motStub, "motion_ty", false); addColumn(motStub, "motion_tz", false); addColumn(motStub, "motion_rx", false); addColumn(motStub, "motion_ry", false); addColumn(motStub, "motion_rz", false); } // event and artifact columns will be left blank until they are received // check number of conditions against filled columns if (numAddedColumns != numNuisance + numConditions) { cerr << "WARNING: number of columns generated (" << numAddedColumns << ") is different from that expected (" << numNuisance + numConditions << "). further calculations are suspect." << endl; } if (DEBUG_LEVEL & MODERATE) { print(); } built = true; return true; }
inline size_t gid2idx_shift(const size_t gid, struct shift_t delta, const struct bbox_t *bbox) { return shift2idx(shiftdelta(gid2shift(gid,bbox),delta),bbox); }