from struct import pack from os import system class CellWriter: def __init__(self, filename): ''' sequential writer for cells ''' self.name = filename+'.car' self.__fname = ['%s.ncell'%filename,'%s.header'%filename,'%s.data'%filename] self.__fo_ncell = open(self.__fname[0], 'wb') self.__fo_header = open(self.__fname[1], 'wb') self.__fo_data = open(self.__fname[2], 'wb') self.__ncell = 0 def close(self): self.__fo_ncell.write(pack('>I', self.__ncell)) self.__fo_header.close() self.__fo_data.close() self.__fo_ncell.close() # merging with open(self.name, 'wb') as fo: for fname in self.__fname: with open(fname, 'rb') as fi: b = fi.read(1) while b: fo.write(b) b = fi.read(1) system('rm %s %s %s' % \ (self.__fo_header.name,\ self.__fo_data.name,\ self.__fo_ncell.name,\ ) ) def write(self, cell): ''' write a cell ''' def writesections(sections): self.__fo_data.write(pack('>H', len(sections))) #n sections for s in sections: self.__fo_data.write(pack('>I', len(s.points))) #n points for p in s.points: self.__fo_data.write(pack('>ffff', *p)) #point def writeconnectivity(cell): # number of connections nconn = 0 for s in cell.soma+cell.apic+cell.tuft+cell.dend: if s.parent: nconn += 1 self.__fo_data.write(pack('>I', nconn)) def write_conn(secid1, sections): for isec1, s in enumerate(sections): if s.parent: try: isec2 = cell.soma.index(s.parent); secid2 = 0 except ValueError: pass try: isec2 = cell.apic.index(s.parent); secid2 = 1 except ValueError: pass try: isec2 = cell.tuft.index(s.parent); secid2 = 2 except ValueError: pass try: isec2 = cell.dend.index(s.parent); secid2 = 3 except ValueError: pass self.__fo_data.write(pack('>BHBH', secid1, isec1, secid2, isec2)) write_conn(0, cell.soma) write_conn(1, cell.apic) write_conn(2, cell.tuft) write_conn(3, cell.dend) # write everything self.__fo_header.write(pack('>I', self.__fo_data.tell())) writesections(cell.soma) writesections(cell.apic) writesections(cell.tuft) writesections(cell.dend) writeconnectivity(cell) self.__ncell += 1 if __name__ == '__main__': from grow import genMitral,genMTufted from params import Nmitral as nmc, Nmtufted as nmtc ncell = nmc cw = CellWriter('../vis/mccells') for gid in range(635): cw.write(genMitral(gid)) print 'cell', gid, 'generated and stored' for gid in range(635,635+10*127): cw.write(genMTufted(gid)) print 'cell', gid, 'generated and stored' cw.close()