ATLAS Offline Software
Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes | List of all members
TVirtualConverter Class Referenceabstract

Base class for converters for Root schema evolution. More...

#include <TVirtualConverter.h>

Inheritance diagram for TVirtualConverter:
Collaboration diagram for TVirtualConverter:

Public Member Functions

 TVirtualConverter (UInt_t checksum, TClass *trans_cls, TClass *pers_cls)
 Constructor, with checksum and class pointers. More...
 
 TVirtualConverter (TClass *trans_cls, TClass *pers_cls)
 Constructor, with class pointers. More...
 
 TVirtualConverter (UInt_t checksum, const std::string &trans_cls, const std::string &pers_cls)
 Constructor, with checksum and class names. More...
 
 TVirtualConverter (const std::string &trans_cls, const std::string &pers_cls)
 Constructor, with class names. More...
 
virtual ~TVirtualConverter ()
 Destructor. More...
 
TClass * GetTransClass ()
 Return the transient class, to which we're converting. More...
 
TClass * GetPersClass ()
 Return the persistent class, from which we're converting. More...
 
int GetCheckSum () const
 Return the checksum of the class from which we're converting. More...
 
virtual void * NewPersObj ()
 Create a new instance of the persistent class. More...
 
virtual void DeletePersObj (void *persobj)
 Destroy an instance of the persistent class. More...
 
virtual void ConvertVoid (void *transobj, const void *persobj)=0
 Do the conversion. More...
 
virtual void ReadBuffer (TBuffer &b, void *obj, Version_t version, UInt_t R__S, UInt_t R__c)
 Read object in non-split mode. More...
 

Static Public Member Functions

static TClass * ToClass (const std::string &name)
 Helper to convert a class name to a Root class pointer. More...
 
static TClass * ToClass (const std::type_info &id)
 Helper to convert a type_info to a Root class pointer. More...
 

Protected Member Functions

 TVirtualConverter ()
 Default constructor. More...
 
void SetCtorInfo (UInt_t checksum, TClass *trans_cls, TClass *pers_cls)
 Set the parameters that would normally be passed to the constructor. More...
 

Protected Attributes

void * fPersObj
 The temporary persistent object instance, used for conversions (in non-split mode). More...
 

Private Member Functions

void CheckStreamInfos ()
 Helper to allow for automatic schema evolution for persistent classes. More...
 
void CheckClasses ()
 Helper to check that the classes have been defined properly. More...
 

Private Attributes

TClass * fTransClass
 The declared transient class. More...
 
TClass * fPersClass
 The declared persistent class. More...
 
UInt_t fCheckSum
 The declared checksum. More...
 
int fOldLast
 Used by CheckStreamInfos: the length of the streamerinfo list that we saw on the last CheckStreamInfos call. More...
 

Detailed Description

Base class for converters for Root schema evolution.

Derive from this and define the Convert method to do the conversion. You must specify both the transient and persistent classes in the constructor. The checksum must also be specified if the actual shape in the file is different than the provided persistent class.

Definition at line 109 of file TVirtualConverter.h.

Constructor & Destructor Documentation

◆ TVirtualConverter() [1/5]

TVirtualConverter::TVirtualConverter ( UInt_t  checksum,
TClass *  trans_cls,
TClass *  pers_cls 
)

Constructor, with checksum and class pointers.

Parameters
checksumThe Root checksum of the persistent class we'll convert.
trans_clsThe transient class to which we will be converting.
pers_clsThe persistent class from which we will be converting.

Definition at line 111 of file TVirtualConverter.cxx.

114  : fTransClass (trans_cls),
115  fPersClass (pers_cls),
116  fCheckSum (checksum),
117  fOldLast (-3),
118  fPersObj (0)
119 {
120  CheckClasses();
121 }

◆ TVirtualConverter() [2/5]

TVirtualConverter::TVirtualConverter ( TClass *  trans_cls,
TClass *  pers_cls 
)

Constructor, with class pointers.

Parameters
trans_clsThe transient class to which we will be converting.
pers_clsThe persistent class from which we will be converting.

The checksum will be calculated automatically from the provided classes.

Definition at line 131 of file TVirtualConverter.cxx.

133  : fTransClass (trans_cls),
134  fPersClass (pers_cls),
136  CalculateCheckSum (fPersClass, fTransClass->GetName()) : 0),
137  fOldLast (-3),
138  fPersObj (0)
139 {
140  CheckClasses();
141 }

◆ TVirtualConverter() [3/5]

TVirtualConverter::TVirtualConverter ( UInt_t  checksum,
const std::string &  trans_cls,
const std::string &  pers_cls 
)

Constructor, with checksum and class names.

Parameters
checksumThe Root checksum of the persistent class we'll convert.
trans_clsThe name of the transient class to which we will be converting.
pers_clsThe name of the persistent class from which we will be converting.

Definition at line 152 of file TVirtualConverter.cxx.

155  : fTransClass (ToClass (trans_cls)),
156  fPersClass (ToClass (pers_cls)),
157  fCheckSum (checksum),
158  fOldLast (-3),
159  fPersObj (0)
160 {
161  CheckClasses();
162 }

◆ TVirtualConverter() [4/5]

TVirtualConverter::TVirtualConverter ( const std::string &  trans_cls,
const std::string &  pers_cls 
)

Constructor, with class names.

Parameters
trans_clsThe name of the transient class to which we will be converting.
pers_clsThe name of the persistent class from which we will be converting.

The checksum will be calculated automatically from the provided classes.

Definition at line 174 of file TVirtualConverter.cxx.

176  : fTransClass (ToClass (trans_cls)),
177  fPersClass (ToClass (pers_cls)),
178  fCheckSum (CalculateCheckSum (fPersClass, fTransClass->GetName())),
179  fOldLast (-3),
180  fPersObj (0)
181 {
182  CheckClasses();
183 }

◆ ~TVirtualConverter()

TVirtualConverter::~TVirtualConverter ( )
virtual

Destructor.

Definition at line 210 of file TVirtualConverter.cxx.

211 {
212  // If we made an instance of the persistent class, get rid of it here.
213  if (fPersObj)
215 }

◆ TVirtualConverter() [5/5]

TVirtualConverter::TVirtualConverter ( )
protected

Default constructor.

Intended for use with T_AthenaRootConverter only! You must call SetCtorInfo after this!

Definition at line 413 of file TVirtualConverter.cxx.

414  : fTransClass (0),
415  fPersClass (0),
416  fCheckSum (0),
417  fOldLast (-3),
418  fPersObj (0)
419 {
420 }

Member Function Documentation

◆ CheckClasses()

void TVirtualConverter::CheckClasses ( )
private

Helper to check that the classes have been defined properly.

Check that the class pointers got defined.

Definition at line 189 of file TVirtualConverter.cxx.

190 {
191  if (fTransClass == 0) {
192  if (fPersClass == 0)
193  Error ("TVirtualConverter",
194  "Both transient and persistent classes are null.");
195  else
196  Error ("TVirtualConverter",
197  "Transient class is null for persistent class `%s'",
198  fPersClass->GetName());
199  }
200  else if (fPersClass == 0)
201  Error ("TVirtualConverter",
202  "Persistent class is null for transient class `%s'",
203  fTransClass->GetName());
204 }

◆ CheckStreamInfos()

void TVirtualConverter::CheckStreamInfos ( )
private

Helper to allow for automatic schema evolution for persistent classes.

Automatic schema evolution doesn't work for persistent classes ‘out-of-the-box’ because we're reading the ‘persistent class’, but the relevant StreamerInfo stored in the file will have the name of the ‘transient class’.

This gets called each time we try to read an object (in non-split mode).

Definition at line 369 of file TVirtualConverter.cxx.

370 {
371  // First check to see if the list of TStreamerInfo's for the transient
372  // class has changed since the last time we were called. If not,
373  // then don't do anything.
374  const TObjArray* trans_sis = fTransClass->GetStreamerInfos();
375  if (trans_sis->GetLast() != fOldLast) {
376  // There was a change. Compare the TStreamerInfo list for the
377  // persistent class and the transient class. Look for entries
378  // where the transient class has a TStreamerInfo but the persistent
379  // class does not.
380  //
381  // Note: don't do this for `version' -1.
382  // That should always be built from the internal dictionary.
383  // (Otherwise, root can crash.)
384  const TObjArray* pers_sis = fPersClass->GetStreamerInfos();
385  assert (trans_sis->LowerBound() == pers_sis->LowerBound());
386  for (Int_t v = trans_sis->LowerBound(); v <= trans_sis->GetLast(); ++v) {
387  if (v != -1 &&
388  trans_sis->At(v) != 0 &&
389  (v > pers_sis->GetLast() || pers_sis->At(v) == 0))
390  {
391  // Ok, at this index, the transient class has a TStreamerInfo
392  // but the persistent class does not. Copy the TStreamerInfo
393  // (changing the class that it applies to to the persistent
394  // class), and add it to the persistent class's list.
395  TStreamerInfo* new_si =(TStreamerInfo*)(trans_sis->At(v)->Clone());
396  new_si->SetClass (fPersClass);
397  fPersClass->RegisterStreamerInfo (new_si);
398  }
399  }
400 
401  // Remember how many entries there were in the list for next time.
402  fOldLast = trans_sis->GetLast();
403  }
404 }

◆ ConvertVoid()

virtual void TVirtualConverter::ConvertVoid ( void *  transobj,
const void *  persobj 
)
pure virtual

Do the conversion.

Parameters
transobjPointer to an instance of the transient class.
persobjPointer to an instance of the persistent class.

An implementation of this must be provided in derived classes. It should initialize the object at transobj from the one at persobj.

Implemented in TVirtualConverter_T< TTrans, TPers >, TVirtualConverter_T< TrigSpacePointCounts_p1, TrigSpacePointCounts_p1_old >, TVirtualConverter_T< TauJetContainer_p1, TauJetContainer_p1_old >, TVirtualConverter_T< Identifier, DetDescrCondIdentifier_old >, and TVirtualConverter_T< TrigInDetTrackTruthMap, TrigInDetTrackTruthMap_old >.

◆ DeletePersObj()

void TVirtualConverter::DeletePersObj ( void *  persobj)
virtual

Destroy an instance of the persistent class.

Parameters
persobjPointer to the instance to destroy.

The provided implementation of this uses TClass::Destructor, but you can override it if need be.

Definition at line 264 of file TVirtualConverter.cxx.

265 {
266  return fPersClass->Destructor (persobj);
267 }

◆ GetCheckSum()

int TVirtualConverter::GetCheckSum ( ) const

Return the checksum of the class from which we're converting.

Definition at line 239 of file TVirtualConverter.cxx.

240 {
241  return fCheckSum;
242 }

◆ GetPersClass()

TClass * TVirtualConverter::GetPersClass ( )

Return the persistent class, from which we're converting.

Definition at line 230 of file TVirtualConverter.cxx.

231 {
232  return fPersClass;
233 }

◆ GetTransClass()

TClass * TVirtualConverter::GetTransClass ( )

Return the transient class, to which we're converting.

Definition at line 221 of file TVirtualConverter.cxx.

222 {
223  return fTransClass;
224 }

◆ NewPersObj()

void * TVirtualConverter::NewPersObj ( )
virtual

Create a new instance of the persistent class.

The provided implementation of this uses TClass::New, but you can override it if need be.

Definition at line 251 of file TVirtualConverter.cxx.

252 {
253  return fPersClass->New();
254 }

◆ ReadBuffer()

void TVirtualConverter::ReadBuffer ( TBuffer &  b,
void *  obj,
Version_t  version,
UInt_t  R__s,
UInt_t  R__c 
)
virtual

Read object in non-split mode.

Parameters
bThe source of the data.
objThe object into which we're reading. (This will be the transient object.)
versionThe version number of the class.
R__sThe starting position in the buffer.
R__cThe number of bytes for this object in the buffer.

You normally shouldn't have to worry about this, but it's exposed here so that it can be overridden if needed. It's only used when reading in non-split mode.

Definition at line 283 of file TVirtualConverter.cxx.

288 {
289  // Make sure that we've done automatic schema evolution on the
290  // persistent side.
292 
293  // Make an instance of the persistent class, if we haven't done so already.
294  if (fPersObj == 0)
295  fPersObj = NewPersObj();
296 
297  // Read in the object, as an instance of the persistent class.
298  fPersClass->ReadBuffer (b, fPersObj, version, R__s, R__c);
299 
300  // Convert to the transient representation.
302 }

◆ SetCtorInfo()

void TVirtualConverter::SetCtorInfo ( UInt_t  checksum,
TClass *  trans_cls,
TClass *  pers_cls 
)
protected

Set the parameters that would normally be passed to the constructor.

Parameters
checksumThe Root checksum of the persistent class we'll convert.
trans_clsThe transient class to which we will be converting.
pers_clsThe persistent class from which we will be converting.

Intended for use with T_AthenaRootConverter only!

Definition at line 431 of file TVirtualConverter.cxx.

434 {
435  assert (fTransClass == 0);
436 
437  fCheckSum = checksum;
438  fTransClass = trans_cls;
439  fPersClass = pers_cls;
440  CheckClasses();
441 }

◆ ToClass() [1/2]

TClass * TVirtualConverter::ToClass ( const std::string &  name)
static

Helper to convert a class name to a Root class pointer.

Parameters
nameThe name of the class to convert.

Returns 0 on failure.

Definition at line 311 of file TVirtualConverter.cxx.

312 {
313  return gROOT->GetClass (name.c_str());
314 }

◆ ToClass() [2/2]

TClass * TVirtualConverter::ToClass ( const std::type_info &  id)
static

Helper to convert a type_info to a Root class pointer.

Parameters
nameThe type_info of the class to convert.

Returns 0 on failure.

Definition at line 323 of file TVirtualConverter.cxx.

324 {
325  TClass* cl = gROOT->GetClass (id);
326  if (cl) return cl;
327 
328  // This may fail if the dictionary hasn't been loaded yet,
329  // since we can auto-load only on the name.
330  // Make some attempt to get a name from the type_info.
331  const char* name = id.name();
332  cl = gROOT->GetClass (name);
333  if (cl) return cl;
334 
335  const char* n2 = name;
336  while (isdigit(*n2))
337  ++n2;
338  cl = gROOT->GetClass (n2);
339  if (cl) return cl;
340 
341  int errorCode = 0;
342  char* demname = nullptr;
343  {
344  // Protect against data race inside TClassEdit.
345  // https://github.com/root-project/root/issues/10353
346  // Should be fixed in root 6.26.02.
347  R__WRITE_LOCKGUARD(ROOT::gCoreMutex);
348  demname = TClassEdit::DemangleTypeIdName (id, errorCode);
349  }
350  if (demname) {
351  cl = gROOT->GetClass (demname);
352  free (demname);
353  }
354  return cl;
355 }

Member Data Documentation

◆ fCheckSum

UInt_t TVirtualConverter::fCheckSum
private

The declared checksum.

Definition at line 261 of file TVirtualConverter.h.

◆ fOldLast

int TVirtualConverter::fOldLast
private

Used by CheckStreamInfos: the length of the streamerinfo list that we saw on the last CheckStreamInfos call.

Definition at line 265 of file TVirtualConverter.h.

◆ fPersClass

TClass* TVirtualConverter::fPersClass
private

The declared persistent class.

Definition at line 258 of file TVirtualConverter.h.

◆ fPersObj

void* TVirtualConverter::fPersObj
protected

The temporary persistent object instance, used for conversions (in non-split mode).

Definition at line 271 of file TVirtualConverter.h.

◆ fTransClass

TClass* TVirtualConverter::fTransClass
private

The declared transient class.

Definition at line 255 of file TVirtualConverter.h.


The documentation for this class was generated from the following files:
TVirtualConverter::ToClass
static TClass * ToClass(const std::string &name)
Helper to convert a class name to a Root class pointer.
Definition: TVirtualConverter.cxx:311
TVirtualConverter::fOldLast
int fOldLast
Used by CheckStreamInfos: the length of the streamerinfo list that we saw on the last CheckStreamInfo...
Definition: TVirtualConverter.h:265
TVirtualConverter::fCheckSum
UInt_t fCheckSum
The declared checksum.
Definition: TVirtualConverter.h:261
TVirtualConverter::fTransClass
TClass * fTransClass
The declared transient class.
Definition: TVirtualConverter.h:255
TVirtualConverter::fPersObj
void * fPersObj
The temporary persistent object instance, used for conversions (in non-split mode).
Definition: TVirtualConverter.h:271
TVirtualConverter::CheckClasses
void CheckClasses()
Helper to check that the classes have been defined properly.
Definition: TVirtualConverter.cxx:189
TVirtualConverter::CheckStreamInfos
void CheckStreamInfos()
Helper to allow for automatic schema evolution for persistent classes.
Definition: TVirtualConverter.cxx:369
TVirtualConverter::fPersClass
TClass * fPersClass
The declared persistent class.
Definition: TVirtualConverter.h:258
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
python.PyAthena.v
v
Definition: PyAthena.py:154
get_generator_info.version
version
Definition: get_generator_info.py:33
TVirtualConverter::NewPersObj
virtual void * NewPersObj()
Create a new instance of the persistent class.
Definition: TVirtualConverter.cxx:251
TVirtualConverter::DeletePersObj
virtual void DeletePersObj(void *persobj)
Destroy an instance of the persistent class.
Definition: TVirtualConverter.cxx:264
L1Topo::Error
Error
The different types of error that can be flagged in the L1TopoRDO.
Definition: Error.h:16
python.PyAthena.obj
obj
Definition: PyAthena.py:132
TVirtualConverter::ConvertVoid
virtual void ConvertVoid(void *transobj, const void *persobj)=0
Do the conversion.
dq_make_web_display.cl
cl
print [x.__class__ for x in toList(dqregion.getSubRegions()) ]
Definition: dq_make_web_display.py:26