Esempio n. 1
0
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);
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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);
}