106
Formation ROOT pour débutants Deuxième Jour Programmation

La programmation avec ROOT

  • Upload
    lynhu

  • View
    242

  • Download
    0

Embed Size (px)

Citation preview

Page 1: La programmation avec ROOT

Formation ROOT pour débutants

Deuxième JourProgrammation

Page 2: La programmation avec ROOT

Création et destruction d'objets

Les commandes "new" et "delete"Les pointeurs d'objet

Page 3: La programmation avec ROOT

La commande "new"

• On a commencé la journée d'hier en tapant:new TBrowser

ce qui a fait apparaître le "ROOT object browser".

Page 4: La programmation avec ROOT

La commande "new"

• On a commencé la journée d'hier en tapant:new TBrowser

ce qui a fait apparaître le "ROOT object browser".

• Si l'on tapenew TCanvas

un canevas apparaît!Mais qu'est-ce qui se passedans la fenêtre decommandes ???

Page 5: La programmation avec ROOT

La fenêtre de commandes• La fenêtre de commandes est un interpréteur de C++ !!• L'interpréteur affiche la valeur de chaque fonction,

expression ou commande que l'on tape - essayez e.g.2+2…

Page 6: La programmation avec ROOT

La fenêtre de commandes• Les valeurs affichées après une commande new

sont le type (classe) et l'adresse en mémoire desobjets créés

adresse en mémoirede l'objet de classe "TCanvas"qui est affiché sur votre écran

Page 7: La programmation avec ROOT

Les pointeurs d'objet

• Pour utiliser l'objet, il faut mettre son adressedans une variable spéciale, un pointeur d'objet

Déclaration d'unpointeur d'objet : TypeObjet* toto;

Page 8: La programmation avec ROOT

Les pointeurs d'objet

• Pour utiliser l'objet, il faut mettre son adressedans une variable spéciale, un pointeur d'objet

Déclaration d'unpointeur d'objet : TypeObjet* toto;

On doit déclarer letype d'objet surlequel on va agir.(Type de l'objet =nom de la classe)

C'est '*' qui nousdit qu'il s'agitd'un pointeur

Page 9: La programmation avec ROOT

Les pointeurs d'objet

• La valeur stockée par le pointeur est réellementl'adresse de l'objet en mémoire

Initialisation d'unpointeur d'objet : toto = (TypeObjet*)adresse ;

Page 10: La programmation avec ROOT

Les pointeurs d'objet

• La valeur stockée par le pointeur est réellementl'adresse de l'objet en mémoire

Initialisation d'unpointeur d'objet : toto = (TypeObjet*)adresse ;

On initialise le pointeur avecl'adresse de notre objet detype (classe) TCanvas.

Page 11: La programmation avec ROOT

Destruction d'objets• La commande delete permet de libérer l'espace mémoire

occupé par les objets• On doit l'utiliser pour détruire les objets dont on n'a plus

besoin, sinon on finira par remplir toute la mémoire!

Destruction d'unobjet: delete toto;

Page 12: La programmation avec ROOT

Destruction d'objets• La commande delete permet de libérer l'espace mémoire

occupé par les objets• On doit l'utiliser pour détruire les objets dont on n'a plus

besoin, sinon on finira par remplir toute la mémoire!

Destruction d'unobjet: delete toto; L'exécution de cette

commande fait disparaîtrele premier canevas!

L'objet (et sareprésentation graphique)n'existe plus, la mémoireoccupée est libérée

Page 13: La programmation avec ROOT

Les constructeurs d'objets• La plupart du temps on effectue la déclaration du

pointeur, la création de l'objet et l'initialisation dupointeur avec l'adresse de l'objet en une seule ligne!

Création d'objet avecinitialisation depointeur:

TypeObjet* toto = new TypeObjet;

Page 14: La programmation avec ROOT

Les constructeurs d'objets• La plupart du temps on effectue la déclaration du

pointeur, la création de l'objet et l'initialisation dupointeur avec l'adresse de l'objet en une seule ligne!

Création d'objet avecinitialisation depointeur:

TypeObjet* toto = new TypeObjet;

C'est une fonction spécialeque l'on appelle unconstructeur.

Le constructeur déterminela façon de créer lesobjets d'une classe.*Un autre

canevas apparaît!

Page 15: La programmation avec ROOT

Les constructeurs d'objets

• En règle générale, le constructeur peut prendredes arguments

Création d'objet avecinitialisation depointeur:

TypeObjet* toto = new TypeObjet(…);

Page 16: La programmation avec ROOT

Les constructeurs d'objets

• En règle générale, le constructeur peut prendredes arguments

Création d'objet avecinitialisation depointeur:

TypeObjet* toto = new TypeObjet(…);

Par exemple, on peut créerun canevas en spécifiantson nom, son titre, saposition et sa taille àl'écran.

Dans l'exemple précédent, le canevas a pardéfaut le nom "c1" et le titre "c1"

Page 17: La programmation avec ROOT

Manipuler les objets

Les méthodes des classes

Page 18: La programmation avec ROOT

Agir sur les objets• Graphiquement, on peut agir sur un objet à

travers son menu contextuel:

Exemple d'hier,quand on a divisé uncanevas en 4

Page 19: La programmation avec ROOT

Les méthodes• Avec un pointeur d'objet, on peut aussi interagir

avec l'objet…

Agir sur un objet avecson pointeur: toto-> Méthode(arguments);

Le pointeur d'objetavec l'opérateur '->'définit sur quel objeton va agir

Page 20: La programmation avec ROOT

Les méthodes• Avec un pointeur d'objet, on peut aussi interagir

avec l'objet…

Agir sur un objet avecson pointeur: toto-> Méthode(arguments);

Une des méthodes dela classe de l'objet.Par exemple, une desfonctions du menucontextuel.Tous les objets de la même classe

possèdent les mêmes méthodes.

Page 21: La programmation avec ROOT

Les méthodes• Avec un pointeur d'objet, on peut aussi interagir

avec l'objet…

Agir sur un objet avecson pointeur: canvas->Divide(2,2);

On agit sur l'objet "c1" àtravers son pointeur "canvas".On utilise sa méthode "Divide"avec nx=2 et ny=2.

Page 22: La programmation avec ROOT

Les méthodes• Avec un pointeur d'objet, on peut aussi interagir

avec l'objet…

Agir sur un objet avecson pointeur:

Le canevas "c1" se divise

canvas->Divide(2,2);

Page 23: La programmation avec ROOT

Les méthodes• Avec un pointeur d'objet, on peut aussi interagir

avec l'objet…

Agir sur un objet avecson pointeur: another_canvas->Divide(10,1);

On agit sur l'objet "c2" àtravers son pointeur"another_canvas". On utilise saméthode "Divide" avec nx=10 etny=1.

Page 24: La programmation avec ROOT

Les méthodes• Avec un pointeur d'objet, on peut aussi interagir

avec l'objet…

Agir sur un objet avecson pointeur: another_canvas->Divide(10,1);

Le canevas "c2" se divise

Page 25: La programmation avec ROOT

Les méthodes• D'autres opérations sur les canevas:

canvas->Clear();Effacer le contenu ducanevas, y compris lesdivisions

Rendre le canevas"actif", c-à-d c'est luiqui aura un pourtourjaune, et le prochainhisto s'affichera la-dessus

canvas->cd();

Page 26: La programmation avec ROOT

Exemple avec un histogramme

• On peut créer un spectre à une dimension de lamême façon que pour les canevas:

TH1F* histo = new TH1F("h1","My histo", 10, 0., 10.);Créationd'un histo 1D

TypeObjet* toto = new TypeObjet(…);

TH1F ? Histo à 1D denombres réels (Float)

REMARQUE: L'histo ne s'affiche pasautomatiquement!

Page 27: La programmation avec ROOT

Exemple avec un histogramme

• Afficher et remplir l'histogramme:

histo->Draw();Afficher unspectre:

histo->Fill(3);Remplir unspectre:

L'argument "3"correspond à unevaleur de l'abscisse

Il ne s'estrien passé ?

Page 28: La programmation avec ROOT

Exemple avec un histogramme

• Mettre à jour l'affichage:

canvas->Modified();Signaler aucanevas qu'unobjet affiché aété modifié:

canvas->Update();Forcer lamise à jourdu canevas:

A la ligne de commande, ça provoqueautomatiquement la mise à jour du canevas.

On verra par la suite que la plupart du temps (e.g.dans un programme) il faut aussi demander la miseà jour!

Page 29: La programmation avec ROOT

Exemple avec un histogramme

• On commence à s'ennuyer?

histo->Fill(1.43);histo->Fill(6.9); …histo->Fill(9, 2);canvas->Modified();

On pourrait continuer comme ça jusqu'à ceque notre spectre soit rempli…

Mais on ferait mieux d'écrire une boucle……dans une fonction……en C++…!!!

Remplissageavec un poids

Page 30: La programmation avec ROOT

Création d'objets sans "new"

Il y a une autre façon de faireObjets "temporaires" vs. objets

"permanents"

Page 31: La programmation avec ROOT

L'autre façon de faire…• Il y a une autre façon de créer et de manipuler les

objets…

TypeObjet toto(…);Création d'objet sans"new"

Page 32: La programmation avec ROOT

L'autre façon de faire…• Il y a une autre façon de créer et de manipuler les

objets…

Créationd'objet avec"new"

TypeObjet toto(…);

TypeObjet* toto_ptr = new TypeObjet(…);

Si le constructeur prend desarguments, on les met ici

Création d'objet sans"new"

Page 33: La programmation avec ROOT

L'autre façon de faire…• Il y a une autre façon de créer et de manipuler les

objets…

Créationd'objet avec"new"

TCanvas can("c3","titre",250,100,50,500);

TCanvas* can_ptr = new TCanvas("c3","titre", …);

Création d'objet sans"new"

Page 34: La programmation avec ROOT

L'autre façon de faire…• La façon d'agir sur l'objet n'est plus tout à fait la

même…

toto. Méthode(arguments);Création d'objet sans"new"

Page 35: La programmation avec ROOT

L'autre façon de faire…• La façon d'agir sur l'objet n'est plus tout à fait la

même…

toto. Méthode(arguments);Création d'objet sans"new"

Agir sur un objet avecson pointeur: toto_ptr-> Méthode(arguments);

Dans un cas on utiliseun point, dans l'autreune flèche

Page 36: La programmation avec ROOT

L'autre façon de faire…• La façon d'agir sur l'objet n'est plus tout à fait la

même…

can.Divide(1,6);Création d'objet sans"new"

Agir sur un objet avecson pointeur: can_ptr->Divide(1,6);

Page 37: La programmation avec ROOT

L'autre façon de faire…• On peut aussi obtenir l'adresse mémoire des objets créés

de cette façon, et les manipuler en utilisant un pointeur

TypeObjet* toto_ptr = &toto;Initialiser un pointeravec l'adresse d'unobjet existant

Page 38: La programmation avec ROOT

L'autre façon de faire…• On peut aussi obtenir l'adresse mémoire des objets créés

de cette façon, et les manipuler en utilisant un pointeur

TypeObjet* toto_ptr = &toto;Initialiser un pointeravec l'adresse d'unobjet existant

Opérateur qui renvoiel'adresse mémoire del'objet

Page 39: La programmation avec ROOT

L'autre façon de faire…

toto_ptr ->Méthode(arguments);Agir sur l'objet àtravers son pointeur

• L'utilisation du pointeur pour agir sur l'objetensuite est identique aux cas précédents…

Page 40: La programmation avec ROOT

L'autre façon de faire…

can_ptr ->Clear();Agir sur l'objet àtravers son pointeur

• L'utilisation du pointeur pour agir sur l'objetensuite est identique aux cas précédents…

Page 41: La programmation avec ROOT

L'autre façon de faire…• La différence ? On n'a pas besoin d'utiliser delete

pour détruire l'objet quand on n'en veut plus…

Les objets créés de cetté façon sontdétruits automatiquement à la fin dubloc de code* dans lequel ils ont étécréés.

Les objets créés avec "new" sontdétruits à la demande de l'utilisateuravec "delete".

*Fonction,boucle, "if", etc.

Page 42: La programmation avec ROOT

L'autre façon de faire…• La différence ? On n'a pas besoin d'utiliser delete

pour détruire l'objet quand on n'en veut plus…

Les objets créés de cette façon sontdétruits automatiquement à la fin dubloc de code* dans lequel ils ont étécréés.

Les objets créés avec "new" sontdétruits à la demande de l'utilisateuravec "delete".

Objetstemporaires

Objetspermanents

*Fonction,boucle, "if", etc.

Page 43: La programmation avec ROOT

Trouver l'information sur lesclasses

Où est le mode d'emploi ?Faut-il tout apprendre par cœur ?*

*NON!!!!

Page 44: La programmation avec ROOT

Trouver l'information• Mais comment connaître toutes les façons d'interagir

avec un objet ?• Comment connaître toutes les méthodes d'une classe ?

1. la complétion des commandesavec la touche <TAB>

Très efficace, permet de réduireau minimum les commandes à tapersoi-même (c-à-d le nombrepossible de fautes de frappe)…

ASTUCE:la plupart des méthodes quimodifie un objet commencent par"Set…"la plupart des méthodes quirenseignent sur un objetcommencent par "Get…"

<TAB>

<TAB>

Page 45: La programmation avec ROOT

Trouver l'information• La meilleur façon de se renseigner: consulter le

site web http://root.cern.ch

1. clique sur"Reference Guide"

2. Regarder le site web

Page 46: La programmation avec ROOT

Consultation du site web• La meilleur façon de se renseigner: consulter le

site web http://root.cern.ch

2. liste des classespar catégories(histos, matrices,géométrie, etc.)

Page 47: La programmation avec ROOT

Consultation du site web• La meilleur façon de se renseigner: consulter le

site web http://root.cern.ch

2. liste complètedes classes pourchaque version deROOT

Page 48: La programmation avec ROOT

Consultation du site web• La meilleur façon de se renseigner: consulter le

site web http://root.cern.ch

2. recherchesur mots clés

Page 49: La programmation avec ROOT

Consultation du site web• La meilleur façon de se renseigner: consulter le

site web http://root.cern.ch

rentrez"TCanvas"(puis <ENTER>)

Page 50: La programmation avec ROOT

Consultation du site web• La meilleur façon de se renseigner: consulter le

site web http://root.cern.ch

la recherche par nom declasse marche le mieux…

…mais ne négligez pas lesautres résultats quipeuvent être trèsintéressants!!

Page 51: La programmation avec ROOT

Présentation d'une page dedescription d'une classe

• On y trouve toutes les informations nécessaires…à condition de savoir les trouver

Le nom de la classeet de son parent leplus proche(classe "mère")

Page 52: La programmation avec ROOT

Présentation d'une page dedescription d'une classe

• On y trouve toutes les informations nécessaires…à condition de savoir les trouver

Généalogie complètede la classe

Page 53: La programmation avec ROOT

Présentation d'une page dedescription d'une classe

• On y trouve toutes les informations nécessaires…à condition de savoir les trouver

Généalogie complètede la classe

parents et grand-parents à gauche

Page 54: La programmation avec ROOT

Présentation d'une page dedescription d'une classe

• On y trouve toutes les informations nécessaires…à condition de savoir les trouver

Généalogie complètede la classe

parents et grand-parents à gauche

enfants et petit-enfants à droite

Page 55: La programmation avec ROOT

La liste des méthodes d'uneclasse

• On y trouve toutes les informations nécessaires…à condition de savoir les trouver

(un peu plus bas)

la liste complète desméthodes de la classe

chaque nom est un lienvers une documentationcomplète de la méthode

Page 56: La programmation avec ROOT

La liste des méthodes d'uneclasse

• Il existe trois types de méthodes: "private","protected", "public"

on ne peut utiliser niles méthodes "private"ni "protected"…

… donc on neregardera que lesméthodes "public"

Page 57: La programmation avec ROOT

La liste des méthodes d'uneclasse

• La liste des méthodes "public" est toujoursorganisée de la même façon:

D'abord, on a lesconstructeurs de laclasse (méthodes avecle même nom que laclasse)

Page 58: La programmation avec ROOT

La liste des méthodes d'uneclasse

• La liste des méthodes "public" est toujoursorganisée de la même façon:

Une méthode destructeur"~TypeObjet()" appeléequand on détruit l'objet,e.g. avec delete*

*On ne peut pas utilisercette méthodedirectement

Page 59: La programmation avec ROOT

Trouver toutes les méthodesd'une classe

• La liste des méthodes "public" est toujoursorganisée de la même façon:

La liste alphabétique detoutes les méthodes de laclasse…?

Où est la méthode "Divide"?

Page 60: La programmation avec ROOT

Trouver toutes les méthodesd'une classe

• Si une classe semble manquer une méthode, elleest peut-être définie par ses (grand-)parents

ASTUCE:Les objets d'une classeprofitent de tout lesavoir-faire de leursaïeuls…

…les méthodes passentde mère en fille!!

Commencez parla classe mère

Page 61: La programmation avec ROOT

Trouver toutes les méthodesd'une classe

• Si une classe semble manquer une méthode, elleest peut-être définie par ses (grand-)parents

Trouvée!Regardons la doc…*

*…on expliquera ladéclaration (types devariables, arguments pardéfaut etc.) tout àl'heure

Page 62: La programmation avec ROOT

Trouver toutes les méthodesd'une classe

• Si une classe semble manquer une méthode, elleest peut-être définie par ses (grand-)parents

Voici la doc en ligne de laméthode "Divide" de laclasse "TPad", qui estaussi une méthode de laclasse "TCanvas", classefille de "TPad".

Ouf!

Page 63: La programmation avec ROOT

A la recherche des objets perdus

Ou: pourquoi les objets ont des noms

Page 64: La programmation avec ROOT

Double-clique sur"root"

Retrouver un objet perdu

• ROOT tient à jour des listes d'objets, ce quipermet de les retrouver facilement

Page 65: La programmation avec ROOT

Retrouver un objet perdu

• On peut naviguer dans ces listes en utilisant leTBrowser

Clique sur"Canvases"

Page 66: La programmation avec ROOT

Retrouver un objet perdu

• Chaque objet doit porter un nom unique, pourqu'on puisse le retrouver

Nos deux canevas sontlà, on les repère parleur nom

Page 67: La programmation avec ROOT

Retrouver un objet perdu

• On peut agir sur un objet à travers son menucontextuel dans le browser…

Clique-droit pourouvrir le menucontextuel de "c1"

Page 68: La programmation avec ROOT

Retrouver un objet perdu

• On peut agir sur un objet à travers son menucontextuel dans le browser…

Sélectionner e.g."Divide" commehier, et on peutdiviser le canevas"c1" en 4…

Page 69: La programmation avec ROOT

Retrouver un objet perdu

• …ou en récupérant son adresse, on agira avec unpointeur d'objet:

gROOT->GetListOfCanvases()->FindObject("c1");

Page 70: La programmation avec ROOT

Retrouver un objet perdu

• …ou en récupérant son adresse, on agira avec unpointeur d'objet:

gROOT->GetListOfCanvases()->FindObject("c1");

Ce pointeur d'objet contient l'adresse dudossier racine "root" dans le TBrowser.

Il permet d'accéder à tous les autres objets.

Page 71: La programmation avec ROOT

Retrouver un objet perdu

• …ou en récupérant son adresse, on agira avec unpointeur d'objet:

gROOT->GetListOfCanvases()->FindObject("c1");

On descend d'un niveaudans l'arborescence,c'est l'équivalent dudossier "Canvases"

Page 72: La programmation avec ROOT

Retrouver un objet perdu

• …ou en récupérant son adresse, on agira avec unpointeur d'objet:

gROOT->GetListOfCanvases()->FindObject("c1");

Dans la liste descanevas, on cherchel'objet dont le nomest "c1".

Page 73: La programmation avec ROOT

Retrouver un objet perdu

• Si l'on n'est pas sûr dans quel dossier il faut chercher, onpeut faire une recherche récursive dans tous les dossiers:

gROOT->GetListOfCanvases()->FindObject("c1");

gROOT->FindObject("nom");

C'est la formule magique qui permetde retrouver à peu près n'importequel objet à n'importe quel moment.

On l'utilisera tout le temps!!

Page 74: La programmation avec ROOT

Retrouver un objet perdu

• Ensuite il n'y a plus qu'à mettre l'adresse dans unpointeur approprié et l'utiliser:

TypeObjet* toto = (TypeObjet*) gROOT->FindObject("nom");

On doit repréciserle type de l'objetrecherché ici

TCanvas* c1_ptr = (TCanvas*) gROOT->FindObject("c1");c1_ptr->Clear();

Exemple: on cherche lecanevas "c1" et on effaceson contenu:

Page 75: La programmation avec ROOT

Savoir si un objet existe

• On utilisera la même fonction quand on voudrasavoir si tel ou tel objet a déjà été créé

L'histogramme "h1" existeOn récupère son adresse

Page 76: La programmation avec ROOT

Savoir si un objet existe

• On utilisera la même fonction quand on voudrasavoir si tel ou tel objet a déjà été créé

Il n'y a pas d'histogramme"hh".

On récupère une adressequi vaut ZERO!!

Page 77: La programmation avec ROOT

Savoir si un objet existe

• En toute rigueur, il faut toujours tester la valeur d'unpointeur pour être sûr que l'adresse est valable…

Qu'est-ce qui se passe quand onessaie d'utiliser un pointeur nul ?

Page 78: La programmation avec ROOT

Savoir si un objet existe

• En toute rigueur, il faut toujours tester la valeur d'unpointeur pour être sûr que l'adresse est valable…

L'interpréteur est gentil……dans un programme ça ferait"segmentation violation" (aïe!)

Page 79: La programmation avec ROOT

Ecriture de fonctions

La programmation C++ par les nuls

Page 80: La programmation avec ROOT

Une fonction• Voici un exemple d'une fonction C++

EN-TETES:Déclarationsnécessaires pourchaque classe utilisée

Page 81: La programmation avec ROOT

Une fonction• Voici un exemple d'une fonction C++

DECLARATION:Type de retour,nom, etéventuellement desarguments

Page 82: La programmation avec ROOT

Une fonction• Voici un exemple d'une fonction C++

Bloc "if"

Page 83: La programmation avec ROOT

Une fonction• Voici un exemple d'une fonction C++

Boucle sur x, de 0à 99, par pas de 1

Page 84: La programmation avec ROOT

Une fonction• Voici un exemple d'une fonction C++

Mettre à zéro lecontenu du spectre

gPad = pointeur globaldu pad/canevas actif

Page 85: La programmation avec ROOT

Compilation et utilisation

• On compile et on charge la fonction:

.L fillHisto.C+

Nom du fichier quicontient la fonction

• On exécute la fonction:

DrawGaussian()

Nom de la fonction

Page 86: La programmation avec ROOT

Pourquoi utiliser "new" pourcréer l'histo ?

• Voyons ce qui se passe si on crée notrehistogramme sans utiliser "new"

Objet temporaire, iln'existe que dans cebloc (fonction)

On voit l'histo seremplir…

… puis disparaître àla fin de la fonction

Page 87: La programmation avec ROOT

Comment utiliser les arguments• Une fonction avec des arguments:

Liste des argumentsavec leur type

Utilisation desarguments dans lafonction

Page 88: La programmation avec ROOT

Valeurs d'arguments par défaut

e.g. Largeurpar défaut

DrawGaussian() => amp=20, moy=50, large=10DrawGaussian(5) => amp=5, moy=50, large=10DrawGaussian(5,30) => amp=5, moy=30, large=10DrawGaussian(5,30,5) => amp=5, moy=30, large=5

Page 89: La programmation avec ROOT

Retour de valeurs/objets• Les fonctions peuvent retourner tous les types de variables

Fonctiongaussienne

Renvoi dela valeurcalculée

Type de lavariableretournée

Page 90: La programmation avec ROOT

Retour de valeurs/objets• Les fonctions peuvent retourner tous les types de variables

On retourne unpointeurd'histogramme

Utilisation de lafonction gaussienne

Renvoi du pointeur

Page 91: La programmation avec ROOT

Retour de valeurs/objets

• Utilisation de la fonctionOn peut utiliser la fonctiongaussienne indépendamment

On exécute la fonction,récupère le pointeur del'histogramme, et on l'affiche…

Page 92: La programmation avec ROOT

Exemple d'analyse

http://caeinfo.in2p3.fr/root/Formation/fr/Jour2/basic.Chttp://caeinfo.in2p3.fr/root/Formation/fr/Jour2/basic.dat

Page 93: La programmation avec ROOT

Exemple d'analyse

Déclaration dusystème I/O deROOT/C++

Un exemple de script d’analyse: on lit les données dans unfichier ASCII basic.dat; on génère quelques histogrammesque  l’on va sauvegarder dans le fichier basic.root.

Type " chaîne decaractères "

Objet fichierASCII en lecture

Ouverture dufichier ASCII

Page 94: La programmation avec ROOT

Exemple d'analyse

Déclarations dequelques variables

Création denouveau fichierROOT, on l'écrases'il existe déjà.

Création de NtupleLes histogrammes etc. créés aprèsl'ouverture du fichier sont associésà ce fichier; ils lui appartiennent.

Page 95: La programmation avec ROOT

Exemple d'analyseBoucle "while": on continue tant que la lecturede fichier ASCII est correcte

Lecture des 3 paramètresdans le fichier

Affichage des valeurs luesà l'écran.endl => aller à la ligne

Remplissage de l'histo etdu ntuple

Incrémente lenombre delignes lues

Page 96: La programmation avec ROOT

Exemple d'analyse

Fermeture dufichier ASCII

Ecriture sur disque des objetsassociés au fichier (f->Write())Fermeture du fichier par sondestructeur (delete f).

WARNING:les objets associés au fichiern'existent plus en mémoire une foisqu'il a été fermé.

Page 97: La programmation avec ROOT

• Compiler et exécuter:

• Ouvrir le fichier et afficher le spectre "h1":

Exécuter l'analyse et voir lerésultat

.L basic.C+basic()

TFile* fich = new TFile("basic.root")fich->ls()TH1F* histo = (TH1F*) fich->Get("h1")histo->Draw()Affiche le

contenu dufichier Copie en mémoire de

l'objet "h1".Retourne l'adresse decette copie.

Les 2 dernières lignes en 1 seule:fich->Get("h1")->Draw()

Page 98: La programmation avec ROOT

Dernières astuces

Page 99: La programmation avec ROOT

Des exemples defonctions/scripts

• Sur le site web, rubrique Tutorials, on trouvebeaucoup d'exemples• Attention! S'il n'y a pas d'en-tête avec

déclaration d'une fonction, il faut faire:

.x toto.CExécutiond'un scriptsans en-tête

Dans ce cas, le code estinterprété au lieu d'êtrecompilé.

WARNING: utilisationfortement déconseillée.

Page 100: La programmation avec ROOT

Ce que vous risquez en utilisantl’interpréteur…

L’interpréteur Vous

Page 101: La programmation avec ROOT

Le fichier rootlogon.C

{gStyle->SetPalette(1);cout << "Salut " << gSystem->Getenv("USER") << "!" << endl;gSystem->Exec("date");}

• Ce fichier sans en-tête s’exécute automatiquementlorsqu’on lance ROOT dans le répertoire où il setrouve. Pour avoir de

belles couleursdans les bidims

Retourne la valeurde la variabled'environnementUSER

Exécute lacommandesystème "date"

Pour plus d'infos, voir les classes TStyle et TSystem

Page 102: La programmation avec ROOT

Exercice

Un autre exemple d'analyse de données

Page 103: La programmation avec ROOT

Exercice(Episode 1: The ROOT menace)

http://caeinfo.in2p3.fr/root/Formation/fr/Jour2/exo_j2.data

• Faire un programme d’analyse du fichier exo_j2.data danslequel on a 4 variable x,y,z et e (comme c’est original!)x de -25 à 25, y de -25 à 25, z de -10 à 10, e de -500 à 2500

– Génerer les histogrammes suivants● Monodims: distribution de z (TH1F)● Bidims: y vs x, z vs x, z vs y (TH2F)● Profiles: <e> vs x, <e> vs y (TProfile)● Tridims: z vs y vs x, e vs y vs x (TH3F)

– Les sauvegarder dans le fichier exo_j2.root.

Page 104: La programmation avec ROOT

Exercice(Episode 2: The return of

exo_j2.root)• Ouvrir exo_j2.root.• Déterminer les 3 intervalles de z les plus peuplés.

– Notez-les!• En utilisant le FitPanel

– fitter le TProfile <e> vs x avec un polynôme et noterles valeurs des 2 derniers paramètres ex1 et ex2.

– fitter le TProfile <e> vs y avec un polynôme et noterles valeurs des 3 derniers paramètres ey1, ey2 et ey3.

• Fermer exo_j2.root.

Page 105: La programmation avec ROOT

Exercice(Part 3: The analysis strikes

back)• Refaire un programme d’analyse du fichierexo_j2.data.

– Générer les histogrammes suivants● Monodims: distribution (TH1F) de de=e-ex1*x-ex2*x*x-ey1*y-ey2*y*y-ey3*y*y*y

● Bidims: y vs x pour chaque intervalle en z déterminé dansla deuxième partie (TH2F)

● Profiles 2D: <z> vs y vs x, <e> vs y vs x (TProfile2D)– Les ajouter au fichier exo_j2.root.

Page 106: La programmation avec ROOT

Exercice(Part 4: The final shot)

• Déterminer la largeur de la distribution de de enla fittant avec une gaussienne.

• Ecrire un script permettant de visualiser dans lemême TCanvas les quatre histogrammes suivants:– y vs x pour z < 1 avec l’option col– y vs x pour 3 < z < 5 avec l’option box– <z> vs y vs x avec l’option zcol– <e> vs y vs x avec l’option surf1

• Sauvegarder l’image dans un fichier ".gif"