ROOT logo
#pragma implementation
using namespace std;
#include <iostream>
#include <iomanip>
#include "hades.h"
#include "hpario.h"
#include "hdetpario.h"
#include "hspectrometer.h"
#include "hshowerdetector.h"
#include "hshowercalpar.h"
#include "hshowercalparcell.h"

#include "TH2.h"

ClassImp(HShowerCalPar)

//_HADES_CLASS_DESCRIPTION 
///////////////////////////////////////////////////////////////////////
// HShowerCalPar
//
// HShowerCalPar is used to manage of all parameters for calibration
// This class contains structure HObjTable, which contains all
// HShowerCalParCell objects. One HShowerCalParCell object contains
// calibration parameters of one pad: slope and offset
//
//////////////////////////////////////////////////////////////////////

HShowerCalPar::HShowerCalPar(const Char_t* name,const Char_t* title,
                             const Char_t* context)
              : HParSet(name,title,context) {
  strcpy(detName,"Shower");
  setSetup(6, 3, 32, 32); //default setup
  setCellClassName("HShowerCalParCell");
  m_loc.setNIndex(4);
  defaultInit();
}

HShowerCalPar::~HShowerCalPar()
{
  m_ParamsTable.deleteTab();
}

void HShowerCalPar::setSetup(Int_t nSectors, Int_t nModules,
   Int_t  nRows, Int_t nColumns)
{
//set sizes of internal structure
  m_nSectors = nSectors;
  m_nModules = nModules;
  m_nRows = nRows;
  m_nColumns = nColumns;
}

void HShowerCalPar::setCellClassName(const Char_t* pszName)
//set name of class of calibration parameter container for one pad
{
  strncpy(m_szClassName, pszName, sizeof(m_szClassName));
}

Char_t* HShowerCalPar::getCellClassName()
{
//return  name of class of calibration parameter container for one pad

  return m_szClassName;
}


HShowerCalParCell*& HShowerCalPar::getSlot(HLocation &loc)
{
  //return references address to place new object at loc position
  return (HShowerCalParCell*&) m_ParamsTable.getSlot(loc);
}

HShowerCalParCell* HShowerCalPar::getObject(HLocation &loc)
{
  //return pointer to object, which contains parameter for pad
  //at loc position
  return (HShowerCalParCell*) m_ParamsTable.getObject(loc);
}

Float_t HShowerCalPar::getSlope(HLocation &loc)
{
  //return slope for the pad at postion loc
  return getObject(loc)->getSlope();
}

Float_t HShowerCalPar::getOffset(HLocation &loc)
{
  //return offset for the pad at postion loc
  return getObject(loc)->getOffset();
}

Float_t HShowerCalPar::getThreshold(HLocation &loc)
{
  //return Threshold for the pad at postion loc
  return getObject(loc)->getThreshold();
}

Float_t HShowerCalPar::getGain(HLocation &loc)
{
  //return Gain for the pad at postion loc
  return getObject(loc)->getGain();
}

void HShowerCalPar::setSlope(HLocation &loc, Float_t fSlope)
{
  //set slope for the pad at postion loc
  getObject(loc)->setSlope(fSlope);
}

void HShowerCalPar::setOffset(HLocation &loc, Float_t fOffset)
{
  //set offset for the pad at postion loc
  getObject(loc)->setOffset(fOffset);
}

void HShowerCalPar::setThreshold(HLocation &loc, Float_t fThreshold)
{
  //set Threshold for the pad at postion loc
  getObject(loc)->setThreshold(fThreshold);
}

void HShowerCalPar::setGain(HLocation &loc, Float_t fGain)
{
  //set Gain for the pad at postion loc
  getObject(loc)->setGain(fGain);
}

Bool_t HShowerCalPar::defaultInit()
{
  //initialization of calibration parameters for full setup
  //of pre-SHOWER detector. Default calibration using
  //values of slope==1 and offset==0
  Int_t sect, mod, row, col;
  HShowerDetector *pShowerDet = (HShowerDetector*)gHades->getSetup()
                                                  ->getDetector("Shower");
  if (!pShowerDet) return kFALSE;

  m_nSectors = pShowerDet->getShowerSectors();
  m_nModules = pShowerDet->getShowerModules();
  m_nRows = pShowerDet->getRows();
  m_nColumns = pShowerDet->getColumns();

  //  printf("%d - %d - %d - %d\n", m_nSectors, m_nModules, m_nRows, m_nColumns);
  m_ParamsTable.set(4, m_nSectors, m_nModules, m_nRows, m_nColumns);

  m_ParamsTable.setCellClassName(getCellClassName());
  m_ParamsTable.makeObjTable();

  HShowerCalParCell *pCell;

  for(sect = 0; sect < m_nSectors; sect++)
    for(mod = 0; mod < m_nModules; mod++)
      for(row = 0; row < m_nRows; row++)
         for(col = 0; col < m_nColumns; col++) {
           m_loc[0] = sect;
           m_loc[1] = mod;
           m_loc[2] = row;
           m_loc[3] = col;

           pCell = (HShowerCalParCell*) getSlot(m_loc);
           if (pCell) {
                 pCell = new(pCell) HShowerCalParCell;
                 pCell->setSlope(1.0);
                 pCell->setOffset(0.0);
           }

            //printf("XX : ");
           //pCell->print();
         }

  //  printf("Shower calpar default initialization\n");
  return kTRUE;
}

Bool_t HShowerCalPar::init(HParIo* inp,Int_t* set) {
  // intitializes the container from an input
  HDetParIo* input=inp->getDetParIo("HShowerParIo");
  if (input) return (input->init(this,set));
  return kFALSE;
}

Int_t HShowerCalPar::write(HParIo* output) {
  // writes the shower container to the output
  HDetParIo* out=output->getDetParIo("HShowerParIo");
  if (out) return out->write(this);
  return kFALSE;
}

Bool_t HShowerCalPar::readline(const Char_t* buf) {
// Decodes one line read from ASCII file I/O and fills the cells
  Int_t sec=0, mod=0, row=0, col=0;
  Float_t offset=0., slope=0.,threshold=0.,gain=0.;
  sscanf(buf,"%i%i%i%i%f%f%f%f",&sec,&mod,&row,&col,&slope,&offset,&threshold,&gain);
  m_loc[0] = sec;
  m_loc[1] = mod;
  m_loc[2] = row;
  m_loc[3] = col;
  HShowerCalParCell* pCell = (HShowerCalParCell*) getSlot(m_loc);
  if (pCell) {
    pCell = new(pCell) HShowerCalParCell;
    pCell->setSlope(slope);
    pCell->setThreshold(threshold);
    pCell->setOffset(offset);
    pCell->setGain(gain);
    return kTRUE;
  } else {
    Error("readline(const Char_t*)","No slot found: %i %i %i %i",sec,mod,row,col);
    return kFALSE;
  }
}

void HShowerCalPar::putAsciiHeader(TString& header) {
  // puts the ascii header to the string used in HShowerParAsciiFileIo
  header=
    "# Calibration parameters of the Shower\n"
    "# Format:\n"
    "# sector  module  row  column  slope  offset  threshold  gain\n";
}

void HShowerCalPar::write(fstream& fout) {
  // writes the calibration parameters to an ASCII file
  for(Int_t sec = 0; sec < m_nSectors; sec++) {
    m_loc[0] = sec;
    for(Int_t mod = 0; mod < m_nModules; mod++) {
      m_loc[1] = mod;
      for(Int_t row = 0; row < m_nRows; row++) {
        m_loc[2] = row;
        for(Int_t col = 0; col < m_nColumns; col++) {
          m_loc[3] = col;
          fout<<setw(3)<<sec<<setw(3)<<mod
              <<setw(4)<<right<<row<<setw(4)<<right<<col
              <<" "<<setw(10)<<setprecision(6)<<getSlope(m_loc)
              <<" "<<setw(10)<<setprecision(5)<<getOffset(m_loc)
              <<" "<<setw(10)<<setprecision(5)<<getThreshold(m_loc)
              <<" "<<setw(10)<<setprecision(6)<<getGain(m_loc)<<endl;
        }
      }
    }
  }
}

void HShowerCalPar::printParams() {
  Int_t i, j, k, l;
  Float_t slope, offset,threshold,gain;
  for (i = 0; i < m_nSectors; i++) {
    for (j = 0; j < m_nModules; j++) {
      for (k = 0; k < m_nRows; k++) {
        for (l = 0; l < m_nColumns; l++) {
          m_loc[0] = i;
          m_loc[1] = j;
          m_loc[2] = k;
          m_loc[3] = l;
          slope = getSlope(m_loc);
          offset = getOffset(m_loc);
          threshold = getThreshold(m_loc);
          gain = getGain(m_loc);
          if (offset < 0)
          printf("%d:%d:%d:%d %f %f %f %f\n", i, j, k, l, slope, offset,threshold,gain);
        }
      }
    }
  }
}

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

void HShowerCalPar::changeValues(Int_t iVar, Int_t iOpr, Float_t f)
{
Int_t                iSec, iMod, iRow, iCol;
Float_t            fVals[4];
HShowerCalParCell *pCell;

    for(iSec = 0; iSec < m_nSectors; iSec++)
    {
        m_loc[0] = iSec;

        for(iMod = 0; iMod < m_nModules; iMod++)
        {
            m_loc[1] = iMod;

            for(iRow = 0; iRow < m_nRows; iRow++)
            {
                m_loc[2] = iRow;

                for(iCol = 0; iCol < m_nColumns; iCol++)
                {
                    m_loc[3] = iCol;

                    if((pCell = (HShowerCalParCell *) getSlot(m_loc)) == NULL)
                        continue;

                    fVals[HSCPV_SLOPE]     = pCell->getSlope();
                    fVals[HSCPV_OFFSET]    = pCell->getOffset();
                    fVals[HSCPV_THRESHOLD] = pCell->getThreshold();
                    fVals[HSCPV_GAIN]      = pCell->getGain();

                    switch(iOpr)
                    {
                        case HSCPM_SET:
                            fVals[iVar] = f;
                            break;

                        case HSCPM_ADD:
                            fVals[iVar] += f;
                            break;

                        default:
                            fVals[iVar] *= f;
                            break;
                    }

                    pCell->setParams(fVals[HSCPV_SLOPE], fVals[HSCPV_OFFSET],
                                fVals[HSCPV_THRESHOLD], fVals[HSCPV_GAIN]);
                }
            }
        }
    }
}

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

TH2F* HShowerCalPar::getHist(Int_t iSector, Int_t iModule,
                enum_HSCPM_Var enType)
{
// Create a new histogram with a calibartion values for the selected chamber.
// User must delete the histogram himself

    // check parameters
    if((iSector < 0) || (iSector >= m_nSectors))
    {
        Error("getHist", "Sector %d out of bounds [0, %d]",
                    iSector, m_nSectors - 1);

        return NULL;
    }

    if((iModule < 0) || (iModule >= m_nModules))
    {
        Error("getHist", "Module %d out of bounds [0, %d]",
                    iModule, m_nModules - 1);

        return NULL;
    }

    if(m_nRows <= 0)
    {
        Error("getHist", "m_nRows = %d", m_nRows);
        return NULL;
    }

    if(m_nColumns <= 0)
    {
        Error("getHist", "m_nColumns = %d", m_nColumns);
        return NULL;
    }

TH2F *h;
Char_t  sT[100];
Char_t  sN[100];

    // prepare the names
    strcpy(sT, "Shower calibration params: ");
    strcpy(sN, "hShwCal_");
    switch(enType)
    {
        case HSCPV_SLOPE:
            strcat(sT, "slopes");
            strcat(sN, "slope");
            break;

        case HSCPV_OFFSET:
            strcat(sT, "offsets");
            strcat(sN, "off");
            break;

        case HSCPV_THRESHOLD:
            strcat(sT, "thresholds");
            strcat(sN, "thr");
            break;

        case HSCPV_GAIN:
            strcat(sT, "gains");
            strcat(sN, "gain");
            break;

        default:
            Error("getHist", "Wrong option enType=%d", enType);
            return NULL;
    }

    sprintf(sT + strlen(sT), " sec: %d mod: %d", iSector, iModule);
    sprintf(sN + strlen(sN), "_%d_%d", iSector, iModule);

    // create histogram
    if((h = new TH2F(sN, sT, m_nColumns, 0, m_nColumns, m_nRows, 0, m_nRows))
            == NULL)
    {
        Error("getHist", "Cannot create histogram");
        return NULL;
    }

    // fill histogram
HLocation hLoc;
Float_t   f;

    hLoc.setNIndex(4);
    hLoc[0] = iSector;
    hLoc[1] = iModule;

    for(hLoc[2] = 0; hLoc[2] < m_nRows; hLoc[2]++)
    {
        for(hLoc[3] = 0; hLoc[3] < m_nColumns; hLoc[3]++)
        {
            switch(enType)
            {
                case HSCPV_SLOPE:
                    f = getSlope(hLoc);
                    break;

                case HSCPV_OFFSET:
                    f = getOffset(hLoc);
                    break;

                case HSCPV_THRESHOLD:
                    f = getThreshold(hLoc);
                    break;

                default:
                    f = getGain(hLoc);
                    break;
            }

            h->Fill(hLoc[3], hLoc[2], f);
        }
    }

    return h;
}
 hshowercalpar.cc:1
 hshowercalpar.cc:2
 hshowercalpar.cc:3
 hshowercalpar.cc:4
 hshowercalpar.cc:5
 hshowercalpar.cc:6
 hshowercalpar.cc:7
 hshowercalpar.cc:8
 hshowercalpar.cc:9
 hshowercalpar.cc:10
 hshowercalpar.cc:11
 hshowercalpar.cc:12
 hshowercalpar.cc:13
 hshowercalpar.cc:14
 hshowercalpar.cc:15
 hshowercalpar.cc:16
 hshowercalpar.cc:17
 hshowercalpar.cc:18
 hshowercalpar.cc:19
 hshowercalpar.cc:20
 hshowercalpar.cc:21
 hshowercalpar.cc:22
 hshowercalpar.cc:23
 hshowercalpar.cc:24
 hshowercalpar.cc:25
 hshowercalpar.cc:26
 hshowercalpar.cc:27
 hshowercalpar.cc:28
 hshowercalpar.cc:29
 hshowercalpar.cc:30
 hshowercalpar.cc:31
 hshowercalpar.cc:32
 hshowercalpar.cc:33
 hshowercalpar.cc:34
 hshowercalpar.cc:35
 hshowercalpar.cc:36
 hshowercalpar.cc:37
 hshowercalpar.cc:38
 hshowercalpar.cc:39
 hshowercalpar.cc:40
 hshowercalpar.cc:41
 hshowercalpar.cc:42
 hshowercalpar.cc:43
 hshowercalpar.cc:44
 hshowercalpar.cc:45
 hshowercalpar.cc:46
 hshowercalpar.cc:47
 hshowercalpar.cc:48
 hshowercalpar.cc:49
 hshowercalpar.cc:50
 hshowercalpar.cc:51
 hshowercalpar.cc:52
 hshowercalpar.cc:53
 hshowercalpar.cc:54
 hshowercalpar.cc:55
 hshowercalpar.cc:56
 hshowercalpar.cc:57
 hshowercalpar.cc:58
 hshowercalpar.cc:59
 hshowercalpar.cc:60
 hshowercalpar.cc:61
 hshowercalpar.cc:62
 hshowercalpar.cc:63
 hshowercalpar.cc:64
 hshowercalpar.cc:65
 hshowercalpar.cc:66
 hshowercalpar.cc:67
 hshowercalpar.cc:68
 hshowercalpar.cc:69
 hshowercalpar.cc:70
 hshowercalpar.cc:71
 hshowercalpar.cc:72
 hshowercalpar.cc:73
 hshowercalpar.cc:74
 hshowercalpar.cc:75
 hshowercalpar.cc:76
 hshowercalpar.cc:77
 hshowercalpar.cc:78
 hshowercalpar.cc:79
 hshowercalpar.cc:80
 hshowercalpar.cc:81
 hshowercalpar.cc:82
 hshowercalpar.cc:83
 hshowercalpar.cc:84
 hshowercalpar.cc:85
 hshowercalpar.cc:86
 hshowercalpar.cc:87
 hshowercalpar.cc:88
 hshowercalpar.cc:89
 hshowercalpar.cc:90
 hshowercalpar.cc:91
 hshowercalpar.cc:92
 hshowercalpar.cc:93
 hshowercalpar.cc:94
 hshowercalpar.cc:95
 hshowercalpar.cc:96
 hshowercalpar.cc:97
 hshowercalpar.cc:98
 hshowercalpar.cc:99
 hshowercalpar.cc:100
 hshowercalpar.cc:101
 hshowercalpar.cc:102
 hshowercalpar.cc:103
 hshowercalpar.cc:104
 hshowercalpar.cc:105
 hshowercalpar.cc:106
 hshowercalpar.cc:107
 hshowercalpar.cc:108
 hshowercalpar.cc:109
 hshowercalpar.cc:110
 hshowercalpar.cc:111
 hshowercalpar.cc:112
 hshowercalpar.cc:113
 hshowercalpar.cc:114
 hshowercalpar.cc:115
 hshowercalpar.cc:116
 hshowercalpar.cc:117
 hshowercalpar.cc:118
 hshowercalpar.cc:119
 hshowercalpar.cc:120
 hshowercalpar.cc:121
 hshowercalpar.cc:122
 hshowercalpar.cc:123
 hshowercalpar.cc:124
 hshowercalpar.cc:125
 hshowercalpar.cc:126
 hshowercalpar.cc:127
 hshowercalpar.cc:128
 hshowercalpar.cc:129
 hshowercalpar.cc:130
 hshowercalpar.cc:131
 hshowercalpar.cc:132
 hshowercalpar.cc:133
 hshowercalpar.cc:134
 hshowercalpar.cc:135
 hshowercalpar.cc:136
 hshowercalpar.cc:137
 hshowercalpar.cc:138
 hshowercalpar.cc:139
 hshowercalpar.cc:140
 hshowercalpar.cc:141
 hshowercalpar.cc:142
 hshowercalpar.cc:143
 hshowercalpar.cc:144
 hshowercalpar.cc:145
 hshowercalpar.cc:146
 hshowercalpar.cc:147
 hshowercalpar.cc:148
 hshowercalpar.cc:149
 hshowercalpar.cc:150
 hshowercalpar.cc:151
 hshowercalpar.cc:152
 hshowercalpar.cc:153
 hshowercalpar.cc:154
 hshowercalpar.cc:155
 hshowercalpar.cc:156
 hshowercalpar.cc:157
 hshowercalpar.cc:158
 hshowercalpar.cc:159
 hshowercalpar.cc:160
 hshowercalpar.cc:161
 hshowercalpar.cc:162
 hshowercalpar.cc:163
 hshowercalpar.cc:164
 hshowercalpar.cc:165
 hshowercalpar.cc:166
 hshowercalpar.cc:167
 hshowercalpar.cc:168
 hshowercalpar.cc:169
 hshowercalpar.cc:170
 hshowercalpar.cc:171
 hshowercalpar.cc:172
 hshowercalpar.cc:173
 hshowercalpar.cc:174
 hshowercalpar.cc:175
 hshowercalpar.cc:176
 hshowercalpar.cc:177
 hshowercalpar.cc:178
 hshowercalpar.cc:179
 hshowercalpar.cc:180
 hshowercalpar.cc:181
 hshowercalpar.cc:182
 hshowercalpar.cc:183
 hshowercalpar.cc:184
 hshowercalpar.cc:185
 hshowercalpar.cc:186
 hshowercalpar.cc:187
 hshowercalpar.cc:188
 hshowercalpar.cc:189
 hshowercalpar.cc:190
 hshowercalpar.cc:191
 hshowercalpar.cc:192
 hshowercalpar.cc:193
 hshowercalpar.cc:194
 hshowercalpar.cc:195
 hshowercalpar.cc:196
 hshowercalpar.cc:197
 hshowercalpar.cc:198
 hshowercalpar.cc:199
 hshowercalpar.cc:200
 hshowercalpar.cc:201
 hshowercalpar.cc:202
 hshowercalpar.cc:203
 hshowercalpar.cc:204
 hshowercalpar.cc:205
 hshowercalpar.cc:206
 hshowercalpar.cc:207
 hshowercalpar.cc:208
 hshowercalpar.cc:209
 hshowercalpar.cc:210
 hshowercalpar.cc:211
 hshowercalpar.cc:212
 hshowercalpar.cc:213
 hshowercalpar.cc:214
 hshowercalpar.cc:215
 hshowercalpar.cc:216
 hshowercalpar.cc:217
 hshowercalpar.cc:218
 hshowercalpar.cc:219
 hshowercalpar.cc:220
 hshowercalpar.cc:221
 hshowercalpar.cc:222
 hshowercalpar.cc:223
 hshowercalpar.cc:224
 hshowercalpar.cc:225
 hshowercalpar.cc:226
 hshowercalpar.cc:227
 hshowercalpar.cc:228
 hshowercalpar.cc:229
 hshowercalpar.cc:230
 hshowercalpar.cc:231
 hshowercalpar.cc:232
 hshowercalpar.cc:233
 hshowercalpar.cc:234
 hshowercalpar.cc:235
 hshowercalpar.cc:236
 hshowercalpar.cc:237
 hshowercalpar.cc:238
 hshowercalpar.cc:239
 hshowercalpar.cc:240
 hshowercalpar.cc:241
 hshowercalpar.cc:242
 hshowercalpar.cc:243
 hshowercalpar.cc:244
 hshowercalpar.cc:245
 hshowercalpar.cc:246
 hshowercalpar.cc:247
 hshowercalpar.cc:248
 hshowercalpar.cc:249
 hshowercalpar.cc:250
 hshowercalpar.cc:251
 hshowercalpar.cc:252
 hshowercalpar.cc:253
 hshowercalpar.cc:254
 hshowercalpar.cc:255
 hshowercalpar.cc:256
 hshowercalpar.cc:257
 hshowercalpar.cc:258
 hshowercalpar.cc:259
 hshowercalpar.cc:260
 hshowercalpar.cc:261
 hshowercalpar.cc:262
 hshowercalpar.cc:263
 hshowercalpar.cc:264
 hshowercalpar.cc:265
 hshowercalpar.cc:266
 hshowercalpar.cc:267
 hshowercalpar.cc:268
 hshowercalpar.cc:269
 hshowercalpar.cc:270
 hshowercalpar.cc:271
 hshowercalpar.cc:272
 hshowercalpar.cc:273
 hshowercalpar.cc:274
 hshowercalpar.cc:275
 hshowercalpar.cc:276
 hshowercalpar.cc:277
 hshowercalpar.cc:278
 hshowercalpar.cc:279
 hshowercalpar.cc:280
 hshowercalpar.cc:281
 hshowercalpar.cc:282
 hshowercalpar.cc:283
 hshowercalpar.cc:284
 hshowercalpar.cc:285
 hshowercalpar.cc:286
 hshowercalpar.cc:287
 hshowercalpar.cc:288
 hshowercalpar.cc:289
 hshowercalpar.cc:290
 hshowercalpar.cc:291
 hshowercalpar.cc:292
 hshowercalpar.cc:293
 hshowercalpar.cc:294
 hshowercalpar.cc:295
 hshowercalpar.cc:296
 hshowercalpar.cc:297
 hshowercalpar.cc:298
 hshowercalpar.cc:299
 hshowercalpar.cc:300
 hshowercalpar.cc:301
 hshowercalpar.cc:302
 hshowercalpar.cc:303
 hshowercalpar.cc:304
 hshowercalpar.cc:305
 hshowercalpar.cc:306
 hshowercalpar.cc:307
 hshowercalpar.cc:308
 hshowercalpar.cc:309
 hshowercalpar.cc:310
 hshowercalpar.cc:311
 hshowercalpar.cc:312
 hshowercalpar.cc:313
 hshowercalpar.cc:314
 hshowercalpar.cc:315
 hshowercalpar.cc:316
 hshowercalpar.cc:317
 hshowercalpar.cc:318
 hshowercalpar.cc:319
 hshowercalpar.cc:320
 hshowercalpar.cc:321
 hshowercalpar.cc:322
 hshowercalpar.cc:323
 hshowercalpar.cc:324
 hshowercalpar.cc:325
 hshowercalpar.cc:326
 hshowercalpar.cc:327
 hshowercalpar.cc:328
 hshowercalpar.cc:329
 hshowercalpar.cc:330
 hshowercalpar.cc:331
 hshowercalpar.cc:332
 hshowercalpar.cc:333
 hshowercalpar.cc:334
 hshowercalpar.cc:335
 hshowercalpar.cc:336
 hshowercalpar.cc:337
 hshowercalpar.cc:338
 hshowercalpar.cc:339
 hshowercalpar.cc:340
 hshowercalpar.cc:341
 hshowercalpar.cc:342
 hshowercalpar.cc:343
 hshowercalpar.cc:344
 hshowercalpar.cc:345
 hshowercalpar.cc:346
 hshowercalpar.cc:347
 hshowercalpar.cc:348
 hshowercalpar.cc:349
 hshowercalpar.cc:350
 hshowercalpar.cc:351
 hshowercalpar.cc:352
 hshowercalpar.cc:353
 hshowercalpar.cc:354
 hshowercalpar.cc:355
 hshowercalpar.cc:356
 hshowercalpar.cc:357
 hshowercalpar.cc:358
 hshowercalpar.cc:359
 hshowercalpar.cc:360
 hshowercalpar.cc:361
 hshowercalpar.cc:362
 hshowercalpar.cc:363
 hshowercalpar.cc:364
 hshowercalpar.cc:365
 hshowercalpar.cc:366
 hshowercalpar.cc:367
 hshowercalpar.cc:368
 hshowercalpar.cc:369
 hshowercalpar.cc:370
 hshowercalpar.cc:371
 hshowercalpar.cc:372
 hshowercalpar.cc:373
 hshowercalpar.cc:374
 hshowercalpar.cc:375
 hshowercalpar.cc:376
 hshowercalpar.cc:377
 hshowercalpar.cc:378
 hshowercalpar.cc:379
 hshowercalpar.cc:380
 hshowercalpar.cc:381
 hshowercalpar.cc:382
 hshowercalpar.cc:383
 hshowercalpar.cc:384
 hshowercalpar.cc:385
 hshowercalpar.cc:386
 hshowercalpar.cc:387
 hshowercalpar.cc:388
 hshowercalpar.cc:389
 hshowercalpar.cc:390
 hshowercalpar.cc:391
 hshowercalpar.cc:392
 hshowercalpar.cc:393
 hshowercalpar.cc:394
 hshowercalpar.cc:395
 hshowercalpar.cc:396
 hshowercalpar.cc:397
 hshowercalpar.cc:398
 hshowercalpar.cc:399
 hshowercalpar.cc:400
 hshowercalpar.cc:401
 hshowercalpar.cc:402
 hshowercalpar.cc:403
 hshowercalpar.cc:404
 hshowercalpar.cc:405
 hshowercalpar.cc:406
 hshowercalpar.cc:407
 hshowercalpar.cc:408
 hshowercalpar.cc:409
 hshowercalpar.cc:410
 hshowercalpar.cc:411
 hshowercalpar.cc:412
 hshowercalpar.cc:413
 hshowercalpar.cc:414
 hshowercalpar.cc:415
 hshowercalpar.cc:416
 hshowercalpar.cc:417
 hshowercalpar.cc:418
 hshowercalpar.cc:419
 hshowercalpar.cc:420
 hshowercalpar.cc:421
 hshowercalpar.cc:422
 hshowercalpar.cc:423
 hshowercalpar.cc:424
 hshowercalpar.cc:425
 hshowercalpar.cc:426
 hshowercalpar.cc:427
 hshowercalpar.cc:428
 hshowercalpar.cc:429
 hshowercalpar.cc:430
 hshowercalpar.cc:431
 hshowercalpar.cc:432
 hshowercalpar.cc:433
 hshowercalpar.cc:434
 hshowercalpar.cc:435
 hshowercalpar.cc:436
 hshowercalpar.cc:437
 hshowercalpar.cc:438