Ejemplo n.º 1
0
Finfo* initCaConcZombieFinfo()
{
	static Finfo* caconcFields[] =
	{
		new ValueFinfo( "Ca", ValueFtype1< double >::global(),
			GFCAST( &HSolveHub::getCa ), 
			RFCAST( &HSolveHub::setCa )
		),
	};

	static const ThisFinfo* tf = dynamic_cast< const ThisFinfo* >( 
		initCaConcCinfo()->getThisFinfo() );
	assert( tf != 0 );

	static SolveFinfo caconcZombieFinfo( 
		caconcFields, 
		sizeof( caconcFields ) / sizeof( Finfo* ),
		tf
	);

	return &caconcZombieFinfo;
}
Ejemplo n.º 2
0
static const Finfo* compartmentVmFinfo =
	initCompartmentCinfo()->findFinfo( "Vm" );
static const Finfo* channelGbarFinfo =
	initHHChannelCinfo()->findFinfo( "Gbar" );
static const Finfo* channelEkFinfo =
	initHHChannelCinfo()->findFinfo( "Ek" );
static const Finfo* channelGkFinfo =
	initHHChannelCinfo()->findFinfo( "Gk" );
static const Finfo* channelXFinfo =
	initHHChannelCinfo()->findFinfo( "X" );
static const Finfo* channelYFinfo =
	initHHChannelCinfo()->findFinfo( "Y" );
static const Finfo* channelZFinfo =
	initHHChannelCinfo()->findFinfo( "Z" );
static const Finfo* caConcCaFinfo =
	initCaConcCinfo()->findFinfo( "Ca" );
/////////////////////////////////////////////////////////////////////////
// Replacement fields for aspiring zombies
/////////////////////////////////////////////////////////////////////////

Finfo* initCompartmentZombieFinfo()
{
	static Finfo* compartmentFields[] =
	{
		new ValueFinfo( "Vm",
			ValueFtype1< double >::global(),
			GFCAST( &HSolveHub::getVm ),
			RFCAST( &HSolveHub::setVm )
		),
		new ValueFinfo( "Im",
			ValueFtype1< double >::global(),
void adaptCa2Sig( TreeNode& t, 
	map< string, Element* >& m, unsigned int offset, double calciumScale,
	Id caId, const string& mol )
{
	static const Finfo* inputFinfo = 
		initAdaptorCinfo()->findFinfo( "inputRequest" );
	static const Finfo* outputFinfo = 
		initAdaptorCinfo()->findFinfo( "outputSrc" );
	static const Finfo* scaleFinfo = 
		initAdaptorCinfo()->findFinfo( "scale" );
	static const Finfo* inputOffsetFinfo = 
		initAdaptorCinfo()->findFinfo( "inputOffset" );
	static const Finfo* outputOffsetFinfo = 
		initAdaptorCinfo()->findFinfo( "outputOffset" );
	
	// Not sure if these update when solved
	static const Finfo* sumTotalFinfo =  
		initMoleculeCinfo()->findFinfo( "sumTotal" );
	static const Finfo* modeFinfo =  
		initMoleculeCinfo()->findFinfo( "mode" );
	static const Finfo* concInitFinfo =  
		initMoleculeCinfo()->findFinfo( "nInit" );
	static const Finfo* volumeScaleFinfo =  
		initMoleculeCinfo()->findFinfo( "volumeScale" );

	// This isn't yet a separate destMsg. Again, issue with update.
	static const Finfo* concFinfo =  
		initCaConcCinfo()->findFinfo( "Ca" );
	static const Finfo* caBasalFinfo =  
		initCaConcCinfo()->findFinfo( "CaBasal" );
	
	// cout << "adaptCa2Sig( el=" << t.compt.path() << ", Ca=" << caId.path() << ", mol=" << mol << ", offset = " << offset << ", cascale=" << calciumScale << endl;
	if ( t.sigEnd <= t.sigStart ) // Nothing to do here, move along
		return;
	// Look up matching molecule
	map< string, Element* >::iterator i = m.find( mol );
	if ( i != m.end() ) {
		Element* e = i->second;
		// cout << "Adding adaptor from " << caId.path() << " to " << i->second->name() << endl;

		assert( t.sigStart >= offset );
		assert( t.sigEnd - offset <= e->numEntries() );

		// Create the adaptor
		string name = "adapt_Ca_2_" + mol;
		Element* adaptor = Neutral::create( "Adaptor", name,
			t.compt, Id::childId( t.compt ) );
		assert( adaptor != 0 );
		Eref adaptorE( adaptor, 0 );
		double caCell = 0.0;
		bool ret = get< double >( caId.eref(), caBasalFinfo, caCell );
		double caSig = 0.08;
		double vs = 1.0; // Converts uM into # for this sig compartment
		Eref MolE( e, t.sigStart - offset );
		ret = get< double >( e, concInitFinfo, caSig );
		assert( ret );
		ret = get< double >( e, volumeScaleFinfo, vs );
		assert( ret );
		vs *= calciumScale;
		ret = set< double >( adaptorE, inputOffsetFinfo, caCell );
		assert( ret );
		ret = set< double >( adaptorE, outputOffsetFinfo, caSig );
		assert( ret );
		ret = set< double >( adaptorE, scaleFinfo, vs );
		assert( ret );

		for ( unsigned int j = t.sigStart; j < t.sigEnd; ++j ) {
			// Connect up the adaptor.
			Eref molE( e, j - offset );
			// Put the molE into sumtotal mode.
			set< int >( molE, modeFinfo, 1 );
			ret = adaptorE.add( outputFinfo->msg(), molE, 
				sumTotalFinfo->msg(), ConnTainer::Default );
			assert( ret );
		}
		// Here we need the adaptor to ask the object for the data,
		// because the solver doesn't push out data at this point.
		ret = adaptorE.add( inputFinfo->msg(), caId.eref(),
			concFinfo->msg(), ConnTainer::Default );
		/*
		ret = caId.eref().add( concFinfo->msg(), adaptorE,
			inputFinfo->msg(), ConnTainer::Default );
			*/
		assert( ret );
	}
}