277{
278
279
280
281 int readoutSide{1};
285 double thickness{0.320};
286 double stereoAngle{0.020};
287 double centreR{500.};
290 std::vector<double> phiPitch;
291 std::vector<double> startR;
292 std::vector<double> endR;
293 bool usePC{false};
294
295 std::string carrierString;
296 getParameter(typeName, parameters,
"carrierType", carrierString);
297 if (carrierString == "electrons") {
299 } else if (carrierString == "holes") {
301 } else {
302 throw GaudiException("Parameter carrierType should be electrons or holes for " + typeName,
303 "StripGmxInterface::makeStereoAnnulus", StatusCode::FAILURE);
304 }
305
306 std::string readoutSideString;
307 getParameter(typeName, parameters,
"readoutSide", readoutSideString);
308 if (readoutSideString == "+") {
309 readoutSide = 1;
310 } else if (readoutSideString == "-") {
311 readoutSide = -1;
312 } else {
313 throw GaudiException("Parameter readoutSide should be + or - for " + typeName,
314 "StripGmxInterface::makeStereoAnnulus", StatusCode::FAILURE);
315 }
316
317 std::string fieldDirectionString;
318 getParameter(typeName, parameters,
"fieldDirection", fieldDirectionString);
319 if (fieldDirectionString == "x") {
321 } else if (fieldDirectionString == "y") {
323 } else if (fieldDirectionString == "z") {
325 } else {
326 throw GaudiException("Parameter fieldDirection should be x, y, or z for " + typeName,
327 "StripGmxInterface::makeStereoAnnulus", StatusCode::FAILURE);
328 }
329
330 std::string stripDirectionString;
331 getParameter(typeName, parameters,
"stripDirection", stripDirectionString);
332 if (stripDirectionString == "x") {
334 } else if (stripDirectionString == "y") {
336 } else if (stripDirectionString == "z") {
338 } else {
339 throw GaudiException("Parameter stripDirection should be x, y, or z for " + typeName,
340 "StripGmxInterface::makeStereoAnnulus", StatusCode::FAILURE);
341 }
342
343 getParameter(typeName, parameters,
"thickness", thickness);
344 getParameter(typeName, parameters,
"stereoAngle", stereoAngle);
347
348 getParameters(typeName, parameters, "nStrips", nStrips);
349 if (
nStrips.size() !=
static_cast<size_t>(nRows)) {
350 throw GaudiException(
"Wrong number of nStrips " + std::to_string(
nStrips.size()) +
" " + typeName,
351 "StripGmxInterface::makeStereoAnnulus", StatusCode::FAILURE);
352 }
353
354 getParameters(typeName, parameters, "phiPitch", phiPitch);
355 if (phiPitch.size() != static_cast<size_t>(nRows)) {
356 throw GaudiException("Wrong number of pitches " + std::to_string(phiPitch.size()) + " " + typeName,
357 "StripGmxInterface::makeStereoAnnulus", StatusCode::FAILURE);
358 }
359
360 getParameters(typeName, parameters, "startR", startR);
361 if (startR.size() != static_cast<size_t>(nRows)) {
362 throw GaudiException("Wrong number of startRs " + std::to_string(startR.size()) + " " + typeName,
363 "StripGmxInterface::makeStereoAnnulus", StatusCode::FAILURE);
364 }
365
366 getParameters(typeName, parameters, "endR", endR);
367 if (endR.size() != static_cast<size_t>(nRows)) {
368 throw GaudiException("Wrong number of endRs " + std::to_string(endR.size()) + " " + typeName,
369 "StripGmxInterface::makeStereoAnnulus", StatusCode::FAILURE);
370 }
371
372 if (checkParameter(typeName, parameters,
"usePC", usePC))
ATH_MSG_INFO(
"Using polar co-ordinates for strip stereo annulus modules");
373
374
375
376
378 int detectorTypeEnum = 0;
379 if (checkParameter(typeName, parameters, "detectorType", detectorTypeEnum)) {
381 else ATH_MSG_WARNING(
"Non-strip endcap type set for strip annulus DetectorElement - is this intended?");
382 }
383
384
385
386
387 std::vector<int> singleRowStrips;
388 std::vector<double> singleRowPitch;
389 std::vector<double> singleRowMinR;
390 std::vector<double> singleRowMaxR;
391
392 int splitLevel{};
393 if (checkParameter(typeName, parameters, "splitLevel", splitLevel)) {
394
395 auto motherDesign = std::make_unique<StripStereoAnnulusDesign>(stripDirection,
396 fieldDirection,
397 thickness,
398 readoutSide,
399 carrier,
400 nRows,
401 nStrips,
402 phiPitch,
403 startR,
404 endR,
405 stereoAngle,
406 centreR,
407 usePC,
408 detectorType);
409
410 for (
int i = 0;
i < splitLevel;
i++) {
411 singleRowStrips.clear();
412 singleRowPitch.clear();
413 singleRowMinR.clear();
414 singleRowMaxR.clear();
415
416 singleRowStrips.push_back(nStrips[i]);
417 singleRowPitch.push_back(phiPitch[i]);
418 singleRowMinR.push_back(startR[i]);
419 singleRowMaxR.push_back(endR[i]);
420
421
422
423 double thisCentreR = (singleRowMinR[0] + singleRowMaxR[0] ) *0.5;
424
425 auto design = std::make_unique<StripStereoAnnulusDesign>(stripDirection,
426 fieldDirection,
427 thickness,
428 readoutSide,
429 carrier,
430 1,
431 singleRowStrips,
432 singleRowPitch,
433 singleRowMinR,
434 singleRowMaxR,
435 stereoAngle,
436 thisCentreR,
437 centreR,
438 usePC,
439 detectorType);
440
441
442 std::string splitName =
typeName +
"_" + std::to_string(i);
443 design->setMother(motherDesign.get());
444 motherDesign->addChildDesign(i,design.get());
445
448
449 }
450
451
454
455 } else {
456 auto design = std::make_unique<StripStereoAnnulusDesign>(stripDirection,
457 fieldDirection,
458 thickness,
459 readoutSide,
460 carrier,
461 nRows,
462 nStrips,
463 phiPitch,
464 startR,
465 endR,
466 stereoAngle,
467 centreR,
468 usePC,
469 detectorType);
470
473 }
474}