Issuu on Google+

Институт теоретической и экспериментальной физики Лаборатория атомно­масштабных исследований  конденсированных сред

Модификация  Программной Части  Томографического Атомного Зонда

 

Московский Инженерно­Физический Институт, гр. Т8­60, студент Степанов П.С.   Научный руководитель Алеев А.А.


Томографический Атомно­Зондовый Микроскоп

Физическая часть

 

Испарение одного или нескольких ионов с поверхности образца

Сохранение экспериментальных данных

Система детектирования

Поступление информации в CAMAC

 


Томографический Атомно­Зондовый Микроскоп Tap3D

Математическая часть

Обработка результатов программой Tap 3D

Построение масс­спектра и 3D изображений расположения атомов в образце  

 


Система Детектирования

ион

Система микроканальных пластин. Процесс выбивания электронов из каналов.

ион

сетка

e Система стрипов. Поглощение электронов.

МКП

e

e

Люминофор. Возбуждение центров светимости (­кванты)

e

e

люминофор

стрипы Остановка таймера, запущенного в момент подачи отрывного импульса.  

Матрица камеры регистрирует вспышку и передает ее  координаты в CAMAC  

256 x 256 пкс

камера


Цель УИР Существующие проблемы. Постановка задач. Настоящая работа заключает в себе изучение кода программы Tap3D и  последующая его модификация с учетом особенностей системы детектирования. 

Цель УИР:

Повышение эффективности обработки данных посредством  устранения существующих проблем.

Существующие проблемы:

1

Неравномерное распределение  шума в объеме образца Задача: разобраться в исходном коде  программы Tap3Ddata. Устранить  причину возникновения “шумовых  полос“.

 

 


Существующие проблемы. Постановка задач.

2

Проведено много экспериментов при условии  несоосного положения камеры и системы  стрипов Задача: написать дополнительный модуль к  программе Tap3D, позволяющий программно  определить угол отклонения камеры от  горизонтального положения; развернуть массив  вспышек до горизонтального положения.

 

 


Модификация программной части. Устранение шумовых полос. Программно поменяны местами стрипы с номарами 5 и 6.

Шум

Было опознано

126964 атомов

Стало опознано

Прирост опознанных атомов  

 

1.7%

130023 атомов


Модификация программной части. Разворот камеры. I (x, y)

I (x, y) / Imax

1

2

3 x

y

выа

x

 Процесс построения массива вспышек: 1.     Суммирование интенсивностей всех вспышек 2.     Нормировка максимума на единицу  

3.     Порог со значением 0.05

 

y


Модификация программной части. Разворот камеры. Автоматический режим

 

Ручной режим

 


Модификация программной части. Разворот камеры.

Удалены шумы, возникающие при построении  3D изображения образца

Автоматическое определение границ области  вспышек.

Прирост опознанных атомов

 

 

8.5%


Интерфейс программы Tap 3D Data. Мелкие доработки. 2

1

 

 


Итоги УИР.

1.

Выяснение структуры программы Tap3D Data.

2. Устранение причины возникновения “шумовых” полос на трехмерных  картинах состава образца. Прирост количества опознанных атомов  1.7% 3. Написан дополнительный модуль к программе Tap3DData,  позволяющий  программно разворачивать массив вспышек,  регистрируемый матрицей ПЗС камеры детектора.  Прирост  количества опознанных атомов 8.5% 4. Восстановление математической модели, реализующей рассчет z­ координаты детектируемых частиц. Суммарный прирост опознанных частиц составляет 10%  

 


Вычисление x, y, z­координат. void CTransformDataInAtoms::vCalculateSpace ( WID_DATASET *widBrut , unsigned short uNumberOfAtoms ) { // Environment.fDs ­ Free Flight Length // Init the flight length // Environment.fPref ­ Reflectron Depth fDist = Environment.fDs + 4 * Environment.fPref / Environment.fCref ; // Environment.fCref ­ Reflectron length ratio // Init the parameters fm_vrai = ( Environment.fMvalue ­ 1 ) ; // Environment.fMvalue ­ Position of the projection point widBrut­>fPz = 0 ;  // Init the angles for rotation matrix ro1 = Environment.fAngleForTilt * (float)PI / (float)180. ; // = 0 Environment.fAngleForTilt ­ Angle for tilt psi1 = Environment.fAngleForRotation * (float)PI / (float)180. ; // = 0 Environment.fAngleForRotation ­ Angle for rotationon AM = ­1 * (float)( ( sin ( (double)psi1 ) * sin ( (double)psi1 ) ) + 1 ) / (float)( cos ( (double)psi1 ) ) ; // ­1 BM = (float)( sin ( (double)ro1 ) * sin ( (double)psi1 ) ) ; // 0 CM = (float)( cos ( (double)ro1 ) * sin ( (double)psi1 ) ) ; // 0 DM = 0 ; // 0 EM = (float)( cos ( (double)ro1 ) ) ; // 1 FM = (float)( ­ sin ( (double)ro1 ) ) ; // 0 GM = (float)( ­ sin ( (double)psi1 ) ) ; // 0 HM = (float)( sin ( (double)ro1 ) * cos ( (double)psi1 ) ) ; // 0 IM = (float)( cos ( (double)ro1 ) * cos ( (double)psi1 ) ) ; // 0 // Treat the current atoms for ( i = 0 ; i < uNumberOfAtoms ; i ++ ){ // Area of the detector in the tip reference px = ( widBrut + i )­>fDx * (float)1e­2 ;  //  = fDx/100 py = ( widBrut + i )­>fDy * (float)1e­2 ;  //  = fDy/100 pz = fDist ; PX = AM * px + BM * py + CM * pz ; //  = ­px = ­fDx/100 PY = DM * px + EM * py + FM * pz ;  //  = +py = +fDy/100 PZ = GM * px + HM * py + IM * pz ; //  = 0 // Angle from the tip fteta = (float)atan2 ( sqrt ( (double)( PX * PX ) + (double)( PY * PY ) ) , (double)PZ ) ; // = pi/2 ffi   = (float)atan2 ( (double)PY , (double)PX ) ; // = fi // Vdc and Vp for the atom fPot = ( ( widBrut + i )­>fDc + ( widBrut + i )­>fVp ) * (float)1000. ; // Angle for the stereographic projection fteta = fteta + (float)asin ( (double)fm_vrai * sin( (double)fteta ) ) ; ffi = ffi ; // calculate x , y and z PX = fPot / Environment.fEbeta * (float)( sin ( (double)fteta ) ) * (float)( cos ( (double)ffi ) ) ; // coefficient for EB PY = fPot / Environment.fEbeta * (float)( sin ( (double)fteta ) ) * (float)( sin ( (double)ffi ) ) ;  // coefficient for EB PZ = fPot / Environment.fEbeta * ( 1 ­ (float)cos ( (double)fteta ) ) ; // = fPot / Environment.fEbeta ( widBrut + i )­>fPx = PX ; ( widBrut + i )­>fPy = PY ;     ( widBrut + i )­>fPz = PZ ; } vCalculateZDepth ( widBrut , uNumberOfAtoms ) ; }


Вычисление z­координаты.

void CTransformDataInAtoms::vCalculateZDepth ( WID_DATASET *widBrut , unsigned short uNumberOfAtoms ) { int i , j ; float mv , mem_mv ; float kp ; for ( i = 0 ; i < uNumberOfAtoms ; i ++ ) { // Find the atomic volume for ( j = 0 , kp = 0 ; j < Environment.iNbItv ; j ++ ) if ( ( widBrut+ i )­>fMs >= Environment.fLowLimit[ j ] && ( widBrut+ i )­>fMs < Environment.fHighLimit[ j ] ) { kp = Environment.fAtomicVolume[ j ] ; if ( kp == 0 ) iIsElt[ i ] = Environment.iNbElt ; break ; } kp *= Environment.fEbeta * Environment.fEbeta / ( ftetaDP * ftetaDP * Environment.fRend ) ; iTout ++ ; // The atom is an element if ( iIsElt[ i ] < Environment.iNbElt ) { iAtome ++ ; mv = mem_mv = ( widBrut­>fDc + widBrut­>fVp ) * (float)1000. ; iCount ++ ; fPot = fCalculateAverage ( mv , fMean , iCount ) ; fMean = fPot ; mv = kp * iCount / ( fPot * fPot ) ; ( widBrut + i )­>fPz = ( widBrut + i )­>fPz + mv + fAccumule ; if ( mv >= 1. ) { fAccumule = fAccumule + mv ; fMean = 0. ; iCount = 0 ; } }

  }

// The atom is a noise else { ( widBrut + i )­>fPz = ( widBrut + i )­>fPz + fAccumule ; } }

 


Структура *.eco файла.

// "ECOTAP_MOSCOU_01__________________"

for ( i = 0 ; i < Event.uNumberOfTof ; i ++ ) { fread ( &fTofValue , sizeof(float) , 1 , pfFileIn ) ; fread ( &uChargeValue , sizeof(unsigned short) , 1 , pfFileIn ) ; fread ( &uStripValue , sizeof(unsigned short) , 1 , pfFileIn ) ; } // Spots fread ( &Event.uNumberOfSpot , sizeof(unsigned short) , 1 , pfFileIn ) ; for ( i = 0 , j = 0 ; i < Event.uNumberOfSpot ; i ++ ) { fread ( &Event.uFirstPixelInSpot[ j ] , sizeof(unsigned short) , 1 , pfFileIn ) ; fread ( &Event.uLastPixelInSpot[ j ] , sizeof(unsigned short) , 1 , pfFileIn ) ; fread ( &Event.uNumberOfPixelInSpot[ j ] , sizeof(unsigned short) , 1 , pfFileIn ) ; fread ( &Event.uLightLevelInSpot[ j ] , sizeof(unsigned short) , 1 , pfFileIn ) ; } // End of Event fread ( &fEndOfEvent , sizeof(float) , 1 , pfFileIn ) ; if ( fEndOfEvent != ­9999 ) iReturnValue = FALSE ;

}  while ( iTest != END_OF_THE_FILE ) ;

 

if ( strcmp ( sIndentificationOfTheFile , "ECOTAP_MOSCOU_01__________________" ) == 0 ) {

// Tofs / Charges / Strips fread ( &Event.uNumberOfTof , sizeof(unsigned short) , 1 , pfFileIn ) ;

iTypeOfTransformation = ECOTAP_TRANSFORMATION ; iTypeOfAtomProbe = ECOTAP_MOSCOU_01 ; return TRUE ;

// Voltage values fread ( &Event.fVdcValue , sizeof(float) , 1 , pfFileIn ) ; fread ( &Event.fVpValue , sizeof(float) , 1 , pfFileIn ) ; fread ( &Event.fVrefValue , sizeof(float) , 1 , pfFileIn ) ;

}

// Identification of the type for the input data file fread ( sIndentificationOfTheFile , sizeof( char ) , 34 , pfFileIn ) ; do { // Number of null iTest = fread ( &Event.iNumberOfNull , sizeof(int) , 1 , pfFileIn ) ; if ( iTest == 0 ) return END_OF_THE_FILE ;


Структура *.ato файла.

// Definition of the structure WID_DATASET typedef struct                         {    float fPx ; void CTransformDataInAtoms::vCalculateSpace ( WID_DATASET *widBrut , unsigned short uNumberOfAtoms )    float fPy ; void CTransformDataInAtoms::vCalculateZDepth ( WID_DATASET *widBrut , unsigned short uNumberOfAtoms )    float fPz ;    float fMs ;             float fTof ; // ( Spot[ i ].fTofMeasured + Environment.fT0 ) / 1000    float fDc ; // Event.fVrefValue    float fVp ; // Event.fVpValue    float fDx ; // 8*(Spot[i].fXPosition­(float)Environment.iCCDXMin)/(float)(Environment.iCCDXMax­Environment.iCCDXMin)­4    float fDy ; //­8*(Spot[i].fYPosition­(float)Environment.iCCDYMin)/(float)(Environment.iCCDYMax­Environment.iCCDYMin)+4             int iQt ; // (int)( Spot[ i ].uChargeMeasured )    int iNbPulses ; // iTotalNumberOfPulse             unsigned short uwNumSt ; // Spot[ i ].uStripOfCenter    unsigned short uwNumCk ; // i (0; Event.unumberOfSpot)             QBOX udBox ; // widSol[ i ].udBox.uLeft = 256 * Spot[ i ].uTop + Spot[ i ].uLeft ;          // widSol[ i ].udBox.uRight = 256 * Spot[ i ].uBottom + Spot[ i ].uRight ; } WID_DATASET ; // widSol[ i ].udBox.uTop = Spot[ i ].uNumberOfPixel ; // widSol[ i ].udBox.uBottom = Spot[ i ].uLightLevel ;

fwrite ( widSol , sizeof( WID_DATASET ) , Event.uNumberOfSpot , pfFileOut ) ; fAlphaAngle = 8 ­ widSol­>fDx; fAlphaAngle = fAlphaAngle * (float)PI / 180 ; fAngleFactor = (float) cos ( (double)fAlphaAngle ) ; // Length factor fLengthFactor = Environment.fDs / fAngleFactor ; fLengthFactor += 4 * Environment.fPref * fAngleFactor / Environment.fCref ; fLengthFactor += 2 * Environment.fDa / ( fAngleFactor * ( 1 + (float) sqrt ( (double)( 1 + Environment.fVmcpin * Environment.fCref / widSol­>fDc ) ) ) ) ; // Mass widSol­>fMs = (float)0.192973 * ( widSol­>fDc / Environment.fCref ) * widSol­>fTof * widSol­>fTof / ( fLengthFactor * fLengthFactor ) ;

 

widSol­>fMs =  199 ;

 

// Spot and tof are not associated

if ( Spot[ i ].uState != TRUE )


UIR