code: def _read_stimtime_AFNI(stimtime_files, n_C, n_S, scan_onoff):
      """Utility called by gen_design. It reads in one or more stimulus timing
          file comforming to AFNI style, and return a list
          (size of ``[number of runs \\* number of conditions]``)
          of dictionary including onsets, durations and weights of each event.
  
      Parameters
      ----------
  
      stimtime_files: a string or a list of string.
          Each string is the name of the file storing the stimulus
          timing information of one task condition.
          The contents in the files should follow the style of AFNI
          stimulus timing files, refer to gen_design.
  
      n_C: integer, number of task conditions
  
      n_S: integer, number of scans
  
      scan_onoff: list of numbers.
          The onset of each scan after concatenating all scans,
          together with the offset of the last scan.
          For example, if 3 scans of duration 100s, 150s, 120s are run,
          scan_onoff is [0, 100, 250, 370]
  
  
      Returns
      -------
  
      design_info: list of stimulus information
          The first level of the list correspond to different scans.
          The second level of the list correspond to different conditions.
          Each item in the list is a dictiornary with keys "onset",
          "duration" and "weight". If one condition includes no event
          in a scan, the values of these keys in that scan of the condition
          are empty lists.
  
  
      See also
      --------
  
      gen_design
      """
      design_info = [
          [
              {"onset": [], "duration": [], "weight": []}
              for i_c in range(n_C)
          ]
          for i_s in range(n_S)
      ]
      # Read stimulus timing files
      for i_c in range(n_C):
          with open(stimtime_files[i_c]) as f:
              text = f.readlines()
              assert (
                  len(text) == n_S
              ), "Number of lines does not match number of runs!"
              for i_s, line in enumerate(text):
                  events = line.strip().split()
                  if events[0] == "*":
                      continue
                  for event in events:
                      assert event != "*"
                      tmp = str.split(event, ":")
                      if len(tmp) == 2:
                          duration = float(tmp[1])
                      else:
                          duration = 1.0
                      tmp = str.split(tmp[0], "*")
                      if len(tmp) == 2:
                          weight = float(tmp[1])
                      else:
                          weight = 1.0
                      if (
                          float(tmp[0]) >= 0
                          and float(tmp[0])
                          < scan_onoff[i_s + 1] - scan_onoff[i_s]
                      ):
                          design_info[i_s][i_c]["onset"].append(
                              float(tmp[0])
                          )
                          design_info[i_s][i_c]["duration"].append(
                              duration
                          )
                          design_info[i_s][i_c]["weight"].append(weight)
      return design_info
  
imports: import numpy
  import re
  import warnings
  import os.path
  import psutil
  from .fmrisim import generate_stimfunction, _double_gamma_hrf, convolve_hrf
  from scipy.fftpack import fft, ifft
  import logging
label_desc: Use image node_id 9 for calling a global function with example usage: _read_stimtime_AFNI(stimtime_files, n_C, n_S, scan_onoff) and returns: design_info