ROOT’s Basics II: ¿Qué son los archivos .root y cómo crear uno?

junio 3, 2015

ROOT’s Basics II: ¿Qué son los archivos .root y cómo crear uno?

Ya hemos instalado ROOT, Ahora ¿Qué es un archivo .root? *.root es un formato (tipo de archivo) diseñado por el CERN para almacenar y tener acceso de manera eficiente a datos (objetos de C++). Este archivo ha sido estructurado a modo de sistema de archivos, es decir, dentro del mismo se pueden encontrar directorios, subdirectorios y objetos.

Crearemos un archivo e iremos entendiendo la función de lo que hacemos a medida que vamos trabajando en ello.

Inicialmente, creamos un archivo .root que es una instancia de la clase TFile:

root[] TFile *MyFirstFile = new TFile("MyFirstFile.root","NEW");

Mediante lo cual creamos la instancia MyFirstFile de la clase TFile. El primer argumento del constructor "MyFirstFile.root" indica el nombre del archivo, mientras que el segundo ("NEW") le da la instrucción a root de crear el archivo, el cual quedará ubicado en el directorio de trabajo. Otras opciones para el segundo argumento es "READ", lo cual abrira el archivo .root indicado en el primer argumento en modo lectura (útil cuando nos han dado un .root y no tenemos ni ídea qué hacer con el), o "UPDATE" para abrir un .root existente para modificarlo.

Verificamos que el archivo se haya creado de manera correcta:

root[] cout << MyFirstFile->IsOpen() << endl ;

IsOpen() es un método binario que devolverá 1 (true, que en ROOT es kTRUE) si el archivo se encuentra disponible para el uso en ROOT o 0 (false, que en ROOT es kFALSE) si el archivo no está disponible. Alguién podría preguntar "¿y acaso podía fallar?", la respuesta es SÍ, hubiese podido fallar, por ejemplo si el directorio de trabajo no hubiese tenido permisos de escritura para el usuario. Aunque parezca una verificación algo "ingenua", es necesario recordar que siempre que se está diseñando y escribiendo Software, es indispensable que usted como "escritor" imagine la peor situación en la que se puede encontrar un usuario del mismo. Lo ideal es hacer un Software a prueba de tontos (no es fácil, y en la mayoría de los casos no se logra). Así, será necesario adecuar éste método en un condicional para que el Software (o script o macro -como se llama en ROOT a los scripts-) sepa qué hacer en caso de que se presente un error.

Vamos a crear un directorio, ¿cómo?, ROOT es hijo de GNU/Linux, así que:

root[] MyFirstFile->mkdir("TestFolder");

¿Cuál será el nombre del directorio creado?. Ingresamos al directorio:

root[] MyFirstFile->cd("TestFolder");

La cuestión es que ahora tenemos un archivo, una carpeta, pero no sabemos qué guardar en ella. Pero, recordemos que comenzando esta entrada, comentamos que podíamos almacenar objetos de C++. Así que creemos un objeto para almacenarlo ¿Qué tal un histograma?:

root[] TH1I *FirstHistogram = new TH1I("FirstHistogram","My First Saved Histogram",5,0,50) ;

Con lo que se creó un histograma de tipo entero (TH1I), cuyo título será "My First Saved Histogram", que tendrá 5 cajas "bins", cuyo límite inferior será 0 y cuyo límite superior será 50. Con tales límites parece que será un histograma que contiene notas de resultados de exámenes:

root[] Int_t Data[]=
{47,47,43,45,45,45,33,43,45,45,37,45,45,42,42,43,42,42,42,42,43,40,42,43,30,42,40,40,38,40,28,40,38,35,27};

Así, hemos definido un Array llamado Data que contiene un ejemplo típico del conjunto de notas obtenidas en los exámenes de física de un profesor promedio.

Mediante un ciclo rellenamos el histograma con cada uno de los datos del Array:

root[] for(Int_t i = 0; i < sizeof(Data)/sizeof(Data[1]); i++){ root[] FirstHistogram->Fill(Data[i]);
root[] }

Donde la expresión sizeof(data)/sizeof(data[1]) es una forma de obtener el número de datos que contiene el Array. Graficamos el histograma (porque siempre que esas horribles líneas de código generan una gráfica hay cierto tipo de motivación):

root[] FirstHistogram->Draw("*H")

Finalmente, guardamos nuestro histograma en el archivo .root que habíamos creado, y lo cerramos:

root[] MyFirstFile->Write()
root[] MyFirstFile->Close()

Bueno, ahora ¿Cómo sabemos (aparte del acto de fé) que el histograma ha sido guardado en el archivo?. Ejecutamos ROOT (léase ejecutamos otra instancia de ROOT para tener la certeza de que no estamos trabajando con objetos que hagan parte de la anterior ejecución) y creamos un TBrowser:

root[] new TBrowser

Una vez allí, buscamos (una instancia de TBrowser tiene interfaz gráfica) nuestro archivo .root y verificamos la existencia del histograma.

Enlaces Recomendados

Comentarios

Agregue usted un comentario,

Nombre:

Dirección de correo electrónico:

URL:

Mensaje:



* La dirección de correo electrónico no será publicada.




This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 Colombia License.


I'm committed to the privacy of k-lab users. Each time you access content delivered by http://www.k-lab.tk/, information like referrer, anonymized IP (255.255.X.X), date, time and requested resources are sent to a Google Analytics. This is done in order to know user preferences to adapt our content for users needs and to detect failures in the website. However, respecting your decision we don't store any of this information if you have enabled Do Not Track option in your web browser (Preferences/Privacy/Tracking/Tell Websites I do not want to be tracked). Protect your privacy.