ROOT logo
#include "hshowergeometry.h"
#include "hshowergeompar.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hpario.h"
#include "hdetpario.h"
#include "hgeomcompositevolume.h"

ClassImp(HShowerGeometry)

HShowerGeometry::HShowerGeometry(const Char_t* name,
                                 const Char_t* title,
                                 const Char_t* context)
               :HParCond(name,title,context) {
  nSectors = 6;
  nModules = 3;
  nRows = 32;
  nColumns = 32;
  for(Int_t i = 0; i < nModules; i++) {
    frames[i].setModuleID(i);
    wires[i].setModuleID(i);
    pads[i].setModuleID(i);
    pads[i].setFrame(&frames[i]);
  }
  if (gHades) {
    pGeomPar=(HShowerGeomPar*)(gHades->getRuntimeDb()->getContainer("ShowerGeomPar"));
  } else {
    pGeomPar=0;
  }
}

HShowerGeometry::~HShowerGeometry() {
  clear();
}

Bool_t HShowerGeometry::init(HParIo* inp,Int_t* set) {
  Bool_t rc=fillFromGeomPar();
  if (rc) {
    HDetParIo* input=inp->getDetParIo("HCondParIo");
    if (input) rc=input->init(this,set);
  }
  return rc;
}

void HShowerGeometry::clear() {
  for(Int_t i=0; i<nModules; i++) {
    wires[i].reset();
    pads[i].reset();
  }
}

void HShowerGeometry::putParams(HParamList* l) {
  if (!l) return;
  for(Int_t i=0; i<nModules; i++) {
    wires[i].putParams(l);
    pads[i].putParams(l);
  }
}

Bool_t HShowerGeometry::getParams(HParamList* l) {
  if (!l) return kFALSE;
  for(Int_t i=0; i<nModules; i++) {
    if (!wires[i].getParams(l)) return kFALSE;
    if (!pads[i].getParams(l))  return kFALSE;
  }
#if DEBUG_LEVEL > 0
  printParams();
#endif
  return kTRUE;
}

Bool_t HShowerGeometry::fillFromGeomPar(){
  //Function for calculating the module centers and tranformation used in analysis
  //(corresponding to the PAD_FIBREs)
  if (!pGeomPar) return kFALSE;
  if (!pGeomPar->hasChanged()) return kTRUE;
  HGeomVector vm[3] = { HGeomVector(0.000 , 0.00 ,  -4.0),
                        HGeomVector(0.000 , 0.00 ,  67.6), 
                        HGeomVector(0.000 , 0.00 , 134.9)};
  for (Int_t s=0;s<nSectors;s++) {
    sectorTransform[s].clear();
    for (Int_t m=0;m<nModules;m++) {
      moduleTransform[s*nModules+m].clear();
    }
  }
  for (Int_t s=0;s<pGeomPar->getMaxSectors();s++) {
    sectorTransform[s]=pGeomPar->getModule(s,0)->getLabTransform();
    for(Int_t m=0;m<pGeomPar->getMaxModules();m++) {
      HGeomTransform trans=pGeomPar->getModule(s,m)->getLabTransform();
      HGeomVector v_mod = trans.getRotMatrix()*vm[m]+trans.getTransVector();
      trans.setTransVector(v_mod);
      moduleTransform[s*nModules+m]=trans;
    }  
  }
  HGeomVector *points[4];
  HShowerFrameCorner *pFC;
  for(Int_t m = 0; m < 3; m++) {
    HGeomCompositeVolume* refMod=pGeomPar->getRefVolume(m);
    HGeomVolume *comp = refMod->getComponent(0);//only one comp; wires plane
    points[0] = comp->getPoint(3);//geant coordinate system is left-handed!! 
    points[1] = comp->getPoint(2);//
    points[2] = comp->getPoint(1);//
    points[3] = comp->getPoint(0);//
    frames[m].reset();
    for (Int_t i=0;i<4;i++) {
      pFC = new HShowerFrameCorner;
      pFC->setX(points[i]->getX()*0.1);
      pFC->setY(points[i]->getY()*0.1);
      if(i==0 || i==3) pFC->setFlagArea(1);
      else pFC->setFlagArea(0);
      frames[m].addCorner(pFC);
    }
  }
  return kTRUE;
}

void HShowerGeometry::printParams() {
  HParCond::printParams();
  for (Int_t s=0; s < nSectors; s++) {
    cout<<"Lab transform of wire plane 0 in sector "<<s<<endl; 
    sectorTransform[s].print();
    for (Int_t m=0; m < nModules; m++) {
      cout<<"Lab transform pad plane sector "<<s<<" module "<<m<<endl; 
      moduleTransform[s*nModules+m].print();
    }
  }
  for (Int_t m=0; m < nModules; m++) {
    frames[m].printParams();
  }
};

void HShowerGeometry::getLocalCoord(HLocation& loc, HGeomVector& v) {
//retrieve local coordinates of center of pads in position loc

  Float_t fX, fY;
  Float_t scale = 10.0; //transform cm to mm

  HShowerPadTab* pPads = getPadParam(loc[1]);
  pPads->getPad(loc[2], loc[3])->getPadCenter(&fX, &fY);

  v.setX(scale*fX);
  v.setY(scale*fY);
  v.setZ(0.0);  //z==0 local coordinates are in plain
}

void HShowerGeometry::transVectToLab(HLocation& loc, HGeomVector vLocal, HGeomVector2& vLab) {
// transform X_loc, Y_Loc -> X,Y,Z Lab

  HGeomTransform tt = getTransform(loc[0], loc[1]);
  vLab = tt.transFrom(vLocal);
}

void HShowerGeometry::getLabCoord(HLocation& loc, HGeomVector2& v) {
// retrieve lab coordinates of center of pads in position loc
// Local coordinates are transformed to lab using HGeomTransform class
// There is data for transformation this in HShowerModuleGeom object
// addressed by loc[0], loc[1]

  HGeomVector vLoc;
  getLocalCoord(loc, vLoc);
  HGeomTransform tt = getTransform(loc[0], loc[1]);
  v = tt.transFrom(vLoc);
}

void HShowerGeometry::getSphereCoord(HLocation& loc, HGeomVector2& v, HGeomVector *pvTarget){
// Sphere coordinate are calculated from lab coordinates
  Float_t r,theta,phi;
  HGeomVector2 vLoc;

  getLabCoord(loc,vLoc);

  if(pvTarget != NULL)
    vLoc -= *pvTarget;

  vLoc.sphereCoord(r,theta,phi); //calculation of sphere coord

  v.setRad(r);
  v.setTheta(theta);
  v.setPhi(phi);
}

void HShowerGeometry::transLabToSphereCoord(HGeomVector2& labIn, HGeomVector2& sphereOut, HGeomVector *pvTarget){
// transform X_Lab,Y_Lab,Z_Lab -> Phi,Theta,R
//Sphere coordinate are calculated from lab coordinates
  Float_t r,theta,phi;

  if(pvTarget != NULL)
    //vLoc -= *pvTarget;
    labIn -= *pvTarget;

  labIn.sphereCoord(r,theta,phi); //calculation of sphere coord

  sphereOut.setRad(r);
  sphereOut.setTheta(theta);
  sphereOut.setPhi(phi);
}

Bool_t HShowerGeometry::transPadToLab() {
  HGeomTransform tt;
  HGeomVector2 vLoc,vLab;
  Float_t fX,fY,r,theta,phi;
  Float_t scale = 10.0; //transform cm to mm
  FILE *fp;
  fp = fopen("test.txt","w");

  for(Int_t i=0;i<nSectors;i++) {
    for(Int_t j=0;j<nModules;j++) {
      for (Int_t k=0;k < nRows; k++) {
        for (Int_t l=0;l < nColumns; l++) {

          HShowerPadTab* pPads = getPadParam(j);
          pPads->getPad(k,l)->getPadCenter(&fX, &fY);
          vLoc.setX(scale*fX);
          vLoc.setY(scale*fY);
          vLoc.setZ(0.0);

          tt = getTransform(i,j);
          vLab = tt.transFrom(vLoc);

          vLab.sphereCoord(r,theta,phi);
          if(!j) fprintf(fp,"%3d%3d%3d %10.3f%10.3f\n",i,k,l,phi,theta);

        }
      }
    }
  }
  fclose(fp);
  return kTRUE;
}
 hshowergeometry.cc:1
 hshowergeometry.cc:2
 hshowergeometry.cc:3
 hshowergeometry.cc:4
 hshowergeometry.cc:5
 hshowergeometry.cc:6
 hshowergeometry.cc:7
 hshowergeometry.cc:8
 hshowergeometry.cc:9
 hshowergeometry.cc:10
 hshowergeometry.cc:11
 hshowergeometry.cc:12
 hshowergeometry.cc:13
 hshowergeometry.cc:14
 hshowergeometry.cc:15
 hshowergeometry.cc:16
 hshowergeometry.cc:17
 hshowergeometry.cc:18
 hshowergeometry.cc:19
 hshowergeometry.cc:20
 hshowergeometry.cc:21
 hshowergeometry.cc:22
 hshowergeometry.cc:23
 hshowergeometry.cc:24
 hshowergeometry.cc:25
 hshowergeometry.cc:26
 hshowergeometry.cc:27
 hshowergeometry.cc:28
 hshowergeometry.cc:29
 hshowergeometry.cc:30
 hshowergeometry.cc:31
 hshowergeometry.cc:32
 hshowergeometry.cc:33
 hshowergeometry.cc:34
 hshowergeometry.cc:35
 hshowergeometry.cc:36
 hshowergeometry.cc:37
 hshowergeometry.cc:38
 hshowergeometry.cc:39
 hshowergeometry.cc:40
 hshowergeometry.cc:41
 hshowergeometry.cc:42
 hshowergeometry.cc:43
 hshowergeometry.cc:44
 hshowergeometry.cc:45
 hshowergeometry.cc:46
 hshowergeometry.cc:47
 hshowergeometry.cc:48
 hshowergeometry.cc:49
 hshowergeometry.cc:50
 hshowergeometry.cc:51
 hshowergeometry.cc:52
 hshowergeometry.cc:53
 hshowergeometry.cc:54
 hshowergeometry.cc:55
 hshowergeometry.cc:56
 hshowergeometry.cc:57
 hshowergeometry.cc:58
 hshowergeometry.cc:59
 hshowergeometry.cc:60
 hshowergeometry.cc:61
 hshowergeometry.cc:62
 hshowergeometry.cc:63
 hshowergeometry.cc:64
 hshowergeometry.cc:65
 hshowergeometry.cc:66
 hshowergeometry.cc:67
 hshowergeometry.cc:68
 hshowergeometry.cc:69
 hshowergeometry.cc:70
 hshowergeometry.cc:71
 hshowergeometry.cc:72
 hshowergeometry.cc:73
 hshowergeometry.cc:74
 hshowergeometry.cc:75
 hshowergeometry.cc:76
 hshowergeometry.cc:77
 hshowergeometry.cc:78
 hshowergeometry.cc:79
 hshowergeometry.cc:80
 hshowergeometry.cc:81
 hshowergeometry.cc:82
 hshowergeometry.cc:83
 hshowergeometry.cc:84
 hshowergeometry.cc:85
 hshowergeometry.cc:86
 hshowergeometry.cc:87
 hshowergeometry.cc:88
 hshowergeometry.cc:89
 hshowergeometry.cc:90
 hshowergeometry.cc:91
 hshowergeometry.cc:92
 hshowergeometry.cc:93
 hshowergeometry.cc:94
 hshowergeometry.cc:95
 hshowergeometry.cc:96
 hshowergeometry.cc:97
 hshowergeometry.cc:98
 hshowergeometry.cc:99
 hshowergeometry.cc:100
 hshowergeometry.cc:101
 hshowergeometry.cc:102
 hshowergeometry.cc:103
 hshowergeometry.cc:104
 hshowergeometry.cc:105
 hshowergeometry.cc:106
 hshowergeometry.cc:107
 hshowergeometry.cc:108
 hshowergeometry.cc:109
 hshowergeometry.cc:110
 hshowergeometry.cc:111
 hshowergeometry.cc:112
 hshowergeometry.cc:113
 hshowergeometry.cc:114
 hshowergeometry.cc:115
 hshowergeometry.cc:116
 hshowergeometry.cc:117
 hshowergeometry.cc:118
 hshowergeometry.cc:119
 hshowergeometry.cc:120
 hshowergeometry.cc:121
 hshowergeometry.cc:122
 hshowergeometry.cc:123
 hshowergeometry.cc:124
 hshowergeometry.cc:125
 hshowergeometry.cc:126
 hshowergeometry.cc:127
 hshowergeometry.cc:128
 hshowergeometry.cc:129
 hshowergeometry.cc:130
 hshowergeometry.cc:131
 hshowergeometry.cc:132
 hshowergeometry.cc:133
 hshowergeometry.cc:134
 hshowergeometry.cc:135
 hshowergeometry.cc:136
 hshowergeometry.cc:137
 hshowergeometry.cc:138
 hshowergeometry.cc:139
 hshowergeometry.cc:140
 hshowergeometry.cc:141
 hshowergeometry.cc:142
 hshowergeometry.cc:143
 hshowergeometry.cc:144
 hshowergeometry.cc:145
 hshowergeometry.cc:146
 hshowergeometry.cc:147
 hshowergeometry.cc:148
 hshowergeometry.cc:149
 hshowergeometry.cc:150
 hshowergeometry.cc:151
 hshowergeometry.cc:152
 hshowergeometry.cc:153
 hshowergeometry.cc:154
 hshowergeometry.cc:155
 hshowergeometry.cc:156
 hshowergeometry.cc:157
 hshowergeometry.cc:158
 hshowergeometry.cc:159
 hshowergeometry.cc:160
 hshowergeometry.cc:161
 hshowergeometry.cc:162
 hshowergeometry.cc:163
 hshowergeometry.cc:164
 hshowergeometry.cc:165
 hshowergeometry.cc:166
 hshowergeometry.cc:167
 hshowergeometry.cc:168
 hshowergeometry.cc:169
 hshowergeometry.cc:170
 hshowergeometry.cc:171
 hshowergeometry.cc:172
 hshowergeometry.cc:173
 hshowergeometry.cc:174
 hshowergeometry.cc:175
 hshowergeometry.cc:176
 hshowergeometry.cc:177
 hshowergeometry.cc:178
 hshowergeometry.cc:179
 hshowergeometry.cc:180
 hshowergeometry.cc:181
 hshowergeometry.cc:182
 hshowergeometry.cc:183
 hshowergeometry.cc:184
 hshowergeometry.cc:185
 hshowergeometry.cc:186
 hshowergeometry.cc:187
 hshowergeometry.cc:188
 hshowergeometry.cc:189
 hshowergeometry.cc:190
 hshowergeometry.cc:191
 hshowergeometry.cc:192
 hshowergeometry.cc:193
 hshowergeometry.cc:194
 hshowergeometry.cc:195
 hshowergeometry.cc:196
 hshowergeometry.cc:197
 hshowergeometry.cc:198
 hshowergeometry.cc:199
 hshowergeometry.cc:200
 hshowergeometry.cc:201
 hshowergeometry.cc:202
 hshowergeometry.cc:203
 hshowergeometry.cc:204
 hshowergeometry.cc:205
 hshowergeometry.cc:206
 hshowergeometry.cc:207
 hshowergeometry.cc:208
 hshowergeometry.cc:209
 hshowergeometry.cc:210
 hshowergeometry.cc:211
 hshowergeometry.cc:212
 hshowergeometry.cc:213
 hshowergeometry.cc:214
 hshowergeometry.cc:215
 hshowergeometry.cc:216
 hshowergeometry.cc:217
 hshowergeometry.cc:218
 hshowergeometry.cc:219
 hshowergeometry.cc:220
 hshowergeometry.cc:221
 hshowergeometry.cc:222
 hshowergeometry.cc:223
 hshowergeometry.cc:224
 hshowergeometry.cc:225
 hshowergeometry.cc:226
 hshowergeometry.cc:227
 hshowergeometry.cc:228
 hshowergeometry.cc:229