KaliVeda  1.13/01
Heavy-Ion Analysis Toolkit
KVASMultiDetArray.cpp
Go to the documentation of this file.
1 /***************************************************************************
2 $Id: KVMultiDetArray.cpp,v 1.91 2009/04/06 11:54:54 franklan Exp $
3  KVMultiDetArray.cpp - description
4  -------------------
5  begin : Thu May 16 2002
6  copyright : (C) 2002 by J.D. Frankland
7  email : frankland@ganil.fr
8  ***************************************************************************/
9 
10 /***************************************************************************
11  * *
12  * This program is free software; you can redistribute it and/or modify *
13  * it under the terms of the GNU General Public License as published by *
14  * the Free Software Foundation; either version 2 of the License, or *
15  * (at your option) any later version. *
16  * *
17  ***************************************************************************/
18 #include "Riostream.h"
19 #include "TROOT.h"
20 #include "KVASMultiDetArray.h"
21 #include "KVDetector.h"
22 #include "KVDetectorEvent.h"
23 #include "KVReconstructedEvent.h"
24 #include "KVEBYEDAT_ACQParam.h"
25 #include "KVRList.h"
26 #include "KVLayer.h"
27 #include "KVTemplateEvent.h"
28 #include "KVNucleus.h"
29 #include "KVASGroup.h"
30 #include "KVRing.h"
31 #include "KVTelescope.h"
32 #include "KVMaterial.h"
33 #include "KVTarget.h"
34 #include "KVIDTelescope.h"
35 #include "KV2Body.h"
36 #include <KVString.h>
37 #include <TObjString.h>
38 #include <TObjArray.h>
39 #include <KVIDGridManager.h>
40 #include "TPluginManager.h"
41 #include "TGeoManager.h"
42 #include "TGeoMedium.h"
43 #include "TGeoMaterial.h"
44 #include "KVHashList.h"
45 #include "KVNameValueList.h"
46 #include "KVUniqueNameList.h"
47 #include "KVIonRangeTable.h"
48 
49 using namespace std;
50 
52 
53 
54 
57 {
58  init();
59 }
60 
61 
62 
64 
66 {
67  fCurrentLayerNumber = 0;
68 }
69 
70 
71 
72 
75 
76 KVASMultiDetArray::~KVASMultiDetArray()
77 {
78  //destroy (delete) the MDA and all the associated structure, detectors etc.
79 }
80 
81 
82 
83 
86 
88 {
89 //Update the list of groups in the detector array by comparing all telescopes in two layers.
90 
91  TIter lay1_nextring(l1->GetStructures());
92  TIter lay2_nextring(l2->GetStructures());
93  KVRing* kring1, *kring2;
94  // loop over all pairs of rings in the two layers
95  while ((kring1 = (KVRing*) lay1_nextring())) {
96  while ((kring2 = (KVRing*) lay2_nextring())) {
97 #ifdef KV_DEBUG
98  cout <<
99  "SetGroups(KVLayer * l1, KVLayer * l2) - Looking at rings:" <<
100  endl;
101  cout << " kring1 - " << kring1->GetName() << ", " << kring1->
102  GetType() << ", " << kring1->GetNumber() << endl;
103  cout << " kring2 - " << kring2->GetName() << ", " << kring2->
104  GetType() << ", " << kring2->GetNumber() << endl;
105 #endif
106  if ((kring1->IsOverlappingWith(kring2))) // overlap between rings ?
107 #ifdef KV_DEBUG
108  cout << " +++ Calling UpdateGroupsInRings" << endl;
109 #endif
110  UpdateGroupsInRings(kring1, kring2);
111  }
112  lay2_nextring.Reset();
113  }
114 }
115 
116 
117 
120 
122 {
123 //Calculate groups by comparing two rings in different layers.
124  TIter r1nxtele(r1->GetTelescopes());
125  TIter r2nxtele(r2->GetTelescopes());
126  KVTelescope* kvt1, *kvt2;
127  // loop over all pairs of telescopes in the two rings
128  while ((kvt1 = (KVTelescope*) r1nxtele())) {
129  while ((kvt2 = (KVTelescope*) r2nxtele())) {
130  if (kvt1->IsOverlappingWith(kvt2)) {
131  AddToGroups(kvt1, kvt2);
132  }
133  }
134  r2nxtele.Reset();
135  }
136 }
137 
138 
139 
140 
141 
142 
145 
147 {
148  // Return pointer to telescope in array with name given by "name"
149  KVSeqCollection* fLayers = GetStructureTypeList("LAYER");
150  TIter nextL(fLayers);
151  KVLayer* k1;
152  KVRing* k2;
153  KVTelescope* k3;
154  while ((k1 = (KVLayer*) nextL())) { // loop over layers
155  TIter nextR(k1->GetStructures());
156  while ((k2 = (KVRing*) nextR())) { // loop over rings
157  TIter nextT(k2->GetTelescopes());
158  while ((k3 = (KVTelescope*) nextT())) {
159  if (!strcmp(k3->GetName(), name)) {
160  delete fLayers;
161  return k3;
162  }
163  // search among telescopes of ring
164  }
165  }
166  }
167  delete fLayers;
168  return 0;
169 }
170 
171 
172 
173 
174 
181 
183 {
184  // Set up list of all detectors in array
185  // This method is called after array geometry has been defined.
186  // We set the name of each detector by calling its KVDetector::GetArrayName()
187  // method (or overrides in child classes), as the name may depend on the
188  // position in the final array geometry.
189 
190  fDetectors.Clear();
191 
192  KVSeqCollection* fLayers = GetStructureTypeList("LAYER");
193  TIter nextL(fLayers);
194  KVLayer* k1;
195  KVRing* k2;
196  KVTelescope* k3;
197  KVDetector* k4;
198  while ((k1 = (KVLayer*) nextL())) { // loop over layers
199  TIter nextR(k1->GetStructures());
200  while ((k2 = (KVRing*) nextR())) { // loop over rings
201  TIter nextT(k2->GetTelescopes());
202  while ((k3 = (KVTelescope*) nextT())) { // loop over telescopes
203  TIter nextD(k3->GetDetectors());
204  while ((k4 = (KVDetector*) nextD())) { // loop over detectors
205  if (k4->InheritsFrom("KVDetector"))
206  k4->SetName(k4->GetArrayName()); //set name of detector
207  Add(k4);
208  }
209  ((KVUniqueNameList*)k3->GetDetectors())->Rehash();//keep consistency if any detector names changed
210  }
211  ((KVUniqueNameList*)k2->GetStructures())->Rehash();//keep consistency if any telescope names changed
212  }
213  }
214  // rehash detector node lists due to change of names of all detectors
215  TIter nextD(GetDetectors());
216  while ((k4 = (KVDetector*)nextD())) k4->GetNode()->RehashLists();
217 
218 #ifdef KV_DEBUG
219  Info("MakeListOfDetectors", "Success");
220 #endif
221  delete fLayers;
222 }
223 
224 
225 
228 
230  const Char_t* ring_name) const
231 {
232  //find named ring in named layer
233  KVLayer* tmp = GetLayer(layer);
234  KVRing* ring = 0;
235  if (tmp) {
236  ring = (KVRing*)tmp->GetStructure("RING", ring_name);
237  }
238  return ring;
239 }
240 
241 
242 
245 
246 KVRing* KVASMultiDetArray::GetRing(const Char_t* layer, UInt_t ring_number) const
247 {
248  //find numbered ring in named layer
249  KVLayer* tmp = GetLayer(layer);
250  KVRing* ring = 0;
251  if (tmp) {
252  ring = (KVRing*)tmp->GetStructure("RING", ring_number);
253  }
254  return ring;
255 }
256 
257 
258 
261 
262 KVRing* KVASMultiDetArray::GetRing(UInt_t layer, const Char_t* ring_name) const
263 {
264  //find named ring in numbered layer
265  KVLayer* tmp = GetLayer(layer);
266  KVRing* ring = 0;
267  if (tmp) {
268  ring = (KVRing*)tmp->GetStructure("RING", ring_name);
269  }
270  return ring;
271 }
272 
273 
274 
277 
278 KVRing* KVASMultiDetArray::GetRing(UInt_t layer, UInt_t ring_number) const
279 {
280  //find numbered ring in numbered layer
281  KVLayer* tmp = GetLayer(layer);
282  KVRing* ring = 0;
283  if (tmp) {
284  ring = (KVRing*)tmp->GetStructure("RING", ring_number);
285  }
286  return ring;
287 }
288 
289 
290 
291 
293 
295 {
296  ClearStructures("GROUP"); // clear out (delete) old groups
297 
298  const KVSeqCollection* fLayers = GetStructures();
299  ((KVUniqueNameList*)fLayers)->Sort();
300 
301  TIter nxtlay1(fLayers);
302  KVLayer* l1;
303  if (fLayers->GetSize() > 1) {
304  fGr = 0; // for numbering groups
305  TIter nxtlay2(fLayers);
306  KVLayer* l2;
307 
308  while ((l1 = (KVLayer*) nxtlay1())) { // loop over layers
309  while ((l2 = (KVLayer*) nxtlay2())) { // loop over layers
310  if ((l1->GetNumber() < l2->GetNumber())
311  && ((UInt_t) l1->GetNumber() <
312  (UInt_t) fLayers->GetSize()))
313  SetGroups(l1, l2); // compare all telescopes in different layers
314  }
315  nxtlay2.Reset();
316  }
317  } //if(fLayers->GetSize()>1)
318 
319  // Finally, create groups for all orphan telescopes which are not in any existing
320  // group
321 
322  nxtlay1.Reset(); // reset loop over layers
323  while ((l1 = (KVLayer*) nxtlay1())) { // loop over layers
324  if (l1->GetStructures()) {
325  TIter nxtrng(l1->GetStructures());
326  KVRing* robj;
327  while ((robj = (KVRing*) nxtrng())) { // loop over rings
328  TIter nxtscp(robj->GetTelescopes());
329  KVTelescope* tobj;
330  while ((tobj = (KVTelescope*) nxtscp())) { // loop over telescopes
331  if (!tobj->GetParentStructure("GROUP")) { // orphan telescope
332 
333  KVASGroup* kvg = new KVASGroup();
334  kvg->SetNumber(++fGr);
335  kvg->Add(tobj);
336  //group dimensions determined by detector dimensions
337  kvg->SetPolarMinMax(tobj->GetThetaMin(),
338  tobj->GetThetaMax());
339  kvg->SetAzimuthalMinMax(tobj->GetPhiMin(),
340  tobj->GetPhiMax());
341  Add(kvg);
342  }
343  }
344  }
345  }
346  }
347 }
348 
349 
350 
356 
358 {
359 // The two telescopes are in angular overlap.
360 // a) if neither are in groups already, create a new group to which they both belong
361 // b) if one of them is in a group already, add the orphan telescope to it
362 // c) if both are in groups already, merge the two groups
363  KVASGroup* kvg;
364 
365  if (!kt1->GetParentStructure("GROUP") && !kt2->GetParentStructure("GROUP")) { // case a)
366 #ifdef KV_DEBUG
367  cout << "Making new Group from " << kt1->
368  GetName() << " and " << kt2->GetName() << endl;
369 #endif
370  kvg = new KVASGroup();
371  kvg->SetNumber(++fGr);
372  kvg->Add(kt1);
373  kvg->Add(kt2);
374  kvg->Sort(); // sort telescopes in list
375  kvg->SetDimensions(kt1, kt2); // set group dimensions from telescopes
376  //add to list
377  Add(kvg);
378  }
379  else if ((kvg = (KVASGroup*)(kt1->GetParentStructure("GROUP")))
380  && !kt2->GetParentStructure("GROUP")) { // case b) - kt1 is already in a group
381 #ifdef KV_DEBUG
382  cout << "Adding " << kt2->GetName() << " to group " << kvg->
383  GetNumber() << endl;
384 #endif
385  //add kt2 to group
386  kvg->Add(kt2);
387  kvg->Sort(); // sort telescopes
388  kvg->SetDimensions(kvg, kt2); //adjust dimensions depending on kt2
389  }
390  else if ((kvg = (KVASGroup*)(kt2->GetParentStructure("GROUP")))
391  && !kt1->GetParentStructure("GROUP")) { // case b) - kt2 is already in a group
392 #ifdef KV_DEBUG
393  cout << "Adding " << kt1->GetName() << " to group " << kvg->
394  GetNumber() << endl;
395 #endif
396  //add kt1 to group
397  kvg->Add(kt1);
398  kvg->Sort(); // sort telescopes
399  kvg->SetDimensions(kvg, kt1); //adjust dimensions depending on kt1
400  }
401  else if (kt1->GetParentStructure("GROUP") != kt2->GetParentStructure("GROUP")) { //both telescopes already in different groups
402 #ifdef KV_DEBUG
403 // cout << "Merging " << kt1->GetGroup()->
404 // GetNumber() << " and " << kt2->GetGroup()->GetNumber() << endl;
405 // cout << "because of " << kt1->GetName() << " and " << kt2->
406 // GetName() << endl;
407 #endif
408  MergeGroups((KVASGroup*)kt1->GetParentStructure("GROUP"), (KVASGroup*)kt2->GetParentStructure("GROUP"));
409  }
410 }
411 
412 
435 
437 {
438  //Merge two existing groups into a new single group.
439 
440  //look through kg1 telescopes.
441  //set their "group" to kg2.
442  //if they are not already in kg2, add them to kg2.
443 // KVTelescope *tel = 0;
444 // TIter next(kg1->GetTelescopes());
445 // while ((tel = (KVTelescope *) next())) {
446 // if (kg2->Contains(tel)) {
447 // tel->SetGroup(kg2); //make sure telescope has right group pointer
448 // } else {
449 // kg2->Add(tel);
450 // }
451 // }
452 // //remove kg1 from list and destroy it
453 // fGroups->Remove(kg1);
454 // delete kg1;
455 // //sort merged group and calculate dimensions
456 // kg2->Sort();
457 // kg2->SetDimensions();
458 // //renumber groups and reset group counter
459 // RenumberGroups();
460  Warning("KVASMultiDetArray", "Needs reimplementing");
461 }
462 
463 
479 
481 {
482 // Simulate detection of a single particle (nucleus) by multidetector array.
483 // We look for the group in the array that the particle will hit
484 //
485 // If a group is found the detection of this particle
486 // by the different members of the group is simulated.
487 // The detectors concerned have their fEloss members set to the energy lost by the
488 // particle when it crosses them.
489 //
490 // Returns a list (KVNameValueList pointer) of the crossed detectors with their name and energy loss
491 // if particle hits detector in array, 0 if not (i.e. particle
492 // in beam pipe or dead zone of the multidetector)
493 // INFO User has to delete the KVNameValueList after its use
494 //
495  //find group in array hit by particle
496  KVASGroup* grp_tch = (KVASGroup*)GetGroupWithAngles(part->GetTheta(), part->GetPhi());
497  if (grp_tch) {
498  //simulate detection of particle by this group
499  KVNameValueList* nvl = grp_tch->DetectParticle(part);
500  return nvl;
501  }
502  return 0;
503 }
504 
505 
506 
507 
510 
512 {
513  // return pointer to group in array according to given polar coordinates
514  KVSeqCollection* fGroups = GetStructures()->GetSubListWithType("GROUP");
515 
516  TIter next(fGroups);
517  KVGroup* obj;
518  while ((obj = (KVGroup*) next())) { // loop over group list
519  if (((KVASGroup*)obj)->IsInPolarRange(theta)
520  && ((KVASGroup*)obj)->IsInPhiRange(phi)) {
521  delete fGroups;
522  return obj;
523  }
524  }
525  delete fGroups;
526  return 0; // no group found with these coordinates
527 }
528 
529 
530 
535 
537 {
538  //Create and fill list of telescopes at position (theta, phi) sorted
539  //according to distance from target (closest first).
540  //User must delete list after use.
541  KVASGroup* gr = (KVASGroup*)GetGroupWithAngles(theta, phi);
542  TList* tmp = 0;
543  if (gr)
544  tmp = gr->GetTelescopesWithAngles(theta, phi);
545  return tmp;
546 }
547 
548 
549 
550 
555 
557 {
558  // compute & return the total solid angle (msr) of the array
559  // it is the sum of solid angles of all existing KVGroups
560 
561  // if ROOT geometry is used, just use base class method
562  if (IsROOTGeometry()) return KVMultiDetArray::GetTotalSolidAngle();
563 
564  Double_t ftotal_solid_angle = 0.0;
565  KVASGroup* grp;
566  KVSeqCollection* fGroups = GetStructures()->GetSubListWithType("GROUP");
567 
568  TIter ngrp(fGroups);
569  while ((grp = (KVASGroup*) ngrp())) {
570  ftotal_solid_angle += grp->GetSolidAngle(); // use the KVPosition::GetSolidAngle()
571  }
572  delete fGroups;
573  return ftotal_solid_angle;
574 }
575 
576 
577 
593 
595 {
596  //Identify all the ways of identifying particles possible from the detectors
597  //in the group, create the appropriate KVIDTelescope objects and add them to
598  //the list pointed to by tel_list.
599  //USER'S RESPONSIBILITY TO DELETE CONTENTS OF LIST!!
600  //
601  //Starting from each detector in the "detector layer" furthest from the
602  //target, we build ID telescopes from all pairs of aligned detectors.
603  //We then continue up through the layers of the group
604  //
605  //For each pair of detectors, it is KVMultiDetArray::GetIDTelescopes
606  //which determines which KVIDTelescope class to use (specialise this method
607  //in KVMultiDetArray child classes). It must also make sure that
608  //each IDTelescope is added only once (i.e. check it is not already in the
609  //list).
610 
611  for (int lay = grp->GetNumberOfDetectorLayers(); lay > 0; lay--) {
612 
613  unique_ptr<TList> det_lay(grp->GetDetectorsInLayer(lay));
614  if (det_lay.get()) {
615 
616  TIter next_det(det_lay.get());
617  KVDetector* det;
618 
619  while ((det = (KVDetector*) next_det())) {
620  if (det->IsOK()) {
621  //1st call: create ID telescopes, they will be added to the
622  //gMultiDetArray list of IDTelescopes
623  GetAlignedIDTelescopesForDetector(det, tel_list);
624  //2nd call: set up in the detector a list of pointers to the
625  //ID telescopes made up of it and all aligned detectors in front
626  //of it
627  GetAlignedIDTelescopesForDetector(det, 0);
628  }
629  }
630 
631  }
632  }
633 }
634 
635 
636 
639 
641 {
642  // Set up detectors in de-e identification telescope and add to idtels
643 
644  idt->AddDetector(de);
645  idt->AddDetector(e);
646  if (de->GetGroup()) {
647  idt->SetGroup(de->GetGroup());
648  }
649  else {
650  idt->SetGroup(e->GetGroup());
651  }
652  if (idtels->FindObject(idt->GetName())) {
653  delete idt;
654  }
655  else {
656  idtels->Add(idt);
657  }
658 }
659 
660 
661 
664 
666 {
667  // Set up detector in single-stage identification telescope and add to idtels
668 
669  idt->AddDetector(det);
670  idt->SetGroup(det->GetGroup());
671  if (idtels->FindObject(idt->GetName())) {
672  delete idt;
673  }
674  else {
675  idtels->Add(idt);
676  }
677 }
678 
679 
680 
682 
684 {
685 
686  KVASGroup* ASgrp = dynamic_cast<KVASGroup*>(grp);
687  if (!ASgrp) {
688  Fatal("AnalyseGroupAndReconstructedEvent",
689  "All groups in KVASMultiDetArray must derive from KVASGroup! %s is NOT a KVASGroup", grp->GetName());
690  return;
691  }
692  UInt_t nLayers = ASgrp->GetNumberOfLayers();
693 
694  UInt_t initial_hits_in_group = grp->GetHits();
695 
696  if (nLayers > 1) {
697  //multilayer group
698  //Start with layer furthest from target and work inwards (but don't look at layer
699  //nearest to target)
700  for (UInt_t i = ASgrp->GetLayerFurthestTarget();
701  i > ASgrp->GetLayerNearestTarget(); i--) {
702  TList* kvtl = ASgrp->GetTelescopesInLayer(i);
703  if (kvtl) {
704  AnalyseTelescopes(event, kvtl);
705  delete kvtl;
706  }
707  }
708 
709 
710  //if nothing has been found, then check for particles stopping in layer nearest target
711  if (grp->GetHits() == initial_hits_in_group) {
712  TList* kvtl =
714  if (kvtl) {
715  AnalyseTelescopes(event, kvtl);
716  delete kvtl;
717  }
718  }
719 
720  }
721  else {
722  //single layer group
723 #ifdef KV_DEBUG
724  Info("AnalyseGroup", "Single layer group");
725 #endif
726  //for a single layer group we should have
727  //kvg->GetLayerNearestTarget() = kvg->GetLayerFurthestTarget()
728  //so we can use either one as argument for kvg->GetTelescopesInLayer
729  TList* kvtl =
731  if (kvtl) {
732  AnalyseTelescopes(event, kvtl);
733  delete kvtl;
734  }
735  }
736 
737 #ifdef KV_DEBUG
738  Info("AnalyseGroup", "OK after analysis of hit groups");
739 #endif
740 
741  //perform first-order coherency analysis (set fAnalStatus for each particle)
743 }
744 
745 
746 
747 
749 
751 {
752 
753  KVTelescope* t;
754  TIter nxt_tel(kvtl);
755  //get max number of detectors in telescopes of layer
756  Int_t max = 0;
757  while ((t = (KVTelescope*)nxt_tel()))
758  if (max < t->GetDetectors()->GetSize())
759  max = t->GetDetectors()->GetSize();
760  //before, we assumed all telescopes to be same in layer:
761  // but in fact it's not true
762  //UInt_t ndet = ((KVTelescope *) (kvtl->First()))->GetSize();
763  UInt_t ndet = max;
764 
765  for (UInt_t i = ndet; i > 0; i--) {
766 
767  nxt_tel.Reset();
768  TList detlist;
769 
770  //start from last detectors and move inwards
771  while ((t = (KVTelescope*) nxt_tel())) {
772  //loop over detectors in each telescope
773  if ((UInt_t)t->GetDetectors()->GetSize() >= i) {
774  KVDetector* d = t->GetDetector(i);
775  if (d)
776  detlist.Add(d);
777  else
778  Warning("AnalyseTelescopes", "pointeur KVDetector NULL");
779  }
780  }
781 
782  event->AnalyseDetectors(&detlist);
783 
784  }
785 }
786 
787 
788 
int Int_t
unsigned int UInt_t
ClassImp(KVASMultiDetArray) KVASMultiDetArray
#define d(i)
#define e(i)
char Char_t
double Double_t
float Float_t
Group in axially-symmetric array (obsolete)
Definition: KVASGroup.h:16
UInt_t GetLayerNearestTarget() const
Definition: KVASGroup.cpp:483
void Add(KVBase *)
Definition: KVASGroup.cpp:47
void Sort()
Definition: KVASGroup.cpp:144
UInt_t GetNumberOfLayers()
Definition: KVASGroup.h:30
void SetDimensions(KVPosition *, KVPosition *)
Definition: KVASGroup.cpp:108
UInt_t GetLayerFurthestTarget() const
Definition: KVASGroup.cpp:503
KVNameValueList * DetectParticle(KVNucleus *part)
Definition: KVASGroup.cpp:163
TList * GetTelescopesInLayer(UInt_t nlayer)
Definition: KVASGroup.cpp:225
Base class for azimuthally-symmetric multidetector arrays (obsolete)
virtual void set_up_telescope(KVDetector *de, KVDetector *e, KVIDTelescope *idt, TCollection *l)
Set up detectors in de-e identification telescope and add to idtels.
virtual void MergeGroups(KVASGroup *kg1, KVASGroup *kg2)
KVRing * GetRing(const Char_t *layer, const Char_t *ring_name) const
find named ring in named layer
virtual void set_up_single_stage_telescope(KVDetector *det, KVIDTelescope *idt, TCollection *l)
Set up detector in single-stage identification telescope and add to idtels.
virtual Double_t GetTotalSolidAngle(void) const
KVNameValueList * DetectParticle_KV(KVNucleus *part)
KVTelescope * GetTelescope(const Char_t *name) const
Return pointer to telescope in array with name given by "name".
void SetGroups(KVLayer *, KVLayer *)
Update the list of groups in the detector array by comparing all telescopes in two layers.
void UpdateGroupsInRings(KVRing *r1, KVRing *r2)
Calculate groups by comparing two rings in different layers.
virtual void AddToGroups(KVTelescope *kt1, KVTelescope *kt2)
void AnalyseGroupAndReconstructEvent(KVReconstructedEvent *event, KVGroup *grp)
void AnalyseTelescopes(KVReconstructedEvent *event, TList *kvtl)
virtual KVGroup * GetGroupWithAngles(Float_t theta, Float_t phi)
return pointer to group in array according to given polar coordinates
void GetIDTelescopesForGroup(KVGroup *grp, TCollection *tel_list)
TList * GetTelescopes(Float_t theta, Float_t phi)
UInt_t GetNumber() const
Definition: KVBase.h:219
Base class for detector geometry description.
Definition: KVDetector.h:159
virtual const Char_t * GetArrayName()
Definition: KVDetector.cpp:439
virtual Bool_t IsOK() const
Definition: KVDetector.h:681
KVGroup * GetGroup() const
KVGeoDetectorNode * GetNode()
Definition: KVDetector.h:325
const KVSeqCollection * GetDetectors() const
const KVSeqCollection * GetStructures() const
KVGeoStrucElement * GetStructure(const Char_t *name) const
KVGeoStrucElement * GetParentStructure(const Char_t *type, const Char_t *name="") const
Group of detectors which can be treated independently of all others in array.
Definition: KVGroup.h:19
UInt_t GetHits()
Definition: KVGroup.h:57
virtual void SetNumber(UInt_t num)
Definition: KVGroup.h:38
virtual TList * GetDetectorsInLayer(UInt_t lay)
Definition: KVGroup.cpp:88
virtual UInt_t GetNumberOfDetectorLayers()
Definition: KVGroup.cpp:64
Base class for all detectors or associations of detectors in array which can identify charged particl...
Definition: KVIDTelescope.h:83
void SetGroup(KVGroup *kvg)
virtual void AddDetector(KVDetector *d)
Set of detectors at a similar distance from target (obsolete)
Definition: KVLayer.h:32
virtual Double_t GetTotalSolidAngle(void) const
Handles lists of named parameters with different types, a list of KVNamedParameter objects.
Description of properties and kinematics of atomic nuclei.
Definition: KVNucleus.h:125
Double_t GetTheta() const
Definition: KVParticle.h:682
Double_t GetPhi() const
Definition: KVParticle.h:690
virtual void SetAzimuthalMinMax(Double_t min, Double_t max)
Set min and max azimuthal angles and calculate (mean) phi.
Definition: KVPosition.cpp:216
virtual Double_t GetSolidAngle(void) const
Definition: KVPosition.cpp:567
Double_t GetPhiMax() const
Definition: KVPosition.h:145
Double_t GetPhiMin() const
Definition: KVPosition.h:141
Double_t GetThetaMin() const
Definition: KVPosition.h:149
virtual void SetPolarMinMax(Double_t min, Double_t max)
Set min and max polar angles and calculate (mean) theta.
Definition: KVPosition.cpp:171
Bool_t IsOverlappingWith(KVPosition *pos)
kTRUE if there is at least partial overlap between two solid angle elements
Definition: KVPosition.cpp:408
Double_t GetThetaMax() const
Definition: KVPosition.h:153
Event containing KVReconstructedNucleus nuclei reconstructed from hits in detectors.
static void AnalyseParticlesInGroup(KVGroup *grp)
Ring in INDRA array (obsolete)
Definition: KVRing.h:19
const KVSeqCollection * GetTelescopes() const
Definition: KVRing.h:30
KaliVeda extensions to ROOT collection classes.
virtual Int_t GetSize() const
KVSeqCollection * GetSubListWithType(const Char_t *retvalue) const
Associates two detectors placed one behind the other.
Definition: KVTelescope.h:35
KVDetector * GetDetector(Int_t n) const
Definition: KVTelescope.h:49
Optimised list in which named objects can only be placed once.
virtual TObject * FindObject(const char *name) const
virtual void Add(TObject *obj)=0
void Reset()
virtual void Add(TObject *obj)
virtual const char * GetName() const
virtual void SetName(const char *name)
virtual Bool_t InheritsFrom(const char *classname) const
TGraphErrors * gr
void Add(RHist< DIMENSIONS, PRECISION, STAT_TO... > &to, const RHist< DIMENSIONS, PRECISION, STAT_FROM... > &from)
void Info(const char *location, const char *va_(fmt),...)
void Fatal(const char *location, const char *va_(fmt),...)
void Warning(const char *location, const char *va_(fmt),...)
Type GetType(const std::string &Name)