void MainWindow::createFileDock()//创建文件Dock { m_filedock=new SAMFileDock(this); m_filedock->refresh(core); this->addDockWidget(Qt::LeftDockWidgetArea,m_filedock); connect(m_filedock,SIGNAL(ShowLImg(QString)),m_limgviewer,SLOT(openImg(QString))); connect(m_filedock,SIGNAL(ShowRImg(QString)),m_rimgviewer,SLOT(openImg(QString))); connect(m_filedock,SIGNAL(ShowP(QString)),m_pimgviewer,SLOT(loadProduct(QString))); }
/* ViterbiAlign: align the segNum'th segment. For each frame k, store aligned state in states and mostly likely mix comp in mixes. Return logP. */ LogFloat ViterbiAlign(int segNum,int segLen, IntVec states, IntVec *mixes) { int currState,prevState,bestPrevState; int segIdx; LogFloat bestP,currP,tranP,prevP; Observation obs; if (trace & T_VIT) printf(" Aligning Segment Number %d\n",segNum); MakeTraceBack(segLen); /* From entry state 1: Column 1 */ obs = GetSegObs(segStore, segNum, 1); if (hset.hsKind == TIEDHS) PrecomputeTMix(&hset, &obs, 50.0, 0); for (currState=2;currState<nStates;currState++) { tranP = hmmLink->transP[1][currState]; if (tranP<LSMALL) lastP[currState] = LZERO; else lastP[currState] = tranP + OutP(&obs,hmmLink,currState); traceBack[1][currState] = 1; } if (trace & T_VIT) ShowP(1,lastP); /* Columns[2] -> Columns[segLen] -- this is the general case */ for (segIdx=2; segIdx<=segLen; segIdx++) { obs = GetSegObs(segStore, segNum, segIdx); if (hset.hsKind == TIEDHS) PrecomputeTMix(&hset, &obs, 50.0, 0); for (currState=2;currState<nStates;currState++) { bestPrevState=2; tranP = hmmLink->transP[2][currState]; prevP = lastP[2]; bestP = (tranP<LSMALL) ? LZERO : tranP+prevP; for (prevState=3;prevState<nStates;prevState++) { tranP = hmmLink->transP[prevState][currState]; prevP = lastP[prevState]; currP = (tranP<LSMALL) ? LZERO : tranP+prevP; if (currP > bestP) { bestPrevState=prevState; bestP=currP; } } if (bestP<LSMALL) currP = thisP[currState] = LZERO; else { currP = OutP(&obs,hmmLink,currState); thisP[currState] = bestP+currP; } if (trace&T_OBP) printf("OutP[s=%d,t=%d] = %f\n",currState,segIdx,currP); traceBack[segIdx][currState]=bestPrevState; } CopyVector(thisP,lastP); if (trace & T_VIT) ShowP(segIdx,lastP); } /* column[segLen]--> exit state(numStates) */ bestPrevState=2; tranP = hmmLink->transP[2][nStates]; prevP = lastP[2]; bestP=(tranP<LSMALL) ? LZERO : tranP+prevP; for (prevState=3;prevState<nStates;prevState++) { tranP = hmmLink->transP[prevState][nStates]; prevP = lastP[prevState]; currP = (tranP<LSMALL) ? LZERO : tranP+prevP; if (currP > bestP) { bestPrevState=prevState; bestP=currP; } } /* bestPrevState now gives last internal state along best state sequence */ if (bestP<LSMALL) HError(2126,"ViterbiAlign: No path found in %d'th segment",segNum); if (trace & T_VIT) { ShowTraceBack(segLen,traceBack); printf(" bestP = %12.5f via state %d\n",bestP,bestPrevState); fflush(stdout); } DoTraceBack(segLen,states,bestPrevState); if (mixes!=NULL) /* ie not DISCRETE */ FindBestMixes(segNum,segLen,states,mixes); ResetHeap( &traceBackStack ); return bestP; }