source: trunk/MagicSoft/Mars/mbase/MContinue.cc @ 9302

Last change on this file since 9302 was 9302, checked in by tbretz, 11 years ago
*** empty log message ***
File size: 8.5 KB
Line 
1/* ======================================================================== *\
2!
3! *
4! * This file is part of MARS, the MAGIC Analysis and Reconstruction
5! * Software. It is distributed to you in the hope that it can be a useful
6! * and timesaving tool in analysing Data of imaging Cerenkov telescopes.
7! * It is distributed WITHOUT ANY WARRANTY.
8! *
9! * Permission to use, copy, modify and distribute this software and its
10! * documentation for any purpose is hereby granted without fee,
11! * provided that the above copyright notice appear in all copies and
12! * that both that copyright notice and this permission notice appear
13! * in supporting documentation. It is provided "as is" without express
14! * or implied warranty.
15! *
16!
17!
18!   Author(s): Thomas Bretz 10/2002 <mailto:tbretz@astro.uni-wuerzburg.de>
19!
20!   Copyright: MAGIC Software Development, 2000-2003
21!
22!
23\* ======================================================================== */
24
25/////////////////////////////////////////////////////////////////////////////
26//
27// MContinue
28//
29// Does nothing than return kCONTINUE in the Process-function
30// (use with filters). For more details see the description of the
31// constructors.
32//
33// To invert the meaning of the contained filter call SetInverted()
34//
35//
36//  Input Containers:
37//   -/-
38//
39//  Output Containers:
40//   -/-
41//
42//
43// Class Version 2:
44// ----------------
45//  + Int_t fRc;
46//
47/////////////////////////////////////////////////////////////////////////////
48#include "MContinue.h"
49
50#include "MLog.h"
51#include "MLogManip.h"
52
53#include "MF.h"
54#include "MString.h"
55#include "MParList.h"
56#include "MTaskList.h"
57
58ClassImp(MContinue);
59
60using namespace std;
61
62// --------------------------------------------------------------------------
63//
64// Default constructor.
65//
66// Use this constructor if a rule (see MF for more details) shell be used.
67// MContinue will create a MF object and use it as a filter for the
68// instance. The MF-Task is added to the tasklist in front of the MContinue
69// instance and also automatically deleted, eg.
70//   MContinue cont("MHillas.fSize<20");
71//   tasklist.AddToList(&cont);
72// would skip all events which fullfill "MHillas.fSize<20" from this point
73// in the tasklist.
74// It is not necessary to put the filter in the tasklist. The PreProcess
75// will search for the filter and if it isn't found in the tasklist it
76// is added to the tasklist in front of MContinue.
77//
78// Use the default constructor (or an empty rule) if you want to read the
79// rule from a resource file.
80//
81MContinue::MContinue(const TString rule, const char *name, const char *title)
82    : fTaskList(0), fRc(kCONTINUE)
83{
84    fName  = name  ? name  : "MContinue";
85    fTitle = title ? title : "Task returning kCONTINUE";
86
87    if (rule.IsNull())
88        return;
89
90    SetBit(kIsOwner);
91
92    MTask::SetFilter(new MF(rule, TString("MF(")+fName+")"));
93}
94
95// --------------------------------------------------------------------------
96//
97// Use this if you have a filter. Would be the same as if you would call:
98//   MContinue cont;
99//   cont.SetFilter(f);
100// It is not necessary to put the filter in the tasklist. The PreProcess
101// will search for the filter and if it isn't found in the tasklist it
102// is added to the tasklist in front of MContinue.
103//
104MContinue::MContinue(MFilter *f, const char *name, const char *title)
105    : fTaskList(0), fRc(kCONTINUE)
106{
107    fName  = name  ? name  : "MContinue";
108    fTitle = title ? title : "Task returning kCONTINUE (or any other return code)";
109
110    SetFilter(f);
111}
112
113// --------------------------------------------------------------------------
114//
115//  Delete the filter if it was created automatically
116//
117MContinue::~MContinue()
118{
119    if (TestBit(kIsOwner))
120        delete GetFilter();
121}
122
123// --------------------------------------------------------------------------
124//
125//  PreProcess tries to find the tasklist MTaskList, adds the filter
126//  before this instance to the tasklist and preprocesses the filter.
127//
128Int_t MContinue::PreProcess(MParList *list)
129{
130    ResetBit(kFilterIsPrivate);
131
132    if (!GetFilter())
133    {
134        if (IsAllowEmpty())
135        {
136            *fLog << warn << GetDescriptor() << " - WARNING: Filter empty... task removed." << endl;
137            return kSKIP;
138        }
139
140        *fLog << inf << "My filter has vanished... skipping." << endl;
141        return kSKIP;
142    }
143
144    fTaskList = (MTaskList*)list->FindTaskListWithTask(this);
145    if (!fTaskList)
146    {
147        *fLog << err << dbginf << "ERROR - MTaskList with this not found... abort." << endl;
148        return kFALSE;
149    }
150
151    if (fTaskList->FindObject(GetFilter()))
152    {
153        *fLog << inf << dbginf << "The filter is already in the tasklist..." << endl;
154        return kTRUE;
155    }
156
157    if ((TString)GetFilter()->GetName()==fName)
158        GetFilter()->SetName(MString::Format("MF:%s", fName.Data()));
159
160    if (!fTaskList->AddToListBefore(GetFilter(), this))
161    {
162        *fLog << err << dbginf << "ERROR - Adding filter before MContinue failed... abort." << endl;
163        return kFALSE;
164    }
165
166    // Make sure, that everything is correctly propageted to the childs
167    GetFilter()->SetDisplay(fDisplay);
168    GetFilter()->SetLogStream(fLog);
169    GetFilter()->SetAccelerator(GetAccelerator());
170
171    // Remeber that the filter is not already in tasklist
172    SetBit(kFilterIsPrivate);
173
174    return GetFilter()->CallPreProcess(list);
175}
176
177// --------------------------------------------------------------------------
178//
179// Propagate display to filter (if set)
180//
181void MContinue::SetDisplay(MStatusDisplay *d)
182{
183    if (GetFilter())
184        GetFilter()->SetDisplay(d);
185
186    MTask::SetDisplay(d);
187}
188
189// --------------------------------------------------------------------------
190//
191// Propagate log stream to filter (if set)
192//
193void MContinue::SetLogStream(MLog *lg)
194{
195    if (GetFilter())
196        GetFilter()->SetLogStream(lg);
197
198    MTask::SetLogStream(lg);
199}
200
201// --------------------------------------------------------------------------
202//
203// If the filter was added to the tasklist automatically it is removed
204// from the tasklist.
205//
206Int_t MContinue::PostProcess()
207{
208    if (!TestBit(kFilterIsPrivate))
209        return kTRUE;
210
211    if (fTaskList->RemoveFromList(GetFilter()))
212        return kTRUE;
213
214    *fLog << err << "ERROR: MContinue::PostProcess - Cannot remove Filter from tasklist" << endl;
215
216    return kFALSE;
217}
218
219// --------------------------------------------------------------------------
220//
221// If a filter is setup, call its 'IsInverted' to invert its meaning
222// (boolean "not")
223//
224void MContinue::SetInverted(Bool_t i)
225{
226    if (GetFilter())
227        GetFilter()->SetInverted(i);
228}
229
230// --------------------------------------------------------------------------
231//
232// If a filter is setup, its IsInverted status is returned. If now filter
233// has been setup yet, kFALSE is returned.
234//
235Bool_t MContinue::IsInverted() const
236{
237    return GetFilter() ? GetFilter()->IsInverted() : kFALSE;
238}
239
240void MContinue::Print(Option_t *) const
241{
242    *fLog << all << GetDescriptor() << ":";
243    if (GetFilter())
244        *fLog << " <" << GetFilter()->GetDescriptor() << ">";
245    *fLog << endl;
246    if (GetFilter())
247        GetFilter()->Print();
248}
249
250// --------------------------------------------------------------------------
251//
252// Check for corresponding entries in resource file and setup filters.
253// Avoid trailing 0's!
254//
255// Example:
256//   test.C:
257//     MContinue cont("", "MyContinue");
258//
259//   test.rc:
260//     MyContinue.Condition: {0} && {1}
261//     MyContinue.Inverted: yes
262//     MyContinue.0: MHillas.fSize>1000
263//     MyContinue.1: MHillas.fSize<10000
264//   or (the syntax might change in the future!)
265//     MyContinue.Condition: <MMyClass>
266//     MMyClass.Variable1: ...
267//     MMyClass.Variable2: ...
268//
269// For more details see MF::ReadEnv
270//
271Int_t MContinue::ReadEnv(const TEnv &env, TString prefix, Bool_t print)
272{
273    MFilter *f = MTask::GetFilter();
274    if (IsEnvDefined(env, prefix, "Condition", print))
275    {
276        TString txt = GetEnvValue(env, prefix, "Condition", "");
277        txt = txt.Strip(TString::kBoth);
278        if (txt.BeginsWith("<") && txt.EndsWith(">"))
279        {
280            const TString name = txt(1, txt.Length()-2);
281            f = (MFilter*)GetNewObject(name, MFilter::Class());
282            if (!f)
283                return kERROR;
284        }
285    }
286
287    if (!f)
288        f = new MF;
289
290    f->SetName(fName);
291
292    const Bool_t rc = f->ReadEnv(env, prefix, print);
293    if (rc!=kTRUE)
294    {
295        if (f!=MTask::GetFilter())
296            delete f;
297        return rc;
298    }
299
300    if (f != MTask::GetFilter())
301    {
302        if (TestBit(kIsOwner))
303            delete GetFilter();
304        SetBit(kIsOwner);
305    }
306    MTask::SetFilter(f);
307
308    return kTRUE;
309}
Note: See TracBrowser for help on using the repository browser.