Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
ProofTests.C
Go to the documentation of this file.
1/// \file
2/// \ingroup tutorial_ProofTests
3///
4/// Auxilliary selector used to test PROOF functionality
5///
6/// \macro_code
7///
8/// \author Gerardo Ganis (gerardo.ganis@cern.ch)
9
10#define ProofTests_cxx
11
12#include "ProofTests.h"
13#include <TEnv.h>
14#include <TH1F.h>
15#include <TH1I.h>
16#include <TMath.h>
17#include <TString.h>
18#include <TSystem.h>
19#include <TParameter.h>
20
21//_____________________________________________________________________________
22ProofTests::ProofTests()
23{
24 // Constructor
25
26 fTestType = 0;
27 fStat = nullptr;
28}
29
30//_____________________________________________________________________________
31ProofTests::~ProofTests()
32{
33 // Destructor
34
35}
36
37//_____________________________________________________________________________
38void ProofTests::ParseInput()
39{
40 // This function sets some control member variables based on the input list
41 // content. Called by Begin and SlaveBegin.
42
43 // Determine the test type
44 TNamed *ntype = dynamic_cast<TNamed*>(fInput->FindObject("ProofTests_Type"));
45 if (ntype) {
46 if (!strcmp(ntype->GetTitle(), "InputData")) {
47 fTestType = 0;
48 } else if (!strcmp(ntype->GetTitle(), "PackTest1")) {
49 fTestType = 1;
50 } else if (!strcmp(ntype->GetTitle(), "PackTest2")) {
51 fTestType = 2;
52 } else {
53 Warning("ParseInput", "unknown type: '%s'", ntype->GetTitle());
54 }
55 }
56 Info("ParseInput", "test type: %d (from '%s')", fTestType, ntype ? ntype->GetTitle() : "undef");
57}
58
59//_____________________________________________________________________________
60void ProofTests::Begin(TTree * /*tree*/)
61{
62 // The Begin() function is called at the start of the query.
63 // When running with PROOF Begin() is only called on the client.
64 // The tree argument is deprecated (on PROOF 0 is passed).
65}
66
67//_____________________________________________________________________________
68void ProofTests::SlaveBegin(TTree * /*tree*/)
69{
70 // The SlaveBegin() function is called after the Begin() function.
71 // When running with PROOF SlaveBegin() is called on each slave server.
72 // The tree argument is deprecated (on PROOF 0 is passed).
73
74 TString option = GetOption();
75
76 // Fill relevant members
77 ParseInput();
78
79 // Output histo
80 fStat = new TH1I("TestStat", "Test results", 20, .5, 20.5);
81 fOutput->Add(fStat);
82
83 // We were started
84 fStat->Fill(1.);
85
86 // Depends on the test
87 if (fTestType == 0) {
88 // Retrieve objects from the input list and copy them to the output
89 // H1
90 TList *h1list = dynamic_cast<TList*>(fInput->FindObject("h1list"));
91 if (h1list) {
92 // Retrieve objects from the input list and copy them to the output
93 TH1F *h1 = dynamic_cast<TH1F*>(h1list->FindObject("h1data"));
94 if (h1) {
95 TParameter<Double_t> *h1avg = dynamic_cast<TParameter<Double_t>*>(h1list->FindObject("h1avg"));
96 TParameter<Double_t> *h1rms = dynamic_cast<TParameter<Double_t>*>(h1list->FindObject("h1rms"));
97 if (h1avg && h1rms) {
98 if (TMath::Abs(h1avg->GetVal() - h1->GetMean()) < 0.0001) {
99 if (TMath::Abs(h1rms->GetVal() - h1->GetRMS()) < 0.0001) {
100 fStat->Fill(2.);
101 }
102 }
103 } else {
104 Warning("SlaveBegin", "%d: info 'h1avg' or 'h1rms' not found!", fTestType);
105 }
106 } else {
107 Warning("SlaveBegin", "%d: input histo 'h1data' not found!", fTestType);
108 }
109 } else {
110 Warning("SlaveBegin", "%d: input list 'h1list' not found!", fTestType);
111 }
112 // H2
113 TList *h2list = dynamic_cast<TList*>(fInput->FindObject("h2list"));
114 if (h2list) {
115 // Retrieve objects from the input list and copy them to the output
116 TH1F *h2 = dynamic_cast<TH1F*>(h2list->FindObject("h2data"));
117 if (h2) {
118 TParameter<Double_t> *h2avg = dynamic_cast<TParameter<Double_t>*>(h2list->FindObject("h2avg"));
119 TParameter<Double_t> *h2rms = dynamic_cast<TParameter<Double_t>*>(h2list->FindObject("h2rms"));
120 if (h2avg && h2rms) {
121 if (TMath::Abs(h2avg->GetVal() - h2->GetMean()) < 0.0001) {
122 if (TMath::Abs(h2rms->GetVal() - h2->GetRMS()) < 0.0001) {
123 fStat->Fill(3.);
124 }
125 }
126 } else {
127 Warning("SlaveBegin", "%d: info 'h2avg' or 'h2rms' not found!", fTestType);
128 }
129 } else {
130 Warning("SlaveBegin", "%d: input histo 'h2data' not found!", fTestType);
131 }
132 } else {
133 Warning("SlaveBegin", "%d: input list 'h2list' not found!", fTestType);
134 }
135
136 TNamed *iob = dynamic_cast<TNamed*>(fInput->FindObject("InputObject"));
137 if (iob) {
138 fStat->Fill(4.);
139 } else {
140 Warning("SlaveBegin", "%d: input histo 'InputObject' not found!", fTestType);
141 }
142 } else if (fTestType == 1) {
143 // We should find in the input list the name of a test variable which should exist
144 // at this point in the gEnv table
145 TNamed *nm = dynamic_cast<TNamed*>(fInput->FindObject("testenv"));
146 if (nm) {
147 if (gEnv->Lookup(nm->GetTitle())) {
148 fStat->Fill(2.);
149 } else {
150 Warning("SlaveBegin", "%d: lookup for '%s' failed!", fTestType, nm->GetTitle());
151 gEnv->Print();
152 }
153 } else {
154 Warning("SlaveBegin", "%d: TNamed with the test env info not found!", fTestType);
155 }
156 } else if (fTestType == 2) {
157 // We should find in the input list the list of names of test variables which should exist
158 // at this point in the gEnv table
159 TNamed *nm = dynamic_cast<TNamed*>(fInput->FindObject("testenv"));
160 if (nm) {
161 TString nms(nm->GetTitle()), nam;
162 Int_t from = 0;
163 while (nms.Tokenize(nam, from, ",")) {
164 if (gEnv->Lookup(nam)) {
165 Double_t xx = gEnv->GetValue(nam, -1.);
166 if (xx > 1.) fStat->Fill(xx);
167 } else {
168 Warning("SlaveBegin", "RC-env '%s' not found!", nam.Data());
169 }
170 }
171 } else {
172 Warning("SlaveBegin", "%d: TNamed with the test env info not found!", fTestType);
173 }
174 }
175}
176
177//_____________________________________________________________________________
178Bool_t ProofTests::Process(Long64_t)
179{
180 // The Process() function is called for each entry in the tree (or possibly
181 // keyed object in the case of PROOF) to be processed. The entry argument
182 // specifies which entry in the currently loaded tree is to be processed.
183 // It can be passed to either ProofTests::GetEntry() or TBranch::GetEntry()
184 // to read either all or the required parts of the data. When processing
185 // keyed objects with PROOF, the object is already loaded and is available
186 // via the fObject pointer.
187 //
188 // This function should contain the "body" of the analysis. It can contain
189 // simple or elaborate selection criteria, run algorithms on the data
190 // of the event and typically fill histograms.
191 //
192 // The processing can be stopped by calling Abort().
193 //
194 // Use fStatus to set the return value of TTree::Process().
195 //
196 // The return value is currently not used.
197
198 return kTRUE;
199}
200
201//_____________________________________________________________________________
202void ProofTests::SlaveTerminate()
203{
204 // The SlaveTerminate() function is called after all entries or objects
205 // have been processed. When running with PROOF SlaveTerminate() is called
206 // on each slave server.
207
208}
209
210//_____________________________________________________________________________
211void ProofTests::Terminate()
212{
213 // The Terminate() function is the last function to be called during
214 // a query. It always runs on the client, it can be used to present
215 // the results graphically or save the results to file.
216
217}
Auxilliary selector used to test PROOF functionality.
bool Bool_t
Definition RtypesCore.h:63
int Int_t
Definition RtypesCore.h:45
double Double_t
Definition RtypesCore.h:59
long long Long64_t
Definition RtypesCore.h:80
constexpr Bool_t kTRUE
Definition RtypesCore.h:100
R__EXTERN TEnv * gEnv
Definition TEnv.h:170
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
Definition TError.cxx:218
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
Definition TError.cxx:229
Option_t Option_t option
void Print(Option_t *option="") const override
Print all resources or the global, user or local resources separately.
Definition TEnv.cxx:556
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
Definition TEnv.cxx:491
virtual TEnvRec * Lookup(const char *n) const
Loop over all resource records and return the one with name.
Definition TEnv.cxx:547
1-D histogram with a float per channel (see TH1 documentation)
Definition TH1.h:621
1-D histogram with an int per channel (see TH1 documentation)
Definition TH1.h:539
virtual Double_t GetMean(Int_t axis=1) const
For axis = 1,2 or 3 returns the mean value of the histogram along X,Y or Z axis.
Definition TH1.cxx:7503
Double_t GetRMS(Int_t axis=1) const
This function returns the Standard Deviation (Sigma) of the distribution not the Root Mean Square (RM...
Definition TH1.h:319
A doubly linked list.
Definition TList.h:38
TObject * FindObject(const char *name) const override
Find an object in this list using its name.
Definition TList.cxx:576
The TNamed class is the base class for all named ROOT classes.
Definition TNamed.h:29
const char * GetTitle() const override
Returns title of object.
Definition TNamed.h:48
Named parameter, streamable and storable.
Definition TParameter.h:35
const AParamType & GetVal() const
Definition TParameter.h:67
Basic string class.
Definition TString.h:139
const char * Data() const
Definition TString.h:376
A TTree represents a columnar dataset.
Definition TTree.h:79
TH1F * h1
Definition legend1.C:5
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
Definition TMathBase.h:123