Перейти к содержимому

Root cern как задать массив примеры

  • автор:

Машинное обучение с помощью TMVA (ROOT)

В последние пару лет только и слышно о том, что Python и scikit-learn являются неким золотым стандартом в data science.
Я же хочу рассказать Вам о возможности альтернативного развития в области machine learning, библиотеке написанной на С++.
TMVA (Toolkit for Multivariate Data Analysis with ROOT) — open-source библиотека алгоритмов машинного обучения, которая идёт в дополнение к пакету анализа больших данных ROOT, соответственно устанавливается вместе с ним. Про установку подробно написано в мануале, поэтому мы не будем рассматривать этот момент.
Основным сайтом проекта до недавнего времени считался TMVA, но, как мы видим, на нём уже давненько не было никаких обновлений. Это не повод для скепсиса и паники, т.к. теперь его развитием занимается новая команда церновских разработчиков.
CERN (Европейская организация по ядерным исследованиям) была первопроходцем в создании ПО для анализа больших объёмов данных. Именно там была разработана объектно-ориентированная библиотека ROOT, которая нашла применение не только в мире физики.
В ROOT’е данные хранятся в очень экономичном формате *.root, но можно работать и с любым текстовым форматом. Для простоты используем при работе с TMVA обычный тектовый формат csv/txt.
К сожалению, на данный момент, в TMVA используются только алгоритмы обучения с учителем.

Примеры графиков в TMVA

Так выглядят корреляционные матрицы в TMVA:

Ro-curve выглядит нестандартно:

Итак, представим, что у нас уже установлен ROOT и есть 2 текстовых файла: с «хорошими» и теми, кого нужно классифицировать (либо построить регрессию для прогнозирования). Для того, чтобы подать как инпут эти 2 файла, необходимо привести заголовок файла к необходимому формату:
id/F:Param1/I:Param2/I:Param3/F

Типичный пример входного формата текстового файла

id/F:Param1/I:Param2/I:Param3/F
2,59,1,0
3,85,0,44
4,39,0,78
.

В TMVA 2 типа данных: Float и Integer (в Reader’e только float)
В качестве разделителя переменных по умолчанию идёт знак запятой.
Ознакомиться со списком алгоритмов можно в User Guide

Давайте перейдём к коду.

#include "TMVA/Types.h" #include "TMVA/Factory.h" #include "TMVA/Tools.h" using std::cout; //For Reader std::string outputListFileName; void Model_BDT() < std::cout Start TMVAClassification" >>> Adding variables phase\n"; factory->AddVariable("Param1",'I'); factory->AddVariable("Param2",'I'); factory->AddVariable("Param3",'F'); //Id в моём случае будет просто проверочной переменной factory->AddSpectator("id", 'F'); Double_t sigWeight = 1.0; // overall weight for all signal events Double_t bkgWeight = 1.0; // overall weight for all background events factory->SetInputTrees( sigFile, bkgFile, sigWeight, bkgWeight ); cout >>> Cutting\n"; //Отбираем значения для параметра Param1 и Param3;может пригодиться если данные с каким-то шумом TCut preselectionCut("Param1 > 0. && Param3<350.0"); TCut mycutS = ""; //Можем взять каждое n-ое событие в Background,если данных очень много, а ноутбук не тянет TCut mycutB = "id%100==0"; //Задаём объём тренировочного и тестового дерева factory->PrepareTrainingAndTestTree(mycutS, mycutB, "nTrain_Signal=16000:nTest_Signal=1451:nTrain_Background=800000:nTest_Background=118416:VerboseLevel=Debug"); //Выбираем модель Boosted Decision and Regression Trees, вводим параметры factory->BookMethod(TMVA::Types::kBDT, "BDT", "MaxDepth=5:NTrees=2000:MinNodeSize=9%:PruneStrength=10:SeparationType=GiniIndex"); //Выводим help для метода factory->PrintHelpMessage("BDT"); //тренируем,тестируем и оцениваем модель cout >>> doing TrainAllMethods\n"; factory->TrainAllMethods(); cout >>> doing TestAllMethods\n"; factory->TestAllMethods(); cout >>> doing EvaluateAllMethods\n"; factory->EvaluateAllMethods(); // Save the output outFputFile->Close(); std::cout Wrote root file: " GetName() TMVAClassification is done!"

Запустить макрос можно командой из терминала «root Model_BDT.C».
После того, как всё досчитается, в консоли можно открыть ROOT-браузер, командой «TBrowser b;» и полюбоваться множеством симпатичных графиков.
В следующей статье я хочу рассказать про то, как написать Reader модели, который позволяет применять полученную модель на любых других данных и выгрузить отскоренный массив с определённой отсечкой скор-балла.

Лекция 5. Начало работы с root

Рассмотренный в предыдущих лекциях пакет программ PAW реализован на языке программирования Fortran. PAW хорошо зарекомендовал себя в задачах, типичных для обработки данных ускорительного эксперимента, таких, например, как работа с гистограммами. Тем не менее, все возрастающая сложность экспериментальных установок и увеличение объема накапливаемых данных, требовала освоения научным сообществом новых, более эффективных инструментов обработки информации. Речь идет о языке С++, который к середине 90-х годов стал широко использоваться для создания коммерческих программных продуктов. Принципиальным отличием C++ от Fortran является поддержка объектно-ориентированного программирования (ООП).

Сотрудники Европейской организации ядерных исследований CERN Рене Бран и Фонс Ридмайкерс в 1994 г. занялись исследованием возможностей C++ применительно к задачам ядерного эксперимента. Результатом этой работы явилось создание программного пакета ROOT. К настоящему времени ROOT претерпел впечатляющую эволюцию и стал по сути дела стандартным программным обеспечением, используемым для хранения и обработки данных ускорительного эксперимента, практически вытеснив PAW.

Официальный Web-сайт проекта ROOT расположен по адресу http://root.cern.ch. На этом сайте содержится информация о текущем релизе.

Наилучшим справочным материалом по ROOT является блестяще написанное руководство пользователя, которое доступно по адресу http://root.cern.ch/root/doc/RootDoc.html.

Поскольку ROOT реализован на C++, то необходимо напомнить некоторые понятия этого языка, необходимые для практической работы.

В самом общем виде идея ООП заключается в том, чтобы моделировать окружающий мир как совокупность взаимодействующих объектов. В С++ такой подход реализуется с помощью классов.

Класс является типом данных, определяемым пользователем, и представляет собой модель реального объекта в виде данных и функций для работы с ними. Таким образом, класс — это тип данных, который объединяет переменные и функции. Функции класса называются функциями-членами или методами. Переменные класса называются данными-членами или полями. Принадлежность метода DoSomething классу MyClass обозначается так: MyClass::DoSomething.

Переменная соответствующего типа называется объектом, т.е. объект — это конкретный представитель, экземпляр данного класса.

При работе с объектами часто используются указатели. Указателем называется переменная, в которой хранится адрес памяти, по которому располагается другая переменная. Тип указателя ― указатель на переменную данного типа.

Создание и определение указателя часто осуществляется с помощью операции new:

MyClass *pointer = new MyClass(…);

Здесь с помощью операции new выделяется объем динамической памяти, необходимой для размещения переменной типа MyClass (т. е. объекта) и адрес этого участка памяти записывается в соответствующий указатель ― переменную pointer.

Обращение к методам класса через указатель производится с помощью операции «-­>». Предположим, класс MyClass имеет метод DoSomething(…) (троеточие обозначает возможные параметры и опции этого метода). Тогда обращение к этому методу с помощью указателя pointer выглядит следующим образом:

В случае работы непосредственно с объектом класса MyClass, обращение к методам производится через «.»:

Перейдем теперь собственно к ROOT. Полное название этого программного пакета “An Object Oriented Data Analysis Framework” — объектно-ориентированная среда для анализа данных. ROOT реализован как набор библиотек классов, обеспечивающих необходимую функциональность: гистограммы, функции, графики, деревья и т. д. В рамках настоящего курса будут рассмотрены классы ROOT, обеспечивающие работу с гистограммами, функциями, файлами, графиками, деревьями. Описание классов ROOT для различных версий пакета находится по адресу http://root.cern.ch/root/Reference.html.

Кроме того, в состав ROOT входит интерпретатор CINT, который воспринимает команды ROOT и выражения С/C++.

Существует два варианта работы с ROOT. Первый состоит в том, чтобы работать с программой root.exe в сессионном режиме. Второй вариант заключается во включении библиотек классов ROOT в собственные программы.

ROOT имеет принятые соглашения по наименованию различных типов переменных:

имена классов начинаются с T TF1, TFile

переменные типа «не класс» заканчиваются на _t Int_t

поля начинаются с f fIntegral

методы начинаются с прописной Fill(), Draw()

константы начинаются с k kRed

глобальные переменные начинаются с g gStyle

В ROOT используются предопределенные машинно-независимые типы переменных. К наиболее употребляемым типам относятся:

Char_t знаковый символьный 1 байт

Int_t знаковый целый 4 байта

Float_t вещественный 4 байта

Double_t вещественный 8 байт

Bool_t логический (0 ложь, 1 истина)

Для начала работы в ROOT наберите в командной строке

Эта команда запустит интерактивную сессию работы с ROOT (при условии, что программа установлена и правильно настроены соответствующие переменные окружения).

Для выхода из программы следует набрать

(далее root[] будет означать, что команды вводятся в командной строке ROOT).

Как уже обсуждалось, ROOT имеет встроенный командный интерпретатор CINT. CINT воспринимает три типа команд.

1. Собственно команды CINT начинаются с «.»

.? вывести список всех команд

.L загрузить файл filename

.x загрузить и выполнить файл filename

2. C/C++ выражения в соответствии с синтаксисом языка

3. Команды SHELL начинаются с «.!»

Подобно командному интерпретатору ОС Linux, оболочка ROOT имеет встроенную историю команд, для навигации по которой следует использовать клавиши «вверх» и «вниз».

Приведем пример простейшей сессии работы в ROOT: создания гистограммы, заполнения ее гауссовым распределением и рисования гистограммы.

Сначала создадим объект класса TH1F и указатель h1 на этот объект:

root[] TH1F *h1 = new TH1F(«h1», «Random gauss»,100,-2,2)

Далее с помощью метода FillRandom заполним гистограмму значениями, распределенными по гауссу:

root[] h1->FillRandom(«gaus», 1000)

Обратите внимание на то, что интерпретатор CINT позволяет опускать точки с запятой после команд.

Очевидно, работа в интерактивной сессии может быть полезна для небольших задач, поскольку каждый раз необходимые команды приходится набирать вручную (или отыскивать в истории команд). Для большей функциональности необходимо иметь возможность писать скрипты, т.е. последовательности команд, сохраненные в файле. В ROOT различается два типа скриптов: именованные и неименованные.

Неименованные скрипты представляют собой простую последовательность команд для CINT, заключенную в фигурные скобки. Пусть файл MyMacro.C содержит следующий код:

using namespace std;

Запуск такого скрипта в интерактивной сессии осуществляется командой .x:

root[] .x MyMacro.C

По умолчанию ROOT будет запускать скрипт из текущей директории или из директории $ROOTSYS/macros. В командной строке ROOT можно задать полное имя скрипта, который следует выполнить, например

root[] .x /home/user2/rootscripts/MyMacro.C

Теперь создадим скрипт, содержащий определение функции:

TH1F *h1 = new TH1F(«h1″,»simplest histo»,10,0,10);

Такой скрипт является именованным. Прежде чем выполнить функцию drawhist(), нужно загрузить скрипт в память:

root[] .L MyNamedMacro.C

Обратите внимание, что в отличие от работы в режиме интерактивной сессии, в скриптах требуется ставить точки с запятой после каждой команды, в соответствии с синтаксисом C/C++.

Команды ROOT, которые будут приводиться далее в курсе, можно использовать как в режиме интерактивной сессии, так и в скриптах.

В заключение следует упомянуть о возможности преобразования данных HBOOK/PAW в ROOT-файлы. Для этого в составе ROOT существует специальная утилита h2root. Эта утилита автоматически преобразует гистограммы, ntuples, содержащиеся в HBOOK-файле, в соответствующие объекты ROOT и записывает их в новый файл.

Синтаксис утилиты h2root (в консольной строке ОС Linux)

где hbook file означает имя файла HBOOK, а root file имя выходного ROOT-файла.

Cовременные методы анализа данных

fname — имя фитирующей функции. Это должно быть имя одной из предопределенных в ROOTe функций или имя функции, определенной пользователем.
Вот список имен предопределенных функций, которые могут использоваться в функции TH1:Fit() :

  • gaus — гауссиан с 3-мя параметрами: f(x)=p0*exp(-0.5*((x-p1)/p2)^2))
  • expo — экспонента с 2-мя параметрами: f(x)=exp(p0+p1*x)
  • polN — полином степени N: f(x)=p0+p1*x+p2*x^2+.
  • landau — функция Ландау с двумя параметрами
Фитирование предопределенной функцией

Чтобы отфитировать гистограмму предопределенной функцией достаточно просто использовать функцию TH1::Fit() передав ее в качестве первого аргумента имя функции:

для предопределенных функций нет необходимости устанавливать начальные значения параметров — это делается автоматически.

Фитирование пользовательской функцией.

Чтобы отфитировать гистограмму своей функцией, нужно создать функцию — объект класса TF1 и вызвать функцию Fit передав ей имя созданной функции.

  1. Используя набор «С++ — подобных» выражений и операций определенных для класса TFormula
  2. То же что и #1, но с параметрами
  3. Используя вашу функцию

TF1 * f1 = new TF1(«f1″,»gaus+expo»,0,10);

Только что созданный объект f1 класса TF1 может быть использован для создания следующего объекта класса TF1:

TF1 * f2 = new TF1(«f2″,»f1 * 2»,0,10);

Создание TF1 с параметрами

Следующий способ — добавить параметры в выражение для функции:

TF1 * f1 = new TF1(«f1″,»[0]*x*sin([1]*x)»,0,10);

Номер параметра — в квадратных скобках. Чтобы явно задать начальные значения параметров можно использовать функцию SetParameter(),

Это устанавливает начальное значение параметра номер 0 равным 10. Можно так же установить допустимый диапазон изменения параметров:

Это позволяет параметру номер 0 во время фитирования изменяться только в пределах от 2 до 10.

Создание TF1 с помощью пользовательской функции

Третий способ создать TF1 — определить функцию самостоятельно и передать еf имя в конструктор TF1. Тип возвращаемого значения и список передаваемых параметров должны в точности совпадать со следующим примером:

Double_t fitf(Double_t *x, Double_t *par);

  • Double_t *x указатель на массив переменных, размерность массива равна числу переменных от которых зависит функция, для одномерной гистограммы используется только x[0], для двумерной — x[0] и x[1] и так далее.
  • Double_t *par указатель на массив параметров
 double ourFitFunction( double *x , double * par)
return par[0]*exp(-par[1]*x[0])+par[2]*exp(-pow((par[3]-x[0])/par[4],2));
>
 TF1* ff = new TF1("ff",ourFitFunction, 1.0, 10.0, 5); ff->SetParameter(0,50); // expo parameter ff->SetParameter(1,0.5); // expo parameter ff->SetParameter(3,5); // gaussian shift ff->SetParLimits(4,0.1,1); // gaussian sigma hist->Fit("ff","q0r");

Сначала определяем функцию ourFitFunction() — она зависит только от одной переменной (используется только x[0]) и 5-ти параметров (используются p[0] — p[4]).
Затем создаем объект ff класса TF1 c именем «ff», передаем ему указатель на ourFitFunction() и указываем диапазон для функции (от 1.0 до 10.0) и число параметров (5)

Root cern как задать массив примеры

Create TArrayS object and set array size to n shorts.

Definition at line 34 of file TArrayS.cxx.

◆ TArrayS() [3/4]

TArrayS::TArrayS ( Int_t n,
const Short_t * array
)

Create TArrayS object and initialize it with values of array.

Definition at line 43 of file TArrayS.cxx.

◆ TArrayS() [4/4]

TArrayS::TArrayS ( const TArrayS & array )

Definition at line 52 of file TArrayS.cxx.

◆ ~TArrayS()

TArrayS::~TArrayS ( )

Definition at line 71 of file TArrayS.cxx.

Member Function Documentation

◆ AddAt()

void TArrayS::AddAt ( Short_t c,
Int_t i
)

Add short c at position i. Check for out of bounds.

Definition at line 93 of file TArrayS.cxx.

◆ Adopt()

void TArrayS::Adopt ( Int_t n,
Short_t * arr
)

Adopt array arr into TArrayS, i.e.

don’t copy arr but use it directly in TArrayS. User may not delete arr, TArrayS dtor will do it.

Definition at line 81 of file TArrayS.cxx.

◆ At()

Short_t TArrayS::At ( Int_t i ) const

Definition at line 78 of file TArrayS.h.

◆ Class()

static TClass * TArrayS::Class ( )

Returns TClass describing this class

◆ Class_Name()

static const char * TArrayS::Class_Name ( )

Returns Name of this class

◆ Class_Version()

static constexpr Version_t TArrayS::Class_Version ( )

Returns Version of this class

Definition at line 55 of file TArrayS.h.

◆ Copy()

void TArrayS::Copy ( TArrayS & array ) const

Definition at line 42 of file TArrayS.h.

◆ DeclFileName()

static const char * TArrayS::DeclFileName ( )

Returns Name of the file containing the class declaration

Definition at line 55 of file TArrayS.h.

◆ GetArray() [1/2]

Short_t * TArrayS::GetArray ( )

Definition at line 44 of file TArrayS.h.

◆ GetArray() [2/2]

const Short_t * TArrayS::GetArray ( ) const

Definition at line 43 of file TArrayS.h.

◆ GetAt()

Double_t TArrayS::GetAt ( Int_t i ) const

Definition at line 45 of file TArrayS.h.

◆ GetSum()

Stat_t TArrayS::GetSum ( ) const

Definition at line 46 of file TArrayS.h.

◆ IsA()

TClass * TArrayS::IsA ( ) const

Returns TClass describing current object

Reimplemented in TH1S, TH2S, and TH3S.

Definition at line 55 of file TArrayS.h.

◆ operator=()

TArrayS & TArrayS::operator= ( const TArrayS & rhs )

Definition at line 61 of file TArrayS.cxx.

◆ operator[]() [1/2]

Short_t & TArrayS::operator[] ( Int_t i )

Definition at line 84 of file TArrayS.h.

◆ operator[]() [2/2]

Short_t TArrayS::operator[] ( Int_t i ) const

Definition at line 91 of file TArrayS.h.

◆ Reset() [1/2]

void TArrayS::Reset ( )

Definition at line 47 of file TArrayS.h.

◆ Reset() [2/2]

void TArrayS::Reset ( Short_t val )

Definition at line 48 of file TArrayS.h.

◆ Set() [1/2]

void TArrayS::Set ( Int_t n )

Set size of this array to n shorts.

A new array is created, the old contents copied to the new array, then the old array is deleted. This function should not be called if the array was declared via Adopt.

Definition at line 105 of file TArrayS.cxx.

◆ Set() [2/2]

void TArrayS::Set ( Int_t n,
const Short_t * array
)

Set size of this array to n shorts and set the contents.

This function should not be called if the array was declared via Adopt.

Definition at line 132 of file TArrayS.cxx.

◆ SetAt()

void TArrayS::SetAt ( Double_t v,
Int_t i
)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *