CMS 3D CMS Logo

DDHCalEndcapModuleAlgo.cc
Go to the documentation of this file.
1 // File: DDHCalEndcapModuleAlgo.cc
3 // adapted from CCal(G4)HcalEndcap.cc
4 // Description: Geometry factory class for Hcal Endcap
6 
7 #include <cmath>
8 #include <algorithm>
9 
18 #include "CLHEP/Units/GlobalPhysicalConstants.h"
19 #include "CLHEP/Units/GlobalSystemOfUnits.h"
20 
22  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo info: Creating an instance";
23 }
24 
26 
28  const DDVectorArguments & vArgs,
29  const DDMapArguments & ,
30  const DDStringArguments & sArgs,
31  const DDStringVectorArguments &vsArgs){
32 
33  genMaterial = sArgs["MaterialName"];
34  absorberMat = sArgs["AbsorberMat"];
35  plasticMat = sArgs["PlasticMat"];
36  scintMat = sArgs["ScintMat"];
37  rotstr = sArgs["Rotation"];
38  sectors = int (nArgs["Sectors"]);
39  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo: General material "
40  << genMaterial << "\tAbsorber " << absorberMat
41  << "\tPlastic " << plasticMat << "\tScintillator "
42  << scintMat << "\tRotation " << rotstr
43  << "\tSectors " << sectors;
44 
45  zMinBlock = nArgs["ZMinBlock"];
46  zMaxBlock = nArgs["ZMaxBlock"];
47  z1Beam = nArgs["Z1Beam"];
48  ziDip = nArgs["ZiDip"];
49  dzStep = nArgs["DzStep"];
50  moduleThick = nArgs["ModuleThick"];
51  layerThick = nArgs["LayerThick"];
52  scintThick = nArgs["ScintThick"];
53  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo: Zmin " << zMinBlock
54  << "\tZmax " << zMaxBlock << "\tZ1Beam " << z1Beam
55  << "\tZiDip " << ziDip << "\tDzStep " << dzStep
56  << "\tModuleThick " << moduleThick <<"\tLayerThick "
57  << layerThick << "\tScintThick " << scintThick;
58 
59  rMaxFront = nArgs["RMaxFront"];
60  rMaxBack = nArgs["RMaxBack"];
61  trimLeft = nArgs["TrimLeft"];
62  trimRight = nArgs["TrimRight"];
63  tolAbs = nArgs["TolAbs"];
64  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo: RMaxFront " << rMaxFront
65  <<"\tRmaxBack " << rMaxBack << "\tTrims " <<trimLeft
66  << ":" << trimRight << "\tTolAbs " << tolAbs;
67 
68  slopeBot = nArgs["SlopeBottom"];
69  slopeTop = nArgs["SlopeTop"];
70  slopeTopF = nArgs["SlopeTopFront"];
71  modType = (int)(nArgs["ModType"]);
72  modNumber = (int)(nArgs["ModNumber"]);
73  layerType = (int)(nArgs["LayerType"]);
74  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo: slopeBot " << slopeBot
75  << "\tslopeTop " << slopeTop << "\tslopeTopF "
76  << slopeTopF << "\tmodType " << modType
77  << "\tmodNumber " << modNumber << "\tlayerType "
78  << layerType;
79 
80  layerNumber = dbl_to_int(vArgs["LayerNumber"]);
81  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo: " << layerNumber.size()
82  << " layer Numbers";
83  for (unsigned int i=0; i<layerNumber.size(); ++i)
84  edm::LogInfo("HCalGeom") << "LayerNumber[" << i << "] = " <<layerNumber[i];
85 
86  phiName = vsArgs["PhiName"];
87  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo: " << phiName.size()
88  << " phi sectors";
89  for (unsigned int i=0; i<phiName.size(); ++i)
90  edm::LogInfo("HCalGeom") << "PhiName[" << i << "] = " << phiName[i];
91 
92  layerName = vsArgs["LayerName"];
93  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo: " << layerName.size()
94  << " layers";
95  for (unsigned int i=0; i<layerName.size(); ++i)
96  edm::LogInfo("HCalGeom") << "LayerName[" << i << "] = " << layerName[i];
97 
98  idName = sArgs["MotherName"];
100  idOffset = int (nArgs["IdOffset"]);
101  DDName parentName = parent().name();
102  modName = sArgs["ModName"];
103  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo debug: Parent "
104  << parentName << " " << modName << " idName "
105  << idName << " NameSpace " << idNameSpace
106  << " Offset " << idOffset;
107 
108 }
109 
111 // DDHCalEndcapModuleAlgo methods...
113 
115 
116  edm::LogInfo("HCalGeom") << "==>> Constructing DDHCalEndcapModuleAlgo...";
117  if (modType == 0)
119  else
120  constructInsideModule (parent(), cpv);
121  edm::LogInfo("HCalGeom") << "<<== End of DDHCalEndcapModuleAlgo construction ...";
122 }
123 
124 
126 
127  edm::LogInfo("HCalGeom") <<"DDHCalEndcapModuleAlgo test: \t\tInside module0";
128 
130  //Pointers to the Rotation Matrices and to the Materials
132  DDName matName(DDSplit(absorberMat).first, DDSplit(absorberMat).second);
133  DDMaterial matabsorbr(matName);
134  DDName plasName(DDSplit(plasticMat).first, DDSplit(plasticMat).second);
135  DDMaterial matplastic(plasName);
136 
137  int layer = layerNumber[0];
138  int layer0 = layerNumber[1];
140  DDSolid solid;
141  DDLogicalPart glog, plog;
142  for (unsigned int iphi=0; iphi<phiName.size(); iphi++) {
144  name = idName+modName+layerName[0]+phiName[iphi];
145  solid = DDSolidFactory::trap(DDName(name, idNameSpace),
146  0.5*layerThick, 0, 0, parm.yh1, parm.bl1,
147  parm.tl1, parm.alp, parm.yh2, parm.bl1,
148  parm.tl2, parm.alp);
149  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo test: " << solid.name()
150  << " Trap made of " << plasName
151  << " of dimensions " << 0.5*layerThick
152  << ", 0, 0, " << parm.yh1 << ", " << parm.bl1
153  << ", " << parm.tl1 << ", " << parm.alp/CLHEP::deg
154  << ", " << parm.yh2 << ", " << parm.bl2 << ", "
155  << parm.tl2 << ", " << parm.alp/CLHEP::deg;
156  glog = DDLogicalPart(solid.ddname(), matplastic, solid);
157 
158  DDTranslation r1(parm.xpos, parm.ypos, parm.zpos);
159  cpv.position(glog, module, idOffset+layer+1, r1, rot);
160  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo test: " << glog.name()
161  << " number " << idOffset+layer+1 << " positioned in "
162  << module.name() << " at " << r1 << " with " << rot;
163  //Now construct the layer of scintillator inside this
164  int copyNo = layer0*10 + layerType;
165  name = modName+layerName[0]+phiName[iphi];
166  constructScintLayer (glog, scintThick, parm, name, copyNo, cpv);
167  }
168 
169  //Now the absorber layer
170  double zi = zMinBlock + layerThick;
171  double zo = zi + 0.5*dzStep;
172  double rinF, routF, rinB, routB;
173  if (modNumber == 0) {
174  rinF = zi * slopeTopF;
175  routF = (zi - z1Beam) * slopeTop;
176  rinB = zo * slopeTopF;
177  routB = (zo - z1Beam) * slopeTop;
178  } else if (modNumber > 0) {
179  rinF = zi * slopeBot;
180  routF = zi * slopeTopF;
181  rinB = zo * slopeBot;
182  routB = zo * slopeTopF;
183  } else {
184  rinF = zi * slopeBot;
185  routF = (zi - z1Beam) * slopeTop;
186  rinB = zo * slopeBot;
187  routB = (zo - z1Beam) * slopeTop;
188  }
189  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo test: Front "
190  << zi << ", " << rinF << ", " << routF << " Back "
191  << zo << ", " << rinB << ", " << routB;
193  rinB, routB, zi,
194  zo);
195  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo test: Trim " << tolAbs
196  << " Param " << parm.yh1 << ", " << parm.bl1 << ", "
197  << parm.tl1 << ", " << parm.yh2 << ", " << parm.bl2
198  << ", " << parm.tl2;
199  parm.bl1 -= tolAbs;
200  parm.tl1 -= tolAbs;
201  parm.bl2 -= tolAbs;
202  parm.tl2 -= tolAbs;
203 
204  name = idName+modName+layerName[0]+"Absorber";
205  solid = DDSolidFactory::trap(DDName(name, idNameSpace),
206  0.5*moduleThick, parm.theta, parm.phi, parm.yh1,
207  parm.bl1, parm.tl1, parm.alp, parm.yh2,
208  parm.bl2, parm.tl2, parm.alp);
209  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo test: " << solid.name()
210  << " Trap made of " << matName << " of dimensions "
211  << 0.5*moduleThick << ", " << parm.theta/CLHEP::deg
212  << ", " << parm.phi/CLHEP::deg << ", " << parm.yh1
213  << ", " << parm.bl1 << ", " << parm.tl1 << ", "
214  << parm.alp/CLHEP::deg << ", " << parm.yh2 << ", "
215  << parm.bl2 << ", " << parm.tl2 << ", "
216  << parm.alp/CLHEP::deg;
217  glog = DDLogicalPart(solid.ddname(), matabsorbr, solid);
218 
219  DDTranslation r2(parm.xpos, parm.ypos, parm.zpos);
220  cpv.position(glog, module, 1, r2, rot);
221  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo test: " << glog.name()
222  << " number 1 positioned in " << module.name()
223  << " at " << r2 << " with " << rot;
224 }
225 
226 
228 
229  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo test: \t\tInside module";
230 
232  //Pointers to the Rotation Matrices and to the Materials
234  DDName matName(DDSplit(genMaterial).first, DDSplit(genMaterial).second);
235  DDMaterial matter(matName);
236  DDName plasName(DDSplit(plasticMat).first, DDSplit(plasticMat).second);
237  DDMaterial matplastic(plasName);
238 
239  double alpha = CLHEP::pi/sectors;
240  double zi = zMinBlock;
241 
242  for (unsigned int i=0; i<layerName.size(); i++) {
244  DDSolid solid;
245  DDLogicalPart glog, plog;
246  int layer = layerNumber[i];
247  double zo = zi + 0.5*dzStep;
248 
249  for (unsigned int iphi=0; iphi<phiName.size(); iphi++) {
250  double ziAir = zo - moduleThick;
251  double rinF, rinB;
252  if (modNumber == 0) {
253  rinF = ziAir * slopeTopF;
254  rinB = zo * slopeTopF;
255  } else {
256  rinF = ziAir * slopeBot;
257  rinB = zo * slopeBot;
258  }
259  double routF = getRout(ziAir);
260  double routB = getRout(zo);
261  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo test: Layer " << i
262  << " Phi " << iphi << " Front " << ziAir <<", "
263  << rinF << ", " << routF << " Back " << zo
264  << ", " << rinB << ", " << routB;
266  routF, rinB,
267  routB, ziAir,
268  zo);
269 
270  name = idName+modName+layerName[i]+phiName[iphi]+"Air";
271  solid = DDSolidFactory::trap(DDName(name, idNameSpace),
272  0.5*moduleThick, parm.theta, parm.phi,
273  parm.yh1, parm.bl1, parm.tl1, parm.alp,
274  parm.yh2, parm.bl2, parm.tl2, parm.alp);
275  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo test: "
276  << solid.name() << " Trap made of " << matName
277  << " of dimensions " << 0.5*moduleThick << ", "
278  << parm.theta/CLHEP::deg << ", "
279  << parm.phi/CLHEP::deg << ", " << parm.yh1
280  << ", " << parm.bl1 << ", " << parm.tl1 << ", "
281  << parm.alp/CLHEP::deg << ", " << parm.yh2
282  << ", " << parm.bl2 << ", " << parm.tl2 << ", "
283  << parm.alp/CLHEP::deg;
284  glog = DDLogicalPart(solid.ddname(), matter, solid);
285 
286  DDTranslation r1(parm.xpos, parm.ypos, parm.zpos);
287  cpv.position(glog, module, layer+1, r1, rot);
288  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo test: " <<glog.name()
289  << " number " << layer+1 << " positioned in "
290  << module.name() << " at " << r1 << " with "
291  << rot;
292 
293  //Now the plastic with scintillators
294  parm.yh1 = 0.5 * (routF - rinB) - getTrim(iphi);
295  parm.bl1 = 0.5 * rinB * tan(alpha) - getTrim(iphi);
296  parm.tl1 = 0.5 * routF * tan(alpha) - getTrim(iphi);
297  name = idName+modName+layerName[i]+phiName[iphi];
298  solid = DDSolidFactory::trap(DDName(name, idNameSpace),
299  0.5*layerThick, 0, 0, parm.yh1,
300  parm.bl1, parm.tl1, parm.alp, parm.yh1,
301  parm.bl1, parm.tl1, parm.alp);
302  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo test: "<<solid.name()
303  << " Trap made of " << plasName
304  << " of dimensions " << 0.5*layerThick
305  << ", 0, 0, " << parm.yh1 << ", " << parm.bl1
306  << ", " << parm.tl1 <<", "<< parm.alp/CLHEP::deg
307  << ", " << parm.yh1 << ", " << parm.bl1 << ", "
308  << parm.tl1 << ", " << parm.alp/CLHEP::deg;
309  plog = DDLogicalPart(solid.ddname(), matplastic, solid);
310 
311  double ypos = 0.5*(routF+rinB) - parm.xpos;
312  DDTranslation r2(0., ypos, 0.);
313  cpv.position(plog, glog, idOffset+layer+1, r2, DDRotation());
314  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo test: " <<plog.name()
315  << " number " << idOffset+layer+1
316  << " positioned in " << glog.name() << " at "
317  << r2 << " with no rotation";
318 
319  //Constructin the scintillators inside
320  int copyNo = layer*10 + layerType;
321  name = modName+layerName[i]+phiName[iphi];
322  constructScintLayer (plog, scintThick, parm, name, copyNo, cpv);
323  zo += 0.5*dzStep;
324  } // End of loop over phi indices
325  zi = zo - 0.5*dzStep;
326  } // End of loop on layers
327 }
328 
329 
332 
334  //Given module and layer number compute parameters of trapezoid
335  //and positioning parameters
336  double alpha = CLHEP::pi/sectors;
337  edm::LogInfo("HCalGeom") << "Input " << iphi << " Alpha " <<alpha/CLHEP::deg;
338 
339  double zi, zo;
340  if (iphi == 0) {
341  zi = zMinBlock;
342  zo = zi + layerThick;
343  } else {
344  zo = zMaxBlock;
345  zi = zo - layerThick;
346  }
347  double rin, rout;
348  if (modNumber == 0) {
349  rin = zo * slopeTopF;
350  rout = (zi - z1Beam) * slopeTop;
351  } else if (modNumber > 0) {
352  rin = zo * slopeBot;
353  rout = zi * slopeTopF;
354  } else {
355  rin = zo * slopeBot;
356  rout = (zi - z1Beam) * slopeTop;
357  }
358  edm::LogInfo("HCalGeom") << "ModNumber " << modNumber << " " << zi << " " << zo << " " << slopeTopF << " " << slopeTop << " " << slopeBot << " " << rin << " " << rout << " " << getTrim(iphi);
359  double yh = 0.5 * (rout - rin);
360  double bl = 0.5 * rin * tan (alpha);
361  double tl = 0.5 * rout * tan(alpha);
362  parm.xpos = 0.5 * (rin + rout);
363  parm.ypos = 0.5 * (bl + tl);
364  parm.zpos = 0.5 * (zi + zo);
365  parm.yh1 = parm.yh2 = yh - getTrim(iphi);
366  parm.bl1 = parm.bl2 = bl - getTrim(iphi);
367  parm.tl1 = parm.tl2 = tl - getTrim(iphi);
368  parm.alp = atan(0.5 * tan(alpha));
369  if (iphi == 0) {
370  parm.ypos = -parm.ypos;
371  } else {
372  parm.alp = -parm.alp;
373  }
374  edm::LogInfo("HCalGeom") << "Output Dimensions " << parm.yh1 << " "
375  << parm.bl1 << " " << parm.tl1 << " "
376  << parm.alp/CLHEP::deg << " Position " << parm.xpos
377  << " " << parm.ypos << " " << parm.zpos;
378  return parm;
379 }
380 
381 
383 DDHCalEndcapModuleAlgo::parameterLayer(unsigned int iphi, double rinF,
384  double routF, double rinB, double routB,
385  double zi, double zo) {
386 
388  //Given rin, rout compute parameters of the trapezoid and
389  //position of the trapezoid for a standrd layer
390  double alpha = CLHEP::pi/sectors;
391  edm::LogInfo("HCalGeom") << "Input " << iphi << " Front " << rinF << " "
392  << routF << " " << zi << " Back " << rinB << " "
393  << routB << " " << zo<<" Alpha " <<alpha/CLHEP::deg;
394 
395  parm.yh1 = 0.5 * (routF - rinB);
396  parm.bl1 = 0.5 * rinB * tan(alpha);
397  parm.tl1 = 0.5 * routF * tan(alpha);
398  parm.yh2 = 0.5 * (routF - rinB);
399  parm.bl2 = 0.5 * rinB * tan(alpha);
400  parm.tl2 = 0.5 * routF * tan(alpha);
401  double dx = 0.25* (parm.bl2+parm.tl2-parm.bl1-parm.tl1);
402  double dy = 0.5 * (rinB+routF-rinB-routF);
403  parm.xpos = 0.25*(rinB+routF+rinB+routF);
404  parm.ypos = 0.25*(parm.bl2+parm.tl2+parm.bl1+parm.tl1);
405  parm.zpos = 0.5*(zi+zo);
406  parm.alp = atan(0.5 * tan(alpha));
407  if (iphi == 0) {
408  parm.ypos = -parm.ypos;
409  } else {
410  parm.alp = -parm.alp;
411  dx = -dx;
412  }
413  double r = sqrt (dx*dx + dy*dy);
414  edm::LogInfo("HCalGeom") << "dx|dy|r " << dx << ":" << dy << ":" << r;
415  if (r > 1.0e-8) {
416  parm.theta = atan (r/(zo-zi));
417  parm.phi = atan2 (dy, dx);
418  } else {
419  parm.theta = parm.phi = 0;
420  }
421  edm::LogInfo("HCalGeom") << "Output Dimensions " << parm.yh1 << " "
422  << parm.bl1 << " " << parm.tl1 << " " << parm.yh2
423  << " " << parm.bl2 << " " << parm.tl2 << " "
424  << parm.alp/CLHEP::deg <<" " <<parm.theta/CLHEP::deg
425  << " " << parm.phi/CLHEP::deg << " Position "
426  << parm.xpos << " " << parm.ypos << " " <<parm.zpos;
427  return parm;
428 }
429 
430 
433  const std::string& nm, int id, DDCompactView& cpv) {
434 
436  DDMaterial matter(matname);
437  std::string name = idName+"Scintillator"+nm;
438 
439  DDSolid solid = DDSolidFactory::trap(DDName(name, idNameSpace), 0.5*dz, 0, 0,
440  parm.yh1, parm.bl1, parm.tl1, parm.alp,
441  parm.yh1, parm.bl1, parm.tl1, parm.alp);
442  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo test: " << solid.name()
443  << " Trap made of " << scintMat << " of dimensions "
444  << 0.5*dz << ", 0, 0, " << parm.yh1 << ", "
445  << parm.bl1 << ", " << parm.tl1 << ", "
446  << parm.alp/CLHEP::deg << ", " << parm.yh1 << ", "
447  << parm.bl1 << ", " << parm.tl1 << ", "
448  << parm.alp/CLHEP::deg;
449 
450  DDLogicalPart glog(solid.ddname(), matter, solid);
451 
452  cpv.position(glog, detector, id, DDTranslation(0,0,0), DDRotation());
453  edm::LogInfo("HCalGeom") << "DDHCalEndcapModuleAlgo test: " << glog.name()
454  << " number " << id << " positioned in "
455  << detector.name() <<" at (0,0,0) with no rotation";
456 
457 }
458 
459 double DDHCalEndcapModuleAlgo::getTrim(unsigned int j) const {
460 
461  if (j == 0) return trimLeft;
462  else return trimRight;
463 }
464 
465 double DDHCalEndcapModuleAlgo::getRout(double z) const {
466  double r = (modNumber >= 0) ? ((z - z1Beam) * slopeTop) : z * slopeTopF;
467  if (z > ziDip) {
468  if (r > rMaxBack) r = rMaxBack;
469  } else {
470  if (r > rMaxFront) r = rMaxFront;
471  }
472  return r;
473 }
float alpha
Definition: AMPTWrapper.h:95
const N & name() const
Definition: DDBase.h:74
HcalEndcapPar parameterLayer(unsigned int iphi, double rinF, double routF, double rinB, double routB, double zi, double zo)
void constructInsideModule0(const DDLogicalPart &module, DDCompactView &cpv)
DDMaterial is used to define and access material information.
Definition: DDMaterial.h:43
std::vector< int > layerNumber
void initialize(const DDNumericArguments &nArgs, const DDVectorArguments &vArgs, const DDMapArguments &mArgs, const DDStringArguments &sArgs, const DDStringVectorArguments &vsArgs) override
DDName is used to identify DDD entities uniquely.
Definition: DDName.h:15
static std::string & ns()
Compact representation of the geometrical detector hierarchy.
Definition: DDCompactView.h:80
A DDSolid represents the shape of a part.
Definition: DDSolid.h:39
HcalEndcapPar parameterLayer0(unsigned int iphi)
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
const Double_t pi
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:68
U second(std::pair< T, U > const &p)
std::vector< int > dbl_to_int(const std::vector< double > &vecdbl)
Converts a std::vector of doubles to a std::vector of int.
Definition: DDutils.h:7
std::vector< std::string > phiName
void constructInsideModule(const DDLogicalPart &module, DDCompactView &cpv)
T sqrt(T t)
Definition: SSEVec.h:18
void constructScintLayer(const DDLogicalPart &detector, double dz, DDHCalEndcapModuleAlgo::HcalEndcapPar parm, const std::string &nm, int id, DDCompactView &cpv)
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:93
static DDSolid trap(const DDName &name, double pDz, double pTheta, double pPhi, double pDy1, double pDx1, double pDx2, double pAlp1, double pDy2, double pDx3, double pDx4, double pAlp2)
Definition: DDSolid.cc:792
std::vector< std::string > layerName
double getTrim(unsigned int j) const
void position(const DDLogicalPart &self, const DDLogicalPart &parent, const std::string &copyno, const DDTranslation &trans, const DDRotation &rot, const DDDivision *div=0)
void execute(DDCompactView &cpv) override
double getRout(double z) const
std::pair< std::string, std::string > DDSplit(const std::string &n)
split into (name,namespace), separator = &#39;:&#39;
Definition: DDSplit.cc:3
Definition: vlib.h:208
const N & ddname() const
Definition: DDBase.h:76