ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/GPetrucc/interface/fwlite/Scanner.h
(Generate patch)

Comparing UserCode/GPetrucc/interface/fwlite/Scanner.h (file contents):
Revision 1.5 by gpetrucc, Sun Jan 31 19:44:41 2010 UTC vs.
Revision 1.7 by gpetrucc, Thu Feb 4 10:53:26 2010 UTC

# Line 5 | Line 5
5   #include <TString.h>
6   #include <TObjString.h>
7   #include <TObjArray.h>
8 + #include <TDirectory.h>
9   #include <TEnv.h>
10  
11   #if !defined(__CINT__) && !defined(__MAKECINT__)
12   #include "UserCode/GPetrucc/interface/fwliteHelpers.h"
13   #else
14 + #ifndef UserCode_GPetrucc_CINT_load_library
15 + #define UserCode_GPetrucc_CINT_load_library
16   // load the library that contains the dictionaries
17   int _load_UserCodeGPetrucc = gSystem->Load("libUserCodeGPetrucc.so");
18   #endif
19 + #endif
20 +
21 + #include "UserCode/GPetrucc/interface/fwlite/EventSelectors.h"
22  
23   namespace fwlite {
24      template<typename T>
# Line 20 | Line 26 | namespace fwlite {
26          public:
27              typedef fwlite::Handle<std::vector<T> > HandleT;
28              Scanner(fwlite::EventBase *ev, const char *label, const char *instance = "", const char *process="")  :
23                //helper::ScannerBase(Reflex::Type::ByTypeInfo(typeid(T))),
29                  event_(ev), label_(label), instance_(instance),
30                  printFullEventId_(ev->isRealData()),
31                  ignoreExceptions_(false),
32 <                exprSep_(":")
32 >                exprSep_(":"),
33 >                maxLinesToPrint_(50)
34              {
35 <                Reflex::Type wrapperType = Reflex::Type::ByTypeInfo(HandleT::TempWrapT::typeInfo());
36 <                objType = helpme.elementType(Reflex::Type::ByTypeInfo(HandleT::TempWrapT::typeInfo()));
35 >                objType = helper::Parser::elementType(Reflex::Type::ByTypeInfo(HandleT::TempWrapT::typeInfo()));
36 >                eventSelectors_.SetOwner();
37              }
38  
39              
40 <            void scan(const char *exprs, const char *cut="", int nmax=20) {
40 >            void scan(const char *exprs, const char *cut="", int nmax=-1) {
41                  helper::ScannerBase scanner(objType);
42                  scanner.setIgnoreExceptions(ignoreExceptions_);
43  
# Line 59 | Line 65 | namespace fwlite {
65  
66                  if (strlen(cut)) scanner.setCut(cut);
67  
68 <                int iev = 0;
69 <                for (event_->toBegin(); (iev < nmax) && !event_->atEnd(); ++iev, ++(*event_)) {
68 >                int iev = 0, line = 0;
69 >                for (event_->toBegin(); (iev != nmax) && !event_->atEnd(); ++iev, ++(*event_)) {
70 >                    if (!selectEvent(*event_)) continue;
71                      handle_.getByLabel(*event_, label_.c_str(), instance_.c_str(), process_.c_str());
72                      const std::vector<T> & vals = *handle_;
73                      for (size_t j = 0, n = vals.size(); j < n; ++j) {
# Line 73 | Line 80 | namespace fwlite {
80                          }
81                          scanner.print(&vals[j]);
82                          std::cout << " :" << std::endl;
83 +                        if (++line == maxLinesToPrint_) {
84 +                            line = 0;
85 +                            if (!wantMore()) {
86 +                                iev = nmax-1; // this is to exit the outer loop
87 +                                break;        // and this to exit the inner one
88 +                             }
89 +                        }
90                      }
91                  }
92                  std::cout << std::endl;
93              }
94 <
81 <
94 >    
95              TH1 * draw(const char *expr, const char *cut = "", TString drawopt = "", TH1 *hist = 0) {
96                  // prep the machinery
97                  helper::ScannerBase scanner(objType);
98                  scanner.setIgnoreExceptions(ignoreExceptions_);
99 <                scanner.addExpression(expr);
99 >                if (!scanner.addExpression(expr)) return 0;
100                  if (strlen(cut)) scanner.setCut(cut);
101  
102                  // make histo, if needed
103                  if (hist == 0) {
104 +                    htempDelete();
105                      hist = new TH1F("htemp",
106                              (strlen(cut) ? TString(expr)+"{"+cut+"}" : TString(expr)),
107                              gEnv->GetValue("Hist.Binning.1D.x",100), 0, 0);
# Line 96 | Line 110 | namespace fwlite {
110  
111                  // fill histogram
112                  for (event_->toBegin(); !event_->atEnd(); ++(*event_)) {
113 +                    if (!selectEvent(*event_)) continue;
114                      handle_.getByLabel(*event_, label_.c_str(), instance_.c_str(), process_.c_str());
115                      const std::vector<T> & vals = *handle_;
116                      for (size_t j = 0, n = vals.size(); j < n; ++j) {
# Line 107 | Line 122 | namespace fwlite {
122                  return hist;
123              }
124              TH1 * draw(const char *expr, int bins, double xlow, double xhigh, const char *cut = "", const char *drawopt = "") {
125 +                htempDelete();
126                  TH1 * htemp = new TH1F("htemp", (strlen(cut) ? TString(expr)+"{"+cut+"}" : TString(expr)), bins, xlow, xhigh);
127                  return draw(expr,cut,drawopt,htemp);
128              }
# Line 115 | Line 131 | namespace fwlite {
131                  // prep the machinery
132                  helper::ScannerBase scanner(objType);
133                  scanner.setIgnoreExceptions(ignoreExceptions_);
134 <                scanner.addExpression(xexpr);
135 <                scanner.addExpression(yexpr);
134 >                if (!scanner.addExpression(xexpr)) return 0;
135 >                if (!scanner.addExpression(yexpr)) return 0;
136                  if (strlen(cut)) scanner.setCut(cut);
137  
138                  // make histo, if needed
139                  if (hist == 0) {
140 +                    htempDelete();
141                      hist = new TProfile("htemp",
142                              (strlen(cut) ? yexpr+":"+xexpr+"{"+cut+"}" : yexpr+":"+xexpr),
143                              gEnv->GetValue("Hist.Binning.1D.x",100), 0., 0.);
# Line 129 | Line 146 | namespace fwlite {
146  
147                  // fill histogram
148                  for (event_->toBegin(); !event_->atEnd(); ++(*event_)) {
149 +                    if (!selectEvent(*event_)) continue;
150                      handle_.getByLabel(*event_, label_.c_str(), instance_.c_str(), process_.c_str());
151                      const std::vector<T> & vals = *handle_;
152                      for (size_t j = 0, n = vals.size(); j < n; ++j) {
# Line 140 | Line 158 | namespace fwlite {
158                  return hist;
159              }
160              TProfile * drawProf(TString xexpr, int bins, double xlow, double xhigh, TString yexpr, const char *cut = "", const char *drawopt = "") {
161 +                htempDelete();
162                  TProfile * htemp = new TProfile("htemp", (strlen(cut) ? yexpr+":"+xexpr+"{"+cut+"}" : yexpr+":"+xexpr), bins, xlow, xhigh);
163                  return drawProf(xexpr,yexpr,cut,drawopt,htemp);
164              }
# Line 148 | Line 167 | namespace fwlite {
167                  // prep the machinery
168                  helper::ScannerBase scanner(objType);
169                  scanner.setIgnoreExceptions(ignoreExceptions_);
170 <                scanner.addExpression(xexpr);
171 <                scanner.addExpression(yexpr);
170 >                if (!scanner.addExpression((const char *)xexpr)) return 0;
171 >                if (!scanner.addExpression((const char *)yexpr)) return 0;
172                  if (strlen(cut)) scanner.setCut(cut);
173  
174                  // make histo, if needed
175                  if (hist == 0) {
176 +                    // ok this is much more a hack than for the 1D case
177 +                    double xmin = 0, xmax = -1, ymin = 0, ymax = -1;
178 +                    for (event_->toBegin(); !event_->atEnd(); ++(*event_)) {
179 +                        if (!selectEvent(*event_)) continue;
180 +                        handle_.getByLabel(*event_, label_.c_str(), instance_.c_str(), process_.c_str());
181 +                        const std::vector<T> & vals = *handle_;
182 +                        for (size_t j = 0, n = vals.size(); j < n; ++j) {
183 +                            if (!scanner.test(&vals[j])) continue;
184 +                            double x = scanner.eval(&vals[j],0);
185 +                            double y = scanner.eval(&vals[j],1);
186 +                            if ((xmax == -1) || (x >= xmax)) xmax = x;
187 +                            if ((xmin ==  0) || (x <= xmin)) xmin = x;
188 +                            if ((ymax == -1) || (y >= ymax)) ymax = y;
189 +                            if ((ymin ==  0) || (y <= ymin)) ymin = y;
190 +                        }
191 +                    }
192 +                    htempDelete();
193                      hist = new TH2F("htemp",
194                              (strlen(cut) ? yexpr+":"+xexpr+"{"+cut+"}" : yexpr+":"+xexpr),
195 <                            gEnv->GetValue("Hist.Binning.2D.x",20), 0, 0,
196 <                            gEnv->GetValue("Hist.Binning.2D.y",20), 0, 0);
161 <                   hist->SetBit(TH1::kCanRebin);
195 >                            gEnv->GetValue("Hist.Binning.2D.x",20), xmin, xmax,
196 >                            gEnv->GetValue("Hist.Binning.2D.y",20), ymin, ymax);
197                  }
198  
199                  // fill histogram
200                  for (event_->toBegin(); !event_->atEnd(); ++(*event_)) {
201 +                    if (!selectEvent(*event_)) continue;
202                      handle_.getByLabel(*event_, label_.c_str(), instance_.c_str(), process_.c_str());
203                      const std::vector<T> & vals = *handle_;
204                      for (size_t j = 0, n = vals.size(); j < n; ++j) {
# Line 178 | Line 214 | namespace fwlite {
214              TH2 * draw2D(TString xexpr, int xbins, double xlow, double xhigh,
215                           TString yexpr, int ybins, double ylow, double yhigh,
216                           const char *cut = "", const char *drawopt = "") {
217 +                htempDelete();
218                  TH2 * htemp = new TH2F("htemp", (strlen(cut) ? yexpr+":"+xexpr+"{"+cut+"}" : yexpr+":"+xexpr),
219                                          xbins, xlow, xhigh, ybins,ylow,yhigh);
220                  return draw2D(xexpr,yexpr,cut,drawopt,htemp);
221              }
222  
223 +
224 +            TGraph * drawGraph(TString xexpr, TString yexpr, const char *cut = "", TString drawopt = "AP", TGraph *graph = 0) {
225 +                // prep the machinery
226 +                helper::ScannerBase scanner(objType);
227 +                scanner.setIgnoreExceptions(ignoreExceptions_);
228 +                if (!scanner.addExpression((const char *)xexpr)) return 0;
229 +                if (!scanner.addExpression((const char *)yexpr)) return 0;
230 +                if (strlen(cut)) scanner.setCut(cut);
231 +
232 +                // make graph, if needed
233 +                if (graph == 0) {
234 +                    htempDelete();
235 +                    graph = new TGraph();
236 +                    graph->SetNameTitle("htemp", (strlen(cut) ? yexpr+":"+xexpr+"{"+cut+"}" : yexpr+":"+xexpr));
237 +                }
238 +
239 +                // fill graph
240 +                for (event_->toBegin(); !event_->atEnd(); ++(*event_)) {
241 +                    if (!selectEvent(*event_)) continue;
242 +                    handle_.getByLabel(*event_, label_.c_str(), instance_.c_str(), process_.c_str());
243 +                    const std::vector<T> & vals = *handle_;
244 +                    for (size_t j = 0, n = vals.size(); j < n; ++j) {
245 +                        scanner.fillGraph(&vals[j], graph);
246 +                    }
247 +                }
248 +
249 +                if (!strlen(graph->GetXaxis()->GetTitle())) graph->GetXaxis()->SetTitle(xexpr);
250 +                if (!strlen(graph->GetYaxis()->GetTitle())) graph->GetYaxis()->SetTitle(yexpr);
251 +                if (!TString(drawopt).Contains("goff",TString::kIgnoreCase)) graph->Draw(drawopt);
252 +                return graph;
253 +            }
254 +
255              void setPrintFullEventId(bool printIt=true) { printFullEventId_ = printIt; }
256              void setExpressionSeparator(TString separator) { exprSep_ = separator; }
257              void setIgnoreExceptions(bool ignoreThem) { ignoreExceptions_ = ignoreThem; }
258 +            void setMaxLinesToPrint(int lines) { maxLinesToPrint_ = (lines > 0 ? lines : 2147483647); }
259 +    
260 +            void addEventSelector(fwlite::EventSelector *selector) { eventSelectors_.Add(selector); }
261 +            void clearEventSelector() { eventSelectors_.Clear(); }
262 +            TObjArray & eventSelectors() { return eventSelectors_; }
263 +            bool selectEvent(const fwlite::EventBase &ev) const {
264 +                for (int i = 0, n = eventSelectors_.GetEntries(); i < n; ++i) {
265 +                    if (!((fwlite::EventSelector *)(eventSelectors_[i]))->accept(ev)) return false;
266 +                }
267 +                return true;
268 +            }
269          private:
270              fwlite::EventBase *event_;
271              std::string    label_, instance_, process_;
# Line 193 | Line 273 | namespace fwlite {
273              bool ignoreExceptions_;
274              TString exprSep_;
275              HandleT        handle_;
196            helper::Parser helpme;
276              Reflex::Type   objType;
277  
278 +            TObjArray eventSelectors_;
279 +
280 +            int maxLinesToPrint_;
281 +            bool wantMore() const {
282 +                // ask if user wants more
283 +                fprintf(stderr,"Type <CR> to continue or q to quit ==> ");
284 +                // read first char
285 +                int readch = getchar(), answer = readch;
286 +                // poll out remaining chars from buffer
287 +                while (readch != '\n' && readch != EOF) readch = getchar();
288 +                // check first char
289 +                return !(answer == 'q' || answer == 'Q');
290 +            }
291 +
292 +            void htempDelete() {
293 +                if (gDirectory) {
294 +                    TObject *obj = gDirectory->Get("htemp");
295 +                    if (obj) obj->Delete();
296 +                }
297 +            }
298 +
299      };
300   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines