HYDRA_development_version
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
hpiontrackergeompar.cc
Go to the documentation of this file.
1 //_HADES_CLASS_DESCRIPTION
2 /////////////////////////////////////////////////////////////
3 //
4 // HPionTrackerGeomPar
5 //
6 // Container class for PionTracker geometry parameters
7 //
8 /////////////////////////////////////////////////////////////
9 
10 using namespace std;
11 #include "hpiontrackergeompar.h"
12 #include "hades.h"
13 #include "hspectrometer.h"
14 #include "hpiontrackerdetector.h"
15 #include "hparamlist.h"
16 #include <iostream>
17 
20 
21 void HPionTrackerDetGeomPar::print(void)
22 {
23  // prints the geometry parameters of a single detector
24  cout<<"Number of strips: "<<numStrips<<'\n';
25  cout<<"Distance between strips: "<<stripDistance<<'\n';
26  cout<<"Lab transformation:\n"<<" ";
27  labTransform.print();
28 }
29 
30 HPionTrackerGeomPar::HPionTrackerGeomPar(const Char_t* name, const Char_t* title,
31  const Char_t* context)
32  : HParCond(name, title, context) {
33  // constructor
34  numDetectors = 0;
35  pDetectors = NULL;
36 }
37 
38 
40  // destructor deletes the array of detectors
41  clear();
42 }
43 
45  // deletes the array of detectors
46  if (pDetectors) pDetectors->Delete();
47  delete pDetectors;
48  numDetectors = 0;
49 }
50 
52  // add the parameters to the list for writing
53  if (!l) return;
54  TArrayI nStrips(numDetectors);
55  TArrayF dist(numDetectors);
56  TArrayD transform(numDetectors*12);
57  for(Int_t i=0;i<numDetectors;i++) {
59  nStrips.SetAt(p->getNumStrips(),i);
60  dist.SetAt(p->getStripDistance(),i);
62  const HGeomRotation& r = t.getRotMatrix();
63  const HGeomVector& v = t.getTransVector();
64  for(Int_t k=0;k<9;k++) transform.SetAt(r(k), i*12 + k);
65  transform.SetAt(v.getX(), i*12 + 9);
66  transform.SetAt(v.getY(), i*12 + 10);
67  transform.SetAt(v.getZ(), i*12 + 11);
68  }
69  l->add("numDetectors", numDetectors);
70  l->add("numStrips", nStrips);
71  l->add("stripDistance", dist);
72  l->add("labTransform", transform);
73 }
74 
76  // gets the parameters from the list (read from input)
77  if (!l) return kFALSE;
78  Int_t nDet;
79  if (!l->fill("numDetectors", &nDet)) return kFALSE;
80  TArrayI nStrips(nDet);
81  if (!l->fill("numStrips", &nStrips)) return kFALSE;
82  if (nStrips.GetSize()!=nDet) {
83  Error("HPionTrackerGeomPar::getParams(HParamList* l)",
84  "Array size of numStrips does not fit to number of detectors");
85  return kFALSE;
86  }
87  TArrayF dist(nDet);
88  if (!l->fill("stripDistance", &dist)) return kFALSE;
89  if (dist.GetSize()!=nDet) {
90  Error("HPionTrackerGeomPar::getParams(HParamList* l)",
91  "Array size of stripDistance does not fit to number of detectors");
92  return kFALSE;
93  }
94  Int_t nData = nDet*12;
95  Double_t* tValues = new Double_t[nData];
96  Bool_t rc = l->fill("labTransform",tValues,nData);
97  if (!rc) {
98  Error("HPionTrackerGeomPar::getParams(HParamList* l)",
99  "Array size of labTransform does not fit to number of detectors");
100  delete [] tValues;
101  return kFALSE;
102  }
103  rc = setNumDetectors(nDet);
104  if (rc) {
105  for(Int_t i=0;i<numDetectors;i++) {
107  p->setNumStrips(nStrips.At(i));
108  p->setStripDistance(dist.At(i));
109  HGeomTransform& tLab = p->getLabTransform();
110  Double_t r[9], v[3];
111  for(Int_t k=0;k<9;k++) r[k] = tValues[i*12+k];
112  for(Int_t k=0;k<3;k++) v[k] = tValues[i*12+9+k];
113  tLab.setRotMatrix(r);
114  tLab.setTransVector(v);
115  }
116  }
117  delete [] tValues;
118  return rc;
119 }
120 
122  // prints the parameters (overloads HParCond::printParams(void))
123  cout<<"----- Geometry of Pion Tracker detectors ------------------"<<endl;
124  for(Int_t i=0;i<numDetectors;i++) {
126  cout<<"Detector number: "<<i<<'\n';
127  p->print();
128  cout<<"-------------------------"<<endl;
129  }
130 }
131 
132 Bool_t HPionTrackerGeomPar::setNumDetectors(const Int_t nDet) {
133  if (nDet > 0) {
134  Int_t maxDetectors = 0;
136  if (pDet) maxDetectors = (Int_t)((pDet->getMaxModInSetup()-1) / 2) + 1;
137  if (nDet >= maxDetectors) {
138  numDetectors = nDet;
139  pDetectors = new TObjArray(nDet);
140  for (Int_t i=0;i<nDet;++i) {
141  pDetectors->AddAt(new HPionTrackerDetGeomPar(),i);
142  }
143  return kTRUE;
144  } else {
145  Error("HPionTrackerGeomPar::setNumDetectors(const Int_t nDet)",
146  "Number of detectors too small for number of active modules in the setup");
147  return kFALSE;
148  }
149  }
150  Error("HPionTrackerGeomPar::setNumDetectors(const Int_t nDet","nDet must be larger than 0");
151  return kFALSE;
152 }
153 
155  if (pDetectors && n<numDetectors) return (HPionTrackerDetGeomPar*)pDetectors->At(n);
156  return NULL;
157 }
Bool_t getParams(HParamList *)
Float_t getNumStrips(void) const
HPionTrackerDetGeomPar * getDetector(const Int_t)
Double_t getZ() const
Definition: hgeomvector.h:24
const HGeomRotation & getRotMatrix() const
void putParams(HParamList *)
Int_t n
void setStripDistance(const Float_t d)
void add(HParamObj &)
Definition: hparamlist.cc:415
HPionTrackerGeomPar(const Char_t *name="PionTrackerGeomPar", const Char_t *title="Geometry parameters of the PionTracker", const Char_t *context="GeomProduction")
HSpectrometer * getSetup(void)
Definition: hades.h:112
Float_t getStripDistance(void) const
HDetector * getDetector(const Char_t *name)
const HGeomVector & getTransVector() const
void setNumStrips(const Int_t n)
Hades * gHades
Definition: hades.cc:1213
void setTransVector(const HGeomVector &t)
void setRotMatrix(const HGeomRotation &r)
Bool_t rc
HGeomTransform & getLabTransform(void)
ClassImp(HPionTrackerDetGeomPar) ClassImp(HPionTrackerGeomPar) void HPionTrackerDetGeomPar
Bool_t setNumDetectors(const Int_t)
Bool_t fill(const Text_t *, Text_t *, const Int_t)
Definition: hparamlist.cc:561
Double_t getX() const
Definition: hgeomvector.h:22
Double_t getY() const
Definition: hgeomvector.h:23