// il nome del file da aprire, se e' sempre lo stesso, // lo puoi mettere come argomento predefinito // in questo modo, non sara' necessario passarglielo ogni volta. // Se per esempio si chiamarre "dati.dat", basta definire fra le parentesi: // (const char *filename = "dati.dat") void plot(const char *filename, const char *numProt) { // apriamo il file fstream file(filename, ios::in); // prima di tutto lo scorro interamente, // per vedere quante coppie di valori // sono contenute (suppongo che non ci sia un numero isolato) // usero' questo valore in seguito Int_t total = 0; Double_t testX, testY; while (file >> testX >> testY) { total++; } //cout << "Total number of points collected: " << total << endl; // ora la variabile 'total' contiene il numero di righe // inizializzo un array dinamico dimensionato opportunamente Double_t *x = new Double_t[total]; Double_t *y = new Double_t[total]; // chiudo il file e lo riapro // (e' un modo semplice e sicuro per tornare all'inizio di esso) file.close(); fstream file(filename, ios::in); // rileggo le coppie, stavolta memorizzandole nell'array Int_t i; for (i = 0; i < total; i++) { file >> x[i] >> y[i]; } // creo un oggetto TGraph con i dati che ho raccolto // e una finestra ove contenerlo (la ho impostata a 800 x 480 pixel) TCanvas *canvas = new TCanvas("canvas", "canvas", 0, 0, 800, 480); TGraph *graph = new TGraph(total, x, y); // metodo per disegnare il grafico // l'opzione A e' per disegnare gli assi --> NON rimuovere // l'opzione C disegna una curva smooth lungo i punti (spline) // l'opzione P disegna un marker in ogni punto // per scegliere il tipo di marker, basta far partire ROOT e scrivere: // root[0] new TCanvas // al che appare una tipica finestra di ROOT. // nella barra dei menu, cliccare sulla voce "View", e scegliere "Markers". // appare un'altra finestra con tutti i tipi di marker. // Scelto il marker desiderato, si usa il metodo // graph->SetMarkerStyle(n) // ove n e' il numero del marker scelto graph->Draw("AP"); // per fissare il titolo dell'asse X e Y graph->GetXaxis()->SetTitle("Depth (mm)"); graph->GetYaxis()->SetTitle("Normalized Dose (a.u.)"); // per fissare il titolo del grafico char *title = new char[1000]; sprintf(title,"Bragg curve -- protons %s -- Grid Job", numProt); graph->SetTitle(title); //TPaveLabel *label = new TPaveLabel(0.6, 0.05, 0.5, 0.25, numProt); //label->SetBorderSize(0); // per aggiungere scritte un modo veloce e' TPaveLabel // // TPaveLabel *label = new TPaveLabel(x1, y1, x2, y2, testo) // // x1,2 e y1,2 sono le coordinate dei due angoli opposti (basso-sin, alto des) // che sono vlautate in una scala secondo cui l'intero rettangolo del canvas // va da 0,0 a 1,1, quindi lavora di decimali. // testo e' il testo da inserire, che va messo fra virgolette. // per posizionare bene questo oggetto, devi giocarci un pochino finche' // non ti va bene dove sta. // la dimensione del testo dipende da quanto e' grande il box, e sta // tutto su una riga. // Non so usare oggetti che mettono piu' righe di testo, mi pare che // si chiami TPaveText // CONSIGLIO: // usa il metodo label->SetBorderSize(0), cosi' non disegna // il bordo antipaticissimo (se ben ricordo) // per salvare la figura in formato GIF o EPS //canvas->SaveAs("plot.gif"); canvas->SaveAs("plot.eps"); // NB. se esegui in formato batch, FORSE non e' possibile // salvare in formato GIF, ma e' comunque possibile salvare in EPS // e magari in jpeg. Se non e' possibile, lo segnala. }