ROOT logo
using namespace std;
#include <iostream> 
#include <iomanip>

#include "hshowerpad.h"
#include "hparamlist.h"

ClassImp(HShowerPad)
ClassImp(HShowerPadTab)

//_HADES_CLASS_DESCRIPTION 
/////////////////////////////////////////////////////////////
// HShowerPad
// Class describe coordinates one pad
//
// HShowerPadTab
// Table of local coordinates of pads.  
// Thera are pads informations in one dimensional table
// Two-dimensional structure of pads in shower detector
// is calculated to one index of table of pads
//
/////////////////////////////////////////////////////////////


HShowerPad::HShowerPad() {
//creating default pad
     nPadsX=32;
     nPadNr = 0;
     nPadFlag = 0;
     fXld = fYld = fXlu = fYlu = 0.f;
     fXrd = fYrd = fXru = fYru = 0.f;
}

HShowerPad::HShowerPad(const HShowerPad& srcPad) :TObject(srcPad)
{
  //copy ctor
  nPadsX=32;
  nPadNr = srcPad.nPadNr;
  nPadFlag =  srcPad.nPadFlag;
  fXld = srcPad.fXld;
  fYld = srcPad.fYld;
  fXlu = srcPad.fXlu;
  fYlu = srcPad.fYlu;
  fXrd = srcPad.fXrd;
  fYrd = srcPad.fYrd;
  fXru = srcPad.fXru;
  fYru = srcPad.fYru;
}

HShowerPad& HShowerPad::operator=(const HShowerPad& srcPad) {
  nPadNr = srcPad.nPadNr;
  nPadFlag = srcPad.nPadFlag;
  fXld = srcPad.fXld;
  fYld = srcPad.fYld;
  fXlu = srcPad.fXlu;
  fYlu = srcPad.fYlu;
  fXrd = srcPad.fXrd;
  fYrd = srcPad.fYrd;
  fXru = srcPad.fXru;
  fYru = srcPad.fYru;
  return *this;
}

void HShowerPad::reset() {
//clearing data
   nPadNr = 0;
   nPadFlag = 0;
   fXld = fYld = fXlu = fYlu = 0.f;
   fXrd = fYrd = fXru = fYru = 0.f;
}

void HShowerPad::getPadCenter(Float_t *pfX, Float_t *pfY) {
//calculate position of geometrical center of pad
  *pfX = 0.25 * (fXld + fXlu + fXrd + fXru); 
  *pfY = 0.25 * (fYld + fYlu + fYrd + fYru); 
}

void HShowerPad::getPadPos(Int_t *pnRow, Int_t *pnCol) {
//return number of row and col 
  *pnCol = nPadNr % nPadsX;
  *pnRow = nPadNr / nPadsX;
}

Int_t HShowerPad::isOut(HShowerGeantWire *qhit) {
//?????????????????
  Float_t fX, fY;
  qhit->getXY(&fX, &fY);
  return isOut(fX, fY);  
}

Int_t HShowerPad::isOut(Float_t x, Float_t y) {
//returns 1 if point (x,y) is outside of pad, otherwise 0
  return (isOutY(x, y) || isOutX(x, y));
}


Int_t HShowerPad::isOutX(Float_t x, Float_t y) {
//returns 1 if  x coordinate of point is outside of pad, otherwise 0
  Float_t a,b;

  if (fXld==fXlu && x<fXld) return 1;
  if (fYld==fYlu && y<fYld) return 1;

  a = (fYlu-fYld)/(fXlu-fXld);
  b = (fXlu*fYld-fXld*fYlu)/(fXlu-fXld);
  if(a>0.){
    if (y>(a*x+b)) return 1;
  } else {
    if (y<(a*x+b)) return 1;
  }

  if (fXru==fXrd && x>fXru) return 1;
  if (fYru==fYrd && y>fYru) return 1;

  a = (fYrd-fYru)/(fXrd-fXru);
  b = (fXrd*fYru-fXru*fYrd)/(fXrd-fXru);
  if(a>0.){
    if (y<(a*x+b)) return 1;
  } else {
    if (y>(a*x+b)) return 1;
  }

  return 0;
}


Int_t HShowerPad::isOutY(Float_t x, Float_t y) {
//returns 1 if  y coordinate of point is outside of pad, otherwise 0

  Float_t a,b;

  if (fYlu==fYru && y>fYlu) return 1;
  if (fYrd==fYld && y<fYrd) return 1;

  if (fXrd==fXld && x<fXrd) return 1;
  if (fXlu==fXru && x>fXlu) return 1;


  a = (fYru-fYlu)/(fXru-fXlu);
  b = (fXru*fYlu-fXlu*fYru)/(fXru-fXlu);
  if (y>(a*x+b)) return 1;

  a = (fYld-fYrd)/(fXld-fXrd);
  b = (fXld*fYrd-fXrd*fYld)/(fXld-fXrd);
  if (y<(a*x+b)) return 1;

  return 0;
}

//-------------------------------------------------------------

HShowerPadTab::HShowerPadTab() {
//default ctor
  nPads = 1024;
  nPadsX = 32;
  nPadsY = 32;
  m_pPadArr = new TObjArray(1024);
}

HShowerPadTab::~HShowerPadTab() {
  if (m_pPadArr) {
    m_pPadArr->Delete();
    delete m_pPadArr;
    m_pPadArr = NULL;
  }
}

void HShowerPadTab::reset() {
//clearing data
  m_pPadArr->Delete();
}

void HShowerPadTab::putParams(HParamList* l) {
  if (!l) return;
  Int_t nCorners=8;
  TArrayF arr(nPads*nCorners);
  HShowerPad* p=0;
  Int_t k=0;
  for(Int_t i=0;i<nPads;i++) {
    p=(HShowerPad*)m_pPadArr->At(i);
    if (p) {
      k=i*nCorners;
      arr.AddAt(p->fXld,k);
      arr.AddAt(p->fYld,++k);
      arr.AddAt(p->fXlu,++k);
      arr.AddAt(p->fYlu,++k);
      arr.AddAt(p->fXrd,++k);
      arr.AddAt(p->fYrd,++k);
      arr.AddAt(p->fXru,++k);
      arr.AddAt(p->fYru,++k);
    }
  }
  l->add(Form("pPadCorners_%i",m_nModuleID),arr);
}

Bool_t HShowerPadTab::getParams(HParamList* l) {
  if (!l) return kFALSE;
  TArrayF arr;
  Int_t nCorners=8;
  if (!l->fill(Form("pPadCorners_%i",m_nModuleID),&arr)) return kFALSE;
  if (arr.GetSize()!= nPads*nCorners) {
    Error("getParams(HParamList*)",
          "Only pad corners for %i pads read",arr.GetSize()/nCorners);
    return kFALSE;
  }
  HShowerFrame* phFrame = getFrame();
  HShowerPad* p=0;
  Int_t k=0;
  for (Int_t i=0;i<nPads;i++) {
    k=i*nCorners;
    p = new HShowerPad;
    p->setPadNr(i);
    p->fXld=arr.At(k);
    p->fYld=arr.At(++k);
    p->fXlu=arr.At(++k);
    p->fYlu=arr.At(++k);
    p->fXrd=arr.At(++k);
    p->fYrd=arr.At(++k);
    p->fXru=arr.At(++k);
    p->fYru=arr.At(++k);
    if (!phFrame->isOut(p->fXld, p->fYld) &&
        !phFrame->isOut(p->fXlu, p->fYlu) &&
        !phFrame->isOut(p->fXru, p->fYru) &&
        !phFrame->isOut(p->fXrd, p->fYrd)) {
      p->setPadFlag(1);
    } else if (!phFrame->isOut(p->fXld, p->fYld) ||
        !phFrame->isOut(p->fXlu, p->fYlu) ||
        !phFrame->isOut(p->fXru, p->fYru) ||
        !phFrame->isOut(p->fXrd, p->fYrd)) {
      p->setPadFlag(2);
    } else {
      p->setPadFlag(0);
    }
    setPad(p,i);
  }
  return kTRUE;
}

void HShowerPadTab::setPad(HShowerPad* pPad, Int_t nRow, Int_t nCol) {
//set pad information at position defined by nRow and nCol
  Int_t nAddr = calcAddr(nRow, nCol);  //calculating index
  setPad(pPad, nAddr);
}

void HShowerPadTab::setPad(HShowerPad* pPad, Int_t nAddr) {
//set pad information at position defined by nAddr
  if( m_pPadArr->At(nAddr)) delete m_pPadArr->At(nAddr);
  m_pPadArr->AddAt(pPad, nAddr);
}

HShowerPad* HShowerPadTab::getPad(Int_t nPadNr) {
//return pad information
  return (HShowerPad*)m_pPadArr->At(nPadNr);
}

HShowerPad* HShowerPadTab::getPad(Int_t nRow, Int_t nCol) {
//return pad information
//nRow and nCol is used to calculate index
  if ((nRow < 0) || (nRow >= nPadsY)) return NULL;
  if ((nCol < 0) || (nCol >= nPadsX)) return NULL;
  Int_t nAddr = calcAddr(nRow, nCol);
  return getPad(nAddr);
}

HShowerPad* HShowerPadTab::getPad(Float_t  fXpos, Float_t fYpos) {
//looking for pad which contains point fXpos, fYpos
  Int_t nPadAddr = 0;
  Int_t nHit = 0;
  for(Int_t j = 0; j < nPadsY; j++) {
    if (!getPad(nPadAddr)->isOutY(fXpos, fYpos)) {
      nHit=1;
      break;
    } else nPadAddr += nPadsX;
  }
  if (!nHit) return NULL;

  nHit = 0;
  for(Int_t j = 0; j < nPadsX; j++, nPadAddr++) {
    if (!getPad(nPadAddr)->isOutX(fXpos, fYpos)) {                    
      nHit = 1;
      break;
    }
  }
  if (!nHit) return NULL;

  return getPad(nPadAddr);
}

Bool_t HShowerPadTab::isOut(Int_t nX, Int_t nY) {
//testing if pad in nX, nY position is inside table
  if ((nX < 0) || (nX >= nPadsX)) return 1;
  if ((nY < 0) || (nY >= nPadsY)) return 1;
  return 0;
}
 hshowerpad.cc:1
 hshowerpad.cc:2
 hshowerpad.cc:3
 hshowerpad.cc:4
 hshowerpad.cc:5
 hshowerpad.cc:6
 hshowerpad.cc:7
 hshowerpad.cc:8
 hshowerpad.cc:9
 hshowerpad.cc:10
 hshowerpad.cc:11
 hshowerpad.cc:12
 hshowerpad.cc:13
 hshowerpad.cc:14
 hshowerpad.cc:15
 hshowerpad.cc:16
 hshowerpad.cc:17
 hshowerpad.cc:18
 hshowerpad.cc:19
 hshowerpad.cc:20
 hshowerpad.cc:21
 hshowerpad.cc:22
 hshowerpad.cc:23
 hshowerpad.cc:24
 hshowerpad.cc:25
 hshowerpad.cc:26
 hshowerpad.cc:27
 hshowerpad.cc:28
 hshowerpad.cc:29
 hshowerpad.cc:30
 hshowerpad.cc:31
 hshowerpad.cc:32
 hshowerpad.cc:33
 hshowerpad.cc:34
 hshowerpad.cc:35
 hshowerpad.cc:36
 hshowerpad.cc:37
 hshowerpad.cc:38
 hshowerpad.cc:39
 hshowerpad.cc:40
 hshowerpad.cc:41
 hshowerpad.cc:42
 hshowerpad.cc:43
 hshowerpad.cc:44
 hshowerpad.cc:45
 hshowerpad.cc:46
 hshowerpad.cc:47
 hshowerpad.cc:48
 hshowerpad.cc:49
 hshowerpad.cc:50
 hshowerpad.cc:51
 hshowerpad.cc:52
 hshowerpad.cc:53
 hshowerpad.cc:54
 hshowerpad.cc:55
 hshowerpad.cc:56
 hshowerpad.cc:57
 hshowerpad.cc:58
 hshowerpad.cc:59
 hshowerpad.cc:60
 hshowerpad.cc:61
 hshowerpad.cc:62
 hshowerpad.cc:63
 hshowerpad.cc:64
 hshowerpad.cc:65
 hshowerpad.cc:66
 hshowerpad.cc:67
 hshowerpad.cc:68
 hshowerpad.cc:69
 hshowerpad.cc:70
 hshowerpad.cc:71
 hshowerpad.cc:72
 hshowerpad.cc:73
 hshowerpad.cc:74
 hshowerpad.cc:75
 hshowerpad.cc:76
 hshowerpad.cc:77
 hshowerpad.cc:78
 hshowerpad.cc:79
 hshowerpad.cc:80
 hshowerpad.cc:81
 hshowerpad.cc:82
 hshowerpad.cc:83
 hshowerpad.cc:84
 hshowerpad.cc:85
 hshowerpad.cc:86
 hshowerpad.cc:87
 hshowerpad.cc:88
 hshowerpad.cc:89
 hshowerpad.cc:90
 hshowerpad.cc:91
 hshowerpad.cc:92
 hshowerpad.cc:93
 hshowerpad.cc:94
 hshowerpad.cc:95
 hshowerpad.cc:96
 hshowerpad.cc:97
 hshowerpad.cc:98
 hshowerpad.cc:99
 hshowerpad.cc:100
 hshowerpad.cc:101
 hshowerpad.cc:102
 hshowerpad.cc:103
 hshowerpad.cc:104
 hshowerpad.cc:105
 hshowerpad.cc:106
 hshowerpad.cc:107
 hshowerpad.cc:108
 hshowerpad.cc:109
 hshowerpad.cc:110
 hshowerpad.cc:111
 hshowerpad.cc:112
 hshowerpad.cc:113
 hshowerpad.cc:114
 hshowerpad.cc:115
 hshowerpad.cc:116
 hshowerpad.cc:117
 hshowerpad.cc:118
 hshowerpad.cc:119
 hshowerpad.cc:120
 hshowerpad.cc:121
 hshowerpad.cc:122
 hshowerpad.cc:123
 hshowerpad.cc:124
 hshowerpad.cc:125
 hshowerpad.cc:126
 hshowerpad.cc:127
 hshowerpad.cc:128
 hshowerpad.cc:129
 hshowerpad.cc:130
 hshowerpad.cc:131
 hshowerpad.cc:132
 hshowerpad.cc:133
 hshowerpad.cc:134
 hshowerpad.cc:135
 hshowerpad.cc:136
 hshowerpad.cc:137
 hshowerpad.cc:138
 hshowerpad.cc:139
 hshowerpad.cc:140
 hshowerpad.cc:141
 hshowerpad.cc:142
 hshowerpad.cc:143
 hshowerpad.cc:144
 hshowerpad.cc:145
 hshowerpad.cc:146
 hshowerpad.cc:147
 hshowerpad.cc:148
 hshowerpad.cc:149
 hshowerpad.cc:150
 hshowerpad.cc:151
 hshowerpad.cc:152
 hshowerpad.cc:153
 hshowerpad.cc:154
 hshowerpad.cc:155
 hshowerpad.cc:156
 hshowerpad.cc:157
 hshowerpad.cc:158
 hshowerpad.cc:159
 hshowerpad.cc:160
 hshowerpad.cc:161
 hshowerpad.cc:162
 hshowerpad.cc:163
 hshowerpad.cc:164
 hshowerpad.cc:165
 hshowerpad.cc:166
 hshowerpad.cc:167
 hshowerpad.cc:168
 hshowerpad.cc:169
 hshowerpad.cc:170
 hshowerpad.cc:171
 hshowerpad.cc:172
 hshowerpad.cc:173
 hshowerpad.cc:174
 hshowerpad.cc:175
 hshowerpad.cc:176
 hshowerpad.cc:177
 hshowerpad.cc:178
 hshowerpad.cc:179
 hshowerpad.cc:180
 hshowerpad.cc:181
 hshowerpad.cc:182
 hshowerpad.cc:183
 hshowerpad.cc:184
 hshowerpad.cc:185
 hshowerpad.cc:186
 hshowerpad.cc:187
 hshowerpad.cc:188
 hshowerpad.cc:189
 hshowerpad.cc:190
 hshowerpad.cc:191
 hshowerpad.cc:192
 hshowerpad.cc:193
 hshowerpad.cc:194
 hshowerpad.cc:195
 hshowerpad.cc:196
 hshowerpad.cc:197
 hshowerpad.cc:198
 hshowerpad.cc:199
 hshowerpad.cc:200
 hshowerpad.cc:201
 hshowerpad.cc:202
 hshowerpad.cc:203
 hshowerpad.cc:204
 hshowerpad.cc:205
 hshowerpad.cc:206
 hshowerpad.cc:207
 hshowerpad.cc:208
 hshowerpad.cc:209
 hshowerpad.cc:210
 hshowerpad.cc:211
 hshowerpad.cc:212
 hshowerpad.cc:213
 hshowerpad.cc:214
 hshowerpad.cc:215
 hshowerpad.cc:216
 hshowerpad.cc:217
 hshowerpad.cc:218
 hshowerpad.cc:219
 hshowerpad.cc:220
 hshowerpad.cc:221
 hshowerpad.cc:222
 hshowerpad.cc:223
 hshowerpad.cc:224
 hshowerpad.cc:225
 hshowerpad.cc:226
 hshowerpad.cc:227
 hshowerpad.cc:228
 hshowerpad.cc:229
 hshowerpad.cc:230
 hshowerpad.cc:231
 hshowerpad.cc:232
 hshowerpad.cc:233
 hshowerpad.cc:234
 hshowerpad.cc:235
 hshowerpad.cc:236
 hshowerpad.cc:237
 hshowerpad.cc:238
 hshowerpad.cc:239
 hshowerpad.cc:240
 hshowerpad.cc:241
 hshowerpad.cc:242
 hshowerpad.cc:243
 hshowerpad.cc:244
 hshowerpad.cc:245
 hshowerpad.cc:246
 hshowerpad.cc:247
 hshowerpad.cc:248
 hshowerpad.cc:249
 hshowerpad.cc:250
 hshowerpad.cc:251
 hshowerpad.cc:252
 hshowerpad.cc:253
 hshowerpad.cc:254
 hshowerpad.cc:255
 hshowerpad.cc:256
 hshowerpad.cc:257
 hshowerpad.cc:258
 hshowerpad.cc:259
 hshowerpad.cc:260
 hshowerpad.cc:261
 hshowerpad.cc:262
 hshowerpad.cc:263
 hshowerpad.cc:264
 hshowerpad.cc:265
 hshowerpad.cc:266
 hshowerpad.cc:267
 hshowerpad.cc:268
 hshowerpad.cc:269
 hshowerpad.cc:270
 hshowerpad.cc:271
 hshowerpad.cc:272
 hshowerpad.cc:273
 hshowerpad.cc:274
 hshowerpad.cc:275
 hshowerpad.cc:276
 hshowerpad.cc:277
 hshowerpad.cc:278
 hshowerpad.cc:279
 hshowerpad.cc:280
 hshowerpad.cc:281
 hshowerpad.cc:282
 hshowerpad.cc:283
 hshowerpad.cc:284
 hshowerpad.cc:285
 hshowerpad.cc:286
 hshowerpad.cc:287
 hshowerpad.cc:288
 hshowerpad.cc:289
 hshowerpad.cc:290
 hshowerpad.cc:291
 hshowerpad.cc:292
 hshowerpad.cc:293
 hshowerpad.cc:294