|
@@ -25,233 +25,9 @@ namespace OTSModelSharp
|
|
|
m_classifyEngine = new CClassifyEngine();
|
|
|
}
|
|
|
|
|
|
- // field image process
|
|
|
- public override bool FieldImageProcess(Point fldCenter, CBSEImgClr a_BSEImg)
|
|
|
- {
|
|
|
- int nNewFieldId;
|
|
|
- nNewFieldId = m_pSampleRstFile.GetIdForANewField();
|
|
|
- //first step:remove background of the bse image and compound all the finded particles.
|
|
|
- curFldData = new CFieldDataClean( a_BSEImg,m_Sample.CalculatePixelSize());
|
|
|
- CFieldDataClean curFldDataCln =( CFieldDataClean) curFldData;
|
|
|
-
|
|
|
- curFldData.SetId(nNewFieldId);
|
|
|
- curFldData.SetOTSPosition(fldCenter);
|
|
|
-
|
|
|
- Point semPos = new Point();
|
|
|
- CSEMStageData a_pCSEMStageData = m_pMsrThread.GetProjResultData().GetSEMStageData();
|
|
|
- a_pCSEMStageData.ConverOTSToSEMPoint(fldCenter, ref semPos);
|
|
|
- curFldData.SemPos = semPos;
|
|
|
-
|
|
|
-
|
|
|
- GetOriginalParticles();
|
|
|
-
|
|
|
- // second step :filter the finded particles.
|
|
|
- FilterParticles((CFieldDataClean)curFldData);
|
|
|
- CalculateParticleAbsolutPos();
|
|
|
-
|
|
|
-
|
|
|
- log.Info("Begin to Calculate the image property of every particle!");
|
|
|
- var analysisparts = curFldDataCln.ListBigParticles;
|
|
|
- curFldData.CalParticleImageProp(analysisparts);//calculate particle image property such as feret diameter, DMAX etc
|
|
|
-
|
|
|
- COTSXRayParam pXRayParam = m_Sample.GetMsrParams().GetXRayParam();
|
|
|
- //collect xray data.
|
|
|
- if (pXRayParam.GetUsingXray() == true)
|
|
|
- {
|
|
|
- Thread.Sleep(100);
|
|
|
- CollectParticlesXrayData((CFieldDataClean)curFldData);
|
|
|
- Thread.Sleep(100);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- ClassifyFieldParticles();
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- // save field files
|
|
|
- m_Sample.GetMsrStatus() .SetStatus(OTS_MSR_SAMPLE_STATUS.SUCCESSED);
|
|
|
-
|
|
|
- StartSaveFileThread(curFldData);
|
|
|
-
|
|
|
- return true;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- // save field data
|
|
|
- //protected void SaveFieldMgrData()
|
|
|
- //{
|
|
|
- // while (bSaveThreadWorking)
|
|
|
- // {
|
|
|
- // while (fieldQueue.Count() > 0)
|
|
|
- // {
|
|
|
- // CFieldDataClean f = (CFieldDataClean) fieldQueue.Dequeue();
|
|
|
- // //double pixelSize = m_Sample.CalculatePixelSize();
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- // //save to disk first ,then pop . if the size is 0,then we know all the saving work is done.
|
|
|
- // SaveFieldData(f,m_pSampleRstFile.GetFieldFileSubFolderStr());
|
|
|
-
|
|
|
-
|
|
|
- // }
|
|
|
- // if (fieldQueue.Count() == 0)
|
|
|
- // {
|
|
|
- // bSaveThreadWorking = false; //must set this flag,so the main thread can know this thread has exited.
|
|
|
- // return;
|
|
|
- // }
|
|
|
- // }
|
|
|
- // return;
|
|
|
- //}
|
|
|
-
|
|
|
-
|
|
|
- //protected void StartSaveFileThread(COTSFieldData a_pFieldMgr)
|
|
|
- //{
|
|
|
+
|
|
|
|
|
|
|
|
|
- // fieldQueue.Enqueue(a_pFieldMgr);
|
|
|
-
|
|
|
-
|
|
|
- // if (fieldQueue.Count() > 0) //if there's data in the queue and the previous thread has finished then start a new thread.
|
|
|
- // {
|
|
|
- // if (bSaveThreadWorking == false)
|
|
|
- // {
|
|
|
- // bSaveThreadWorking = true;
|
|
|
-
|
|
|
- // m_thread_ptr = new System.Threading.Thread(this.SaveFieldMgrData);//m_thread_ptr = shared_ptr<thread>(new thread(&CSmplMeasureInc::SaveFieldMgrData, this));
|
|
|
- // m_thread_ptr.Start();//m_thread_ptr->detach();
|
|
|
- // }
|
|
|
- // }
|
|
|
- //}
|
|
|
-
|
|
|
- public void FilterParticles(CFieldDataClean fld)
|
|
|
- {
|
|
|
- // 1)remove over sized particles, too small particles and get a analysis particles list
|
|
|
-
|
|
|
- double dPixelSize = m_Sample.CalculatePixelSize();
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- CSampleParam pMsrParam = m_Sample.GetMsrParams();
|
|
|
- COTSImageProcParam pImgProcessParam = pMsrParam.GetImageProcessParam();
|
|
|
-
|
|
|
- curFldData.InitParticles(pImgProcessParam, dPixelSize);
|
|
|
- if (curFldData.NoAnalysisParticle())
|
|
|
- {
|
|
|
- log.Warn("There's no analysis particles!");
|
|
|
- }
|
|
|
-
|
|
|
- var listXray = curFldData.GetListAnalysisParticles().OrderByDescending(x => x.GetActualArea()).ToList();
|
|
|
- var listXray1 = new List<COTSParticleClr>();
|
|
|
- var pXRayParam = pMsrParam.GetXRayParam();
|
|
|
- if (listXray.Count > pXRayParam.GetXrayLimit())
|
|
|
- {
|
|
|
- for (var i = 0; i < pXRayParam.GetXrayLimit(); i++)
|
|
|
- {
|
|
|
-
|
|
|
- listXray1.Add(listXray[i]);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- listXray1 = listXray;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- //2) according to the quantify threshold size value saperate the analysis particles into two group :the bigparticles and the smallparticles.
|
|
|
-
|
|
|
- double quantifyThreshold = m_Sample.GetMsrParams().GetXRayParam().GetFeatureModeMinSize();
|
|
|
-
|
|
|
- var smallparts = fld.ListSmallParticles;
|
|
|
- var bigparts = fld.ListBigParticles;
|
|
|
-
|
|
|
-
|
|
|
- foreach (var part in listXray1)
|
|
|
- {
|
|
|
- double equalCircleDiameter = Math.Sqrt(part.GetActualArea() / 3.14159) * 2f;
|
|
|
- if (equalCircleDiameter < quantifyThreshold)
|
|
|
- {
|
|
|
- smallparts.Add(part);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- bigparts.Add(part);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- fld.ListSmallParticles = smallparts;
|
|
|
- fld.ListBigParticles = bigparts;
|
|
|
- //fld.SmallParticlePercentage=percentage;
|
|
|
- log.Info("SmallQuantifyParts (<" + quantifyThreshold.ToString("f2") + "): " + smallparts.Count);
|
|
|
- log.Info("BigQuantifyParts (>=" + quantifyThreshold.ToString("f2")+ "): " + bigparts.Count);
|
|
|
-
|
|
|
- return ;
|
|
|
- }
|
|
|
-
|
|
|
- public void CollectParticlesXrayData(CFieldDataClean fld)
|
|
|
- {
|
|
|
- // get x-ray parameters
|
|
|
- COTSXRayParam pXRayParam = m_Sample.GetMsrParams ().GetXRayParam();
|
|
|
-
|
|
|
- // calculate search x-ray acquire time
|
|
|
- uint nXRayAQTime;
|
|
|
-
|
|
|
- var smallparts = fld.ListSmallParticles;
|
|
|
- var bigparts = fld.ListBigParticles;
|
|
|
-
|
|
|
-
|
|
|
- var pStatus = m_Sample.GetMsrStatus();
|
|
|
- curFldData.CreateXrayList(bigparts); // big particle using the full xray strategy.
|
|
|
-
|
|
|
-
|
|
|
- curFldData.CreateXrayList(smallparts); //small particle using the fast xray strategy
|
|
|
-
|
|
|
- if (bigparts.Count > 0)
|
|
|
- {
|
|
|
-
|
|
|
-
|
|
|
- var workmode = pXRayParam.GetScanMode();
|
|
|
- // get x-ray list (analysis) by particle features
|
|
|
- if (workmode == OTS_X_RAY_SCAN_MODE.FeatureMode)
|
|
|
- {
|
|
|
- nXRayAQTime = (uint)pXRayParam.GetMidAnalyAQTime();
|
|
|
- m_EDSHardwareMgr.GetXRayByFeatures(bigparts, nXRayAQTime, true);
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- nXRayAQTime = (uint)pXRayParam.GetMidAnalyAQTime();
|
|
|
- m_EDSHardwareMgr.GetXRayByPoints(bigparts, nXRayAQTime, true);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- if (smallparts.Count > 0)
|
|
|
- {
|
|
|
- nXRayAQTime = (uint)pXRayParam.GetFastXrayTime();
|
|
|
-
|
|
|
- // get x-ray list (analysis) by points
|
|
|
- m_EDSHardwareMgr.GetXRayByPoints(smallparts, nXRayAQTime, true);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- return ;
|
|
|
- }
|
|
|
-
|
|
|
|
|
|
|
|
|
public override void ClassifyFieldParticles()
|
|
@@ -259,14 +35,14 @@ namespace OTSModelSharp
|
|
|
|
|
|
try
|
|
|
{
|
|
|
- CFieldDataClean curFldDataCln = (CFieldDataClean)curFldData;
|
|
|
+ //CFieldDataClean curFldDataCln = (CFieldDataClean)curFldData;
|
|
|
string libname = m_Sample.GetMsrParams().GetSTDName();
|
|
|
if (libname != "NoSTDDB")
|
|
|
{
|
|
|
log.Info("Begin to classify big particles!Using " + libname);
|
|
|
- var bigparts = curFldDataCln.ListBigParticles;
|
|
|
+ var bigparts = curFldData.ListBigParticles;
|
|
|
ClassifyQuantifyParticles(bigparts,libname);
|
|
|
- var smallParts = curFldDataCln.ListSmallParticles;
|
|
|
+ var smallParts = curFldData.ListSmallParticles;
|
|
|
ClassifyQuantifyParticles(smallParts, libname);
|
|
|
|
|
|
}
|
|
@@ -305,28 +81,7 @@ namespace OTSModelSharp
|
|
|
}
|
|
|
|
|
|
|
|
|
- public void GetOriginalParticles()
|
|
|
- {
|
|
|
- // measure status
|
|
|
- CMsrSampleStatus pStatus = m_Sample.GetMsrStatus();
|
|
|
-
|
|
|
-
|
|
|
- // get image process parameter
|
|
|
- CSampleParam pMsrParam = m_Sample.GetMsrParams();
|
|
|
- COTSImageProcParam pImgProcessParam = pMsrParam.GetImageProcessParam();
|
|
|
- var dPixelsize = m_Sample.CalculatePixelSize();
|
|
|
- // remove BES image background
|
|
|
- curFldData.RemoveImgBGAndGetParticles(pImgProcessParam, dPixelsize);
|
|
|
-
|
|
|
-
|
|
|
- // check if this is an empty image
|
|
|
- if (curFldData.NoParticle())
|
|
|
- { // empty fields
|
|
|
- log.Info("ImageProcess: empty field.");
|
|
|
- //return false;
|
|
|
- }
|
|
|
- return ;
|
|
|
- }
|
|
|
+
|
|
|
public bool ClassifyQuantifyParticles(List<COTSParticleClr> a_listAnalysisParticles, string libname)// classify particles
|
|
|
{
|
|
|
|
|
@@ -370,113 +125,7 @@ namespace OTSModelSharp
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
- //public bool SaveFieldFiles(CFieldDataClean fldData, string filedFileFoler)
|
|
|
- //{
|
|
|
-
|
|
|
- // string strFieldFileFolder = filedFileFoler;
|
|
|
-
|
|
|
- // CBSEImageFileMgr pBSEImgFileMgr = new CBSEImageFileMgr();
|
|
|
- // pBSEImgFileMgr.SetBSEImg(fldData.GetBSEImage());
|
|
|
- // int nId = fldData.GetId();
|
|
|
- // string sFieldId;
|
|
|
- // sFieldId = nId.ToString();
|
|
|
-
|
|
|
-
|
|
|
- // string strBSEFilePathname = strFieldFileFolder + "\\" + m_pSampleRstFile.SMPL_MSR_RESULT_FIELDS_BSE + sFieldId + pBSEImgFileMgr.BMP_IMG_FILE_EXT;
|
|
|
- // if (!pBSEImgFileMgr.SaveIntoBitmap(strBSEFilePathname))
|
|
|
- // {
|
|
|
- // log.Info("SaveFieldFiles: save BSE file failed.");
|
|
|
- // return false;
|
|
|
- // }
|
|
|
-
|
|
|
- // // IncA Data list
|
|
|
-
|
|
|
- // CIncAFileMgr pDBFileMgr = m_pSampleRstFile.DBFileMgr;
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- // pDBFileMgr.SaveStatusDataToDB();
|
|
|
- // var fldDB = pDBFileMgr.GetFieldDB();
|
|
|
-
|
|
|
- // fldDB.SaveAField(fldData.GetId(), fldData.GetOTSPosition(),fldData.SemPos);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- // var analysisParts = fldData.GetListAnalysisParticles();
|
|
|
- // if (!pDBFileMgr.SaveIncADataToDB(analysisParts, fldData.GetOTSPosition()))
|
|
|
- // {
|
|
|
- // log.Info("SaveFieldFiles: save inclusion file failed.");
|
|
|
- // return false;
|
|
|
- // }
|
|
|
- // //save the xray data and element data.
|
|
|
- // CPosXrayDBMgr PosXrayDBMgr = pDBFileMgr.GetPosXrayDBMgr();
|
|
|
- // var m_listAnalysisPosXray = new List<CPosXrayClr>();
|
|
|
-
|
|
|
- // foreach (var p in analysisParts)
|
|
|
- // {
|
|
|
- // m_listAnalysisPosXray.Add(p.GetXray());
|
|
|
- // }
|
|
|
-
|
|
|
- // if (!PosXrayDBMgr.SaveXray(m_listAnalysisPosXray, true))
|
|
|
- // {
|
|
|
- // log.Info("SaveFieldFiles: save analysis x-ray failed.");
|
|
|
- // return false;
|
|
|
- // }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- // //save the small particle info
|
|
|
- // //CSmallParticleInfoDB smallPartDB = pDBFileMgr.GetSmallParticleInfoDB();
|
|
|
- // //Dictionary<int, List<COTSParticleClr>> mapSmallParts = new Dictionary<int, List<COTSParticleClr>>();
|
|
|
- // //foreach (COTSParticleClr smallP in fldData.ListSmallParticles)
|
|
|
- // //{
|
|
|
- // // if (mapSmallParts.ContainsKey((int)smallP.GetType()))
|
|
|
- // // {
|
|
|
- // // mapSmallParts[(int)smallP.GetType()].Add(smallP);
|
|
|
- // // }
|
|
|
- // // else
|
|
|
- // // {
|
|
|
- // // var plist = new List<COTSParticleClr>();
|
|
|
- // // plist.Add(smallP);
|
|
|
- // // mapSmallParts.Add((int)smallP.GetType(), plist);
|
|
|
-
|
|
|
- // // }
|
|
|
-
|
|
|
- // //}
|
|
|
- // //List<CSmallParticleInfo> smallparts = new List<CSmallParticleInfo>();
|
|
|
-
|
|
|
- // //foreach (KeyValuePair<int, List<COTSParticleClr>> particles in mapSmallParts)
|
|
|
- // //{
|
|
|
- // // CSmallParticleInfo partInfo = new CSmallParticleInfo();
|
|
|
- // // partInfo.FieldId = particles.Value[0].GetFieldId();
|
|
|
- // // partInfo.AveGray = particles.Value[0].GetAveGray();
|
|
|
- // // partInfo.Quantity = (int)(particles.Value.Count / fldData.SmallParticlePercentage);
|
|
|
- // // partInfo.TypeId = particles.Key;
|
|
|
- // // partInfo.TypeColor = particles.Value[0].GetTypeColor();
|
|
|
- // // partInfo.TypeName = particles.Value[0].GetTypeName();
|
|
|
- // // double area = 0;
|
|
|
- // // foreach (var p in particles.Value)
|
|
|
- // // {
|
|
|
- // // area += p.GetActualArea();
|
|
|
- // // }
|
|
|
- // // //partInfo.Area = Convert.ToInt32(area / f.SmallParticlePercentage);
|
|
|
- // // partInfo.Area =(int) area ;
|
|
|
- // // smallparts.Add(partInfo);
|
|
|
- // //}
|
|
|
- // //List<KeyValuePair<string, SQLiteParameter[]>> cmds = new List<KeyValuePair<string, SQLiteParameter[]>>();
|
|
|
- // //foreach (CSmallParticleInfo smallp in smallparts)
|
|
|
- // //{
|
|
|
- // // var cmd= smallPartDB.SaveAKindOfSmallParticle(smallp, new CPosXrayClr(), new System.Drawing.Point(0, 0));
|
|
|
- // // cmds.Add(cmd);
|
|
|
- // //}
|
|
|
-
|
|
|
- // //pDBFileMgr.ExecuteNonQueryBatch(ref cmds);
|
|
|
-
|
|
|
- // return true;
|
|
|
- //}
|
|
|
+
|
|
|
|
|
|
|
|
|
}
|