ROOT logo
//_HADES_CLASS_DESCRIPTION 
/////////////////////////////////////////////////////////
//
// HShowerDigiPar - parameters of digitalisation
//
/////////////////////////////////////////////////////////

#include "hshowerdigipar.h"
#include "hhistconverter.h"
#include "hparamlist.h"
#include "hpario.h"
#include "hdetpario.h"
#include "TMath.h"
#include "TRandom.h"

#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <cmath>
using namespace std;

ClassImp(HShowerDigiPar)

//------------------------------------------------------------------------------
HShowerDigiPar::HShowerDigiPar(const Char_t* name,const Char_t* title,
                                      const Char_t* context)
                 : HParCond(name,title,context) {
  gain.Set(18);
  threshold.Set(18);
  effScaleMap.Set(18432);  // 6*3*32*32
  clear();
  pfChargeMatrix = NULL;
  phEff          = NULL;
  for(Int_t s = 0; s < 6; s ++) {
    for(Int_t m = 0; m < 3; m ++) {
      ph2QvB[s][m]    = NULL;
      pArrayQvB[s][m] = NULL;
      nQvBxbins[s][m] = 0;
    }
  }
  nMatrixRange     = 0;
  chargeMatrixSize = 0;
  nGlobalEffBins   = 0;
}

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

HShowerDigiPar::~HShowerDigiPar() {
  removeHistograms();
}

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

void HShowerDigiPar::clear(void) {
  gain.Reset(0.f);
  threshold.Reset(0.f);
  effScaleMap.Reset(1.f);
  globalEff.Set(0);
  for(Int_t s = 0; s < 6; s ++) {
    for(Int_t m = 0; m < 3; m ++) {
      chargeVsBeta[s][m].Set(0);
    }
  }
  fThickDet           = 1.0f;
  nMatrixRange        = 0;
  fBoxSize            = 1.0f;
  fChargeSlope        = 1.0f;
  fPlaneDist          = 1.0f;
  fPadThreshold       = 0.0f;
  fUpdatePadThreshold = 0.0f;
  status=kFALSE;
  resetInputVersions();
  changed=kFALSE;
}

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

void HShowerDigiPar::removeHistograms(void) {
  // removes all histograms
  removeChargeHistograms();
  removeEfficiencyHistograms();
  removeQvBHistograms();
}

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

void HShowerDigiPar::removeChargeHistograms(void) {
  if (pfChargeMatrix != NULL) {
    delete [] pfChargeMatrix;
    pfChargeMatrix = NULL;
  }
  chargeMatrixSize = 0;
}

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

void HShowerDigiPar::removeEfficiencyHistograms(void) {
  if (phEff != NULL) {
    delete phEff;
    phEff = NULL;
  }
  nGlobalEffBins = 0;
}

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

void HShowerDigiPar::removeQvBHistograms(void) {
  nGlobalEffBins = 0;
  for(Int_t s = 0; s < 6; s ++) {
    for(Int_t m = 0; m < 3; m ++) {
      if (ph2QvB[s][m] != NULL) {
        delete ph2QvB[s][m];
        ph2QvB[s][m] = NULL;
      }
      if (pArrayQvB[s][m] != NULL) {
        pArrayQvB[s][m]->Delete();
        delete pArrayQvB[s][m];
        pArrayQvB[s][m] = NULL;
      }
      nQvBxbins[s][m]= 0;
    }
  }
}

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

Bool_t HShowerDigiPar::init(HParIo* inp,Int_t* set) {
  Bool_t rc=kFALSE;
  // intitializes the container from an input
  HDetParIo* input=inp->getDetParIo("HCondParIo");
  if (input) rc=input->init(this,set);
  if (rc && changed) {
    rc=recreateHistograms();
  }	
  return rc;
}

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

void HShowerDigiPar::putParams(HParamList* l) {
  // Puts all params to the parameter list of type HParamList
  // (which is used by the ASCII and Oracle io);
  if (!l) return;
  l->add("gain"                ,gain);
  l->add("threshold"           ,threshold);
  l->add("fThickDet"           ,fThickDet);
  l->add("nMatrixRange"        ,nMatrixRange);
  l->add("fBoxSize"            ,fBoxSize);
  l->add("fChargeSlope"        ,fChargeSlope);
  l->add("fPlaneDist"          ,fPlaneDist);
  l->add("fPadThreshold"       ,fPadThreshold);
  l->add("fUpdatePadThreshold" ,fUpdatePadThreshold);
  l->add("effScaleMap"         ,effScaleMap);
  l->add("globalEff"           ,globalEff);
  for(Int_t s = 0; s < 6; s ++) {
    for(Int_t m = 0; m < 3; m ++) {
      l->add(Form("chargeVsBeta%i%i",s,m),chargeVsBeta[s][m]);
    }
  }
}

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

Bool_t HShowerDigiPar::getParams(HParamList* l) {
  if (!l) return kFALSE;
  if( !(l->fill("gain"               ,&gain)))                return kFALSE;
  if( !(l->fill("threshold"          ,&threshold)))           return kFALSE;
  if (!(l->fill("fThickDet"          ,&fThickDet)))	      return kFALSE;
  if (!(l->fill("nMatrixRange"       ,&nMatrixRange)))	      return kFALSE;
  if (!(l->fill("fBoxSize"           ,&fBoxSize)))            return kFALSE;
  if (!(l->fill("fChargeSlope"       ,&fChargeSlope)))	      return kFALSE;
  if (!(l->fill("fPlaneDist"         ,&fPlaneDist)))          return kFALSE;
  if (!(l->fill("fPadThreshold"      ,&fPadThreshold)))       return kFALSE;
  if (!(l->fill("fUpdatePadThreshold",&fUpdatePadThreshold))) return kFALSE;
  if (!(l->fill("effScaleMap"        ,&effScaleMap)))         return kFALSE;
  if (!(l->fill("globalEff"          ,&globalEff)))	      return kFALSE;
  for(Int_t s = 0; s < 6; s ++) {
    for(Int_t m = 0; m < 3; m ++) {
      if (!(l->fill(Form("chargeVsBeta%i%i",s,m),&chargeVsBeta[s][m]))) return kFALSE;
    }
  }
  return kTRUE;
}

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

Bool_t HShowerDigiPar::recreateHistograms() {
  removeHistograms();
  Bool_t rc=initChargeMatrix();
  if (rc) rc=initEffHistogram();
  if (rc) rc=initSumVersBetaHistograms();
  return rc;
}

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

void HShowerDigiPar::setChargeMatrix(Int_t nRange, const Float_t *pMatrix) {
  if(pfChargeMatrix != NULL) delete [] pfChargeMatrix;
  nMatrixRange = nRange;
  if (nMatrixRange == 0) pfChargeMatrix = NULL;
  else {
    chargeMatrixSize = 2 * nMatrixRange + 1;
    pfChargeMatrix = new Float_t[chargeMatrixSize];
    if (pMatrix != NULL) {
      memcpy(pfChargeMatrix, pMatrix, sizeof(Float_t) * chargeMatrixSize);
    } else
      memset(pfChargeMatrix, 0, sizeof(Float_t) * chargeMatrixSize);
  }
}

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

Float_t HShowerDigiPar::calcCharge(Float_t fCharge, Float_t fDist,
                        Float_t fXd, Float_t fYd, Float_t fXu, Float_t fYu) {
  return ((fCharge / TMath::TwoPi()) *
           (atan(fXd * fYd / (fDist * sqrt(fDist * fDist + fXd * fXd + fYd * fYd)))
            - atan(fXd * fYu / (fDist * sqrt(fDist * fDist + fXd * fXd + fYu * fYu)))
            + atan(fXu * fYu / (fDist * sqrt(fDist * fDist + fXu * fXu + fYu * fYu)))
            - atan(fXu * fYd / (fDist * sqrt(fDist * fDist + fXu * fXu + fYd * fYd)))
           ));
}

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

Bool_t  HShowerDigiPar::initChargeMatrix(void) {
  Float_t cornerX = -0.5 * fBoxSize;
  Float_t cornerY = cornerX;
  setChargeMatrix(nMatrixRange);
  if (pfChargeMatrix==NULL) {
    Error("initChargeMatrix()", "No charge matrix");
    return kFALSE;
  }
  for(Int_t i = 0; i <= nMatrixRange; i++) {
    pfChargeMatrix[nMatrixRange - i] = calcCharge(1., fPlaneDist,
                                                  cornerX + i * fBoxSize,
                                                  cornerY,
                                                  cornerX + (i + 1) * fBoxSize,
                                                  cornerY + fBoxSize);
    Float_t fM = (Float_t)(1.0 - fChargeSlope * i / nMatrixRange);
    if(fM < 0.0f) fM = 0.0f;
    //printf("%d: %f\n", i, fM);
    pfChargeMatrix[nMatrixRange - i] *= fM;
    pfChargeMatrix[nMatrixRange + i] = pfChargeMatrix[nMatrixRange - i];
  }
  for(Int_t i = 1; i < chargeMatrixSize; i++) {
    pfChargeMatrix[i] += pfChargeMatrix[i - 1];
  }
  return kTRUE;
}

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

Bool_t HShowerDigiPar::initEffHistogram(void) {
  phEff = (TH1D*)HHistConverter::createHist("phEff",globalEff);
  if(phEff == NULL) {
    Error("initEffHistogram()", "No efficiency histogram");
    return kFALSE;
  }
  nGlobalEffBins = phEff->GetNbinsX();
  return kTRUE;
}

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

Float_t HShowerDigiPar::getEfficiency(Int_t sec, Int_t mod, Int_t row, Int_t col,
                                      Float_t fBeta) {
  Int_t iBin = phEff->GetXaxis()->FindFixBin((Double_t)fBeta);
  //  if(iBin >= nGlobalEffBins) iBin = nGlobalEffBins - 1;
  return (Float_t)(phEff->GetBinContent(iBin) * effScaleMap[padIndex(sec,mod,row,col)]);
}

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

Bool_t HShowerDigiPar::checkEfficiency(Int_t sec, Int_t mod, Int_t row,Int_t col,
                                       Float_t fBeta) {
  Float_t f = getEfficiency(sec,mod,row,col,fBeta);
  return ((f >= 1.0f) || ((f > 0.0f) && (f > gRandom->Rndm())));
}

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

Bool_t HShowerDigiPar::initSumVersBetaHistograms(void) {
  for(Int_t s = 0; s < 6; s ++) {
    for(Int_t m = 0; m < 3; m ++) {
      TH2D *ph2 = (TH2D*)HHistConverter::createHist(Form("ph2QvB%i%i",s,m),
                                                    chargeVsBeta[s][m]);
      if(ph2 == NULL) {
        Error("%s", "No QvB histogram for sector %i, module %i",s,m);
        return kFALSE;
      }
      Int_t nBins = ph2->GetNbinsX();
      TObjArray *pArr = new TObjArray(nBins);
      pArr->SetOwner();
      for(Int_t iBeta = 0; iBeta < nBins; iBeta++) {
        TH1D *ph1 = ph2->ProjectionY(Form("sumVersBeta%i%i_%i",s,m,iBeta),
                                     iBeta, iBeta+1);
        ph1->SetDirectory(NULL);
        ph1->SetTitle(Form("sum_%03.0f_%03.0f",
                      ph2->GetXaxis()->GetBinLowEdge(iBeta),
                      ph2->GetXaxis()->GetBinUpEdge(iBeta)));
        pArr->AddAt(ph1, iBeta);
      }
      ph2QvB[s][m]    = ph2;
      nQvBxbins[s][m] = nBins;
      pArrayQvB[s][m] = pArr;
    }
  }
  return kTRUE;
}

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

Float_t HShowerDigiPar::getCharge(Int_t sec,Int_t mod, Float_t fBeta) {
  TAxis* axis = ph2QvB[sec][mod]->GetXaxis();
  Int_t iBin = axis->FindFixBin((Double_t)fBeta);
  if(iBin > nQvBxbins[sec][mod]) iBin = nQvBxbins[sec][mod];
  if(iBin<0) iBin = 1;
  Double_t width = axis->GetBinWidth(iBin);
  TH1D *ph1 = (TH1D*)(pArrayQvB[sec][mod]->At(--iBin));
  if(ph1 == NULL) return 0.0f;
  Double_t fQ = ph1->GetRandom() + (2 * gRandom->Rndm() - 1) * width;
  return ((fQ < 0.0) ? 0.0f : (Float_t)fQ);
}

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

void HShowerDigiPar::setEffScaleMap(TArrayF& arr) {
  Int_t n=arr.GetSize();
  if (n==18432) {
    effScaleMap.Set(n,arr.GetArray());
  } else {
    Error("setEffScaleMap(TArrayF&)","Array size %i differs from 6*3*32*32=18432",n);
  }
}  

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

void HShowerDigiPar::setGlobalEff(TArrayD& arr) {
  removeEfficiencyHistograms();
  globalEff.Set(arr.GetSize(),arr.GetArray());  
}

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

void HShowerDigiPar::setChargeVsBeta(Int_t sec, Int_t mod, TArrayD& arr) {
  removeQvBHistograms();
  chargeVsBeta[sec][mod].Set(arr.GetSize(),arr.GetArray());
}
 hshowerdigipar.cc:1
 hshowerdigipar.cc:2
 hshowerdigipar.cc:3
 hshowerdigipar.cc:4
 hshowerdigipar.cc:5
 hshowerdigipar.cc:6
 hshowerdigipar.cc:7
 hshowerdigipar.cc:8
 hshowerdigipar.cc:9
 hshowerdigipar.cc:10
 hshowerdigipar.cc:11
 hshowerdigipar.cc:12
 hshowerdigipar.cc:13
 hshowerdigipar.cc:14
 hshowerdigipar.cc:15
 hshowerdigipar.cc:16
 hshowerdigipar.cc:17
 hshowerdigipar.cc:18
 hshowerdigipar.cc:19
 hshowerdigipar.cc:20
 hshowerdigipar.cc:21
 hshowerdigipar.cc:22
 hshowerdigipar.cc:23
 hshowerdigipar.cc:24
 hshowerdigipar.cc:25
 hshowerdigipar.cc:26
 hshowerdigipar.cc:27
 hshowerdigipar.cc:28
 hshowerdigipar.cc:29
 hshowerdigipar.cc:30
 hshowerdigipar.cc:31
 hshowerdigipar.cc:32
 hshowerdigipar.cc:33
 hshowerdigipar.cc:34
 hshowerdigipar.cc:35
 hshowerdigipar.cc:36
 hshowerdigipar.cc:37
 hshowerdigipar.cc:38
 hshowerdigipar.cc:39
 hshowerdigipar.cc:40
 hshowerdigipar.cc:41
 hshowerdigipar.cc:42
 hshowerdigipar.cc:43
 hshowerdigipar.cc:44
 hshowerdigipar.cc:45
 hshowerdigipar.cc:46
 hshowerdigipar.cc:47
 hshowerdigipar.cc:48
 hshowerdigipar.cc:49
 hshowerdigipar.cc:50
 hshowerdigipar.cc:51
 hshowerdigipar.cc:52
 hshowerdigipar.cc:53
 hshowerdigipar.cc:54
 hshowerdigipar.cc:55
 hshowerdigipar.cc:56
 hshowerdigipar.cc:57
 hshowerdigipar.cc:58
 hshowerdigipar.cc:59
 hshowerdigipar.cc:60
 hshowerdigipar.cc:61
 hshowerdigipar.cc:62
 hshowerdigipar.cc:63
 hshowerdigipar.cc:64
 hshowerdigipar.cc:65
 hshowerdigipar.cc:66
 hshowerdigipar.cc:67
 hshowerdigipar.cc:68
 hshowerdigipar.cc:69
 hshowerdigipar.cc:70
 hshowerdigipar.cc:71
 hshowerdigipar.cc:72
 hshowerdigipar.cc:73
 hshowerdigipar.cc:74
 hshowerdigipar.cc:75
 hshowerdigipar.cc:76
 hshowerdigipar.cc:77
 hshowerdigipar.cc:78
 hshowerdigipar.cc:79
 hshowerdigipar.cc:80
 hshowerdigipar.cc:81
 hshowerdigipar.cc:82
 hshowerdigipar.cc:83
 hshowerdigipar.cc:84
 hshowerdigipar.cc:85
 hshowerdigipar.cc:86
 hshowerdigipar.cc:87
 hshowerdigipar.cc:88
 hshowerdigipar.cc:89
 hshowerdigipar.cc:90
 hshowerdigipar.cc:91
 hshowerdigipar.cc:92
 hshowerdigipar.cc:93
 hshowerdigipar.cc:94
 hshowerdigipar.cc:95
 hshowerdigipar.cc:96
 hshowerdigipar.cc:97
 hshowerdigipar.cc:98
 hshowerdigipar.cc:99
 hshowerdigipar.cc:100
 hshowerdigipar.cc:101
 hshowerdigipar.cc:102
 hshowerdigipar.cc:103
 hshowerdigipar.cc:104
 hshowerdigipar.cc:105
 hshowerdigipar.cc:106
 hshowerdigipar.cc:107
 hshowerdigipar.cc:108
 hshowerdigipar.cc:109
 hshowerdigipar.cc:110
 hshowerdigipar.cc:111
 hshowerdigipar.cc:112
 hshowerdigipar.cc:113
 hshowerdigipar.cc:114
 hshowerdigipar.cc:115
 hshowerdigipar.cc:116
 hshowerdigipar.cc:117
 hshowerdigipar.cc:118
 hshowerdigipar.cc:119
 hshowerdigipar.cc:120
 hshowerdigipar.cc:121
 hshowerdigipar.cc:122
 hshowerdigipar.cc:123
 hshowerdigipar.cc:124
 hshowerdigipar.cc:125
 hshowerdigipar.cc:126
 hshowerdigipar.cc:127
 hshowerdigipar.cc:128
 hshowerdigipar.cc:129
 hshowerdigipar.cc:130
 hshowerdigipar.cc:131
 hshowerdigipar.cc:132
 hshowerdigipar.cc:133
 hshowerdigipar.cc:134
 hshowerdigipar.cc:135
 hshowerdigipar.cc:136
 hshowerdigipar.cc:137
 hshowerdigipar.cc:138
 hshowerdigipar.cc:139
 hshowerdigipar.cc:140
 hshowerdigipar.cc:141
 hshowerdigipar.cc:142
 hshowerdigipar.cc:143
 hshowerdigipar.cc:144
 hshowerdigipar.cc:145
 hshowerdigipar.cc:146
 hshowerdigipar.cc:147
 hshowerdigipar.cc:148
 hshowerdigipar.cc:149
 hshowerdigipar.cc:150
 hshowerdigipar.cc:151
 hshowerdigipar.cc:152
 hshowerdigipar.cc:153
 hshowerdigipar.cc:154
 hshowerdigipar.cc:155
 hshowerdigipar.cc:156
 hshowerdigipar.cc:157
 hshowerdigipar.cc:158
 hshowerdigipar.cc:159
 hshowerdigipar.cc:160
 hshowerdigipar.cc:161
 hshowerdigipar.cc:162
 hshowerdigipar.cc:163
 hshowerdigipar.cc:164
 hshowerdigipar.cc:165
 hshowerdigipar.cc:166
 hshowerdigipar.cc:167
 hshowerdigipar.cc:168
 hshowerdigipar.cc:169
 hshowerdigipar.cc:170
 hshowerdigipar.cc:171
 hshowerdigipar.cc:172
 hshowerdigipar.cc:173
 hshowerdigipar.cc:174
 hshowerdigipar.cc:175
 hshowerdigipar.cc:176
 hshowerdigipar.cc:177
 hshowerdigipar.cc:178
 hshowerdigipar.cc:179
 hshowerdigipar.cc:180
 hshowerdigipar.cc:181
 hshowerdigipar.cc:182
 hshowerdigipar.cc:183
 hshowerdigipar.cc:184
 hshowerdigipar.cc:185
 hshowerdigipar.cc:186
 hshowerdigipar.cc:187
 hshowerdigipar.cc:188
 hshowerdigipar.cc:189
 hshowerdigipar.cc:190
 hshowerdigipar.cc:191
 hshowerdigipar.cc:192
 hshowerdigipar.cc:193
 hshowerdigipar.cc:194
 hshowerdigipar.cc:195
 hshowerdigipar.cc:196
 hshowerdigipar.cc:197
 hshowerdigipar.cc:198
 hshowerdigipar.cc:199
 hshowerdigipar.cc:200
 hshowerdigipar.cc:201
 hshowerdigipar.cc:202
 hshowerdigipar.cc:203
 hshowerdigipar.cc:204
 hshowerdigipar.cc:205
 hshowerdigipar.cc:206
 hshowerdigipar.cc:207
 hshowerdigipar.cc:208
 hshowerdigipar.cc:209
 hshowerdigipar.cc:210
 hshowerdigipar.cc:211
 hshowerdigipar.cc:212
 hshowerdigipar.cc:213
 hshowerdigipar.cc:214
 hshowerdigipar.cc:215
 hshowerdigipar.cc:216
 hshowerdigipar.cc:217
 hshowerdigipar.cc:218
 hshowerdigipar.cc:219
 hshowerdigipar.cc:220
 hshowerdigipar.cc:221
 hshowerdigipar.cc:222
 hshowerdigipar.cc:223
 hshowerdigipar.cc:224
 hshowerdigipar.cc:225
 hshowerdigipar.cc:226
 hshowerdigipar.cc:227
 hshowerdigipar.cc:228
 hshowerdigipar.cc:229
 hshowerdigipar.cc:230
 hshowerdigipar.cc:231
 hshowerdigipar.cc:232
 hshowerdigipar.cc:233
 hshowerdigipar.cc:234
 hshowerdigipar.cc:235
 hshowerdigipar.cc:236
 hshowerdigipar.cc:237
 hshowerdigipar.cc:238
 hshowerdigipar.cc:239
 hshowerdigipar.cc:240
 hshowerdigipar.cc:241
 hshowerdigipar.cc:242
 hshowerdigipar.cc:243
 hshowerdigipar.cc:244
 hshowerdigipar.cc:245
 hshowerdigipar.cc:246
 hshowerdigipar.cc:247
 hshowerdigipar.cc:248
 hshowerdigipar.cc:249
 hshowerdigipar.cc:250
 hshowerdigipar.cc:251
 hshowerdigipar.cc:252
 hshowerdigipar.cc:253
 hshowerdigipar.cc:254
 hshowerdigipar.cc:255
 hshowerdigipar.cc:256
 hshowerdigipar.cc:257
 hshowerdigipar.cc:258
 hshowerdigipar.cc:259
 hshowerdigipar.cc:260
 hshowerdigipar.cc:261
 hshowerdigipar.cc:262
 hshowerdigipar.cc:263
 hshowerdigipar.cc:264
 hshowerdigipar.cc:265
 hshowerdigipar.cc:266
 hshowerdigipar.cc:267
 hshowerdigipar.cc:268
 hshowerdigipar.cc:269
 hshowerdigipar.cc:270
 hshowerdigipar.cc:271
 hshowerdigipar.cc:272
 hshowerdigipar.cc:273
 hshowerdigipar.cc:274
 hshowerdigipar.cc:275
 hshowerdigipar.cc:276
 hshowerdigipar.cc:277
 hshowerdigipar.cc:278
 hshowerdigipar.cc:279
 hshowerdigipar.cc:280
 hshowerdigipar.cc:281
 hshowerdigipar.cc:282
 hshowerdigipar.cc:283
 hshowerdigipar.cc:284
 hshowerdigipar.cc:285
 hshowerdigipar.cc:286
 hshowerdigipar.cc:287
 hshowerdigipar.cc:288
 hshowerdigipar.cc:289
 hshowerdigipar.cc:290
 hshowerdigipar.cc:291
 hshowerdigipar.cc:292
 hshowerdigipar.cc:293
 hshowerdigipar.cc:294
 hshowerdigipar.cc:295
 hshowerdigipar.cc:296
 hshowerdigipar.cc:297
 hshowerdigipar.cc:298
 hshowerdigipar.cc:299
 hshowerdigipar.cc:300
 hshowerdigipar.cc:301
 hshowerdigipar.cc:302
 hshowerdigipar.cc:303
 hshowerdigipar.cc:304
 hshowerdigipar.cc:305
 hshowerdigipar.cc:306
 hshowerdigipar.cc:307
 hshowerdigipar.cc:308
 hshowerdigipar.cc:309
 hshowerdigipar.cc:310
 hshowerdigipar.cc:311
 hshowerdigipar.cc:312
 hshowerdigipar.cc:313
 hshowerdigipar.cc:314
 hshowerdigipar.cc:315
 hshowerdigipar.cc:316
 hshowerdigipar.cc:317
 hshowerdigipar.cc:318
 hshowerdigipar.cc:319
 hshowerdigipar.cc:320
 hshowerdigipar.cc:321
 hshowerdigipar.cc:322
 hshowerdigipar.cc:323
 hshowerdigipar.cc:324
 hshowerdigipar.cc:325
 hshowerdigipar.cc:326
 hshowerdigipar.cc:327
 hshowerdigipar.cc:328
 hshowerdigipar.cc:329
 hshowerdigipar.cc:330
 hshowerdigipar.cc:331
 hshowerdigipar.cc:332
 hshowerdigipar.cc:333
 hshowerdigipar.cc:334
 hshowerdigipar.cc:335
 hshowerdigipar.cc:336
 hshowerdigipar.cc:337
 hshowerdigipar.cc:338
 hshowerdigipar.cc:339
 hshowerdigipar.cc:340
 hshowerdigipar.cc:341
 hshowerdigipar.cc:342
 hshowerdigipar.cc:343
 hshowerdigipar.cc:344
 hshowerdigipar.cc:345
 hshowerdigipar.cc:346
 hshowerdigipar.cc:347
 hshowerdigipar.cc:348