| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426 | #include "stdafx.h"#include "OTSEDSSim.h"#include "OTSImageProcess.h"namespace OTSController {	using namespace OTSIMGPROC;	COTSEDSSim::COTSEDSSim()	{		m_bDoQuantification = FALSE;	}	COTSEDSSim::~COTSEDSSim()	{	}	//void COTSEDSSim::FinishedInstance()	//{	//	return;	//}	// initialization	BOOL COTSEDSSim::Init()	{		// simulation, never be wrong		return TRUE;			}		// collect spectrum at the given position (to controller buffer)	BOOL COTSEDSSim::CollectSpectrum(DWORD a_nMilliseconds, const CPoint& a_oPoint)	{		// read simulation spectrum into buffer		memset(m_nRayData, 0, sizeof(DWORD) * (long)EDSConst::XANA_CHANNELS);		if (!CollectASpectrumFromTxtFile(m_nRayData, (DWORD)EDSConst::XANA_CHANNELS))		{			// failed to call CollectASpectrumFromTxtFile method			LogTrace(__FILE__, __LINE__, _T("COTSEDSSim::CollectSpectrum: failed to call CollectASpectrumFromTxtFile method."));		}		// always return TRUE		return TRUE;		}	// collects spectrum (to controller buffer)	BOOL COTSEDSSim::CollectSpectrum(DWORD a_nMilliseconds)	{				// read simulation spectrum into buffer		memset(m_nRayData, 0, sizeof(DWORD) * (long)EDSConst::XANA_CHANNELS);		if (!CollectASpectrumFromTxtFile(m_nRayData, (DWORD)EDSConst::XANA_CHANNELS))		{			// failed to call CollectASpectrumFromTxtFile method			LogTrace(__FILE__, __LINE__, _T("COTSEDSSim::CollectSpectrum: failed to call CollectASpectrumFromTxtFile method."));		}		// always return TRUE		return TRUE;			}	// collects spectrum (to given buffer)	BOOL COTSEDSSim::CollectSpectrum(DWORD a_nMilliseconds, long* a_pCounts, DWORD a_nBufferSize)	{		// input check		ASSERT(a_pCounts);		if (!a_pCounts)		{			// invalid input data buffer			LogTrace(__FILE__, __LINE__, _T("COTSEDSSim::CollectSpectrum: invalid input data buffer."));			return FALSE;		}		// read simulation spectrum into buffer		memset(a_pCounts, 0, sizeof(long) * (long)a_nBufferSize);		if (!CollectASpectrumFromTxtFile((DWORD*)a_pCounts, a_nBufferSize))		{			// failed to call CollectASpectrumFromTxtFile method			LogTrace(__FILE__, __LINE__, _T("COTSEDSSim::CollectSpectrum: failed to call CollectASpectrumFromTxtFile method."));		}		// always return TRUE		return TRUE;			}	BOOL COTSEDSSim::StopXrayAcquistion()	{		return true;	}	// get live time	float COTSEDSSim::GetLiveTime()	{		// is simulation?		return (float)0.1;			}	BOOL  COTSEDSSim::IsSupportQuantification()	{		return TRUE;			}	BOOL  COTSEDSSim::GetQuantificationMethods(std::vector<CString>& a_vMethods)	{		return TRUE;	}	BOOL  COTSEDSSim::QuantifyXrayPoint(CPosXray* a_pXRayPoint, LPCTSTR a_sMethodName)	{		return TRUE;			}	BOOL  COTSEDSSim::QuantifySpectrumFile(LPCTSTR a_sFilePathName, LPCTSTR a_sMethodName, CElementChemistriesList& a_listElementChemistry)	{		return TRUE;			}	BOOL COTSEDSSim::QuantifySpectrumOut(DWORD a_nMilliseconds, long* a_pCounts, DWORD a_nBufferSize, CElementChemistriesList& a_listElementChemistry)	{		return TRUE;	}	BOOL COTSEDSSim::GetXRayByPoints(std::vector<CPosXrayPtr>& a_vXRayPoints, const DWORD a_nXRayAQTime)	{		// read simulation spectrum into buffer		memset(m_nRayData, 0, sizeof(DWORD) * (long)EDSConst::XANA_CHANNELS);		if (!CollectASpectrumFromTxtFile(m_nRayData, (DWORD)EDSConst::XANA_CHANNELS))		{			// failed to call CollectASpectrumFromTxtFile method			LogTrace(__FILE__, __LINE__, _T("COTSEDSSim::GetXRayByPoints: failed to call CollectASpectrumFromTxtFile method."));		}		int icount = 0;		for (auto pXrayPoi : a_vXRayPoints)		{			std::vector<CString> eleList;			for each (CElementChemistryPtr var in pXrayPoi->GetElementQuantifyData())			{				eleList.push_back(var->GetName());			}			bool isFilter = true;			if (eleList.size() != 0)			{				isFilter = COTSImageProcess::FindPeaks(m_nRayData, eleList);			}			pXrayPoi->SetXrayData(m_nRayData);			CString sResult = "";			CElementChemistriesList listElementQuantifyData;			CElementPtr pElement = CElementPtr(new CElement());			if (m_bDoQuantification && isFilter)			{				switch (icount % 7)				{				case 0://MnS					sResult = _T("Quant=Al,K-Serie,19\nQuant=O,L-Serie,39\nQuant=Ca,L-Serie,20");					listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);					pXrayPoi->SetElementQuantifyData(listElementQuantifyData);					break;				case 1://FeO					sResult = _T("Quant=O,K-Serie,4.84\nQuant=Al,L-Serie,1.47\nQuant=S,L-Serie,1.6\nQuant=Si,L-Serie,2.42\nQuant=Mn,L-Serie,2.97\nQuant=Fe,L-Serie,80.361");					listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);					pXrayPoi->SetElementQuantifyData(listElementQuantifyData);					break;				case 3://Sulfide					sResult = _T("Quant=C,K-Serie,1.057\nQuant=S,L-Serie,2.177\nQuant=Fe,L-Serie,84.592");					listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);					pXrayPoi->SetElementQuantifyData(listElementQuantifyData);					break;				case 4://Silicate					sResult = _T("Quant=O,K-Serie,9.75\nQuant=Al,L-Serie,1.08\nQuant=Si,L-Serie,5.261\nQuant=Mn,L-Serie,11.204\nQuant=Fe,L-Serie,50.403");					listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);					pXrayPoi->SetElementQuantifyData(listElementQuantifyData);					break;				case 5://SiO2					sResult = _T("Quant=C,K-Serie,12.563\nQuant=O,L-Serie,1.906\nQuant=Si,L-Serie,26.126\nQuant=Fe,L-Serie,54.61");					listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);					pXrayPoi->SetElementQuantifyData(listElementQuantifyData);					break;				case 6://AlO2					sResult = _T("Quant=Al,K-Serie,40\nQuant=O,L-Serie,40\nQuant=Fe,L-Serie,20");					listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);					pXrayPoi->SetElementQuantifyData(listElementQuantifyData);					break;				//case 7:				//	sResult = _T("Quant=Al,K-Serie,1\nQuant=O,L-Serie,2\nQuant=Fe,L-Serie,2");				//	listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);				//	pXrayPoi->SetElementQuantifyData(listElementQuantifyData);				//	break;				//case 8:				//	sResult = _T("Quant=Fe,K-Serie,10\nQuant=C,L-Serie,30\nQuant=F,L-Serie,25");				//	listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);				//	pXrayPoi->SetElementQuantifyData(listElementQuantifyData);				//	break;				//case 9:				//	sResult = _T("Quant=O,K-Serie,40\nQuant=Si,L-Serie,40\nQuant=C,L-Serie,1");				//	listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);				//	pXrayPoi->SetElementQuantifyData(listElementQuantifyData);				//	break;				default://Not Identified					sResult = _T("Quant=C,K-Serie,7.992\nQuant=Si,L-Serie,15.969\nQuant=Fe,L-Serie,69.805");					listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);					pXrayPoi->SetElementQuantifyData(listElementQuantifyData);					break;				}				icount++;			}		}			Sleep(500);		// always return TRUE		return TRUE;					}	BOOL COTSEDSSim::GetXRayByFeatures(std::vector<CPosXrayPtr>& a_listXRayPoints,		std::vector<BrukerFeature>& a_vFeatures,		const DWORD a_nXRayAQTime)	{		// read simulation spectrum into buffer		memset(m_nRayData, 0, sizeof(DWORD) * (long)EDSConst::XANA_CHANNELS);		if (!CollectASpectrumFromTxtFile(m_nRayData, (DWORD)EDSConst::XANA_CHANNELS))		{			// failed to call CollectASpectrumFromTxtFile method			LogTrace(__FILE__, __LINE__, _T("COTSEDSSim::GetXRayByFeatures: failed to call CollectASpectrumFromTxtFile method."));		}		int icount = 0;		for (auto pXrayPoi : a_listXRayPoints)		{			pXrayPoi->SetXrayData(m_nRayData);			if (m_bDoQuantification)			{				CString sResult = "";				CElementChemistriesList listElementQuantifyData;				//CString sResult = _T("Quant=O,K-Serie,28.5\nQuant=Al,L-Serie,26.4\nQuant=S,L-Serie,1.6\nQuant=Ca,L-Serie,15.8\nQuant=Fe,L-Serie,9.5");				//CString sResult = _T("Quant=O,K-Serie,28.5\nQuant=Fe,L-Serie,49.5");				CElementPtr pElement = CElementPtr(new CElement());				//listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);				switch (icount % 7)				{				case 0://MnS					sResult = _T("Quant=O,K-Serie,28.5\nQuant=S,L-Serie,10\nQuant=Mn,L-Serie,20\nQuant=Fe,L-Serie,9.5");					listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);					pXrayPoi->SetElementQuantifyData(listElementQuantifyData);					break;				case 1://FeO					sResult = _T("Quant=O,K-Serie,4.84\nQuant=Al,L-Serie,1.47\nQuant=S,L-Serie,1.6\nQuant=Si,L-Serie,2.42\nQuant=Mn,L-Serie,2.97\nQuant=Fe,L-Serie,80.361");					listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);					pXrayPoi->SetElementQuantifyData(listElementQuantifyData);					break;				case 3://Sulfide					sResult = _T("Quant=C,K-Serie,1.057\nQuant=S,L-Serie,2.177\nQuant=Fe,L-Serie,84.592");					listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);					pXrayPoi->SetElementQuantifyData(listElementQuantifyData);					break;				case 4://Silicate					sResult = _T("Quant=O,K-Serie,9.75\nQuant=Al,L-Serie,1.08\nQuant=Si,L-Serie,5.261\nQuant=Mn,L-Serie,11.204\nQuant=Fe,L-Serie,50.403");					listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);					pXrayPoi->SetElementQuantifyData(listElementQuantifyData);					break;				case 5://SiO2					sResult = _T("Quant=C,K-Serie,12.563\nQuant=O,L-Serie,1.906\nQuant=Si,L-Serie,26.126\nQuant=Fe,L-Serie,54.61");					listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);					pXrayPoi->SetElementQuantifyData(listElementQuantifyData);					break;				case 6://AlO2					sResult = _T("Quant=Al,K-Serie,40\nQuant=O,L-Serie,40\nQuant=Fe,L-Serie,20");					listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);					pXrayPoi->SetElementQuantifyData(listElementQuantifyData);					break;				//case 7:				//	sResult = _T("Quant=Al,K-Serie,1\nQuant=O,L-Serie,2\nQuant=Fe,L-Serie,2");				//	listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);				//	pXrayPoi->SetElementQuantifyData(listElementQuantifyData);				//	break;				//case 8:				//	sResult = _T("Quant=Fe,K-Serie,10\nQuant=C,L-Serie,30\nQuant=F,L-Serie,25");				//	listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);				//	pXrayPoi->SetElementQuantifyData(listElementQuantifyData);				//	break;				//case 9:				//	sResult = _T("Quant=O,K-Serie,40\nQuant=Si,L-Serie,40\nQuant=C,L-Serie,1");				//	listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);				//	pXrayPoi->SetElementQuantifyData(listElementQuantifyData);				//	break;				default://Not Identified					sResult = _T("Quant=C,K-Serie,7.992\nQuant=Si,L-Serie,15.969\nQuant=Fe,L-Serie,69.805");					listElementQuantifyData = pElement->ExtractElementChemistrys(sResult);					pXrayPoi->SetElementQuantifyData(listElementQuantifyData);					break;				}				icount++;			}		}		// always return TRUE		return TRUE;			}	//BOOL COTSEDSSim::GetXRayByFeaturesFromMultiPoint(std::vector<CPosXrayPtr>& a_listXRayPoints,	//	std::vector<std::vector<BrukerSegment>>& a_listFeatures,	//	const DWORD a_nXRayAQTime)	//{	//	int nPointNum = 0;	//	for (auto pFeature: a_listFeatures)	//	{	//		std::vector<CPosXrayPtr> listXRayPoints;	//		std::vector<BrukerSegment> listSegment = pFeature;	//		int nSize = listSegment.size();	//		for (int i = 0; i < nSize -2; i= i+2)	//		{	//			BrukerSegment pSegment = listSegment[i];	//			int nLength = pSegment.XCount;	//			int nStart = pSegment.XStart;	//			CPoint pt;	//			pt.x = nStart;	//			pt.y = nStart + nLength / 2 ;	//			CPosXrayPtr pXray = CPosXrayPtr(new CPosXray());	//			pXray->SetPosition(pt);	//			listXRayPoints.push_back(pXray);	//		}	//		if (!GetXRayByPoints(listXRayPoints, a_nXRayAQTime))	//		{	//			LogErrorTrace(__FILE__, __LINE__, _T("GetXRayByFeaturesFromMultiPoint: Can't get xray from points."));	//			return FALSE;	//		}	//		int nNum = 0;	//		DWORD XRayData[GENERALXRAYCHANNELS];	//		memset(XRayData, 0, sizeof(DWORD) *GENERALXRAYCHANNELS);	//		for (auto pXRayPoint : listXRayPoints)	//		{			//				//			DWORD* pXRayData;	//			pXRayData = pXRayPoint->GetXrayData();	//				//			for (int m = 0; m < GENERALXRAYCHANNELS; m++)	//			{	//				XRayData[m] += pXRayData[m];	//			}	//			nNum++;	//		}	//		if (nNum == 0)	//		{	//			LogErrorTrace(__FILE__, __LINE__, _T("GetXRayByFeaturesFromMultiPoint:there is points."));	//			return FALSE;	//		}	//		for (int k = 0; k < GENERALXRAYCHANNELS; k++)	//		{	//			XRayData[k] = (int)((double)XRayData[k]/(double)nNum + 0.5);	//		}	//		CPosXrayPtr pXrayPoint = CPosXrayPtr(new CPosXray());	//		a_listXRayPoints[nPointNum]->SetXrayData(XRayData);	//		nPointNum++;	//	}	//		//	// always return TRUE	//	return TRUE;	//}	void COTSEDSSim::SetQuantification(BOOL a_bQuantification)	{		m_bDoQuantification = a_bQuantification;		return;	}	BOOL COTSEDSSim::GetQuantification()	{		return TRUE;	}	// Get number of channels	DWORD COTSEDSSim::GetNumberOfChannels(void)	{		return (DWORD)2000;	}	// Get the x-Ray data	DWORD* COTSEDSSim::GetXRayData()	{		return m_nRayData;	}	}
 |