GSI Object Oriented Online Offline (Go4)  GO4-6.3.0
TGo4HStackProxy.cxx
Go to the documentation of this file.
1 // $Id$
2 //-----------------------------------------------------------------------
3 // The GSI Online Offline Object Oriented (Go4) Project
4 // Experiment Data Processing at EE department, GSI
5 //-----------------------------------------------------------------------
6 // Copyright (C) 2000- GSI Helmholtzzentrum fuer Schwerionenforschung GmbH
7 // Planckstr. 1, 64291 Darmstadt, Germany
8 // Contact: http://go4.gsi.de
9 //-----------------------------------------------------------------------
10 // This software can be used under the license agreements as stated
11 // in Go4License.txt file which is part of the distribution.
12 //-----------------------------------------------------------------------
13 
14 #include "TGo4HStackProxy.h"
15 
16 #include "TROOT.h"
17 #include "TList.h"
18 #include "TClass.h"
19 #include "THStack.h"
20 
21 #include "TGo4ObjectProxy.h"
22 #include "TGo4ObjectManager.h"
23 
25  protected:
26  TIterator *fIter{nullptr};
27  TObject *fCurrent{nullptr};
28  public:
29  TGo4HStackLevelIter(THStack *hs) :
30  TGo4LevelIter(),
31  fIter(nullptr),
32  fCurrent(nullptr)
33  {
34  fIter = hs->GetHists()->MakeIterator();
35  }
36 
38  {
39  delete fIter;
40  }
41 
42  Bool_t next() override
43  {
44  fCurrent = fIter->Next();
45  return fCurrent != nullptr;
46  }
47 
48  Bool_t isfolder() override
49  {
50  return kFALSE;
51  }
52 
54  {
55  return nullptr;
56  }
57 
58  const char *name() override
59  {
60  return fCurrent->GetName();
61  }
62 
63  const char *info() override
64  {
65  return fCurrent->ClassName();
66  }
67 
68  Int_t GetKind() override
69  {
70  return TGo4Access::kndObject;
71  }
72 
73  const char *GetClassName() override
74  {
75  return fCurrent->ClassName();
76  }
77 };
78 
79 // ****************************************************************
80 
82  TGo4Proxy(),
83  fHS(nullptr),
84  fOwner(kFALSE)
85 {
86 }
87 
88 TGo4HStackProxy::TGo4HStackProxy(THStack *hs, Bool_t owner) :
89  TGo4Proxy(),
90  fHS(hs),
91  fOwner(owner)
92 {
93 }
94 
96 {
97  if (fOwner) delete fHS;
98 }
99 
101 {
103 }
104 
106 {
107  return fHS ? fHS->ClassName() : nullptr;
108 }
109 
111 {
112  TGo4ObjectManager *om = slot->GetOM();
113  if (om) om->RegisterObjectWith(fHS, slot);
114 }
115 
117 {
118  TGo4ObjectManager *om = slot->GetOM();
119  if (om) om->UnregisterObject(fHS, slot);
120 }
121 
123 {
124  if (obj == fHS) {
125  fHS = nullptr;
126  fOwner = kFALSE;
127  }
128  return kFALSE;
129 }
130 
131 void TGo4HStackProxy::WriteData(TGo4Slot *slot, TDirectory *dir, Bool_t onlyobjs)
132 {
133  const char *objname = nullptr;
134  if (fHS)
135  objname = fHS->GetName();
136 
137  if (!onlyobjs)
138  slot->SetPar("HStackProxy::StackName", objname);
139 
140  if (!dir || !fHS) return;
141 
142  dir->cd();
143 
144  fHS->Write(objname);
145 }
146 
147 void TGo4HStackProxy::ReadData(TGo4Slot *slot, TDirectory *dir)
148 {
149  const char *objname = slot->GetPar("HStackProxy::StackName");
150  if (!objname || !dir) return;
151 
152  dir->cd();
153 
154  AssignObject(slot, dir->Get(objname), kTRUE);
155 }
156 
157 Bool_t TGo4HStackProxy::IsAcceptObject(TClass *cl) const
158 {
159  return cl && cl->InheritsFrom(THStack::Class());
160 }
161 
162 Bool_t TGo4HStackProxy::AssignObject(TGo4Slot *slot, TObject *obj, Bool_t owner)
163 {
164  Finalize(slot);
165  if (fHS && fOwner) delete fHS;
166 
167  fHS = dynamic_cast<THStack*> (obj);
168  fOwner = owner && fHS;
169 
170  if (!fHS && obj && owner) delete obj;
171 
172  Initialize(slot);
173 
175 
176  return fHS != nullptr;
177 }
178 
180 {
181  return fHS;
182 }
183 
184 std::unique_ptr<TGo4Access> TGo4HStackProxy::CreateAccess(THStack *hs, const char *name)
185 {
186  if (!hs) return nullptr;
187  if (!name || !*name)
188  return std::make_unique<TGo4ObjectAccess>(hs);
189 
190  TObject *obj = hs->GetHists()->FindObject(name);
191 
192  return obj ? std::make_unique<TGo4ObjectAccess>(obj) : nullptr;
193 }
194 
196 {
197  return new TGo4HStackLevelIter(hs);
198 }
TGo4HStackLevelIter(THStack *hs)
void ReadData(TGo4Slot *slot, TDirectory *dir) override
void UnregisterObject(TObject *obj, TGo4Slot *slot)
Bool_t IsAcceptObject(TClass *cl) const override
static TGo4LevelIter * ProduceIter(THStack *hs)
void Finalize(TGo4Slot *slot) override
virtual ~TGo4HStackProxy()
void RegisterObjectWith(TObject *obj, TGo4Slot *slot)
Int_t GetObjectKind() const override
const char * name() override
TGo4LevelIter * subiterator() override
Bool_t RemoveRegisteredObject(TObject *obj) override
void WriteData(TGo4Slot *slot, TDirectory *dir, Bool_t onlyobjs) override
const char * info() override
TObject * GetAssignedObject() override
Bool_t isfolder() override
Bool_t next() override
void Initialize(TGo4Slot *slot) override
Int_t GetKind() override
const char * GetPar(const char *name) const
Definition: TGo4Slot.cxx:598
Bool_t AssignObject(TGo4Slot *slot, TObject *obj, Bool_t owner) override
const char * GetClassName() override
virtual ~TGo4HStackLevelIter()
void ForwardEvent(TGo4Slot *source, Int_t id, void *param=nullptr)
Definition: TGo4Slot.cxx:565
const char * GetContainedClassName() const override
virtual TGo4ObjectManager * GetOM() const
Definition: TGo4Slot.cxx:282
void SetPar(const char *name, const char *value)
Definition: TGo4Slot.cxx:586
static std::unique_ptr< TGo4Access > CreateAccess(THStack *hs, const char *name)