Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
FirstContour.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_hist
3 /// \notebook
4 /// Make a contour plot and get the first contour in a TPolyMarker.
5 /// This macro generates a color contour plot by selecting entries
6 /// from an ntuple file.
7 /// The TGraph object corresponding to the first contour line is
8 /// accessed and displayed into a separate canvas.
9 ///
10 /// \macro_code
11 ///
12 /// \author Rene Brun
13 
14 void FirstContour()
15 {
16  TString dir = gROOT->GetTutorialDir();
17  dir.Append("/hsimple.C");
18  dir.ReplaceAll("/./","/");
19  if (!gInterpreter->IsLoaded(dir.Data())) gInterpreter->LoadMacro(dir.Data());
20  TFile *file = (TFile*)gROOT->ProcessLineFast("hsimple(1)");
21  if (!file) return;
22  TTree *ntuple = (TTree*)file->Get("ntuple");
23 
24  TCanvas *c1 = new TCanvas("c1","Contours",10,10,800,600);
25  ntuple->Draw("py:px","px*px+py*py < 20", "contz,list");
26 
27  //we must call Update to force the canvas to be painted. When
28  //painting the contour plot, the list of contours is generated
29  //and a reference to it added to the Root list of special objects
30  c1->Update();
31 
32  TCanvas *c2 = new TCanvas("c2","First contour",100,100,800,600);
33 
34 
35  TObjArray *contours =
36  (TObjArray*)gROOT->GetListOfSpecials()->FindObject("contours");
37  if (!contours) return;
38  TList *lcontour1 = (TList*)contours->At(0);
39  if (!lcontour1) return;
40  TGraph *gc1 = (TGraph*)lcontour1->First();
41  if (!gc1) return;
42  if (gc1->GetN() < 10) return;
43  gc1->SetMarkerStyle(21);
44  gc1->Draw("alp");
45 
46  //We make a TCutG object with the array obtained from this graph
47  TCutG *cutg = new TCutG("cutg",gc1->GetN(),gc1->GetX(),gc1->GetY());
48 
49  //We create a polymarker object with npmax points.
50  const Int_t npmax = 50000;
51  TPolyMarker *pm = new TPolyMarker(npmax);
52  Int_t np = 0;
53  while(1) {
54  Double_t x = -4 +8*gRandom->Rndm();
55  Double_t y = -4 +8*gRandom->Rndm();
56  if (cutg->IsInside(x,y)) {
57  pm->SetPoint(np,x,y);
58  np++;
59  if (np == npmax) break;
60  }
61  }
62  pm->Draw();
63 }