unit BrainMap; Описание объектов TVoxel, TCenter, TLead, TBrainMap, TLeadsMap, TBCNNMap - реализующих сеть BCNN на карте реального мозга

Некоторые типы данных и массивы описаны в файле BrainMapData

  TCenterType = (ctLobe,ctStructure,ctBrArea,ctCluster,ctVoxel,ctSome); -Тип мозгового центра (по масштабу)

 


  TDrawingType = (dtActivationT0,dtActivationT1,dtSigmaT0,dtSigmaT1);   - Тип прорисовывания Воксела цветом на карте мозга


  TVoxelCoord = record - 3D Координаты Вокселя иле Электрода
    X:Single;
    Y:Single;
    Z:Single;
  end;

  TBrainRects = array[TPlane] of TRect; - Массив участков Канвы любого компонента для трех плоскостей (TPlane=(plFrontal,plSagital,plHorizontal); //Виды сечений описаны в файле BrainMapData.pas)

  TParVox = record - Параметры вокселя (номер - Ind и среднее расстояние от центра всех вокселов - Large)
    Ind:Integer;
    Large:Single;
  end;

  TLeadSet = set of TLeads; -  Структурный тип - cписок отведений тип TLeads

Тип TLeads - Отведение (описан в файле BrainMapData)

TLeads = (Fp1, Fpz, Fp2, Nz, SO1, SO2, IO1, IO2, AF9, AF7, AF5, AF3, AF1, AFz, AF2, AF4, AF6, AF8, AF10, F9, F7, F5, F3, F1, Fz,
F2, F4, F6, F8, F10, FT9, FT7, FC5, FC3, FC1, FCz, FC2, FC4, FC6, FT8, FT10, T9, T7_T3,  C5, C3, C1, Cz, C2, C4,
C6, T8_T4, T10, TP9, TP7, CP5, CP3, CP1, CPz, CP2, CP4, CP6, TP8, TP10, P9, P7_T5, P5, P3, P1, Pz, P2, P4, P6, P8_T6, P10, PO9, PO7, PO5, PO3, PO1, POz, PO2, PO4, PO6, PO8, PO10, O1, Oz, O2, O9, O10, CB1, CB2, Iz, M1, M2, A1, A2,
T1, T2, Unq);


//Объект Воксель на карте мозга
  TVoxel=class(TObject)  

    constructor Create(); - Создать объект
    function Resist(X,Y,Z:Single):Double ;overload; - Получить сопротивление до точки 
    function Resist(Coord:TVoxelCoord):Double ;overload; - Получить сопротивление до точки заданной структурой TVoxelCoord
    procedure DrawPlane(Plane:TPlane; Level:Integer); ///Нарисовать Воксел на сечении TPlane Разрез мозга уровня Level (если он присутствует в сечении)
    procedure Draw3D() ; ///Нарисовать воксел на 3х срезах мозга в 3х плоскостях

    property Num:Integer - Номер Воксела по порядку  в карте (Координаты вокселов, то к какис долям, структурам и полям мозга они относятся даны в массивах описанных в BrainMapData.pas)

    property X:Single; - координата воксела по горизонтали во фронтальной и горизонтальной плоскости
    property Y:Single;  - координата воксела по горизонтали в сагиттальной плоскости и по вертикали в горизонтальной плоскости
    property Z:Single ; - координата воксела по вертикали во фронтальной и сагиттальной плоскости

    property Coord:TVoxelCoord ; - координаты воксела


    property Activation:Double ;  - электрический потенциал воксела (соответствует потенциалу центра к которому он принадлежит
    property Repainting:Boolean ; - флаг прорисовывания воксела при активации центра


    property Lobe:TBrainLobes ;  - Доля мозга к которой относится Воксел из структуры TBrainLobes описанной в файле BrainMapData.pas
    property LobeName:String ;   - Название доли мозга к которой относится Воксел

    property BrainStructure:TBrainStructures ; - Структура мозга к которой относится Воксел из структуры TBrainStructures описанной в файле BrainMapData.pas 
    property StructureName:String ; - Название структуры мозга к которой относится Воксел

    property BrodmanArea:TBrodmanAreas ; - Поле по атласу Бродмана к которой относится Воксел из структуры TBrodmanAreas описанной в файле BrainMapData.pas
    property BrodmanAreaName:String ; - Название поля по Бродману к которой относится Воксел   

    property Cluster[NumCluster:Integer]:Integer ; - Номер кластера (центра), к которому относится Воксел NumCluster - общее количество кластеров в модели - варианты: 30 кластеров, 39 кластеров, 55 кластеров 

    property ROI:Boolean; - Зарезервировано

 

////////////////////////////// Объект Отведение
  TLead = class(TObject)

      function Resist(X,Y,Z:Single):Double ;overload;  - Получить сопротивление до точки с координатами XYZ
      function Resist(Coord:TVoxelCoord):Double ;overload; - Получить сопротивление до Воксела

      property Coord:TVoxelCoord ; - Координаты отведения
      property Num:Integer ; - Номер отведения в списке
      property X:Single ; - X - Координата электрода   см координаты воксела ...
      property Y:Single;   -  Y - Координата электрода   см координаты воксела ... 
      property Z:Single;    -  Y - Координата электрода   см координаты воксела ... 
      property Name:String ; - Название отведения
      property InputValue:Single ; - Входной потенциал на электроде
      property OutputValue:Single ; - Спрогнозированный потенциал на электроде после активации сети 
      property TargetValue:Single ; - Целевой потенциал на электроде после загрузки целевых значений при обучении

  ///////////////////////////////////////

Список Отведений используемых в модели
  TLeadsMap = class(TObjectList<TLead>) 
      constructor Create(Owner:TBCNNMap;LeadList: array of TLeads); - Создать список Owner - Модель BCNNMap к которой принадлежит список, LeadList - Динамисеский массив элементов TLeads список отведений
      function AddLead(Lead:TLeads):TLead;   - Добавить отведение в список
      procedure LoadList(LeadList: array of TLeads); - Загрузить список отведений из массива LeadList
      property LeadList:TLeadSet read fLeadList; -  Структурный тип содержащий все отведения
      property Input[Lead:TLeads]:Single; - Значение начального потенциала на электроде Lead
      property Output[Lead:TLeads]:Single ; - Спрогнозированный потенциал на электроде Lead после активации сети  
      property Sigma[Lead:TLeads]:Single ; - Ошибка прогноза на электроде Lead в процессе обучения 

  ///////////////////////////////////////

Объект Карта Вокселов - список всех вокселов на карте

  TBrainMap = class(TObjectList<TVoxel>)
      constructor Create(Owner:TBCNNMap); - Создать список вокселов принадлежащий модели Owner
      function Point2Coord(point:TPoint):TVoxelCoord ; - преобразовать точку на срезе карты в координаты воксела
      function Point2Target(point:TPoint):TVoxelCoord; - преобразовать точку на срезе карты в координаты воксела и сделать его центральным 
      procedure Draw(Plane:TPlane;Level:Integer); -  нарисовать срез мозга в плоскости Plane и на уровне Level 
      procedure Draw3D ; - нарисовать срезы 3х плоскостей содержащих точку TargetVoxel
      procedure SetCanvas(Value:TCanvas); - Установить канву компонента для рисования срезов мозга
      function Search(X,Y,Z:Single):TVoxel;  - Найти воксел ближайший к координатам X,Y,Z
      function GetRes(X,Y,Z:Single):TArray1D;overload; - Получить сопротивление
      function GetRes(Coord:TVoxelCoord):TArray1D;overload ; -  Получить массив сопротивлений от каждого воксела до точки X,Y,Z
      function GetDists:TArray2D ; - Получить матрицу расстояний между всеми вокселами;

      property BrainRect[Index:TPlane]:TRect ; - Массив прямоугольных областей TRect для всех 3х сечений мозга
      property ScaleRect:TRect ; - Прямоугольная область для отображения шкалы цветовой температуры отражающей потенциал воксела
      property TargetVoxel:TVoxelCoord; -  Центральный воксел, отображаемый на всех 3 сечениях мозга 
      property Repainting:Boolean ; - Флаг интерактивной отображения активации вокселов на карте мозга в процессе активации нейросети 
      property ColorGrad:Double ; - Коэффициент преобразующий потенциал мозга в цветовую температуру. По умолчанию 0.5

Объект - Список вокселов соответствующих одному центру мозга

  TBrainCenter = class(TObjectList<TVoxel>)

      constructor Create(Owner:TBrainCentersList;CenterType:TCenterType;CenterVoxel:TVoxel); - Создать список центров Owner - Сеть BCNNMap владелец, CenterType - Тип списка (ctLobe - Доли мозга, ctStructure - Структуры мозга, ctBrArea - поля по Бродману, ctCluster  - Кластеры вокселов имеющих сходные матрицы сопротивлений до 29 электродов в системе 10-10%), ctSome - отдельные вокселы выбранные по порядку), CenterVoxel - Воксел, находящийся ближе к геометрическому центру группы вокселов, относящихся к этому центру и имеющий максимально подобную всем вокселам матрицу связей с центрами
      procedure Draw;  Нарисовать активации центров и вокселов к ним примыкающих на карте мозга


      property Num:Integer; - Номер центра
      property CenterType:TCenterType read fType write fType; - Тип Центра -  (ctLobe - Доли мозга, ctStructure - Структуры мозга, ctBrArea - поля по Бродману, ctCluster  - Кластеры вокселов имеющих сходные матрицы сопротивлений до 29 электродов в системе 10-10%), ctSome - отдельные вокселы выбранные по порядку), 
      property CenterVox:TVoxel; - Воксел, являющийся геометрическим центром всех вокселов данной группы вокселов
      property NeuronT0:TNeuron; - Нейрон, соответствующий данному центру в момент Ti
      property NeuronT1:TNeuron;  - Нейрон, соответствующий данному центру в момент Ti+1

      property DrawingType:TDrawingType; - Тип отображения цветом активации центра - TDrawingType см. выше

 

Объект - Список центров мозга

  TBrainCentersList = class(TObjectList<TBrainCenter>)
      constructor Create(Owner:TBCNNMap;CRType:TCenterType;CenterCount:Integer);  - Создать список центров Owner - сеть BCNNMap владелец, CRType - Тип центров TCenterType см. выше, CenterCount - Количество центров (необходимо для ctCluster или ctSome, для остальных не имеет значения)

      function GetActivationsT0:TArray1D; - Получить матрицу активаций центров соответствующую электрическим потенциалам в момент Ti 
      function GetActivationsT1:TArray1D; Получить матрицу активаций центров соответствующую электрическим потенциалам в момент Ti+1 
      function GetSigmasT0:TArray1D; -Получить матрицу долей ошибки детерминированных центрами на выходе нейросети в момент Ti 

      function GetSigmasT1:TArray1D; -Получить матрицу долей ошибки детерминированных центрами на выходе нейросети в момент Ti+1 
 
Объект - Нейросеть TBCNN (Описанная в BCNNLib.pas) содержащий также список электродов Leads:TLeadsMap, список центров Centers:TBrainCentersList, список вокселов BrainMap:TBrainMap 
  TBCNNMap = class(TBCNN)
 
      constructor Create(Owner:TComponent;Electrodes:array of TLeads;CenterType:TCenterType;CenterCount:Integer;InvMatr:Boolean); - Создать сеть BCNNMap с владельцем Owner, списком электродов - динамическим массивом элементов TLeads - Electrodes, имеющем тип центров TCenterType см. выше, количеством центров CenterCount, Типом обратной матрицы на входе InvMatr True - псевдообратная, False - обучаемый 3х-слойный перцептрон.

      destructor Free(); - Удалить сеть и освободить память
      procedure SetMontage(Electrodes:array of TLeads); - Установить монтаж (создать новый список TLeadList и новую матрицу связей и нейронов)
      procedure Activate(InputVec:TArray1D);overload; - Активация сети входным массивом - вектором потенциалов на электродах 
      procedure StepContext;  - Пройти еще шаг активируя центры (передать потенциалы центров Ti+1 на центры Ti и активировать слой Ti+1 и выходной слой еще раз)
      procedure SetMap(); - Нарисовать активации на карте
      procedure SaveToXML(FileName:String); - Сохранить сеть в XML файл - FileName
      procedure LoadFromXML(FileName:String); - Загрузить сеть из файла XML - FileName

 

      property Electrodes:TLeadsMap; - Список объектов TLead - электродов см. выше
      property BrainMap:TBrainMap; - Список объектов TVoxel - вокселов  см. выше
      property Leads:TLeadsMap; - Список объектов TLead - электродов см. выше
      property Centers:TBrainCentersList; - Список объектов TBrainCenter - центров мозга см. выше 
      property Lead[Index:TLeads]:TLead; - Получить Объект электрод по Индексу TLeads  см. выше

 

//Общие процедуры

//Получить название Доли мозга  

  function GetLobeText(Lobe:TBrainLobes):String;

//Получить название Структуры мозга  
  function GetStructureText(Structure:TBrainStructures):String; //Название структуры мозга

//Получить название Поя по Бродману мозга  
 function GetBrodmanAreaText(BrodmanArea:TBrodmanAreas):String; //Название Поля по бродману

//Получить дистанцию в Евклидовом пространстве между точками T1 и T2 с координатами TVoxelCoord

 function Dist(T1,T2:TVoxelCoord):Double;
  begin
    Result:=SQRT(Sqr(T1.X-T2.X)+Sqr(T1.Y-T2.Y)+Sqr(T1.Z-T2.Z));
  end;

   //Возвращает номер воксела в массивах который ближе всего к центру доли Dextra True - правое False Левое полушарие
  function GetLobeCenterVox(Lobe:TBrainLobes;Dextra:Boolean):TParVox; 

  //Возвращает номер воксела в массивах который ближе всего к центру структуры Dextra True - правое False Левое полушарие
 
  function GetStrucCenterVox(Structure:TBrainStructures;Dextra:Boolean):TParVox; 

  //Возвращает номер воксела в массивах который ближе всего к центру поля по Бродману Dextra True - правое False Левое полушарие

  function GetBrodmACenterVox(Barea:TBrodmanAreas;Dextra:Boolean):TParVox; 


  //Возвращает номер воксела в массивах который ближе всего к центру Кластера
  //Cluster - номер кластера, ClusterCount  - количество кластеров, VoxClusterList - массив со списком принадлежности вокселов к кластерам описаны в файле BrainMapData
  function GetClusterCenterVox(Cluster:Integer;ClusterCount:Integer;const VoxClusterList:array of Integer):TParVox;