Textfile lesen



  • Also bei mir kommt da raus:

    $ g++ orig.cpp&&./a.out|grep Found|wc -l
    11276
    

    Aber warum nicht einfach alles wegschmeißen und es so machen: root starten und eingeben:

    auto t = new TTree("t", "t");
    t->ReadFile("data.txt", "q2lo/D:q2hi:ylo:yhi:qTlo:qThi:PDF0:uncertainty");
    t->Draw("PDF0>>h(100,-20,20)");
    

    oder halt nach dem ReadFile einfach nen TBrowser starten.



  • Aus dem TTree kann ich "yield" einlesen oder?



  • @Zafar sagte in Textfile lesen:

    Aus dem TTree kann ich "yield" einlesen oder?

    Das, was du offenbar yield nennst, ist in der Datei doch die vorletzte Spalte. Die scheint doch der Überschrift nach PDF0 zu heißen. Aber den Namen kannst du doch frei vergeben in dem ReadFile.

    Generell: ich würde dir gleiche Namen für gleiche Dinge raten. Wenn es in der Überschrift q2lo und q2hi heißt, warum nicht dann auch die Variablen exakt so benennen?



  • @Zafar sagte in Textfile lesen:

    @wob Ich habe die ersten 50 Zeilen genommen und es hat problemlos funktioniert. Nur bei mehr als 10000 Zeilen ignoriert er die ersten Zeilen, voll komisch.

    Das Output startet einfach ab Zeile 1279

    Wie groß ist denn der Buffer deiner Konsole?

    Leite die Ausgabe doch mal in eine Datei um.



  • @DirkB sagte in Textfile lesen:

    Wie groß ist denn der Buffer deiner Konsole?

    Da die Datei 11276 Datenzeilen hat, rate ich einfach mal: 10.000 Zeilen 😉



  • Der Zeilenpuffer Limit war tatsächlich bei 10000. Es lag tatsächlich an diesem Limit. Es war nur eine kleine Feinjustierung nötig 🙄

    Trotzdem vielen Dank für die Hilfen!



  • @wob , ich habe versucht meinen Histogram mit dem yield und den Bins zu erstelle. ich bekomme irgendwie eine Endlosschleife , wobei der yield immer 0 ist bei printf. Die Variablen nbinsx und nbinsy habe ich vorher deklariert und sind die Anzahl der Bins in x und y Richtung.

    while (in) {
            in_pos = in.tellg();
            if (in >> m_low >> m_high >> y_low >> y_high >> pt_low >> pt_high >> yield >>
                uncertainty) {
    			if(y_low > 6) continue;
    			yield = yield  * 1e-15 * 2.632e-11;
    			for (int i=1;i<=nbinsx;i++)
    			{
    				for(int j=1;j<=nbinsy;j++)
    				
    				{	printf("Found entry, yield is %f\n", yield);
    					drell->SetBinContent(i,j,yield);
    				}
           
    			}
    


  • Generell: ich nehme an, dass drell vom Typ TH2* ist. Was ist nicht verstehe ist, warum du überhaupt eine Loop über die Bins machst und dort SetBinContent aufrufst. Es ergibt doch gar keinen Sinn, innderhalb der Loop jedes Bin auf denselben Wert zu setzen. Warum nutzt du nicht Fill(...)?

    Was soll denn auf die X-Achse und was auf die Y-Achse? Dieses schöne Programm hin oder her, aber wäre es nicht viel viel einfacher, aus dem Tree (siehe mein Dreizeiler oben) ein Histogramm zu erzeugen?

    Wert = 0: dir ist schon klar, dass 1e-15 * 2.632e-11 = 2.63e-26 ist? Und dass das verdammt klein ist? Was sind das überhaupt für Werte? Nutze Konstanten und benenne diese Werte!



  • @wob
    Ja drell is vom Typ TH2D*.
    Das sind meine Bingrenzen und mein drell:

    Int_t nbinsx = 25;
    Double_t binsmee[26] = {2, 2.25, 2.5, 2.75, 3., 3.25, 3.5, 3.75, 4., 4.25, 4.5, 4.75, 5., 5.25, 5.5, 5.75, 6, 6.25, 6.5, 6.75, 7., 7.25, 7.5, 7.75, 8., 20.};
    Int_t nbinsy = 41;
    Double_t binsptee[42] = {0., 0.25, 0.5, 0.75, 1., 1.25, 1.5, 1.75, 2., 2.25, 2.5, 2.75, 3., 3.25, 3.5, 3.75, 4., 4.25, 4.5, 4.75, 5., 5.25, 5.5, 5.75, 6., 6.25, 6.5, 6.75, 7., 7.25, 7.5, 7.75, 8., 8.25, 8.5, 8.75, 9., 9.25, 9.5, 9.75, 10., 20.};
    TH2D *drell = new TH2D("drell", "Drell Yann", nbinsx, binsmee, nbinsy, binsptee);
    

    Jetzt wollte ich den Loop über meine bins in x-Richtung (mee) und y-Richtung (ptee) machen und den yield füllen.
    Die Werte in dem yield sind einfach Einheitsumrechnungen.

    Meinst du Fill(yield) einfach?



  • @Zafar schau dir doch mal irgendein einfaches ROOT-Tutorial an oder frag jemanden in deiner Arbeitsgruppe mit IT-Erfahrung.

    Für mich klingt das so, als wolltest du

    tree->Draw(...dein 2d-Histo, mit : die Variablen trennen);
    tree->Draw("mee:ptee", "yield", "colz") // oder so? mit x, y und yield als Füllwert?
    

    "in kompliziert" machen. Den cut (y_low<6) kannst du im weight angeben und den Scalefactor kannst du nachher einmalig auf das ganze Histogramm anwenden. (und das gewünschte Binning bekommst du, indem zu das TH2 erst anlegst und im Draw dann Draw("x:y>>my_predef_histo", ...) machst.

    PS: Drell-Yan hat nur ein n.


Anmelden zum Antworten