//////////////

script: http://goo.gl/LcLaQo
simple.root : http://goo.gl/rKkHt0

/*
*    In this tutorial,
*    We will expore the TCut, TCutG,
*    and some useful skills for Draw() and Scan() method.
*
*******************************************************************/
{
//________________Part 1 "Draw"________________________

TFile* f = new TFile("simple.root");
TTree* t;
f->GetObject("t",t);

TCanvas* c1 = new TCanvas("c1", "my histo", 500, 800);
c1->Divide(1,2);
/*
| set a Canvas with the title "my histo"
| width  = 500 px.
| height = 800 px.
|
| Divide to sub_Pad, 1 col X 2 row
|
*/

c1->cd(1);  t->Draw("money");
c1->cd(2);  t->Draw("money", "money < 2000");
/*
| whole data, and partial data from the selection.
| x axis: money value
| y axis: counts (frequency)
|
*/

c1->cd(1);  t->Draw("log10(money)");
c1->cd(2);  t->Draw("sqrt(money)");
/*
|
| you can use math.
| ie. you can call function, and get the return value.
|
*/

c1->cd(1); t->Draw("money", "money > 1000 && money < 2000 ");
c1->cd(2); t->Draw("money", "money < 1000 || money > 2000 ");
/*
|
| Logic operator
| &&, ||, etc to combine the selection.
|
*/

/*
|
| Using TCut obj
| to make the selection input easier.
|
*/
TCut cut1 = "money < 1000";
TCut cut2 = "money > 2000";
c1->cd(1); t->Draw("money");
c1->cd(2); t->Draw("money", cut1 || cut2);

t->Draw("money>>h1(2000,0,4000)", "", "goff");
t->Draw("money>>h2(2000,0,4000)", cut1 || cut2, "goff");
c1->cd(1); h1->Draw();
c1->cd(2); h2->Draw();
/*
|
| redirect to a histogram
|
| num of bin = 2000
| x-axis from 0 to 4000
|
| in this way, it is convenient histo to files.
*/

//________________Part 2 "Draw" with TCutG_____________________

TCanvas* c2 = new TCanvas("c2", "my 2D plot", 500, 500);
t->Draw("x:y>>hxy(2000,0,1500,2000,0,12000)", "", "colz");
/*
| x-axis = value of x
| y-axis = value of y
| color  = counts ( frequency)
| x-axis range = 0 to  1500
| y-axis range = 0 to 12000
| option: colz, surf, lego, etc...
*/

/*
| to make a graphic cut
| 1) at menu bar "view" -> "Toolbar"
| 2) at toolbar select the icon of scissors
| 3) use mouse left click to draw a region.
| 4) use double click to finish the region.
| 5) select the outline, and right click --> "SetName"
| 6) give a name, ex mycut
*/

t->Draw("x:y>>hxy(2000,0,1500,2000,0,12000)", "mycut",  "colz");
t->Draw("x:y>>hxy(2000,0,1500,2000,0,12000)", "!mycut", "colz");

c1.cd(1); t->Draw("money", "mycut", "");
c1.cd(2); t->Draw("money", "", "");

TFile g("cut.root","recreate");
mycut->Write();
/*
|   save the mycut to file, then you can reuse it again.
|   you can also modify it.
|
*/

TCanvas* ctest = new TCanvas("ctest", "just for test", 500, 500);
mycut->Draw();
mycut->Print();

/*
|   for refining the region,
|
|   you can use Print(), and use SetPoint() method,
|   ex. mycut->SetPoint(14, 100,1000 );
*/

f->Close();

//________________Part 3 Scan_____________________

TFile* f = new TFile("simple.root");

TTree* t;
f->GetObject("t",t);

t->Scan("*")

/* about the number of entries on print */
t->SetScanField(10);
t->Scan("*")

/* about the column width */
t->Scan("*","","colsize=20")
t->Scan("*","","col=5:10:15")

/* about the precision */
t->Scan("*","","colsize=15 precision=4")
t->Scan("*","","col=5.0F:10.0F:15.0F")
t->Scan("*","","col=5.1F:10.2F:15.3F")

/* about the range */
t->Scan("*","","",10,0) // 10 runs, start from index = 0
t->Scan("*","","",10,5) // 10 runs, start from index = 5

/* about math or invoking function */
t->Scan("sqrt(money)",        "", "colsize=15", 10,0 )
t->Scan("TMath::Log2(money)", "", "colsize=15", 10,0 )

f->Close();

/*
|
|   4 Special variables for array:
|   Entry\$ , Entries\$, Length\$, Iteration\$
*/

// Let's create some data first.

TFile* f2 = new TFile("simple_array.root","recreate");
TTree* t  = new TTree("t", " array ");

vector<Int_t> x;
/*
|   think of it is a class from vector,
|   with Int_t type specified in the template.
*/

t->Branch("x",&x);

x.push_back(10);
x.push_back(11);
x.push_back(12);
t->Fill(); x.clear();
/*
|   push_back() to add elements
|       clear() to clear all elements
|        size() to return number of elements.
|          at()
|            []
*/

x.push_back(9);
x.push_back(99);
x.push_back(7);
x.push_back(77);
x.push_back(777);
t->Fill(); x.clear();

x.push_back(2);
x.push_back(21);
x.push_back(121);
x.push_back(111);
x.push_back(333);
x.push_back(444);
x.push_back(555);
t->Fill(); x.clear();

t->Write();

t->Scan("x");
t->Scan("x:Entry\$:Entries\$");
/*
|    Entry\$   represents the current run number.
|    Entries\$ represents the total run number.
*/

t->Scan("x:Length\$(x):Entry\$");
t->Scan("x:Length\$(x):Iteration\$");
/*
|    Length\$(x)  returns the size of x
|    Iteration\$  returns the current index.
*/

t->Scan("x : x[Iteration\$+1] :x[Iteration\$+2]");
t->Scan("x : x: x[Length\$(x)-1]");
/*
|    x[i] : x[i+1] : x[i+2]
|    x[i] : x   : x[end]
*/

f->Close();

}