KaliVeda  1.13/01
Heavy-Ion Analysis Toolkit
KVGeoNavigator.cpp
Go to the documentation of this file.
1 //Created by KVClassFactory on Mon Apr 22 14:53:13 2013
2 //Author: John Frankland,,,
3 
4 #include "KVGeoNavigator.h"
5 #include "KVTemplateEvent.h"
6 #include "KV3DGeoTrack.h"
7 #include "KVNucleusEvent.h"
8 #include <TGeoManager.h>
9 #include <TGeoMatrix.h>
10 #include "KVGeoStrucElement.h"
11 #include <TVirtualPad.h>
12 
14 
15 
16 
26 void KVGeoNavigator::FormatStructureName(const Char_t* type, Int_t number, KVString& name)
27 {
28  // If a format for naming structures of given type has been defined by a call
29  // to SetStructureNameFormat(const Char_t *, const Char_t *), we use it to
30  // format the name in the TString.
31  //
32  // If no format was given, we use by default "[type]_[number]".
33  //
34  // If SetNameCorrespondanceList(const Char_t *) was used, we use it to translate
35  // any names resulting from this formatting to their final value.
36 
37  name = "";
38  if (fStrucNameFmt.HasParameter(type)) {
39  KVString fmt = fStrucNameFmt.GetStringValue(type);
40  fmt.Begin("$");
41  while (!fmt.End()) {
42  KVString bit = fmt.Next();
43  if (bit.BeginsWith("type")) {
44  Ssiz_t ind = bit.Index("%");
45  if (ind > -1) {
46  bit.Remove(0, ind);
47  name += Form(bit.Data(), type);
48  } else
49  name += type;
50  } else if (bit.BeginsWith("number")) {
51  Ssiz_t ind = bit.Index("%");
52  if (ind > -1) {
53  bit.Remove(0, ind);
54  name += Form(bit.Data(), number);
55  } else
56  name += number;
57  } else
58  name += bit;
59  }
60  } else
61  name.Form("%s_%d", type, number);
62  TString tmp;
63  GetNameCorrespondance(name.Data(), tmp);
64  name = tmp;
65 }
66 
67 
68 
81 
83 {
84  // If a format for naming detectors has been defined by a call
85  // to SetDetectorNameFormat(const Char_t *), we use it to
86  // format the name in the TString.
87  //
88  // If no format was given we prefix the names of the parent structures
89  // to the basename in order to generate the full name of the detector:
90  //~~~~~~~~
91  // [struc1-name]_[struc2-name]_..._[detector-basename]
92  //~~~~~~~~
93  // If SetNameCorrespondanceList(const Char_t *) was used, we use it to translate
94  // any names resulting from this formatting to their final value.
95 
96  name = "";
97  if (!fCurStrucNumber) {
98  // no parent structures
99  name = basename;
100  } else {
101  if (fDetNameFmt == "") {
102  for (int i = 0; i < fCurStrucNumber; i++) {
104  name += Form("%s_", el->GetName());
105  }
106  name += basename;
107  } else {
108  // $det:name$ - will be replaced by the detector basename
109  // $struc:[type]:name$ - will be replaced by the name of the parent structure of given type
110  // $struc:[type]:type$ - will be replaced by the type of the parent structure of given type
111  // $struc:[type]:number$ - will be replaced by the number of the parent structure of given type
112  fDetNameFmt.Begin("$");
113  while (!fDetNameFmt.End()) {
114  KVString bit = fDetNameFmt.Next();
115  if (bit.Contains(":")) {
116  bit.Begin(":");
117  KVString itbit = bit.Next();
118  if (itbit == "det") {
119  itbit = bit.Next();
120  if (itbit.BeginsWith("name")) {
121  Ssiz_t ind = itbit.Index("%");
122  if (ind > -1) {
123  itbit.Remove(0, ind);
124  name += Form(itbit.Data(), basename);
125  } else
126  name += basename;
127  }
128  } else if (itbit == "struc") {
129  KVString struc_typ = bit.Next();
130  KVGeoStrucElement* el = 0;
131  for (int i = 0; i < fCurStrucNumber; i++) {
133  if (el->IsType(struc_typ)) break;
134  }
135  if (el) {
136  itbit = bit.Next();
137  if (itbit.BeginsWith("name")) {
138  Ssiz_t ind = itbit.Index("%");
139  if (ind > -1) {
140  itbit.Remove(0, ind);
141  name += Form(itbit.Data(), el->GetName());
142  } else
143  name += el->GetName();
144  } else if (itbit.BeginsWith("type")) {
145  Ssiz_t ind = itbit.Index("%");
146  if (ind > -1) {
147  itbit.Remove(0, ind);
148  name += Form(itbit.Data(), el->GetType());
149  } else
150  name += el->GetType();
151  } else if (itbit.BeginsWith("number")) {
152  Ssiz_t ind = itbit.Index("%");
153  if (ind > -1) {
154  itbit.Remove(0, ind);
155  name += Form(itbit.Data(), el->GetNumber());
156  } else
157  name += el->GetNumber();
158  }
159  }
160  }
161  } else
162  name += bit;
163  }
164  }
165  }
166  TString tmp;
167  GetNameCorrespondance(name.Data(), tmp);
168  name = tmp;
169 }
170 
171 
172 
175 
177  : fGeometry(g), fCurrentStructures("KVGeoStrucElement", 50), fDetStrucNameCorrespList(nullptr),
178  fDetectorPaths(kTRUE)
179 {
180  // Constructor. Call with pointer to geometry.
183 }
184 
185 
186 
189 
191 {
192  // Destructor
195 }
196 
197 
198 
218 
220 {
221  // The default names for structures are taken from the node name by stripping off
222  // the **STRUCT_** prefix. It is assumed that the remaining string is of the form
223  //~~~~~~~~
224  // "[structure type]_[structure number]"
225  //~~~~~~~~
227  //
228  // However, this format can be change by calling this method
229  //~~~~~~~~{.cpp}
230  // SetStructureNameFormat("[structure type]", "[format]")
231  //~~~~~~~~
232  // where format can contain any of the following tokens:
233  //~~~~~~~
234  // $type$ - will be replaced by the structure type name
235  // $type%[fmt]$ - will be replaced by the structure type name using given format
236  // $number$ - will be replaced by the structure number
237  // $number%[fmt]$ - will be replaced by the structure number using given format
238  //~~~~~~~
240 }
241 
242 
243 
269 
271 {
272  // Allows to provide a list of "translations" for naming structures/detectors
273  // "listfile" must be a file in TEnv format, e.g.
274  //
275  //~~~~~~~~
276  // SI_06_1_A1: SI_0601
277  // SI_06_1_A2: SI_0602
278  // SI_06_1_B1: SI_0701
279  // SI_06_1_B2: SI_0702
280  // SI_06_2_A1: SI_0603
281  // SI_06_2_A2: SI_0604
282  // SI_06_2_B1: SI_0703
283  //~~~~~~~~
284  //
285  // The name before ':' is the name of the detector or structure as deduced
286  // from the geometry, including any formatting due to SetStructureNameFormat()
287  // or SetDetectorNameFormat().
288  //
289  // The name after ':' is the name that will be used 'externally', e.g. by a
290  // KVMultiDetArray created from the geometry using KVGeoImport.
291  //
292  // Several lists can be combined by calling this method several times.
293  //
294  // "listfile" can be an absolute path name; if not, we look for it in
295  // `$KVROOT/KVFiles/data`, or in `$HOME`, or (finally) in `$PWD`.
296 
297  TString fullpath;
298  if (!SearchKVFile(listfile, fullpath, "data")) {
299  Warning("SetNameCorrespondanceList", "File %s not found", listfile);
300  return;
301  }
304 }
305 
306 
307 
310 
312 {
313  // copy TEnv of name correspondances
315  if (list) fDetStrucNameCorrespList = (TEnv*)list->Clone();
316 }
317 
318 
319 
325 
327 {
328  // IF name correspondance lists have been set with SetNameCorrespondanceList(const Char_t*),
329  // look up new name for 'name'.
330  //
331  // If found, returns kTRUE and 'tran' is the 'translated' name, otherwise returns kFALSE and tran=name.
332 
334  tran = fDetStrucNameCorrespList->GetValue(name, "");
335  if (tran == "") {
336  tran = name;
337  //Info("GetNameCorrespondance","...not found");
338  return kFALSE;
339  }
340  //Info("GetNameCorrespondance","...found %s", tran.Data());
341  return kTRUE;
342  }
343  //Info("GetNameCorrespondance","...not found");
344  tran = name;
345  return kFALSE;
346 }
347 
348 
349 
355 
357 {
358  // Propagate a set of particles through the geometry.
359  //
360  // By default, propagates particles from (0,0,0) (world coordinates),
361  // unless a different origin is given.
362 
363  ResetTrackID();
364  for (auto& part : EventIterator(TheEvent)) {
365  PropagateParticle(&part, TheOrigin);
366  }
367 }
368 
369 
370 
389 
391 {
392  // User-overridable method, to be redefined in child classes.
393  //
394  // This method is called every time that a propagated particle enters a new volume
395  // in the geometry.
396  // The user then has access to the following informations:
397  //
398  // - the TGeoVolume the particle is now entering (GetCurrentVolume());
399  // - the node in the geometry this volume occupies (GetCurrentNode());
400  // - the distance the particle will have to travel in this volume before
401  // leaving it (GetStepSize());
402  // - the position of the particle on the boundary as it enters this volume
403  // (GetEntryPoint()).
404  // - the position of the particle on the boundary as it leaves this volume
405  // (GetExitPoint()).
406  //
407  // If required, propagation of the particle can be stopped at any time by calling
408  // SetStopPropagation()
409 
410  AbstractMethod("ParticleEntersNewVolume");
411 }
412 
413 
414 
417 
419 {
420  // Returns pointer to internal copy of current global transformation matrix
421  return &fCurrentMatrix;
422 }
423 
424 
425 
436 
438 {
439  // Returns the name of the current detector (if we are inside a detector)
440  // and whether it is a multilayer or simple detector.
441  //
442  // Returns nullptr if we are not inside a detector volume.
443  //
444  // **N.B.** the returned volume corresponds to the *whole* detector (even if it has several layers).
445  // For a multilayer detector, GetCurrentVolume() returns the volume for the current layer.
446  //
447  // See ExtractDetectorNameFromPath() for details on detector name formatting.
448 
449  multilayer = kFALSE;
451  TString volNom = GetCurrentVolume()->GetName();
452  TGeoVolume* detector_volume = 0;
453  if (volNom.BeginsWith("DET_")) {
454  // simple detector
456  detector_volume = GetCurrentVolume();
457  } else {
458  // have we hit 1 layer of a multilayer detector?
459  TGeoVolume* mother_vol = GetCurrentNode()->GetMotherVolume();
460  if (mother_vol) {
461  TString mom = mother_vol->GetName();
462  if (mom.BeginsWith("DET_")) {
463  // it *is* a multilayer detector (youpi! :-)
464  if (fMotherNode) { // this is the node corresponding to the whole detector,
466  detector_volume = mother_vol;
467  multilayer = kTRUE;
468  }
469  }
470  }
471  }
472  if (detector_volume) ExtractDetectorNameFromPath(detector_name);
473  return detector_volume;
474 }
475 
476 
477 
482 
484 {
485  // Returns the node corresponding to the current detector volume
486  //
487  // **N.B.** the returned node corresponds to the *whole* detector (even if it has several layers).
488  return fCurrentDetectorNode;
489 }
490 
491 
492 
578 
580 {
581  // We analyse the current path in order to construct the full (unique) name
582  // of the detector, i.e. if the current path is
583  //
584  //~~~~~~~
585  // /TOP_1/STRUCT_BLOCK_2/CHIO_WALL_1/DET_CHIO_2/WINDOW_1
586  //~~~~~~~
587  //
588  // then the default name of the detector will be **BLOCK_2_CHIO_2**
589  // (see below to override this).
590  //
591  // This method also fills the fCurrentStructures array with elements
592  // deduced from the path, e.g. if the path is
593  //
594  //~~~~~~~
595  // /TOP_1/STRUCT_BLOCK_2/STRUCT_QUARTET_1/DET_SI1-T1
596  //~~~~~~~
597  //
598  // then by default
599  //~~~~~~~{.cpp}
600  // fCurrentStructures[0] = KVGeoStrucElement(name = "BLOCK_2", type = "BLOCK", number = 2)
601  // fCurrentStructures[1] = KVGeoStrucElement(name = "QUARTET_1", type = "QUARTET", number = 1)
602  //~~~~~~~
603  //
604  // and the default name of the detector will be **BLOCK_2_QUARTET_1_SI1-T1**
605  //
606  // ### STRUCTURE & DETECTOR NAME FORMATTING ###
607  // #### Structures ####
608  // The default names for structures are taken from the node name by stripping off
609  // the **STRUCT_** prefix. It is assumed that the remaining string is of the form
610  //~~~~~~~~~~
611  // "[structure type]_[structure number]"
612  //~~~~~~~~~~
613  // (the structure number is always taken after the last occurence of '_' in the
614  // node name). This is the name that will be used by default for the structure.
615  //
616  // However, this format can be change by calling method
617  //~~~~~{.cpp}
618  // SetStructureNameFormat("[structure type]", "[format]")
619  //~~~~~
620  // where format can contain any of the following tokens:
621  //~~~~~
622  // $type$ - will be replaced by the structure type name
623  // $type%[fmt]$ - will be replaced by the structure type name using given format
624  // $number$ - will be replaced by the structure number
625  // $number%[fmt]$ - will be replaced by the structure number using given format
626  //~~~~~
627  //
628  // Example: to change the name of the block in the previous example to "B-02":
629  //~~~~~~{.cpp}
630  // SetStructureNameFormat("BLOCK", "$type%.1s$-$number%02d$")
631  //~~~~~~
632  //
633  // #### Detectors ####
634  // The default base names for detectors are taken from the node name by stripping off
635  // the **DET_** prefix. In order to ensure that all detectors have unique names,
636  // by default we prefix the names of the parent structures to the basename in
637  // order to generate the full name of the detector:
638  //~~~~~~~
639  // [struc1-name]_[struc2-name]_..._[detector-basename]
640  //~~~~~~~
641  // However, this format can be changed by calling method
642  //~~~~~{.cpp}
643  // SetDetectorNameFormat("[format]")
644  //~~~~~
645  // where format can contain any of the following tokens:
646  //~~~~~~
647  // $det:name$ - will be replaced by the detector basename
648  // $struc:[type]:name$ - will be replaced by the name of the parent structure of given type
649  // $struc:[type]:type$ - will be replaced by the type of the parent structure of given type
650  // $struc:[type]:number$ - will be replaced by the number of the parent structure of given type
651  //~~~~~~
652  // plus additional formatting information as for SetStructureNameFormat() (see above).
653  //
654  // Example: to change the name of the **SI1-T1** detector in the previous example to
655  // **SI1-T1-Q1-B2**:
656  //~~~~~~{.cpp}
657  // SetDetectorNameFormat("$det:name$-Q$struc:QUARTET:number$-B$struc:BLOCK:number$");
658  //~~~~~~
659  // Or if you also change the format of the structure names:
660  //~~~~~~
661  // SetStructureNameFormat("BLOCK", "$type%.1s$$number$");
662  // SetStructureNameFormat("QUARTET", "$type%.1s$$number$");
663  // SetDetectorNameFormat("$det:name$-$struc:QUARTET:name$-$struc:BLOCK:name$");
664  //~~~~~~
665 
666 
667  KVString path = GetCurrentPath();
668  path.Begin("/");
669  detname = "";
671  fCurStrucNumber = 0;
672  while (!path.End()) {
673  KVString elem = path.Next();
674  if (elem.BeginsWith("STRUCT_")) {
675  // structure element. strip off "STRUCT_" and extract type and number of structure.
676  KVString struc_name(elem(7, elem.Length() - 7));
678  Ssiz_t last_ = struc_name.Last('_'); // find last '_' in structure name
679  TString type = struc_name(0, last_);
680  TString nums = struc_name(last_ + 1, struc_name.Length() - last_ - 1);
681  Int_t number = nums.Atoi();
682  KVString name;
683  FormatStructureName(type, number, name);
684  gel->SetNameTitle(name, type);
685  gel->SetNumber(number);
686  } else if (elem.BeginsWith("DET_")) {
687  // detector name. strip off "DET_" and use rest as basename
688  KVString basename(elem(4, elem.Length() - 4));
689  FormatDetectorName(basename, detname);
690  }
691  }
692 }
693 
694 
695 
702 
704 {
705  // Propagate a particle through the geometry in the direction of its momentum,
706  // until we reach the boundary of the geometry, or until fStopPropagation is set to kFALSE.
707  //
708  // Propagation will also stop if we encounter a volume whose name begins with "DEADZONE"
709 
710  // Define point of origin of particles
711  if (TheOrigin) fGeometry->SetCurrentPoint(TheOrigin->X(), TheOrigin->Y(), TheOrigin->Z());
712  else fGeometry->SetCurrentPoint(0., 0., 0.);
713 
714  // unit vector in direction of particle's momentum
715  TVector3 v = part->GetMomentum().Unit();
716  // use particle's momentum direction
717  fGeometry->SetCurrentDirection(v.x(), v.y(), v.z());
718  fGeometry->FindNode();
719 
725  // move along trajectory until we hit a new volume
729  TGeoNode* newNod = fGeometry->GetCurrentNode();
730  TGeoNode* newMom = fGeometry->GetMother();
731  TGeoHMatrix* newMatx = fGeometry->GetCurrentMatrix();
732  TString newPath = fGeometry->GetPath();
733 
734  Double_t XX, YY, ZZ;
735  XX = YY = ZZ = 0.;
736 
737  // reset user flag for stopping propagation of particle
739 
740 // if(IsTracking()) Info("PropagateParticle","Beginning: i am in %s on node %s with path %s",
741 // fCurrentVolume->GetName(),fCurrentNode->GetName(),fCurrentPath.Data());
742 
743  if (IsTracking() && fGeometry->IsOutside()) {
744  const Double_t* posi = fGeometry->GetCurrentPoint();
745  AddPointToCurrentTrack(posi[0], posi[1], posi[2]);
746  return;
747  }
748 
749  // track particle until we leave the geometry or until fStopPropagation
750  // becomes kTRUE
751  while (!fGeometry->IsOutside()) {
752 
753  const Double_t* posi = fGeometry->GetCurrentPoint();
754  fEntryPoint.SetXYZ(XX, YY, ZZ);
755  XX = posi[0];
756  YY = posi[1];
757  ZZ = posi[2];
758  fExitPoint.SetXYZ(XX, YY, ZZ);
759 
760  TString vn = GetCurrentVolume()->GetName();
761  if (vn.BeginsWith("DEADZONE")) {
762  part->GetParameters()->SetValue("DEADZONE", Form("%s/%s", GetCurrentVolume()->GetName(), GetCurrentNode()->GetName()));
763  break;
764  }
765 
766 // if(IsTracking()) Info("PropagateParticle","just before ParticleEntersNewVolume\nnow i am in %s on node %s with path %s",
767 // fCurrentVolume->GetName(),fCurrentNode->GetName(),fCurrentPath.Data());
768 
770 
771  if (StopPropagation()) break;
772 
773  fCurrentVolume = newVol;
774  fCurrentNode = newNod;
775  fMotherNode = newMom;
776  fCurrentMatrix = *newMatx;
777  fCurrentPath = newPath;
778 
779 // if(IsTracking()) Info("PropagateParticle","after ParticleEntersNewVolume\nnow i am in %s on node %s with path %s",
780 // fCurrentVolume->GetName(),fCurrentNode->GetName(),fCurrentPath.Data());
781 
782  // move on to next volume crossed by trajectory
785  newVol = fGeometry->GetCurrentVolume();
786  newNod = fGeometry->GetCurrentNode();
787  newMom = fGeometry->GetMother();
788  newMatx = fGeometry->GetCurrentMatrix();
789  newPath = fGeometry->GetPath();
790  }
791  if (IsTracking() && fGeometry->IsOutside()) {
792  const Double_t* posi = fGeometry->GetCurrentPoint();
793  AddPointToCurrentTrack(posi[0], posi[1], posi[2]);
794  }
795 }
796 
797 
798 
805 
807 {
808  // When using ROOT geometry, after calling PropagateEvent() to simulate detection of some particles,
809  // you can call this method to overlay the tracks of the corresponding particles on the 3D
810  // geometry of the array
811  //
812  // If KVNumberList pointer is given, use it to limit Z of drawn tracks
813 
814  TIter next_track(fGeometry->GetListOfTracks());
815  TVirtualGeoTrack* track;
816  bool first = true;
817  while ((track = (TVirtualGeoTrack*)next_track())) {
818  KVNucleus nuc(track->GetName());
819  if (!zlist || zlist->Contains(nuc.GetZ())) {
820  KV3DGeoTrack* gtrack = new KV3DGeoTrack(track);
821  if (first) {
822  if (gPad) gtrack->Draw("same");
823  else gtrack->Draw("ogl");
824  first = false;
825  } else gtrack->Draw("same");
826  }
827  }
828 }
829 
830 
int Int_t
KVTemplateEvent< KVNucleus >::EventIterator EventIterator
ClassImp(KVPartitionList) void KVPartitionList
Initialisation.
#define SafeDelete(p)
int Ssiz_t
char Char_t
const Bool_t kFALSE
bool Bool_t
double Double_t
const Bool_t kTRUE
kEnvUser
int type
char * Form(const char *fmt,...)
#define gPad
Visualise particle trajectories through array geometry.
Definition: KV3DGeoTrack.h:14
void Draw(Option_t *option="")
Override Draw to add a TPolyMarker3D at the end of the track.
virtual const Char_t * GetType() const
Definition: KVBase.h:176
virtual Bool_t IsType(const Char_t *typ) const
Definition: KVBase.h:184
virtual void SetNumber(UInt_t num)
Definition: KVBase.h:215
static Bool_t SearchKVFile(const Char_t *name, TString &fullpath, const Char_t *kvsubdir="")
Definition: KVBase.cpp:538
UInt_t GetNumber() const
Definition: KVBase.h:219
Abstract base class container for multi-particle events.
Definition: KVEvent.h:66
Base class for propagation of particles through array geometry.
virtual void AddPointToCurrentTrack(Double_t, Double_t, Double_t)
void FormatStructureName(const Char_t *type, Int_t number, KVString &name)
Bool_t IsTracking() const
TGeoHMatrix fCurrentMatrix
current global transformation matrix
void PropagateEvent(KVEvent *, TVector3 *TheOrigin=0)
const TGeoHMatrix * GetCurrentMatrix() const
Returns pointer to internal copy of current global transformation matrix.
TClonesArray fCurrentStructures
list of current structures deduced from path
TString fCurrentPath
current full path to physical node
void FormatDetectorName(const Char_t *basename, KVString &name)
TGeoNode * fCurrentDetectorNode
node for current detector
void ExtractDetectorNameFromPath(KVString &)
KVUniqueNameList fDetectorPaths
correspondance between physical node and detector objects
TGeoNode * GetCurrentNode() const
TGeoNode * fMotherNode
mother node of current node
void SetTracking(Bool_t on=kTRUE)
KVGeoNavigator(TGeoManager *)
Constructor. Call with pointer to geometry.
KVNameValueList fStrucNameFmt
list of user-defined formats for structure names
void SetNameCorrespondanceList(const Char_t *)
TVector3 fExitPoint
position of particle on exiting volume
TEnv * fDetStrucNameCorrespList
list(s) of correspondance for renaming structures/detectors
void SetStopPropagation(Bool_t stop=kTRUE)
virtual void PropagateParticle(KVNucleus *, TVector3 *TheOrigin=0)
TGeoNode * GetCurrentDetectorNode() const
virtual void ParticleEntersNewVolume(KVNucleus *)
TString GetCurrentPath() const
TGeoVolume * GetCurrentVolume() const
Bool_t GetNameCorrespondance(const Char_t *, TString &)
Double_t fStepSize
distance to travel in volume
TGeoManager * fGeometry
geometry to navigate
Bool_t StopPropagation() const
TGeoNode * fCurrentNode
current node
virtual ~KVGeoNavigator()
Destructor.
TVector3 fEntryPoint
position of particle on entering volume
KVString fDetNameFmt
user-defined format for detector names
Int_t fCurStrucNumber
number of current parent structures
void ResetTrackID(Int_t id=0)
TGeoVolume * fCurrentVolume
current volume
void SetStructureNameFormat(const Char_t *type, const Char_t *fmt)
TGeoVolume * GetCurrentDetectorNameAndVolume(KVString &, Bool_t &)
void DrawTracks(KVNumberList *=nullptr)
Base class describing elements of array geometry.
void SetValue(const Char_t *name, value_type value)
Description of properties and kinematics of atomic nuclei.
Definition: KVNucleus.h:125
Int_t GetZ() const
Return the number of proton / atomic number.
Definition: KVNucleus.cpp:770
Strings used to represent a set of ranges of values.
Definition: KVNumberList.h:83
Bool_t Contains(Int_t val) const
returns kTRUE if the value 'val' is contained in the ranges defined by the number list
TVector3 GetMomentum() const
Definition: KVParticle.h:606
KVNameValueList * GetParameters() const
Definition: KVParticle.h:816
virtual void SetOwner(Bool_t enable=kTRUE)
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Definition: KVString.h:72
void Begin(TString delim) const
Definition: KVString.cpp:565
Bool_t End() const
Definition: KVString.cpp:634
KVString Next(Bool_t strip_whitespace=kFALSE) const
Definition: KVString.cpp:695
virtual void Delete(Option_t *option="")
virtual void Clear(Option_t *option="")
TObject * ConstructedAt(Int_t idx)
virtual const char * GetValue(const char *name, const char *dflt) const
virtual Int_t ReadFile(const char *fname, EEnvLevel level)
TGeoHMatrix * GetCurrentMatrix() const
TGeoNode * GetCurrentNode() const
const Double_t * GetCurrentPoint() const
void SetCurrentDirection(Double_t *dir)
TGeoNode * GetMother(Int_t up=1) const
TGeoNode * FindNextBoundaryAndStep(Double_t stepmax=TGeoShape::Big(), Bool_t compsafe=kFALSE)
void SetCurrentPoint(Double_t *point)
TGeoNode * FindNode(Bool_t safe_start=kTRUE)
Bool_t IsOutside() const
Double_t GetStep() const
const char * GetPath() const
TGeoVolume * GetCurrentVolume() const
TObjArray * GetListOfTracks() const
TGeoVolume * GetMotherVolume() const
virtual const char * GetName() const
virtual void SetNameTitle(const char *name, const char *title)
void AbstractMethod(const char *method) const
virtual TObject * Clone(const char *newname="") const
virtual void Warning(const char *method, const char *msgfmt,...) const
Ssiz_t Length() const
Int_t Atoi() const
Ssiz_t Last(char c) const
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
const char * Data() const
void Form(const char *fmt,...)
TString & Remove(EStripType s, char c)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Double_t Z() const
void SetXYZ(Double_t x, Double_t y, Double_t z)
Double_t Y() const
Double_t X() const
TVector3 Unit() const
virtual const char * GetName() const
const long double g
masses
Definition: KVUnits.h:72
v