(plotting-function)= # Walkthrough: Plotting a function **(15 minutes)** Let's plot a simple function. Start ROOT and type the following at the prompt:[^f17] [] TF1 f1("func1","sin(x)/x",0,10) [] f1.Draw() :::{note} Note the use of C++ syntax to invoke ROOT commands.[^f18] ROOT may help you out with context-based colors for the keywords it recognizes. In C++ notation, the first command says: Create an object ("f1") that is a TF1 (we'll get to what that is in a moment) with some properties (name, function, low range, high range). The second command tells f1 to draw itself. When you type in the first command, you may see something like (TF1 &) Name: func1 Title: sin(x)/x Don't worry about this. It's not an error.[^f19] If you have a keen memory (or you type `.help` on the ROOT command line), you'll see that neither `TF1` nor any of its methods are listed as commands. The only place that the complete ROOT functionality is documented is on the ROOT web site.[^roothelp] ::: Go to the ROOT web site at [https://root.cern/](https://root.cern/) (I suggest you bookmark this site[^f20]), click on `Reference`, then on `All Classes` on the left-hand side, then on `TF1`; you may want to use the browser menu {menuselection}`Edit --> Find` and search on `TF1` to locate that link.[^f21] Scroll down the page; you'll see some documentation and examples, the class methods, then method descriptions. :::{note} Get to know your way around this web site. You'll come back often. Also note that when you executed `f1.Draw()` ROOT created a canvas for you named `c1`. "Canvas" is ROOT's term for a window that contains ROOT graphics; everything ROOT draws must be inside a canvas.[^f22] ::: Bring window `c1` to the front by left-clicking on it. As you move the mouse over different parts of the drawing (the function, the axes, the graph label, the plot edges) note how the shape of the mouse changes. Right-click the mouse on different parts of the graph and see how the pop-up menu changes. Position the mouse over the function itself (it will turn into a pointing finger or an arrow). Right-click the mouse and select {guilabel}`SetRange`. Set the range to xmin=-10, xmax=10, and click **OK**. Observe how the graph changes.[^f23]$^,$[^f24] Let's get into a good habit by labeling our axes. Right-click on the x-axis of the plot, select {guilabel}`SetTitle`, enter "x [radians]", and click `OK`. :::{note} Right-clicking on the axis title gives you a `TCanvas` pop-up, not a text pop-up; it's as if the title wasn't there. Only if you right-click on the axis can you affect the title. In object-oriented terms, the title and its centering are a property of the axis. It's a good practice to always label the axes of your plots. Don't forget to include the units. ::: :::{figure-md} convincing-fig :class: align-center xkcd convincing by Randall Munroe ::: Do the same thing with the y-axis; call it "sin(x)/x". Select the {guilabel}`RotateTitle` property of the y-axis and see what happens. You can zoom in on an axis interactively. Left-click on the number "2" on the x-axis, and drag to the number "4". The graph will expand its view. You can zoom in as much as you like. When you've finished, right-click on the axis and select {guilabel}`UnZoom`. You have a lot of control over how this plot is displayed. Select {menuselection}`View --> Editor`. Play around with this a bit. Click on different parts of the graph; notice how the options automatically change. Select {menuselection}`View --> Toolbar`; among other options, you can see how you can draw more objects on the plot. There's no simple `Undo` command, as there might be in a dedicated graphics program, but you can usually right-click on an object and select `Delete` from the pop-up menu. If you want to change the color of the function, right-click on the function and select `SetLineAttributes`. :::{note} If you "ruin" your plot, you can always quit ROOT and start it again. We're not going to work with this plot in the future anyway. You may notice Help menus and icons that appear to offer explanations, like **?**. They worked in earlier versions of ROOT. Unfortunately, at some point in the last few years these links stopped working, probably due to a reorganization of the ROOT web site. Maybe the ROOT developers will fix this someday, but probably not: It's just as easy to do a web search of the form "cern root axis SetRange". ::: :::{figure-md} decline-fig :class: align-center xkcd decline by Randall Munroe. If you have a choice, ruin the plot. Don't let the plot ruin you. ::: [^f17]: I'm starting with "basic" ROOT, which has a command syntax based on C++. For Python users, we'll explore pyroot later. For these simple examples, the ROOT commands are almost the same in both languages anyway. [^f18]: I'm simplifying. ROOT doesn't use a C++ compiler, but an interpreter called "cling" that duplicates most of the C++ language specification. It's meant to provide an interactive experience similar to Python. [^roothelp]: If you remember the output from when you typed `.help`, you may be tempted to try `.help TF1`. Don't bother. What will happen is that ROOT will start up a web browser to take you to the TF1 page on the ROOT web site. This may sound convenient, and it can be... *if* you're running ROOT directly on your laptop. However, if you're running ROOT on a remote server (as I recommend), it will start up the web browser *on the remote server*. Your screen will lock up for a couple of minutes as it pushes the web browser graphics from the server to your screen, and the resultant browser window will be slow and laggy. [^f19]: If it's not an error, what is it? ROOT is printing out the type (TF1 &) and information about the object you've just created. When you become more familiar with programming, you'll see that ROOT is printing out the result of creating the TF1 object, in the same way it would print the result if you typed 2+3. [^f20]: I suggest you also bookmark the location of the [ROOT User's Guide](https://root.cern/root/htmldoc/guides/users-guide/ROOTUsersGuide.html). It's a trifle out-of-date (and hard to find on the ROOT web site), but it's a useful supplement to this tutorial. Here's {ref}`more ` on ROOT's documentation. [^f21]: Assuming that ROOT hasn't reorganized their web site (which they do periodically) since I last reviewed this tutorial, here are the links to [ROOT's list of classes](https://root.cern/doc/master/annotated.html) and to the [description of the TF1 class](https://root.cern/doc/master/classTF1.html). [^f22]: I'm simplifying again. The actual rule is that everything ROOT draws must be inside a "`TPad`". Unless you want to add graphics widgets to a window (e.g., buttons and menus), this distinction won't matter to you. [^f23]: Did you get something funky instead? You probably right-clicked on the axis, not the function. Quit ROOT and start from the beginning. Question: Why did the graph change in such an unexpected way? For the answer, locate the description of the `TAxis` class on the ROOT web site and look at the `SetRange` method within that class. [^f24]: Note that ROOT handles the case where x=0 correctly. If you're a math major, this may make you think. What happens if you plot cos(x)/x? tan(x)/x?