from abaqus import *
from abaqusConstants import *
import sys
from numpy import ones
from SpindleAssembly.PositionComponents import assign_aMT
from SpindleAssembly.PositionConnectors import attach_connectors
# sys.path.append("J:\ECS Research\Public\VLC\Spindle")
from SpindleAssembly import AddComponents as ac
from SpindleAssembly import PositionIpMTs
from SpindleAssembly import PositionConnectors
from Parts.GeometryBuilder import model
[docs]def generate_assembly(**kwargs):
"""
Call modules to generate assembly
:type kwargs: object
:param kwargs:
:return: kwargs -> object
"""
create_model_assembly(**kwargs)
add_and_position_centrosomes(**kwargs)
aMTnames, kwargs = add_and_position_astral_mts(**kwargs)
MTdata, kwargs, data = add_and_position_interpolar_mts_and_connectors(**kwargs)
return MTdata, aMTnames, kwargs, data
[docs]def create_model_assembly(**kwargs):
"""
Create Abaqus model and assembly
:param kwargs: object
:return: None
"""
model(**kwargs)
a = ac.return_assembly(**kwargs)
a.DatumCsysByDefault(CARTESIAN)
kwargs.update({'assembly': a})
[docs]def add_and_position_centrosomes(**kwargs):
"""
Create centrosomes and position them at the right or left pole
:param kwargs: model marameters. object
:return: None
"""
# Add right centrosome
ac.add_centrosome('right', **kwargs)
# Add left centrosome
ac.add_centrosome('left', **kwargs)
[docs]def add_and_position_interpolar_mts_and_connectors(**kwargs):
"""
Create and position interpolar microtubules and connects them with connectors
:param kwargs: model parameters. object
:return: MTdata -> (dictionary) Contains ipMT names, positions and connector positions
"""
MTdata, ConnectorData, data = assign_ipMTs(**kwargs)
attach_connectors(data, **kwargs)
kwargs.update(dict(MTdata=MTdata, ConnectorData=ConnectorData))
return MTdata, kwargs, data
[docs]def add_and_position_astral_mts(**kwargs):
"""
Create and position astral microtubules
:param kwargs: object
:return: aMTnames -> (list) list of astral microtubule names
kwargs -> object
"""
aMTnames, aMTposition = assign_aMT('aMT', **kwargs)
kwargs.update({'aMTnames': aMTnames, 'aMTposition': aMTposition})
return aMTnames, kwargs
[docs]def assign_ipMTs(**kwargs):
"""
Position the microtubules within the spindle along with the associated connectors
:param kwargs: model parameters
:type kwargs: dict
:return: MTdata, ConnectorData, data
:rtype: list, list, list
"""
# Create dictionary to store MT metadata
MTdata = {'MTnames': [],
'MTpositions': [],
'Points': {}}
ConnectorData = {}
data = []
# Create ipMTs:
NipMTs = kwargs['ipMTnumber']
if NipMTs >= 1:
MTname1, pos1, alpha1, kwargs = PositionIpMTs.add_first_ipMT(i=0, **kwargs)
if NipMTs >= 2:
MTname2, pos2, alpha2, kwargs = PositionIpMTs.add_second_ipMT(
pos1, alpha1, i=1, **kwargs)
# Generate points of connector attachment sites
z12, z21, z12_global, z21_global = PositionConnectors.generate_connector_positions(
pos1, pos2, MTtype='antiparallel', **kwargs)
# Store all the metadata in the dictionary
MTdata['MTnames'].append(MTname1)
MTdata['MTnames'].append(MTname2)
MTdata['MTpositions'].append(pos1)
MTdata['MTpositions'].append(pos2)
MTdata['Points'].update({'12': z12})
MTdata['Points'].update({'21': z21})
connectornames, alpha = ac.add_connectors(pos1, pos2, MTname1, MTname2, z12, **kwargs)
PositionConnectors.position_connectors(pos1, pos2, z12, connectornames, alpha, **kwargs)
for index, name in enumerate(connectornames):
ConnectorData.update({name: [MTname1, (pos1[0], pos1[1], z12[index], z12_global[index]),
MTname2, (pos2[0], pos2[1], z21[index], z21_global[index])]})
data.append([MTname1, name, (pos1[0], pos1[1], z12_global[index]), 0])
# data.append({'MT_name': MTname1, 'Con_name': name, 'Con_pointId': 0, 'MT_pointId': MTids[0],
# 'pointCoordinate' : (pos1[0], pos1[1], z12_global[index])})
data.append([MTname2, name, (pos2[0], pos2[1], z21_global[index]), 1])
# MTids[0] += 1
# MTids[1] += 1
if NipMTs >= 3:
MTname3, pos3, alpha3, kwargs = PositionIpMTs.add_third_ipMT(
pos2, alpha2, i=2, **kwargs)
z32, z23, z32_global, z23_global = PositionConnectors.generate_connector_positions(
pos3, pos2, MTtype='antiparallel', **kwargs)
MTdata['MTnames'].append(MTname3)
MTdata['MTpositions'].append(pos3)
MTdata['Points'].update({'32': z32})
MTdata['Points'].update({'23': z23})
connectornames, alpha = ac.add_connectors(pos3, pos2, MTname3, MTname2, z32, **kwargs)
PositionConnectors.position_connectors(pos3, pos2, z32, connectornames, alpha, **kwargs)
for index, name in enumerate(connectornames):
ConnectorData.update({name: [MTname3, (pos3[0], pos3[1], z32[index], z32_global[index]),
MTname2, (pos2[0], pos2[1], z23[index], z23_global[index])]})
data.append([MTname3, name, (pos3[0], pos3[1], z32_global[index]), 0])
data.append([MTname2, name, (pos2[0], pos2[1], z23_global[index]), 1])
if NipMTs >= 4:
MTname4, pos4, alpha4, kwargs = PositionIpMTs.add_fourth_ipMT(
pos3, alpha2, alpha3, i=3, **kwargs)
z34, z43, z34_global, z43_global = PositionConnectors.generate_connector_positions(
pos3, pos4, MTtype='antiparallel', **kwargs)
z14, z41, z14_global, z41_global = PositionConnectors.generate_connector_positions(
pos1, pos4, MTtype='antiparallel', **kwargs)
MTdata['MTnames'].append(MTname4)
MTdata['MTpositions'].append(pos4)
MTdata['Points'].update({'34': z34})
MTdata['Points'].update({'43': z43})
MTdata['Points'].update({'14': z14})
MTdata['Points'].update({'41': z41})
connectornames, alpha = ac.add_connectors(pos3, pos4, MTname3, MTname4, z34, **kwargs)
PositionConnectors.position_connectors(pos3, pos4, z34, connectornames, alpha, **kwargs)
for index, name in enumerate(connectornames):
ConnectorData.update({name: [MTname3, (pos3[0], pos3[1], z34[index], z34_global[index]),
MTname4, (pos4[0], pos4[1], z43[index], z43_global[index])]})
data.append([MTname3, name, (pos3[0], pos3[1], z34_global[index]), 0])
data.append([MTname4, name, (pos4[0], pos4[1], z43_global[index]), 1])
connectornames, alpha = ac.add_connectors(pos1, pos4, MTname1, MTname4, z14, **kwargs)
PositionConnectors.position_connectors(pos1, pos4, z14, connectornames, alpha, **kwargs)
for index, name in enumerate(connectornames):
ConnectorData.update({name: [MTname1, (pos1[0], pos1[1], z14[index], z14_global[index]),
MTname4, (pos4[0], pos4[1], z41[index], z41_global[index])]})
data.append([MTname1, name, (pos1[0], pos1[1], z14_global[index]), 0])
data.append([MTname4, name, (pos4[0], pos4[1], z41_global[index]), 1])
if NipMTs >= 5:
MTname5, pos5, alpha5, kwargs = PositionIpMTs.add_fifth_ipMT(
pos4, alpha4, i=4, **kwargs)
z54, z45, z54_global, z45_global = PositionConnectors.generate_connector_positions(
pos5, pos4, MTtype='antiparallel', **kwargs)
MTdata['MTnames'].append(MTname5)
MTdata['MTpositions'].append(pos5)
MTdata['Points'].update({'45': z45})
MTdata['Points'].update({'54': z54})
connectornames, alpha = ac.add_connectors(pos5, pos4, MTname5, MTname4, z54, **kwargs)
PositionConnectors.position_connectors(pos5, pos4, z54, connectornames, alpha, **kwargs)
for index, name in enumerate(connectornames):
ConnectorData.update({name: [MTname5, (pos5[0], pos5[1], z54[index], z54_global[index]),
MTname4, (pos4[0], pos4[1], z45[index], z45_global[index])]})
data.append([MTname5, name, (pos5[0], pos5[1], z54_global[index]), 0])
data.append([MTname4, name, (pos4[0], pos4[1], z45_global[index]), 1])
if NipMTs >= 6:
MTname6, pos6, alpha6, kwargsAddMT = PositionIpMTs.add_sixth_ipMT(
pos5, alpha4, alpha5, i=5, **kwargs)
z56, z65, z56_global, z65_global = PositionConnectors.generate_connector_positions(
pos5, pos6, MTtype='antiparallel', **kwargs)
MTdata['MTnames'].append(MTname6)
MTdata['MTpositions'].append(pos6)
MTdata['Points'].update({'56': z56})
MTdata['Points'].update({'65': z65})
connectornames, alpha = ac.add_connectors(pos5, pos6, MTname5, MTname6, z56, **kwargs)
PositionConnectors.position_connectors(pos5, pos6, z56, connectornames, alpha, **kwargs)
for index, name in enumerate(connectornames):
ConnectorData.update({name: [MTname5, (pos5[0], pos5[1], z56[index], z56_global[index]),
MTname6, (pos6[0], pos6[1], z65[index], z65_global[index])]})
data.append([MTname5, name, (pos5[0], pos5[1], z56_global[index]), 0])
data.append([MTname6, name, (pos6[0], pos6[1], z65_global[index]), 1])
# Create partitions that correspond to connector attachment sites
MTpoints = {}
for i in range(len(MTdata['MTnames'])):
MTpoints.update({str(i+1): []})
for key, value in MTdata['Points'].iteritems():
if int(key[0]) == i+1:
MTpoints[str(i + 1)] = sorted(MTpoints[str(i+1)] + value)
PositionConnectors.generate_partition_points(
MTpoints[str(i + 1)],
MTdata['MTnames'][i], **kwargs)
return MTdata, ConnectorData, data