ROOT logo
//_HADES_CLASS_DESCRIPTION
/////////////////////////////////////////////////////////////
//
// HPionTrackerGeomPar
//
// Container class for PionTracker geometry parameters
//
/////////////////////////////////////////////////////////////

using namespace std;
#include "hpiontrackergeompar.h"
#include "hades.h"
#include "hspectrometer.h"
#include "hpiontrackerdetector.h"
#include "hparamlist.h"
#include <iostream>

ClassImp(HPionTrackerDetGeomPar)
ClassImp(HPionTrackerGeomPar)

void HPionTrackerDetGeomPar::print(void)
{
	// prints the geometry parameters of a single detector
	cout<<"Number of strips:        "<<numStrips<<'\n';
	cout<<"Distance between strips: "<<stripDistance<<'\n';
	cout<<"Lab transformation:\n"<<"  ";
	labTransform.print();
}

HPionTrackerGeomPar::HPionTrackerGeomPar(const Char_t* name, const Char_t* title,
                                         const Char_t* context)
                   : HParCond(name, title, context) {
  // constructor
  numDetectors = 0;
  pDetectors = NULL; 
}


HPionTrackerGeomPar::~HPionTrackerGeomPar(void) {
  // destructor deletes the array of detectors
  clear();
}

void HPionTrackerGeomPar::clear(void) {
  // deletes the array of detectors
  if (pDetectors) pDetectors->Delete();
  delete pDetectors;
  numDetectors = 0;
}

void HPionTrackerGeomPar::putParams(HParamList* l) {
  // add the parameters to the list for writing
  if (!l) return;
  TArrayI nStrips(numDetectors);
  TArrayF dist(numDetectors);
  TArrayD transform(numDetectors*12);
  for(Int_t i=0;i<numDetectors;i++) {
    HPionTrackerDetGeomPar* p=(HPionTrackerDetGeomPar*)pDetectors->At(i);
    nStrips.SetAt(p->getNumStrips(),i);
    dist.SetAt(p->getStripDistance(),i);
    HGeomTransform& t = p->getLabTransform();
    const HGeomRotation& r = t.getRotMatrix();
    const HGeomVector& v = t.getTransVector();
    for(Int_t k=0;k<9;k++) transform.SetAt(r(k), i*12 + k);
    transform.SetAt(v.getX(), i*12 + 9);
    transform.SetAt(v.getY(), i*12 + 10);
    transform.SetAt(v.getZ(), i*12 + 11);
  }
  l->add("numDetectors",  numDetectors);
  l->add("numStrips",     nStrips);
  l->add("stripDistance", dist);
  l->add("labTransform",  transform);
}
 
Bool_t HPionTrackerGeomPar::getParams(HParamList* l) {
  // gets the parameters from the list (read from input)
  if (!l) return kFALSE;
  Int_t nDet;
  if (!l->fill("numDetectors",  &nDet))      return kFALSE;
  TArrayI nStrips(nDet);
  if (!l->fill("numStrips",     &nStrips))   return kFALSE;
  if (nStrips.GetSize()!=nDet) {
    Error("HPionTrackerGeomPar::getParams(HParamList* l)",
          "Array size of numStrips does not fit to number of detectors");
    return kFALSE;
  }
  TArrayF dist(nDet);
  if (!l->fill("stripDistance", &dist))      return kFALSE;
  if (dist.GetSize()!=nDet) {
    Error("HPionTrackerGeomPar::getParams(HParamList* l)",
          "Array size of stripDistance does not fit to number of detectors");
    return kFALSE;
  }
  Int_t nData = nDet*12;
  Double_t* tValues = new Double_t[nData];
  Bool_t rc = l->fill("labTransform",tValues,nData);
  if (!rc) {
    Error("HPionTrackerGeomPar::getParams(HParamList* l)",
          "Array size of labTransform does not fit to number of detectors");
    delete [] tValues;
    return kFALSE;
  }
  rc = setNumDetectors(nDet);
  if (rc) {
    for(Int_t i=0;i<numDetectors;i++) {
      HPionTrackerDetGeomPar* p=(HPionTrackerDetGeomPar*)pDetectors->At(i);  
      p->setNumStrips(nStrips.At(i));
      p->setStripDistance(dist.At(i));
      HGeomTransform& tLab = p->getLabTransform();
      Double_t r[9], v[3];
      for(Int_t k=0;k<9;k++) r[k] = tValues[i*12+k];
      for(Int_t k=0;k<3;k++) v[k] = tValues[i*12+9+k];
      tLab.setRotMatrix(r);
      tLab.setTransVector(v);
    }
  }
  delete [] tValues;
  return rc; 
}

void HPionTrackerGeomPar::printParams(void) {
  // prints the parameters (overloads HParCond::printParams(void))
  cout<<"----- Geometry of Pion Tracker detectors ------------------"<<endl;
  for(Int_t i=0;i<numDetectors;i++) {
    HPionTrackerDetGeomPar* p=(HPionTrackerDetGeomPar*)pDetectors->At(i);  
    cout<<"Detector number:         "<<i<<'\n';
    p->print();
    cout<<"-------------------------"<<endl;
  }
}

Bool_t HPionTrackerGeomPar::setNumDetectors(const Int_t nDet) {
  if (nDet > 0) {
    Int_t maxDetectors = 0;
    HPionTrackerDetector* pDet= (HPionTrackerDetector*)gHades->getSetup()->getDetector("PionTracker");
    if (pDet) maxDetectors = (Int_t)((pDet->getMaxModInSetup()-1) / 2) + 1;
    if (nDet >= maxDetectors) {
      numDetectors = nDet;
      pDetectors = new TObjArray(nDet);
      for (Int_t i=0;i<nDet;++i) {
        pDetectors->AddAt(new HPionTrackerDetGeomPar(),i);
      }
      return kTRUE;
    } else {
      Error("HPionTrackerGeomPar::setNumDetectors(const Int_t nDet)",
            "Number of detectors too small for number of active modules in the setup");
      return kFALSE;
    }
  }
  Error("HPionTrackerGeomPar::setNumDetectors(const Int_t nDet","nDet must be larger than 0");
  return kFALSE;
}

HPionTrackerDetGeomPar* HPionTrackerGeomPar::getDetector(const Int_t n) {
  if (pDetectors && n<numDetectors) return (HPionTrackerDetGeomPar*)pDetectors->At(n);
  return NULL;
}
 hpiontrackergeompar.cc:1
 hpiontrackergeompar.cc:2
 hpiontrackergeompar.cc:3
 hpiontrackergeompar.cc:4
 hpiontrackergeompar.cc:5
 hpiontrackergeompar.cc:6
 hpiontrackergeompar.cc:7
 hpiontrackergeompar.cc:8
 hpiontrackergeompar.cc:9
 hpiontrackergeompar.cc:10
 hpiontrackergeompar.cc:11
 hpiontrackergeompar.cc:12
 hpiontrackergeompar.cc:13
 hpiontrackergeompar.cc:14
 hpiontrackergeompar.cc:15
 hpiontrackergeompar.cc:16
 hpiontrackergeompar.cc:17
 hpiontrackergeompar.cc:18
 hpiontrackergeompar.cc:19
 hpiontrackergeompar.cc:20
 hpiontrackergeompar.cc:21
 hpiontrackergeompar.cc:22
 hpiontrackergeompar.cc:23
 hpiontrackergeompar.cc:24
 hpiontrackergeompar.cc:25
 hpiontrackergeompar.cc:26
 hpiontrackergeompar.cc:27
 hpiontrackergeompar.cc:28
 hpiontrackergeompar.cc:29
 hpiontrackergeompar.cc:30
 hpiontrackergeompar.cc:31
 hpiontrackergeompar.cc:32
 hpiontrackergeompar.cc:33
 hpiontrackergeompar.cc:34
 hpiontrackergeompar.cc:35
 hpiontrackergeompar.cc:36
 hpiontrackergeompar.cc:37
 hpiontrackergeompar.cc:38
 hpiontrackergeompar.cc:39
 hpiontrackergeompar.cc:40
 hpiontrackergeompar.cc:41
 hpiontrackergeompar.cc:42
 hpiontrackergeompar.cc:43
 hpiontrackergeompar.cc:44
 hpiontrackergeompar.cc:45
 hpiontrackergeompar.cc:46
 hpiontrackergeompar.cc:47
 hpiontrackergeompar.cc:48
 hpiontrackergeompar.cc:49
 hpiontrackergeompar.cc:50
 hpiontrackergeompar.cc:51
 hpiontrackergeompar.cc:52
 hpiontrackergeompar.cc:53
 hpiontrackergeompar.cc:54
 hpiontrackergeompar.cc:55
 hpiontrackergeompar.cc:56
 hpiontrackergeompar.cc:57
 hpiontrackergeompar.cc:58
 hpiontrackergeompar.cc:59
 hpiontrackergeompar.cc:60
 hpiontrackergeompar.cc:61
 hpiontrackergeompar.cc:62
 hpiontrackergeompar.cc:63
 hpiontrackergeompar.cc:64
 hpiontrackergeompar.cc:65
 hpiontrackergeompar.cc:66
 hpiontrackergeompar.cc:67
 hpiontrackergeompar.cc:68
 hpiontrackergeompar.cc:69
 hpiontrackergeompar.cc:70
 hpiontrackergeompar.cc:71
 hpiontrackergeompar.cc:72
 hpiontrackergeompar.cc:73
 hpiontrackergeompar.cc:74
 hpiontrackergeompar.cc:75
 hpiontrackergeompar.cc:76
 hpiontrackergeompar.cc:77
 hpiontrackergeompar.cc:78
 hpiontrackergeompar.cc:79
 hpiontrackergeompar.cc:80
 hpiontrackergeompar.cc:81
 hpiontrackergeompar.cc:82
 hpiontrackergeompar.cc:83
 hpiontrackergeompar.cc:84
 hpiontrackergeompar.cc:85
 hpiontrackergeompar.cc:86
 hpiontrackergeompar.cc:87
 hpiontrackergeompar.cc:88
 hpiontrackergeompar.cc:89
 hpiontrackergeompar.cc:90
 hpiontrackergeompar.cc:91
 hpiontrackergeompar.cc:92
 hpiontrackergeompar.cc:93
 hpiontrackergeompar.cc:94
 hpiontrackergeompar.cc:95
 hpiontrackergeompar.cc:96
 hpiontrackergeompar.cc:97
 hpiontrackergeompar.cc:98
 hpiontrackergeompar.cc:99
 hpiontrackergeompar.cc:100
 hpiontrackergeompar.cc:101
 hpiontrackergeompar.cc:102
 hpiontrackergeompar.cc:103
 hpiontrackergeompar.cc:104
 hpiontrackergeompar.cc:105
 hpiontrackergeompar.cc:106
 hpiontrackergeompar.cc:107
 hpiontrackergeompar.cc:108
 hpiontrackergeompar.cc:109
 hpiontrackergeompar.cc:110
 hpiontrackergeompar.cc:111
 hpiontrackergeompar.cc:112
 hpiontrackergeompar.cc:113
 hpiontrackergeompar.cc:114
 hpiontrackergeompar.cc:115
 hpiontrackergeompar.cc:116
 hpiontrackergeompar.cc:117
 hpiontrackergeompar.cc:118
 hpiontrackergeompar.cc:119
 hpiontrackergeompar.cc:120
 hpiontrackergeompar.cc:121
 hpiontrackergeompar.cc:122
 hpiontrackergeompar.cc:123
 hpiontrackergeompar.cc:124
 hpiontrackergeompar.cc:125
 hpiontrackergeompar.cc:126
 hpiontrackergeompar.cc:127
 hpiontrackergeompar.cc:128
 hpiontrackergeompar.cc:129
 hpiontrackergeompar.cc:130
 hpiontrackergeompar.cc:131
 hpiontrackergeompar.cc:132
 hpiontrackergeompar.cc:133
 hpiontrackergeompar.cc:134
 hpiontrackergeompar.cc:135
 hpiontrackergeompar.cc:136
 hpiontrackergeompar.cc:137
 hpiontrackergeompar.cc:138
 hpiontrackergeompar.cc:139
 hpiontrackergeompar.cc:140
 hpiontrackergeompar.cc:141
 hpiontrackergeompar.cc:142
 hpiontrackergeompar.cc:143
 hpiontrackergeompar.cc:144
 hpiontrackergeompar.cc:145
 hpiontrackergeompar.cc:146
 hpiontrackergeompar.cc:147
 hpiontrackergeompar.cc:148
 hpiontrackergeompar.cc:149
 hpiontrackergeompar.cc:150
 hpiontrackergeompar.cc:151
 hpiontrackergeompar.cc:152
 hpiontrackergeompar.cc:153
 hpiontrackergeompar.cc:154
 hpiontrackergeompar.cc:155
 hpiontrackergeompar.cc:156
 hpiontrackergeompar.cc:157