Histogramme
Répondre à la discussion
Affichage des résultats 1 à 24 sur 24

Histogramme



  1. #1
    DEZZZ

    Talking Histogramme


    ------

    Bonjour,

    Je suis un débutant en ROOT (cern). J'ai un histogramme 2D (.pdf et .root ) et je veux extraire les valeurs de cet histogramme et les mettre dans un fichier texte sous forme d'un tableau. Est ce qu'il y a quelqu'un qui peux m'aider?
    Merci d'avance

    -----

  2. #2
    gemozor

    Re : histogramme

    Bonjour à toi,

    Il faut que tu récupères dans un premier temps l'histrogramme dans ton .root.

    Ensuite tu fais une boucle sur toutes les valeurs de ton histogramme de cette façon :

    int x,y;
    for(int i=0;i<h1->GetNbinsX();i++)
    {
    x=h1->GetBinCenter(i);
    y=h1->GetBinContent(i);

    }

    et tu écris dans un fichier les valeurs de x et y.

    Bien sûr h1 est déclaré comme le pointeur vers ton histo (TH1D,TH2D,TH1F ...).

    Tout ceci est bien expliqué dans la doc de root.

  3. #3
    DEZZZ

    Smile Re : histogramme

    Merci beaucoup.

  4. #4
    DEZZZ

    Re : histogramme

    Merci beaucoup gemezor.
    Est ce que vous pouvez me donner le lien dont ce problème est bien expliqué. Merci d'avance

  5. A voir en vidéo sur Futura
  6. #5
    gemozor

    Re : histogramme

    Tu trouveras toutes les informations sur le site de ROOT dans les pdf associés :

    https://root.cern.ch/drupal/content/...sers-guide-534

    Pour trouver toutes les fonctions qui peuvent être utilisées pour chaque classe, il suffit de taper le nom de la classe sur google et cela t'amèneras directement vers le descriptif du site de root. Si tu n'y arrives toujours pas, je pourrai te donner un exemple complet. Essaye pas toi même déjà

  7. #6
    DEZZZ

    Re : histogramme

    Bonjour Re,

    Merci pour votre réponse. J'ai décidé mais j'ai pas arrivé à écrire le programme désiré. Pouvez me donner un exemple complet et je vous remercie bien.

    Meilleures salutations

  8. #7
    gemozor

    Re : histogramme

    Vous bloquez à quel niveau ?

  9. #8
    DEZZZ

    Re : histogramme

    je vous envoi mon exemple

    #include <iostream>
    #include <iomanip>
    #include "TObjArray.h"
    #include "TFile.h"
    #include "TH1F.h"
    #include "TH2F.h"
    #endif


    using namespace std;

    int nouv(void)

    {
    char hALL[1], Erreur[1];
    TObjArray Hlist(0); // create an array of Histograms
    TH2F* h2;

    // Mon histogramme
    //============================== ================
    const int n = 2267;
    double N[n];
    double Z[n];
    double A[n];
    double def[n];
    double Bexp2[n];
    double Bth[n];
    double err[n];

    for (int i = 0; i < 2267; i++)
    {
    N[i] = 0.0;
    Z[i] = 0.0;
    A[i] = 0.0;
    def[i] = 0.0;
    Bexp2[i] = 0.0;
    Bth[i] = 0.0;
    err[i] = 0.0;

    }

    //TCanvas *c1 = new TCanvas("c1", "c1", 600, 400);
    TH2F *h2 = new TH2F("hALL", "Erreur", 160, 8, 160, 110, 8, 110);


    ifstream fichier("resall12.txt");

    for (int j = 0; j < 2267; j++)
    {
    fichier >> N[j];
    fichier >> Z[j];
    fichier >> A[j];
    fichier >> def[j];
    fichier >> Bexp2[j];
    fichier >> Bth[j];
    fichier >> err[j];

    Hlist.Add(h2);
    h2->Fill(N[j], Z[j], err[j]);


    //mon fichier root ("out.root")

    //============================== =============================
    TFile f("out.root", "recreate");
    Hlist.Write();
    f.Close();
    }

    //fichier texte et les valeurs de l'histogramme
    //============================== ==
    double x[n], y[n], z[n];
    for (int i = 0; i<h2->GetNbinsX(); i++)
    {
    x[i] = h2->GetBinCenter(i);
    y[i] = h2->GetBinContent(i);
    z[i] = h2->GetBinContent(i);

    }

    ofstream fichier2("aa.txt"); // ouverture en écriture avec effacement du fichier ouvert

    for (int k = 0; k < 2267; k++)
    {
    file << x[k] << " " << y[k] << " " << z[k] << endl;
    }

    fichier2.close();

    }

  10. #9
    gemozor

    Re : histogramme

    Il y a plusieurs choses que je comprend pas.

    Pourquoi tu stockes les données de ton fichier resall12.txt dans des tableaux ? Si tu les utilise pas après cela ne sert à rien tu perds de la mémoire pour rien. Cela n'a aucune conséquence si la taille de ton fichier est petite.

    Déclare ton TFile au même endroit que ton histo. Il ne faut pas le déclarer dans une boucle ! A chaque itération de t'as boucle tu crées un pointeur vers un TFile ! Le Write faut le mettre à la sortie de t'as boucle ainsi que le Close. Le Hlist est je pense pas très utile. Tu pourrais directement écrire le tableau dans le point root avec f->Write(). Pas besoin de hlist. N'oublie pas de fermer ton premier fichier : fichier.close();

    Ensuite déclare pas des tableaux pour stocker les données de ton histo. Déclare des doubles à la place qui seront assignés pour GetBinCenter et GetBinContent et écrit directement le fichier dans t'as boucle. Fait pas une autre boucle pour écrire le fichier.
    Dernière modification par gemozor ; 28/05/2015 à 11h46.

  11. #10
    Hermillon73
    Animateur Orientation

    Re : histogramme

    Bonjour,

    https://root.cern.ch/root/html534/gu...Histograms.pdf

    item 1.3.1 (Il faut accéder au "numéro de bin" de votre histo 2D avant d'accéder au contenu du bin, me semble-t-il. Bon, ça fait un bout de temps que je n'ai pas fait ça...)

  12. #11
    DEZZZ

    Re : histogramme

    Merci pour votre réponse. J'ai pas bien compris ce que vous m'avez dit, mais, j'ai corrigé quelques fautes. Je vous envoie de nouveau mon programme. Mon histogramme est "hist.root" et mon fichier texte est "fich.txt". Pouvez vous le corriger et merci

    #include <iostream>
    #include <iomanip>
    #include "TObjArray.h"
    #include "TFile.h"
    #include "TH1F.h"
    #include "TH2F.h"
    #endif


    using namespace std;

    int nouv(void)

    {

    TH2F* h2;


    TFile f("hist.root", "recreate");
    f->Write();
    f->Close();


    double x, y, z;

    ofstream fichier("fich.txt");
    for (int i = 0; i<h2->GetNbinsX(); i++)
    {
    x = h2->GetBinCenter(i);
    y = h2->GetBinContent(i);
    z = h2->GetBinContent(i);
    file << x << " " << y << " " << z << endl;
    }

    fichier.close();

  13. #12
    gemozor

    Re : histogramme

    Fallait pas supprimer la boucle où tu remplis l'histogramme (Fill) !

  14. #13
    DEZZZ

    Re : histogramme

    Mais si n'ai pas les valeurs de l'histogramme. J'ai juste l'histogramme dessiné et je veux extraire les valeurs de l'histogramme et les mettre dans un fichier texte, qu'est ce que je dois faire??

  15. #14
    gemozor

    Re : histogramme

    Ok, si l'histogramme est dans ton .root. Il faut aller le chercher.

    Si ton fichier root ("hist.root") est déjà créé :

    TFile *f = new TFile("hist.root", "READ");
    TH2F *h2 = (TH2F*)f->Get("nom de l'histo");

    Ensuite tu peux jouer avec l'histogramme.

  16. #15
    DEZZZ

    Re : histogramme

    quelle est l'erreur maintenant? Il ne marche pas


    int nouv(void)

    {


    TFile *f = new TFile("hist.root", "READ");
    TH2F *h2 = (TH2F*)f->Get("histALL");

    f->Write();
    f->Close();


    double x, y, z;

    ofstream fichier("fich.txt");
    for (int i = 0; i<h2->GetNbinsX(); i++)
    {
    x = h2->GetBinCenter(i);
    y = h2->GetBinContent(i);
    z = h2->GetBinContent(i);
    file << x << " " << y << " " << z << endl;
    }

    fichier.close();
    }

  17. #16
    gemozor

    Re : histogramme

    Déjà tu n'as pas besoin du Write et du Close pour le TFile puisque tu n'as rien à écrire dedans.

    Pour récupérer les données d'un TH2F regarde de ce côté là :

    https://root.cern.ch/root/html/TH2F.html

    Comme c'est un TH2F (2 dimensions), tu vas avoir besoin d'une double boucle pour parcourir les axes x et y. Le contenu du bin en x,y sera récupéré par :

    z=h2->GetBinContent(x, y);

  18. #17
    gemozor

    Re : histogramme

    Regarde de ce côté là :

    https://root.cern.ch/root/roottalk/roottalk03/2677.html
    Il faut savoir que si tu te poses une question sur root, quelqu'un ce l'ai forcement posée avant !

  19. #18
    DEZZZ

    Re : histogramme

    Merci beaucoup

  20. #19
    DEZZZ

    Re : histogramme

    Bonjour,

    J'ai corrigé mon histogramme. Mais il ne marche pas encore. Pouvez vous me dire ou se trouve la faute.
    Merci pour votre aide

    TFile *f = new TFile("hist.root", "READ");
    TH2F *h2 = (TH2F*)f->Get("histALL");


    ofstream fichier("fich.txt");

    double x, y, z;

    for (int i = 0; i < h2->GetNbinsX(); i++)
    {
    x = h2->GetXaxis()->GetBinCenter(h2->GetXaxis()->FindBin(x));
    }

    for (int i = 0; i < h2->GetNbinsY(); i++)
    {
    y = h2->GetYaxis()->GetBinCenter(h2->GetYaxis()->FindBin(y));
    }

    z = h2->GetBinContent(x, y);


    fichier << x << " " << y << " " << z << endl;

    fichier.close();

  21. #20
    gemozor

    Re : histogramme

    Bonjour à toi,

    Bon tu es pas loin mais je pense que tu as quelques lacunes en programmation C++ non ?

    Premièrement, quand tu as un histogramme en deux dimensions comment peux tu faire pour parcourir tout l'espace ? Il suffit pas de faire deux boucles séparées. Dans ton cas, tu parcours l'axe x puis l'axe y indépendamment. Ce qui est pas bon, il faut deux boucles imbriquées du style :

    for (int i = 0; i < h2->GetNbinsX(); i++)
    {
    for (int j = 0; j < h2->GetNbinsY(); j++)
    {

    }
    }

    Ensuite regarde dans les fonctions que tu appelles. As tu lus sur le site de ROOT comment elles fonctionnent et à quoi elles servent ? Dans ton cas FindBin n'est pas utile. Il faut que tu rentres juste en argument le numéro du canal dans GetBinCenter. Ensuite pourquoi la valeur en z est en dehors des boucles ? De plus, en argument de BinContent il faut le numéro du canal.

    Enfin, la sortie des données dans le fichier doit se faire dans la boucle.

  22. #21
    DEZZZ

    Re : histogramme

    Merci pour votre réponse. Mais qu'est ce que vous voulez dire par "numéro du canal"? Merci

  23. #22
    gemozor

    Re : histogramme

    Le numéro du canal = numéro du bin de l'histogramme. Tu y as accès via l'indice des boucles.

  24. #23
    DEZZZ

    Re : histogramme

    Voilà j'ai corrigé tout ce que vous m'avez dit.

    TFile *f = new TFile("hist.root", "READ");
    TH2F *h2 = (TH2F*)f->Get("histALL");


    ofstream fichier("fich.txt");

    double x, y, z;

    for (int i = 0; i < h2->GetNbinsX(); i++)
    {
    x = h2->GetXaxis()->GetBinCenter(h2->GetXaxis());


    for (int j = 0; j < h2->GetNbinsY(); j++)

    {
    y = h2->GetYaxis()->GetBinCenter(h2->GetYaxis());
    }

    z = h2->GetBinContent(x, y);


    fichier << x << " " << y << " " << z << endl;
    }





    fichier.close();


    Il me dit : illegal pointer to class object h2

  25. #24
    gemozor

    Re : histogramme

    Il faut que tu vires h2->GetXaxis() en argument des fonctions GetBinCenter ! Cela n'a pas de sens ! Il te faut le numéro du canal en argument de GetBinCenter. J'ai dit dans mon message précédent que tu y avais accès via l'indice de t'as boucle.

    Il faut donc h2->GetYaxis()->GetBinCenter(j) pour l'axe des y et h2->GetYaxis()->GetBinCenter(i) pour l'axe des abscisses. Enfin, pour la coordonnée z, elle est pas à la bonne place, il faut qu'elle soit dans la bouche j. Et les arguments encore une fois doivent être i et j (les numéros des bins)...

    As tu déjà fait du C++ en dehors de ROOT ? Car je pense que tu comprends pas ce que tu fais. Je te conseille le cours de OpenClassRooms (anciennement Siteduzero) pour avoir les bases (pointeurs, classes et héritage de classes) :

    http://openclassrooms.com/courses/pr...c-le-langage-c

    Enfin, lit la doc de ROOT aussi.

Discussions similaires

  1. Histogramme
    Par Came31 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 12/01/2013, 15h41
  2. [Matlab] Histogramme
    Par andrew_77 dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 08/12/2012, 03h31
  3. histogramme empilé *2
    Par a freind dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 28/11/2012, 22h25
  4. Histogramme avec R
    Par invitef702cf04 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 20/04/2012, 19h11
  5. histogramme opencv
    Par invite13e724e8 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 06/04/2010, 11h22