(cpp-run-analyze-reader)= # Walkthrough: Executing the AnalyzeReader macro **(10 minutes)** As it stands, the **`AnalyzeReader`** macro does nothing, but let's learn how to run it anyway. Quit ROOT, then start it again with the name of our macro: > root AnalyzeReader.C ROOT will start, then automatically interpret and execute {file}`AnalyzeReader.C`. If you want to run it again without quitting ROOT, use the `.x` command: [] .x AnalyzeReader.C If you make changes to {file}`AnalyzeReader.C` then execute it with `.x` again, ROOT will interpret your changes.[^save] [^save]: That is, if you've used your text editor to save the changes in the file. Every once a while a student tells that ROOT didn't recognize something that they changed, and it turns out the student forgot to do {menuselection}`File --> Save`. Since we haven't included any analysis code yet, you won't see anything happen. We'll remedy that in the next section. :::{admonition} Understanding the commands :class: note Get used to these commands. You'll be executing them over and over again for the next several exercises. Remember, the up-arrow and tab keys are your friends! Let's review what's happening: - When you use `.x` (for "eXecute"), you cause ROOT's C++ intepreter to read your file. - If the name of the function in the file is the same as the file's name (without the `.C), ROOT will automatically run that function. - As you saw in {numref}`Listing %s `, the function **`AnalyzeReader`** does the following: - Uses **`TFile`** to create a pointer to the file {file}`experiment.root`. - Create a **`TTreeReader`** to access an n-tuple in the file. - Create one **`TTreeReaderValue`** pointer for each variable we plan to use. - Executes the loop code for each entry in the tree, referring to the variables you defined with **`TTReaderValue`** as pointers. - Executes your wrap-up code. If you went through the {ref}`TSelector macro ` part as well as this one, you'll notice that this {file}`AnalyzeReader.C` macro is faster. Yay! ::: :::{admonition} The rest of the C++ Path :class: warning The subsequent sections of the tutorial are written with the `TSelector` approach in mind. Since you're a C++ programmer, I'll assume you'll be able to interpolate to the execution instructions I give above. For the most part, this won't be an issue; I'll refer to necessary program edits as taking place in the "Definition" section, the "Loop" section, or whatever. Any such edits would be same in both approaches. Just in case, I'll remind you of a couple of things: - When you see something like "You can copy the file {file}`AnalyzeExercise5.C` from my area," be mindful that any such file will be a TSelector-style macro, not a TTreeReader-style macro. - When you see **`MakeSelector`**, that doesn't apply to you. Just make a copy of {file}`AnalyzeReader.C` and edit the new copy; e.g., > cp AnalyzeReader.C AnalyzeExercise6.C # edit AnalyzeExercise6.C > root AnalyzeExercise6.C [] .x AnalyzeExercise6.C - Every time you see a mention of an n-tuple variable that you haven't used before, you have to define a **`TTreeReaderValue`** for it. The users of `TSelector` have this defined in their file {file}`Analyze.C`, where they don't have to look at it. - I talk about **`GetEntry`** in a few places. You don't use this in your "Loop" section. - The students working with **`TSelector`** have to restart ROOT every time they edit their macro. You don't have to do this. :::