source: trunk/MagicSoft/Mars/mdata/MDataMember.cc@ 9366

Last change on this file since 9366 was 9036, checked in by tbretz, 16 years ago
*** empty log message ***
File size: 6.9 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 04/2002 <mailto:tbretz@astro.uni-wuerzburg.de>
19!
20! Copyright: MAGIC Software Development, 2000-2004
21!
22!
23\* ======================================================================== */
24
25/////////////////////////////////////////////////////////////////////////////
26//
27// MDataMember
28//
29// This objects corresponds to the data member of another object.
30// You can either specify the object as a string, eg "MHillas.fWidth"
31// where MHillas is the name of the container in the parameterlist
32// and fWidth is it's data member, or you can specify it by giving
33// the pointer corresponding to the instance of your object and
34// a TMethodCall pointer corresponding to the Member function returning
35// the requested value.
36//
37/////////////////////////////////////////////////////////////////////////////
38#include "MDataMember.h"
39
40#include <fstream>
41
42#include <TMethodCall.h>
43
44#include "MLog.h"
45#include "MLogManip.h"
46
47#include "MParList.h"
48
49ClassImp(MDataMember);
50
51using namespace std;
52
53// --------------------------------------------------------------------------
54//
55// obj is a pointer to the instance of your class from which the data
56// should be requested. TMethodCall (s. root dox) is a pointer
57// to a TMethodCall object which should be the getter function for
58// the data you want to get.
59//
60MDataMember::MDataMember(MParContainer *obj, TMethodCall *call)
61{
62 fObject = obj;
63 fCall = call;
64
65 if (fCall->ReturnType()==TMethodCall::kLong)
66 SetBit(kIsInt);
67 else
68 ResetBit(kIsInt);
69
70 fDataMember = (TString)obj->GetName() + "." + call->GetName();
71}
72
73// --------------------------------------------------------------------------
74//
75// obj is a pointer to the instance of your class from which the data
76// should be requested. TMethodCall (s. root dox) is a pointer
77// to a TMethodCall object which should be the getter function for
78// the data you want to get.
79//
80MDataMember::MDataMember(MParContainer *obj, const TString call)
81{
82 fObject = obj;
83 fCall = obj->GetterMethod(call);
84
85 if (fCall->ReturnType()==TMethodCall::kLong)
86 SetBit(kIsInt);
87 else
88 ResetBit(kIsInt);
89
90 fDataMember = (TString)obj->GetName() + "." + call;
91}
92
93// --------------------------------------------------------------------------
94//
95// Check if accessing fCall is safe
96//
97Bool_t MDataMember::CheckGet() const
98{
99 if (!fObject)
100 {
101 *fLog << err << "ERROR - MDataMember::Get: fObject not initialized ";
102 *fLog << "(not PreProcessed)... returning 0." << endl;
103 return kFALSE;
104 }
105
106 if (!fCall)
107 {
108 *fLog << err << "ERROR - MDataMemberGet: No TMethodCall for " << fDataMember << " of ";
109 *fLog << fObject->GetName() << " available... returning 0." << endl;
110 return kFALSE;
111 }
112
113 return kTRUE;
114}
115
116// --------------------------------------------------------------------------
117//
118// Returns the value you requested
119//
120Double_t MDataMember::GetValue() const
121{
122 if (!CheckGet())
123 return 0;
124
125 switch (fCall->ReturnType())
126 {
127 case TMethodCall::kLong:
128 Long_t l;
129 fCall->Execute(fObject, l);
130 return (Double_t)l;
131
132 case TMethodCall::kDouble:
133 Double_t v;
134 fCall->Execute(fObject, v);
135 return v;
136
137 default:
138 *fLog << err << "ERROR - MDataMember::GetValue: " << fObject->GetName();
139 *fLog << "." << fDataMember << " has unkown type (=";
140 *fLog << fCall->ReturnType() << ")... returning 0." << endl;
141 return 0;
142 }
143}
144
145// --------------------------------------------------------------------------
146//
147// Returns the string you requested
148//
149const char *MDataMember::GetString() const
150{
151 if (!CheckGet())
152 return NULL;
153
154 switch (fCall->ReturnType())
155 {
156 case TMethodCall::kString:
157 {
158 char *c=NULL;
159 fCall->Execute(fObject, &c);
160 return c;
161 }
162
163 default:
164 *fLog << err << "DataMember " << fDataMember << " of ";
165 *fLog << fObject->GetName() << " not a char*... returning NULL." << endl;
166 return NULL;
167 }
168}
169
170// --------------------------------------------------------------------------
171//
172// If a string was given PreProcess try to resolv the object name and
173// tries to get it from the parlist. And also tries to resolve
174// the data member (variable) name you requested and tries to get a
175// corresponding TMethodCall from the root Dictionary.
176// Remark: If your Data Member is called fDataMember the corresponding
177// getter Method in your class must be calles fDataMember
178//
179Bool_t MDataMember::PreProcess(const MParList *plist)
180{
181 // The following change has to be checked :
182 // In order that fCall is initialized properly
183 // the original statement "if (fCall)" is replaced by the statement
184 if (fCall && !fObject)
185 return kTRUE;
186
187 TString cname(fDataMember);
188 TString mname(fDataMember);
189
190 const char *dot = strrchr(cname, '.');
191
192 if (dot)
193 {
194 const int pos = dot-cname;
195
196 cname.Remove(pos);
197 mname.Remove(0, pos+1);
198 }
199
200 fObject = (MParContainer*)plist->FindObject(cname);
201 if (!fObject)
202 {
203 *fLog << err << "Object '" << cname << "' not in parameter list... aborting." << endl;
204 return kFALSE;
205 }
206
207 fCall = fObject->GetterMethod(mname);
208
209 return fCall ? kTRUE : kFALSE;
210}
211
212// --------------------------------------------------------------------------
213//
214// Returns the ready-to-save flag of the data member container
215//
216Bool_t MDataMember::IsReadyToSave() const
217{
218 return IsValid() ? fObject->IsReadyToSave() : kFALSE;
219}
220
221// --------------------------------------------------------------------------
222//
223// Print the name of the data member without an CR.
224//
225/*
226void MDataMember::Print(Option_t *opt) const
227{
228 *fLog << fName << flush;
229}
230*/
231
232// --------------------------------------------------------------------------
233//
234// Builds a rule which can be used in a MDataPhrase to describe this object
235//
236TString MDataMember::GetRule() const
237{
238 return fDataMember;
239}
240
241// --------------------------------------------------------------------------
242//
243// Returns the data member.
244// This is mainly used in MTask::AddToBranchList
245//
246TString MDataMember::GetDataMember() const
247{
248 return fDataMember;
249}
Note: See TracBrowser for help on using the repository browser.