/*
* simthread.cpp
*
* Created on: Feb 16, 2009
* Author: wen
*/
#include "../includes/simthread.h"
#ifdef INTELCC
#include <omp.h>
#endif
SimThread
::SimThread(QObject *parent, SimDispW
*panel
){
dispW=panel;
}
void SimThread::run()
{
if(dispW==NULL || !initialized)
{
return;
}
simLoop();
}
void SimThread::simLoop()
{
CRandomSFMT0 randGen(time(NULL));
int trialTime;
bool *mfsAP=new bool[NUMMF];
bool *granulesAP=new bool[NUMMF];
bool *golgisAP=new bool[NUMMF];
if(dispW==NULL)
{
return;
}
buf=dispW->getBackBuf();
if(buf==NULL)
{
return;
}
while(true)
{
simStopLock.lock();
if(simStop)
{
simStopLock.unlock();
break;
}
simStopLock.unlock();
trialTime=time(NULL);
for(int i=0; i<NUMMF; i++)
{
if(mossyFibers[i].getMFType()==MossyFiber::activeCS+1 || mossyFibers[i].getMFType()==MossyFiber::activeCS+5)
{
mossyFibers[i].setCSOn(1);
}
else
{
mossyFibers[i].setCSOn(0);
}
}
bufLock.lock();
buf->fill(Qt::black);
bufLock.unlock();
dispW->update();
for(int i=0; i<TRIALTIME; i++)
{
bool tempAP;
bool *drawAP;
simStopLock.lock();
if(simStop)
{
simStopLock.unlock();
break;
}
simStopLock.unlock();
simPauseLock.lock();
for(int j=0; j<NUMMF; j++)
{
//mossyFibers[j].setThresh(mossyFibers[j].getThresh()+(1-mossyFibers[j].getThresh())*MossyFiber::threshDecay);
// mfsSpike[j]=randGen.fRandom()<((int)(mossyFibers[j].getCSOn() && i>=mossyFibers[j].getCSStart() && i<mossyFibers[j].getCSEnd())*mossyFibers[j].getIncFreq()+mossyFibers[j].getbgFreqCont(MossyFiber::activeContext))*mossyFibers[j].getThresh();
//
// if(mfsSpike[j])
// {
// mossyFibers[j].setThresh(0);
//
// {
// for(int k=0; k<mossyFibers[j].getNumSynGR(); k++)
// {
// granuleCells[mossyFibers[j].getConGRInd(k)].setExI(mossyFibers[j].getConGRDen(k),mfsSpike[j]);
// }
// }
// }
mfsAP[j]=mossyFibers[j].calcActivity(i, randGen);
}
#ifdef INTELCC
#pragma omp parallel shared(granuleCells, golgiCells)
#endif
{
#ifdef INTELCC
#pragma omp for schedule(static, NUMGR/16) nowait
#endif
for(int j=0; j<NUMGR; j++)
{
tempAP=granuleCells[j].calcActivity();
if(j<NUMMF)
{
granulesAP[j]=tempAP;
}
}
#ifdef INTELCC
#pragma omp for schedule(static, NUMGO/16) nowait
#endif
for(int j=0; j<NUMGO; j++)
{
golgisAP[j]=golgiCells[j].calcActivity();
}
}
simDispTypeLock.lock();
if(simDispType==0)
{
drawAP=mfsAP;
}
else if(simDispType==1)
{
drawAP=granulesAP;
}
else
{
drawAP=golgisAP;
}
simDispTypeLock.unlock();
bufLock.lock();
p.begin(buf);
p.setWindow(0,0, TRIALTIME, NUMMF);
p.setViewport(0, 0, buf->width(), buf->height());
p.setPen(Qt::white);
for(int j=0; j<NUMMF; j++)
{
if(drawAP[j])
{
p.drawPoint(i, j);
}
}
if(i>=MossyFiber::csOnset[MossyFiber::activeCS] && i<MossyFiber::csOnset[MossyFiber::activeCS]+MossyFiber::csDuration[MossyFiber::activeCS])
{
p.setPen(Qt::blue);
}
else
{
p.setPen(Qt::black);
}
for(int j=0; j<NUMMF; j++)
{
if(!drawAP[j])
{
p.drawPoint(i, j);
}
}
p.scale((float)buf->width()/5000, (float)buf->height()/NUMMF);
QRect updateArea
(p.
worldTransform().
mapRect(QRect(i,
0,
1, NUMMF
)));
if(updateArea.width()<1)
{
updateArea.setWidth(1);
}
p.end();
bufLock.unlock();
dispW->update(updateArea);
simPauseLock.unlock();
}
cout<<"trial run time: "<<time(NULL)-trialTime<<endl;
}
// for(int i=0; i<NUMMF; i++)
// {
// delete &mfsAP[i];
// delete &granulesAP[i];
// delete &golgisAP[i];
// }
delete mfsAP;
delete granulesAP;
delete golgisAP;
}