// per eseguire questa macro dalla linea di comando, bisogna richiamarla come una funzione C++, usando le parentesi // esempio: // prompt>root 'plot.C("dati.txt",3000)' // prompt>root plot.C\(\"dati.txt\",3000\) // 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 Int_t numProt, Int_t total = 0) { // apre il file specificato in argomento, in modalità input fstream file(filename, ios::in); // se il terzo argomento (total) è inizializzato, la macro assume // che esso corrisponda al numero di righe del file (o comunque, il num di righe da leggere) // altrimenti, semplicemente facendo una lettura di tutte le coppie X,Y, conta le righe if (total == 0) { Double_t testX, testY; while (file >> testX >> testY) total++; } printf("Total number of points collected: %d", total); //cout << "Total number of points collected: " << total << endl; // ora la variabile 'total' contiene il numero di righe // 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); // inizializzo un array dinamico dimensionato opportunamente Double_t *x = new Double_t[total]; Double_t *y = new Double_t[total]; // rileggo le coppie, stavolta memorizzandole nell'array // nel frattempo incrementa un contatore, di modo che, nel caso in cui il file finisca // prima di avere letto 'total' righe, riaggiusta 'total' al numero di righe lette Int_t i, count = 0; for (i = 0; i < total; i++) { file >> x[i] >> y[i]; count++; if (file.eof()) { cerr << "File EOF reached after " << count << " lines" << endl; total = count; break; } } // 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 %d -- 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) // salva la figura in formato EPS, creando un file che ha lo stesso nome // del file di dati inserito, con in più l'estensione .EPS // Es. se il file è "dati.txt", l'immagine sarà "dati.txt.eps" //canvas->SaveAs(Form("%s.eps", filename)); canvas->SaveAs("plot.eps"); }