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)
{
	
	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) {
  
  numDetectors = 0;
  pDetectors = NULL; 
}
HPionTrackerGeomPar::~HPionTrackerGeomPar(void) {
  
  clear();
}
void HPionTrackerGeomPar::clear(void) {
  
  if (pDetectors) pDetectors->Delete();
  delete pDetectors;
  numDetectors = 0;
}
void HPionTrackerGeomPar::putParams(HParamList* l) {
  
  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) {
  
  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) {
  
  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: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