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; }
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 ); } }