Source code for netpyne.specs.simConfig

"""
Module containing SimConfig class including simulation configuration and methods

"""

# required to make json saving work in Python 2/3
try:
    to_unicode = unicode
except NameError:
    to_unicode = str

from collections import OrderedDict
from .dicts import Dict, ODict


# ----------------------------------------------------------------------------
# SIMULATION CONFIGURATION CLASS
# ----------------------------------------------------------------------------


[docs] class SimConfig(object): """ Class to hold simulation configuration parameters """ def __init__(self, simConfigDict=None): # Simulation parameters self.duration = self.tstop = 1 * 1e3 # Duration of the simulation, in ms self.dt = 0.025 # Internal integration timestep to use self.hParams = Dict({'celsius': 6.3, 'v_init': -65.0, 'clamp_resist': 0.001}) # parameters of h module self.coreneuron = False # use CoreNEURON to run the simulation (alpha version) self.dump_coreneuron_model = False # dump CoreNEURON model self.random123 = False # enable Random123 random number generator self.cache_efficient = False # use CVode cache_efficient option to optimize load when running on many cores self.gpu = False # enable GPU execution in CoreNEURON self.cvode_active = False # Use CVode variable time step self.use_fast_imem = False # use CVode fast_imem to record membrane voltage via i_membrane_ self.cvode_atol = 0.001 # absolute error tolerance self.seeds = Dict( {'conn': 1, 'stim': 1, 'loc': 1, 'cell': 1} ) # Seeds for randomizers (connectivity, input stimulation, cell locations, cell and synMech params) self.rand123GlobalIndex = ( None # Sets the global index used by all instances of the Random123 instances of Random ) self.createNEURONObj = True # create runnable network in NEURON when instantiating netpyne network metadata self.createPyStruct = True # create Python structure (simulator-independent) when instantiating network self.addSynMechs = True # whether to add synaptich mechanisms or not self.includeParamsLabel = True # include label of param rule that created that cell, conn or stim self.gatherOnlySimData = False # omits gathering of net+cell data thus reducing gatherData time self.compactConnFormat = ( False # replace dict format with compact list format for conns (need to provide list of keys to include) ) self.connRandomSecFromList = True # select random section (and location) from list even when synsPerConn=1 self.distributeSynsUniformly = True # locate synapses at uniformly across section list; if false, place one syn per section in section list self.pt3dRelativeToCellLocation = True # Make cell 3d points relative to the cell x,y,z location self.invertedYCoord = ( True # Make y-axis coordinate negative so they represent depth when visualized (0 at the top) ) self.allowSelfConns = False # allow connections from a cell to itself self.allowConnsWithWeight0 = True # allow connections with weight 0 self.oneSynPerNetcon = ( True # create one individual synapse object for each Netcon (if False, same synpase can be shared) ) self.saveCellSecs = True # save all the sections info for each cell (False reduces time+space; available in netParams; prevents re-simulation) self.saveCellConns = ( True # save all the conns info for each cell (False reduces time+space; prevents re-simulation) ) self.timing = True # show timing of each process self.saveTiming = False # save timing data to pickle file self.printRunTime = False # print run time at interval (in sec) specified here (eg. 0.1) self.printPopAvgRates = False # print population avg firing rates after run self.printSynsAfterRule = False # print total of connections after each conn rule is applied self.verbose = False # show detailed messages self.progressBar = 2 # (0: no progress bar; 1: progress bar w/ leave = False; 2: progress bar w/ leave = True) # Recording self.recordCells = [] # what cells to record traces from (eg. 'all', 5, or 'PYR') self.recordTraces = {} # Dict of traces to record self.recordCellsSpikes = -1 # cells to record spike times from (-1 to record from all) self.recordStim = False # record spikes of cell stims self.recordLFP = [] # list of 3D locations to record LFP from self.recordDipole = False # record dipoles using lfpykit method self.recordDipolesHNN = False # record dipoles using HNN method self.saveLFPCells = False # Store LFP generated individually by each cell self.saveLFPPops = False # Store LFP generated individually by each population self.saveDipoleCells = False # Store LFP generated individually by each cell self.saveDipolePops = False # Store LFP generated individually by each population self.recordStep = 0.1 # Step size in ms to save data (eg. V traces, LFP, etc) self.recordTime = True # record time step of recording # Saving self.simLabel = '' # name of simulation (used as filename if none provided) self.saveFolder = '' # path where to save output data self.filename = ( 'model_output' # Name of file to save model output (if omitted then saveFolder+simLabel is used) ) self.saveDataInclude = ['netParams', 'netCells', 'netPops', 'simConfig', 'simData'] self.timestampFilename = False # Add timestamp to filename to avoid overwriting self.savePickle = False # save to pickle file self.saveJson = False # save to json file self.saveMat = False # save to mat file self.saveCSV = False # save to txt file self.saveDpk = False # save to .dpk pickled file self.saveHDF5 = False # save to HDF5 file self.saveDat = False # save traces to .dat file(s) self.backupCfgFile = [] # copy cfg file, list with [sourceFile,destFolder] (eg. ['cfg.py', 'backupcfg/']) # error checking self.validateNetParams = ( False # whether to validate the input parameters (will be turned off if num processors > 1) ) # self.checkErrors = False # whether to validate the input parameters (will be turned off if num processors > 1) # self.checkErrorsVerbose = False # whether to print detailed errors during input parameter validation # self.exitOnError = False # whether to hard exit on error # Analysis and plotting self.analysis = ODict() # fill in params from dict passed as argument if simConfigDict: for k, v in simConfigDict.items(): if isinstance(v, OrderedDict): setattr(self, k, ODict(v)) elif isinstance(v, dict): setattr(self, k, Dict(v)) else: setattr(self, k, v) def __repr__(self): #functions to make the cfg function more like a dictionary return str(self.__dict__) def __contains__(self, item): return item in self.__dict__ def __iter__(self): return iter(self.__dict__)
[docs] def get(self, k, d=None): try: return self.__getitem__(k) except: return d
def __getitem__(self, k): try: return object.__getattribute__(self, k) except: raise KeyError(k) def __setitem__(self, k, v): try: setattr(self, k, v) except: raise KeyError(v)
[docs] def save(self, filename): import os basename = os.path.basename(filename) folder = filename.split(basename)[0] ext = basename.split('.')[1] # make directories if they do not already exist: try: os.makedirs(folder, exist_ok=True) except Exception as e: print('%s: Exception: %s,' % (os.path.abspath(__file__), e)) raise SystemExit('Could not create %s' % (folder)) dataSave = {'simConfig': self.__dict__} # Save to json file if ext == 'json': from .. import sim print(('Saving simConfig to %s ... ' % (filename))) sim.saveJSON(filename, dataSave)
[docs] def setParam(self, param, value): self.__dict__[param] = value
[docs] def addAnalysis(self, func, params): self.analysis[func] = params
[docs] def todict(self): from ..sim import replaceDictODict return replaceDictODict(self.__dict__)
[docs] def validateDataSaveOptions(self, printWarning=True): if any( [self.savePickle, self.saveJson, self.saveMat, self.saveCSV, self.saveDpk, self.saveHDF5, self.saveDat] ): return True if printWarning: print( "Warning: data won't be saved. No output format specified (consider sim.cfg.savePickle, sim.cfg.saveJson etc.)" ) return False