la programmation avec root
TRANSCRIPT
![Page 1: La programmation avec ROOT](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/1.jpg)
Formation ROOT pour débutants
Deuxième JourProgrammation
![Page 2: La programmation avec ROOT](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/2.jpg)
Création et destruction d'objets
Les commandes "new" et "delete"Les pointeurs d'objet
![Page 3: La programmation avec ROOT](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/3.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/4.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/5.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/6.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/7.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/8.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/9.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/10.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/11.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/12.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/13.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/14.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/15.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/16.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/17.jpg)
Manipuler les objets
Les méthodes des classes
![Page 18: La programmation avec ROOT](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/18.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/19.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/20.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/21.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/22.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/23.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/24.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/25.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/26.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/27.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/28.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/29.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/30.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/31.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/32.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/33.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/34.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/35.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/36.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/37.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/38.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/39.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/40.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/41.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/42.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/43.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/44.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/45.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/46.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/47.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/48.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/49.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/50.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/51.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/52.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/53.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/54.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/55.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/56.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/57.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/58.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/59.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/60.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/61.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/62.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/63.jpg)
A la recherche des objets perdus
Ou: pourquoi les objets ont des noms
![Page 64: La programmation avec ROOT](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/64.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/65.jpg)
Retrouver un objet perdu
• On peut naviguer dans ces listes en utilisant leTBrowser
Clique sur"Canvases"
![Page 66: La programmation avec ROOT](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/66.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/67.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/68.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/69.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/70.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/71.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/72.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/73.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/74.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/75.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/76.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/77.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/78.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/79.jpg)
Ecriture de fonctions
La programmation C++ par les nuls
![Page 80: La programmation avec ROOT](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/80.jpg)
Une fonction• Voici un exemple d'une fonction C++
EN-TETES:Déclarationsnécessaires pourchaque classe utilisée
![Page 81: La programmation avec ROOT](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/81.jpg)
Une fonction• Voici un exemple d'une fonction C++
DECLARATION:Type de retour,nom, etéventuellement desarguments
![Page 82: La programmation avec ROOT](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/82.jpg)
Une fonction• Voici un exemple d'une fonction C++
Bloc "if"
![Page 83: La programmation avec ROOT](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/83.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/84.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/85.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/86.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/87.jpg)
Comment utiliser les arguments• Une fonction avec des arguments:
Liste des argumentsavec leur type
Utilisation desarguments dans lafonction
![Page 88: La programmation avec ROOT](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/88.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/89.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/90.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/91.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/92.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/93.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/94.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/95.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/96.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/97.jpg)
• 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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/98.jpg)
Dernières astuces
![Page 99: La programmation avec ROOT](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/99.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/100.jpg)
Ce que vous risquez en utilisantl’interpréteur…
L’interpréteur Vous
![Page 101: La programmation avec ROOT](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/101.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/102.jpg)
Exercice
Un autre exemple d'analyse de données
![Page 103: La programmation avec ROOT](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/103.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/104.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/105.jpg)
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](https://reader033.vdocuments.pub/reader033/viewer/2022050915/586e0b731a28ab070b8bc1a2/html5/thumbnails/106.jpg)
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"