ROOT logo
//*-- AUTHOR : Ilse Koenig
//*-- Created : 10/11/2003

//_HADES_CLASS_DESCRIPTION 
///////////////////////////////////////////////////////////////////////////////
// HGeomMdc
//
// Class for geometry of MDC
//
// Creation of wires:
//
// The parameters (media, radia, wire distances, ...) to create wires
// (see class HGeomMdcWirePlanes) are read from a parameter ROOT file.
// For each wire the length and position is then calculated and an unique name
// generated.
// All wire planes (sensitive mother volumes) are implemented as TRD1, all
// wires as TUBE filled with a not-sentive medium. The GEANT/ROOT coordinate
// system of both shapes is indentical, but different from the HADES coordinate
// system.
//
//     HADES coordinate system                    TRD1 coordinate system
//                                                
//            Line 1                              xHades = xTrd1
//          ----------              ^ (y)         yHades = zTrd1
//          \ Layer  /              |             zHades = -yTrd1
// Line 0 -> \ MDC  /  <- Line 2    |       
//            \____/                |             
//            Line 3                |      
//  (x) <--------|-------------------      
//              0,0
//
///////////////////////////////////////////////////////////////////////////////

#include "hgeommdc.h"
#include "hgeommdchit.h"
#include "hgeombuilder.h"
#include "hgeommedia.h"
#include "hgeommedium.h"
#include "hgeomnode.h"
#include "hgeommdcwireplanes.h"
#include "hgeommdcwire.h"

#include "TFile.h"

#include <iostream>
#include <iomanip>

using namespace std;

ClassImp(HGeomMdc)

HGeomMdc::HGeomMdc() {
  // Constructor
  fName="mdc";
  maxSectors=6;
  maxModules=4;
  pHit=new HGeomMdcHit(this);
  wn0=33; wn1=0; wn2=0; wn3=-1; // first name will be X000
  memcpy(wnbuf,"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",36);
}

const Char_t* HGeomMdc::getModuleName(Int_t m) {
  // Return the module name in plane m
  sprintf(modName,"DR%iM",m+1);
  return modName;
}

const Char_t* HGeomMdc::getEleName(Int_t m) {
  // Return the element name in plane m
  sprintf(eleName,"D%i",m+1);
  return eleName;
}

Bool_t HGeomMdc::createAdditionalGeometry(HGeomBuilder* builder, const TString& paramFile, HGeomMedia* media) {
  // reads wire plane parameters from file and creates the wires
  Bool_t rc = kTRUE;
  if (builder && paramFile.Length() > 0) {
    TFile* file = new TFile(paramFile.Data(),"READ");
    if (file==NULL || file->IsOpen()== kFALSE) {
      Error("createAdditionalGeometry", "Parameter file %s not found", paramFile.Data());
      return kFALSE;
    }
    file->cd();
    HGeomMdcWirePlanes *mdcWirePlanes = (HGeomMdcWirePlanes*)file->Get("HGeomMdcWirePlanes");
    if (mdcWirePlanes) {
      //mdcWirePlanes->printWirePlanes();
      vector<HGeomMdcWirePlane>& pWirePlanes = mdcWirePlanes->getWirePlanes();
      Int_t totNumWires=0;
      for (UInt_t np=0; np<pWirePlanes.size(); np++) {
        HGeomMdcWirePlane& plane = pWirePlanes[np];
        HGeomNode* pMother=getVolume(plane.planeName.Data());
        if (pMother==NULL || pMother->isActive()==kFALSE) continue;
        Double_t planeX[4], planeY[4];
        for (Int_t i=0; i<4; i++) {
          HGeomVector* point = pMother->getPoint(i);
          planeX[i] = point->getX();
          planeY[i] = point->getY();
        }
        Int_t medId[2] = {-1,-1};
        for (Int_t i = 0; i <= plane.planeType && rc; i++) {
          HGeomMedium* medium = media->getMedium(plane.wireMedium[i]);
          if (medium) {
            medId[i] = medium->getMediumIndex();
            if (medId[i] <= 0) medId[i] = builder->createMedium(medium);
            if (medId[i] <= 0) {
              Error("createAdditionalGeometry",
                    "Medium %s not created",plane.wireMedium[i].Data());
              rc = kFALSE;
            }
          } else {
            Error("createAdditionalGeometry",
                  "Medium %s not found in list of media",plane.wireMedium[i].Data());
            rc = kFALSE;
          }
        }
        // --------------------------------------------------------------------
        // create cathode wires
        if (rc && plane.planeType == 0) {

          Float_t wireDist = plane.wireDist;
          Float_t halfDist = wireDist * 0.5;
          Float_t radius = plane.wireRadius[0];
          Double_t posX = 0., posY = 0., posZ = 0.; // position relative to center of plane
          Double_t at = (planeY[1] - planeY[0]) / (planeX[1] - planeX[0]);
	  Double_t bt = planeY[0] - at * planeX[0];
          Double_t halfLengthCenter = (planeY[1] - planeY[0]) * 0.5;  // central wire at x = 0.
          TString wireName;
          generateWireName(wireName);
          Int_t wireNum = 0;
          Int_t copyNum = 1;
          //
          // central part of cathode plane, wires are copies of central wire
          HGeomMdcWire* pWire = NULL;
          Int_t arrIndex = -1;
          do {
            copyNum = wireNum + 1;
            arrIndex = addWireObject(wireNum, wireName, copyNum, 0, radius, halfLengthCenter, posX, posY, posZ);
            if (wireNum == 0) {
              pWire = wireObjects[arrIndex];
            } else {
              wireObjects[arrIndex]->setCopyNode(pWire); // needed to create copy nodes in ROOT
            }
	    wireNum++;
            posX += wireDist;
          } while ((posX+radius) <= planeX[0]);
          Int_t maxCopyNumLeft = copyNum;
          //
          // left part of cathode plane (all with copyNum 1)
          copyNum = 1;
          do {
            generateWireName(wireName);
            // calc half-length and position
            Double_t y = at * (posX + radius) + bt;
            Double_t halfLength = (planeY[1] - y) / 2.;
            posZ = halfLengthCenter - halfLength;
            addWireObject(wireNum, wireName, copyNum, 0, radius, halfLength, posX, posY, posZ);
	    wireNum++;
            posX += wireDist;
          } while ((posX+halfDist) < planeX[1]);
          Int_t maxInd = wireObjects.size();
          //
          // create all left side wires
          Int_t rotInd = 0;  // no rotation needed for cathode wires
          for (Int_t i=0; i<maxInd && rc; i++) {
            pWire = wireObjects[i];
            copyNum = pWire->getCopyNumber();
            if (copyNum == 1) {
              rc = builder->createVolume(pWire,medId[0]);
              if (!rc) {
                Error("createAdditionalGeometry",
		      "Plane %s wire %i not created",plane.planeName.Data(),i);
                break;
              }
            }
            rc = builder->positionNode(pWire,pMother,rotInd);
            if (!rc) {
              Error("createAdditionalGeometry",
		    "Plane %s wire %i not positioned",plane.planeName.Data(),i);
            }
          }
          //
          // create all right side wires starting from the middle (without central wire)
          for (Int_t i=1; i<maxInd && rc; i++) {
            pWire = wireObjects[i];
            copyNum = pWire->getCopyNumber();
            if (copyNum > 1) {
              copyNum += maxCopyNumLeft -1;
            } else {
              copyNum += 1;
            }
            // change a left side wire to a right side wire
            Float_t* wirePos = pWire->getPosition();
            wirePos[0] *= -1.;
            pWire->setWireNumber(wireNum);
            pWire->setCopyNumber(copyNum);
            rc = builder->positionNode(pWire,pMother,rotInd);
	    wireNum++;
          }
          //cout<<"***** Plane: "<<plane.planeName<<"   Wires created: "<<wireNum<<endl;
          totNumWires += wireNum;
          clearWireObjects();
        } // cathode plane
        //
        // --------------------------------------------------------------------
        // create field (even wire number) and sens wires (odd wire number)
        if (rc && plane.planeType == 1) {
          //
          // calculate and create GEANT rotation matrix for wires in the TRD1 coordinate system
          Double_t wireOrient = -plane.wireOrient;  // looking in reverse z-direction
          Double_t sinWireOr = TMath::Sin(wireOrient*TMath::DegToRad());
          Double_t cosWireOr = TMath::Cos(wireOrient*TMath::DegToRad());
          Double_t arr[] = {sinWireOr, 0., cosWireOr, 0., 1., 0., -cosWireOr, 0., sinWireOr};
          HGeomRotation rotMatrix;
          rotMatrix.setMatrix(arr);
          Int_t rotInd = builder->createRotation(&rotMatrix);
          //
          // calculate parameters relative to plane center
          Double_t planeCenter[2];
          planeCenter[0] = (planeX[0] + planeX[1] + planeX[2] + planeX[3]) * .25;
          planeCenter[1] = (planeY[0] + planeY[1] + planeY[2] + planeY[3]) * .25;
          for (Int_t i=0; i<4; i++) {
            planeX[i] -= planeCenter[0];
            planeY[i] -= planeCenter[1];
          }
          Double_t wireOffset = (plane.centralWireNr - 1) * plane.wireDist;
          //
          // reduce plane size for calculation to avoid extrusions of wire edges
          Double_t at[4], bt[4]; // border lines of plane
          Double_t radius = plane.wireRadius[0];
          at[0] = (planeY[1] - planeY[0]) / (planeX[1] - planeX[0]);
          Double_t dy = radius * cosWireOr;
          Double_t dx1 = dy / at[0];
          Double_t dx2 = 0;
          if (wireOrient > 0.) {
            dx2 = radius * (sinWireOr + cosWireOr / at[0]);  // larger extrusion on left side
          } else {
            dx2 = -radius * (sinWireOr - cosWireOr / at[0]); // larger extrusion on right side
          }
          planeX[0] = planeX[0] + dx1 - dx2;
          planeY[0] = planeY[0] + dy;
          planeX[1] = planeX[1] - dx1 - dx2;
          planeY[1] = planeY[1] - dy;
          planeX[2] = -planeX[1];
          planeY[2] = planeY[1];
          planeX[3] = -planeX[0];
          planeY[3] = planeY[0];
          //
          // calculate lines
          for (Int_t i1=0; i1<4; i1++) {
            Int_t i2 = i1 + 1;
            if (i2==4) i2=0;
            at[i1] = (planeY[i2] - planeY[i1]) / (planeX[i2] - planeX[i1]);
            bt[i1] = planeY[i1] - at[i1] * planeX[i1];
            //cout<<"line "<<i1<<"   at: "<<at[i1]<<"  bt: "<<bt[i1]<<endl;
          }
          //
          // loop on wires
	  Double_t a = TMath::Tan(wireOrient*TMath::DegToRad());
          Int_t numWiresPlane=0;
          for(Int_t wireNum=0; wireNum<plane.numWires; wireNum++) {
            Int_t wireType =  wireNum%2;
            Float_t radius = plane.wireRadius[wireType];
            //
            // calculation of wire length
            Double_t yWire = wireNum * plane.wireDist - wireOffset;
            Double_t b     = yWire/cosWireOr - planeCenter[1];
            Double_t x1  = (bt[0]-b)/(a-at[0]);       // Xb    line 0
            Double_t x2  = (bt[2]-b)/(a-at[2]);       // Xe    line 2
            Double_t y1  = a*x1+b;                    // Yb
            Double_t y2  = a*x2+b;                    // Ye
            Int_t nLine1 = (x1>=planeX[0] && x1<=planeX[1] && y1>=planeY[0] && y1<=planeY[1]) ? 0:-1;
            Int_t nLine2 = (x2<=planeX[3] && x2>=planeX[2] && y2>=planeY[3] && y2<=planeY[2]) ? 2:-1;
            if(nLine1<0 && nLine2 <0) {
            //  Warning("fillCont","%s: wire %i is out of layer.",vname.Data() , wireNum);
              continue;
            }
            if(nLine1<0) {
              x1 = (bt[1]-b)/(a-at[1]);                    // Xb    line 1
              if(x1<planeX[2]) x1 = (bt[3]-b)/(a-at[3]);   // Xb    line 3
              y1 = a*x1+b;                                 // Yb
            } else if(nLine2<0) {
              x2 = (bt[1]-b)/(a-at[1]);                    // Xe    line 1
              if(x2>planeX[1]) x2 = (bt[3]-b)/(a-at[3]);   // Xe    line 3
              y2 = a*x2+b;                                 // Ye
            }
            Double_t wireLength = TMath::Sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
            Double_t posX = (x2 + x1) * .5;  // position in TRD1 coordinate system
            Double_t posY = 0.;
            Double_t posZ = (y2 + y1) * .5;
            //cout<<wireNum<<"  "<<yWire<<"  "<<wireLength<<"  "<<x1<<"  "<<y1<<"  "<<x2<<"  "<<y2<<"  "<<posX<<"  "<<posZ<<endl;
            //
            // create and position wire
            TString wireName;
            generateWireName(wireName);
            HGeomMdcWire wire(wireNum, wireName, 1, wireType, radius, wireLength * 0.5, posX, posY, posZ);
            rc = builder->createVolume(&wire, medId[wireType]);
            if (!rc) {
              Error("createAdditionalGeometry",
                    "Plane %s wire %i not created",plane.planeName.Data(),wireNum);
              break;
            }
            rc = builder->positionNode(&wire,pMother,rotInd);
            if (!rc) {
              Error("createAdditionalGeometry",
                    "Plane %s wire %i not positioned",plane.planeName.Data(),wireNum);
            }
	    numWiresPlane++;
          } //loop on wires
          totNumWires += numWiresPlane;
          //cout<<"***** Plane: "<<plane.planeName<<"   Wires created: "<<numWiresPlane<<endl;
        } // senswire plane
        if (rc) builder->fillMdcCommonBlock(pMother);
      } // loop on planes
      cout<<"  Wires created: "<<totNumWires<<endl;
      delete mdcWirePlanes;
      mdcWirePlanes = NULL;
    } else {
      Warning("createAdditionalGeometry", "HGeomMdcWires not found in parameter file %s", paramFile.Data());
    }
    file->Close();
  }
  return rc;
}

void HGeomMdc::generateWireName(TString& vName) {
  // generates the wire name
  if (wn3<35) wn3++;
  else {
    wn3 = 0;
    if (wn2<35) wn2++;
      else {
	wn2 = 0;
	if (wn1<35) wn1++;
        else {
	  wn1 = 0;
	  wn0++;
        }
     }
  }
  vName.Form("%c%c%c%c",wnbuf[wn0],wnbuf[wn1],wnbuf[wn2],wnbuf[wn3]);
}

void HGeomMdc::clearWireObjects(){
  // deletes objects in working array and sets pointer to 0.
  // cleares the vector.
  for(UInt_t i = 0; i < wireObjects.size(); i ++) {
    if (wireObjects[i]) {
      delete wireObjects[i];
      wireObjects[i] = 0;
    }
  }
  wireObjects.clear();
}

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