diff --git a/SleepLib/calcs.cpp b/SleepLib/calcs.cpp index 0b42329d..3235e386 100644 --- a/SleepLib/calcs.cpp +++ b/SleepLib/calcs.cpp @@ -552,48 +552,39 @@ void FlowParser::flagEvents() int numbreaths=breaths.size(); EventDataType val,mx,mn; - QVector<EventDataType> br(numbreaths); + QVector<EventDataType> br; -// QVector<qint64> bstart(numbreaths); -// QVector<qint64> bend(numbreaths); -// QVector<EventDataType> bvalue(numbreaths); + QVector<qint32> bstart; + QVector<qint32> bend; + //QVector<EventDataType> bvalue; + + bstart.reserve(numbreaths*2); + bend.reserve(numbreaths*2); + //bvalue.reserve(numbreaths*2); + br.reserve(numbreaths*2); double start=m_flow->first(); - double sps=1000.0/m_rate; + // double sps=1000.0/m_rate; double st,mt,et, dur; qint64 len; for (int i=0;i<numbreaths;i++) { -// st=start+breaths[i].start * m_rate; -// et=start+breaths[i].end * m_rate; -// bstart[i]=st; -// bend[i]=et; - - val=breaths[i].max - breaths[i].min; - //bvalue[i]=val; - - br[i]=val; + mx=breaths[i].max; + mn=breaths[i].min; + br.push_back(qAbs(mx)); + br.push_back(qAbs(mn)); } - const EventDataType perc=0.95; - int idx=numbreaths*perc; + const EventDataType perc=0.6; + int idx=float(br.size())*perc; nth_element(br.begin(),br.begin()+idx,br.end()); - EventDataType peak=*(br.begin()+idx); + EventDataType peak=br[idx];//*(br.begin()+idx); EventDataType cutoffval=peak * (PROFILE.cpap->userFlowRestriction()/100.0); - EventDataType duration=PROFILE.cpap->userEventDuration(); - QVector<qint64> good; - EventList * uf1=NULL; - //EventList * uf2=m_session->AddEventList(CPAP_UserFlag2,EVL_Event); - // EventList * uf3=m_session->AddEventList(CPAP_UserFlag3,EVL_Event); - - double lastst=start, lastet=start; - good.reserve(numbreaths); - bool bad=false; - int bs,bm,be; + int bs,bm,be, bs1, bm1, be1; for (int i=0;i<numbreaths;i++) { bs=breaths[i].start; bm=breaths[i].middle; @@ -603,52 +594,154 @@ void FlowParser::flagEvents() mn=breaths[i].min; val=mx - mn; - int i=bs; - for (;i<bm;i++) { - if (qAbs(m_filtered[i]) > cutoffval) { - bs=i; +// if (qAbs(mx) > cutoffval) { + bs1=bs; + for (;bs1<be;bs1++) { + if (qAbs(m_filtered[bs1]) > cutoffval) { + break; + } + } + + bm1=bm; + for (;bm1>bs;bm1--) { + if (qAbs(m_filtered[bm1]) > cutoffval) { + break; + } + } + if (bm1>=bs1) { + bstart.push_back(bs1); + bend.push_back(bm1); + } + // } + // if (qAbs(mn) > cutoffval) { + bm1=bm; + for (;bm1<be;bm1++) { + if (qAbs(m_filtered[bm1]) > cutoffval) { + break; + } + } + be1=be; + for (;be1>bm;be1--) { + if (qAbs(m_filtered[be1]) > cutoffval) { + break; + } + } + if (be1>=bm1) { + bstart.push_back(bm1); + bend.push_back(be1); + } +// } + } + + + EventDataType duration=PROFILE.cpap->userEventDuration(); + //double lastst=start, lastet=start; + //EventDataType v; + int bsize=bstart.size(); + EventList * uf1=NULL; + // EventList * uf2=m_session->AddEventList(CPAP_UserFlag2,EVL_Event); + // EventList * uf3=m_session->AddEventList(CPAP_UserFlag3,EVL_Event); + + for (int i=0;i<bsize-1;i++) { + bs=bend[i]; + be=bstart[i+1]; + st=start + bs * m_rate; + et=start + be * m_rate; + + len=et-st; + dur=len/1000.0; + if (dur>=duration) { + if (!SearchApnea(m_session,st-len/2,15000)) { + if (!uf1) { + uf1=m_session->AddEventList(CPAP_UserFlag1,EVL_Event); + } + uf1->AddEvent(et-len/2,dur); + } + } + } + + + +/* QVector<qint64> good; + + + good.reserve(numbreaths); + bool bad=false; + int bs,bm,be; + + for (int idx=0;idx<numbreaths;idx++) { + bs=breaths[i].start; + bm=breaths[i].middle; + be=breaths[i].end; + + mx=breaths[i].max; + mn=breaths[i].min; + val=mx - mn; + } + + + for (int i=0;i<numbreaths;i++) { + bs=breaths[i].start; + bm=breaths[i].middle; + be=breaths[i].end; + + mx=breaths[i].max; + mn=breaths[i].min; + val=mx - mn; + + et=start + be * m_rate; + if (et<lastet) continue; + if (val > cutoffval) continue; + + int j=bs; + for (;j>0;j--) { + if (qAbs(m_filtered[j]) > cutoffval) { + bs=j; break; } } - i=be; - for (;i>bm;i--) { - if (qAbs(m_filtered[i]) > cutoffval) { - be=i; + + if (bs==be) continue; + j=be; + for (;j<m_samples;j++) { + if (qAbs(m_filtered[j]) > cutoffval) { + be=j; break; } } + st=start + bs * m_rate; mt=start + bm * m_rate; et=start + be * m_rate; - len=st-lastet; + len=et-st; dur=len/1000.0; if (dur>=duration) { //if (!SearchApnea(m_session,st-len/2,15000)) { if (!uf1) { uf1=m_session->AddEventList(CPAP_UserFlag1,EVL_Event); } - uf1->AddEvent(st-len/2,dur); + uf1->AddEvent(et-len/2,dur); //} } // Uncomment to use UserFlags to show waveform crossover points // Good for debugging this stuff. (Make sure to add the EventLists up above) - if (val > cutoffval) { + //if (val > cutoffval) { //uf2->AddEvent(st,0); //uf2->AddEvent(mt,0); //uf3->AddEvent(et,0); lastet=et; lastst=st; - } + //} } return; - +*/ //EventList *uf1=NULL; // int lastbad=-1;