diff --git a/FCCee/ALLEGRO/compact/ALLEGRO_o1_v02/ECalEndcaps_Turbine.xml b/FCCee/ALLEGRO/compact/ALLEGRO_o1_v02/ECalEndcaps_Turbine.xml
index 6b523db09..736412b9f 100644
--- a/FCCee/ALLEGRO/compact/ALLEGRO_o1_v02/ECalEndcaps_Turbine.xml
+++ b/FCCee/ALLEGRO/compact/ALLEGRO_o1_v02/ECalEndcaps_Turbine.xml
@@ -34,14 +34,14 @@
-
+ offset
-
+
@@ -71,7 +71,7 @@
system:4,cryo:1,type:3,subtype:3,side:3,wheel:3,layer:8,module:11,theta:10
-->
-
+
system:4,cryo:1,type:3,subtype:3,side:-2,wheel:3,layer:8,module:17,rho:8,z:8
diff --git a/detector/calorimeter/ECalEndcap_Turbine_o1_v01_geo.cpp b/detector/calorimeter/ECalEndcap_Turbine_o1_v01_geo.cpp
index 79b885f90..4c551396d 100644
--- a/detector/calorimeter/ECalEndcap_Turbine_o1_v01_geo.cpp
+++ b/detector/calorimeter/ECalEndcap_Turbine_o1_v01_geo.cpp
@@ -14,7 +14,7 @@ namespace det {
unsigned ECalEndCapElementCounter = 0;
- unsigned ECalEndcapNumLayers;
+ unsigned ECalEndcapNumCalibLayers;
double tForArcLength(double s, double bladeangle, double delZ, double r) {
@@ -156,7 +156,6 @@ namespace det {
dd4hep::Solid absBlade;
float riLayer = ri;
- float delr = (ro-ri)/ECalEndcapNumLayers;
std::vector claddingLayerVols;
std::vector glueLayerVols;
@@ -165,10 +164,41 @@ namespace det {
std::vector electrodeBladeLayerVols;
float AbsThicki = AbsThickMin;
- for (unsigned iLayer = 0; iLayer < ECalEndcapNumLayers; iLayer++) {
+ // make volumes for the noble liquid, electrode, and absorber blades
+ float AbsThicko;
+ if (scaleBladeThickness) {
+ AbsThicko = AbsThicki + bladeThicknessScaleFactor*((ro/ri)-1.)*AbsThicki;
+ } else {
+ AbsThicko = AbsThicki;
+ }
+ dd4hep::Solid passiveShape = buildOneBlade(AbsThicki+GlueThick+CladdingThick, AbsThicko+GlueThick+CladdingThick, xRange, ro, ri, BladeAngle, delZ );
+ dd4hep::Volume passiveVol("passive", passiveShape, aLcdd.material("Air"));
+
+ unsigned numNonActiveLayers = 1;
+ // check that either all non-active volumes are set to sensitive (for
+ // sampling fraction calculations) or none are (for normal running)
+ bool allNonActiveSensitive = ( claddingElem.isSensitive() &&
+ glueElem.isSensitive() &&
+ absBladeElem.isSensitive() &&
+ electrodeBladeElem.isSensitive() );
+ bool allNonActiveNotSensitive = ( !claddingElem.isSensitive() &&
+ !glueElem.isSensitive() &&
+ !absBladeElem.isSensitive() &&
+ !electrodeBladeElem.isSensitive() );
+ if (allNonActiveSensitive) {
+ numNonActiveLayers = ECalEndcapNumCalibLayers;
+ } else if (allNonActiveNotSensitive) {
+ numNonActiveLayers = 1;
+ } else {
+ lLog << MSG::ERROR << "Some non-active layers are sensitive and others are not -- this is likely a misconfiguration";
+ }
+
+ float delr = (ro-ri)/numNonActiveLayers;
+
+ for (unsigned iLayer = 0; iLayer < numNonActiveLayers; iLayer++) {
float roLayer = riLayer + delr;
- lLog << MSG::DEBUG << "Making layer in inner, outer radii " << riLayer << " " << roLayer << endmsg;
- float AbsThicko;
+ lLog << MSG::ERROR << "Making layer in inner, outer radii " << riLayer << " " << roLayer << endmsg;
+ // float AbsThicko;
if (scaleBladeThickness) {
AbsThicko = AbsThicki + bladeThicknessScaleFactor*((roLayer/riLayer)-1.)*AbsThicki;
} else {
@@ -197,7 +227,25 @@ namespace det {
absBladeLayerVol.setSensitiveDetector(aSensDet);
}
absBladeLayerVols.push_back(absBladeLayerVol);
+
+ dd4hep::Solid electrodeBladeLayer = buildOneBlade(ElectrodeThick, ElectrodeThick, xRange, roLayer, riLayer, BladeAngle, delZ);
+ dd4hep::Volume electrodeBladeLayerVol("electrodeBladeLayer", electrodeBladeLayer, aLcdd.material(electrodeBladeElem.materialStr()));
+ if (electrodeBladeElem.isSensitive()) {
+ electrodeBladeLayerVol.setSensitiveDetector(aSensDet);
+ }
+ electrodeBladeLayerVols.push_back(electrodeBladeLayerVol);
+
+ riLayer = roLayer;
+ AbsThicki = AbsThicko;
+ }
+
+ riLayer = ri;
+
+ for (unsigned iLayer = 0; iLayer < ECalEndcapNumCalibLayers; iLayer++) {
+ delr = (ro-ri)/ECalEndcapNumCalibLayers;
+
+ float roLayer = riLayer + delr;
// now find gap at outer layer
circ = 2*TMath::Pi()*roLayer;
x2 = (AbsThicko+GlueThick+CladdingThick+ElectrodeThick)/TMath::Sin(BladeAngle);
@@ -212,17 +260,11 @@ namespace det {
LArgapo *= 2.;
lLog << MSG::DEBUG << "Outer LAr gap is " << LArgapo << endmsg ;
lLog << MSG::INFO << "Inner and outer thicknesses of noble liquid volume " << ElectrodeThick+LArgapi*2 << " " << ElectrodeThick+LArgapo*2 << endmsg;
-
-
+
dd4hep::Solid electrodeBladeAndGapLayer = buildOneBlade(ElectrodeThick+LArgapi*2, ElectrodeThick+LArgapo*2, xRange, roLayer, riLayer, BladeAngle, delZ);
// dd4hep::Volume electrodeBladeAndGapLayerVol("electrodeBladeAndGapLayer", electrodeBladeAndGapLayer, aLcdd.material("Air"));
- dd4hep::Solid electrodeBladeLayer = buildOneBlade(ElectrodeThick, ElectrodeThick, xRange, roLayer, riLayer, BladeAngle, delZ);
- dd4hep::Volume electrodeBladeLayerVol("electrodeBladeLayer", electrodeBladeLayer, aLcdd.material(electrodeBladeElem.materialStr()));
- if (electrodeBladeElem.isSensitive()) {
- electrodeBladeLayerVol.setSensitiveDetector(aSensDet);
- }
- electrodeBladeLayerVols.push_back(electrodeBladeLayerVol);
+ dd4hep::Solid electrodeBladeLayer = buildOneBlade(ElectrodeThick, ElectrodeThick, xRange, roLayer, riLayer, BladeAngle, delZ);
dd4hep::SubtractionSolid LArShapeTotalLayer(electrodeBladeAndGapLayer, electrodeBladeLayer);
dd4hep::Volume LArTotalLayerVol("LArTotalLayerVol", LArShapeTotalLayer, aLcdd.material(nobleLiquidElem.materialStr()));
@@ -253,11 +295,98 @@ namespace det {
//build cryostat
// Retrieve cryostat data
int nUnitCellsToDraw = nUnitCells;
- //nUnitCellsToDraw = 50;
+ //nUnitCellsToDraw = 1;
//nBladesToDraw = 2;
lLog << MSG::INFO << "Number of unit cells "<< nUnitCells << endmsg;
+ // place all components of the absorber blade inside passive volume
+
+ unsigned iLayer = 0;
+
+ riLayer = ri;
+
+ for (auto absBladeLayerVol: absBladeLayerVols) {
+
+ float roLayer = riLayer+delr;
+ float xLayer = ((roLayer+riLayer)/2.);
+ float yLayer = 0.; // ((roLayer+riLayer)/2.)*TMath::Sin(phi); //ri*TMath::Sin(phi)/6.;
+ float zLayer = 0.;
+ riLayer = roLayer;
+
+ dd4hep::Position posLayer(0,0,0);
+ dd4hep::PlacedVolume absBladeVol_pv = passiveVol.placeVolume(absBladeLayerVol, posLayer);
+
+
+ // absBladeVol_pv.addPhysVolID("side",sign);
+ // absBladeVol_pv.addPhysVolID("wheel", iWheel);
+ // absBladeVol_pv.addPhysVolID("module", modIndex*nUnitCellsLeastCommonMultiple/nUnitCells);
+ // absBladeVol_pv.addPhysVolID("type", 1); // 0 = active, 1 = passive, 2 = readout
+ absBladeVol_pv.addPhysVolID("subtype", 0); // 0 = absorber, 1 = glue, 2 = cladding
+ lLog << MSG::DEBUG << "Blade layer, rho is " << iLayer << " " << absBladeVol_pv.position().Rho() << " " << roLayer/2. << endmsg;
+ // absBladeVol_pv.addPhysVolID("layer", iWheel*ECalEndcapNumLayers+iLayer);
+ absBladeVol_pv.addPhysVolID("layer", iLayer);
+ // dd4hep::DetElement absBladeDetElem(passiveDetElem, "absorber"+std::to_string(sign)+"_"+std::to_string(iWheel)+"_"+std::to_string(iUnitCell)+"_"+std::to_string(iWheel*ECalEndcapNumLayers+iLayer), ECalEndCapElementCounter++);
+ // absBladeDetElem.setPlacement(absBladeVol_pv);
+ riLayer = roLayer;
+ iLayer++;
+ }
+
+ riLayer = ri;
+ iLayer =0;
+
+ for (auto claddingLayerVol: claddingLayerVols) {
+
+ float roLayer = riLayer+delr;
+ float xLayer = ((roLayer+riLayer)/2.);
+ float yLayer = 0.; // ((roLayer+riLayer)/2.)*TMath::Sin(phi); //ri*TMath::Sin(phi)/6.;
+ float zLayer = 0.;
+ riLayer = roLayer;
+
+ dd4hep::Position posLayer(0,0,0);
+ dd4hep::PlacedVolume claddingVol_pv = passiveVol.placeVolume(claddingLayerVol, posLayer);
+
+
+ // claddingVol_pv.addPhysVolID("side",sign);
+ // claddingVol_pv.addPhysVolID("wheel", iWheel);
+ //claddingVol_pv.addPhysVolID("module", modIndex*nUnitCellsLeastCommonMultiple/nUnitCells);
+ //claddingVol_pv.addPhysVolID("type", 1); // 0 = active, 1 = passive, 2 = readout
+ claddingVol_pv.addPhysVolID("subtype", 2); // 0 = absorber, 1 = glue, 2 = cladding
+ // claddingVol_pv.addPhysVolID("layer", iWheel*ECalEndcapNumLayers+iLayer);
+ claddingVol_pv.addPhysVolID("layer", iLayer);
+ // dd4hep::DetElement claddingDetElem(passiveDetElem, "cladding"+std::to_string(sign)+"_"+std::to_string(iWheel)+"_"+std::to_string(iUnitCell)+"_"+std::to_string(iWheel*ECalEndcapNumLayers+iLayer), ECalEndCapElementCounter++);
+ // claddingDetElem.setPlacement(claddingVol_pv);
+ riLayer = roLayer;
+ iLayer++;
+ }
+
+ riLayer = ri;
+ iLayer =0;
+
+ for (auto glueLayerVol: glueLayerVols) {
+
+ float roLayer = riLayer+delr;
+ float xLayer = ((roLayer+riLayer)/2.);
+ float yLayer = 0.; //((roLayer+riLayer)/2.)*TMath::Sin(phi); //ri*TMath::Sin(phi)/6.;
+ float zLayer = 0.;
+ riLayer = roLayer;
+
+ dd4hep::Position posLayer(0,0,0);
+ dd4hep::PlacedVolume glueVol_pv = passiveVol.placeVolume(glueLayerVol, posLayer);
+
+ // glueVol_pv.addPhysVolID("side",sign);
+ // glueVol_pv.addPhysVolID("wheel", iWheel);
+ //glueVol_pv.addPhysVolID("module", modIndex*nUnitCellsLeastCommonMultiple/nUnitCells);
+ //glueVol_pv.addPhysVolID("type", 1); // 0 = active, 1 = passive, 2 = readout
+ glueVol_pv.addPhysVolID("subtype", 1); // 0 = absorber, 1 = glue, 2 = cladding
+ // glueVol_pv.addPhysVolID("layer", iWheel*ECalEndcapNumLayers+iLayer);
+ glueVol_pv.addPhysVolID("layer", iLayer);
+ // dd4hep::DetElement glueDetElem(passiveDetElem, "glue"+std::to_string(sign)+"_"+std::to_string(iWheel)+"_"+std::to_string(iUnitCell)+"_"+std::to_string(iWheel*ECalEndcapNumLayers+iLayer), ECalEndCapElementCounter++);
+ // glueDetElem.setPlacement(glueVol_pv);
+ riLayer = roLayer;
+ iLayer++;
+ }
+
for (int iUnitCell = 0; iUnitCell < nUnitCellsToDraw; iUnitCell++) {
int modIndex = iUnitCell-nUnitCellsToDraw/2;
@@ -292,93 +421,21 @@ namespace det {
rotMat2(1,0), rotMat2(1,1), rotMat2(1,2),
rotMat2(2,0), rotMat2(2,1), rotMat2(2,2));
- unsigned iLayer = 0;
riLayer = ri;
-
- for (auto absBladeLayerVol: absBladeLayerVols) {
-
- float roLayer = riLayer+delr;
- float xLayer = ((roLayer+riLayer)/2.)*TMath::Cos(phi);
- float yLayer = ((roLayer+riLayer)/2.)*TMath::Sin(phi); //ri*TMath::Sin(phi)/6.;
- float zLayer = 0.;
- riLayer = roLayer;
+ float xCell = ((ro+ri)/2.)*TMath::Cos(phi);
+ float yCell = ((ro+ri)/2.)*TMath::Sin(phi); //ri*TMath::Sin(phi)/6.;
+ float zCell = 0.;
- dd4hep::Transform3D comLayer(r3d, dd4hep::Translation3D(xLayer,yLayer,zLayer));
- dd4hep::PlacedVolume absBladeVol_pv = aEnvelope.placeVolume(absBladeLayerVol, comLayer);
-
-
- absBladeVol_pv.addPhysVolID("side",sign);
- absBladeVol_pv.addPhysVolID("wheel", iWheel);
- absBladeVol_pv.addPhysVolID("module", modIndex*nUnitCellsLeastCommonMultiple/nUnitCells);
- absBladeVol_pv.addPhysVolID("type", 1); // 0 = active, 1 = passive, 2 = readout
- absBladeVol_pv.addPhysVolID("subtype", 0); // 0 = absorber, 1 = glue, 2 = cladding
- lLog << MSG::DEBUG << "Blade layer, rho is " << iLayer << " " << absBladeVol_pv.position().Rho() << " " << roLayer/2. << endmsg;
- // absBladeVol_pv.addPhysVolID("layer", iWheel*ECalEndcapNumLayers+iLayer);
- absBladeVol_pv.addPhysVolID("layer", iLayer);
- dd4hep::DetElement absBladeDetElem(bathDetElem, "absorber"+std::to_string(sign)+"_"+std::to_string(iWheel)+"_"+std::to_string(iUnitCell)+"_"+std::to_string(iWheel*ECalEndcapNumLayers+iLayer), ECalEndCapElementCounter++);
- absBladeDetElem.setPlacement(absBladeVol_pv);
- riLayer = roLayer;
- iLayer++;
- }
-
- riLayer = ri;
- iLayer =0;
+ dd4hep::Transform3D comCell(r3d, dd4hep::Translation3D(xCell,yCell,zCell));
- for (auto claddingLayerVol: claddingLayerVols) {
-
- float roLayer = riLayer+delr;
- float xLayer = ((roLayer+riLayer)/2.)*TMath::Cos(phi);
- float yLayer = ((roLayer+riLayer)/2.)*TMath::Sin(phi); //ri*TMath::Sin(phi)/6.;
- float zLayer = 0.;
- riLayer = roLayer;
-
- dd4hep::Transform3D comLayer(r3d, dd4hep::Translation3D(xLayer,yLayer,zLayer));
- dd4hep::PlacedVolume claddingVol_pv = aEnvelope.placeVolume(claddingLayerVol, comLayer);
-
-
- claddingVol_pv.addPhysVolID("side",sign);
- claddingVol_pv.addPhysVolID("wheel", iWheel);
- claddingVol_pv.addPhysVolID("module", modIndex*nUnitCellsLeastCommonMultiple/nUnitCells);
- claddingVol_pv.addPhysVolID("type", 1); // 0 = active, 1 = passive, 2 = readout
- claddingVol_pv.addPhysVolID("subtype", 2); // 0 = absorber, 1 = glue, 2 = cladding
- // claddingVol_pv.addPhysVolID("layer", iWheel*ECalEndcapNumLayers+iLayer);
- claddingVol_pv.addPhysVolID("layer", iLayer);
- dd4hep::DetElement claddingDetElem(bathDetElem, "cladding"+std::to_string(sign)+"_"+std::to_string(iWheel)+"_"+std::to_string(iUnitCell)+"_"+std::to_string(iWheel*ECalEndcapNumLayers+iLayer), ECalEndCapElementCounter++);
- claddingDetElem.setPlacement(claddingVol_pv);
- riLayer = roLayer;
- iLayer++;
- }
-
- riLayer = ri;
- iLayer =0;
+ // place passive volume in LAr bath
+ dd4hep::PlacedVolume passivePhysVol = aEnvelope.placeVolume(passiveVol, comCell);
+ passivePhysVol.addPhysVolID("module", iUnitCell);
+ passivePhysVol.addPhysVolID("type", 1); // 0 = active, 1 = passive, 2 = readout
+ dd4hep::DetElement passiveDetElem(bathDetElem, "passive_" + std::to_string(iUnitCell)+"_"+std::to_string(iWheel), ECalEndCapElementCounter++);
+ passiveDetElem.setPlacement(passivePhysVol);
- for (auto glueLayerVol: glueLayerVols) {
-
- float roLayer = riLayer+delr;
- float xLayer = ((roLayer+riLayer)/2.)*TMath::Cos(phi);
- float yLayer = ((roLayer+riLayer)/2.)*TMath::Sin(phi); //ri*TMath::Sin(phi)/6.;
- float zLayer = 0.;
- riLayer = roLayer;
-
- dd4hep::Transform3D comLayer(r3d, dd4hep::Translation3D(xLayer,yLayer,zLayer));
- dd4hep::PlacedVolume glueVol_pv = aEnvelope.placeVolume(glueLayerVol, comLayer);
-
-
- glueVol_pv.addPhysVolID("side",sign);
- glueVol_pv.addPhysVolID("wheel", iWheel);
- glueVol_pv.addPhysVolID("module", modIndex*nUnitCellsLeastCommonMultiple/nUnitCells);
- glueVol_pv.addPhysVolID("type", 1); // 0 = active, 1 = passive, 2 = readout
- glueVol_pv.addPhysVolID("subtype", 1); // 0 = absorber, 1 = glue, 2 = cladding
- // glueVol_pv.addPhysVolID("layer", iWheel*ECalEndcapNumLayers+iLayer);
- glueVol_pv.addPhysVolID("layer", iLayer);
- dd4hep::DetElement glueDetElem(bathDetElem, "glue"+std::to_string(sign)+"_"+std::to_string(iWheel)+"_"+std::to_string(iUnitCell)+"_"+std::to_string(iWheel*ECalEndcapNumLayers+iLayer), ECalEndCapElementCounter++);
- glueDetElem.setPlacement(glueVol_pv);
- riLayer = roLayer;
- iLayer++;
- }
-
- riLayer = ri;
iLayer =0;
for (auto electrodeBladeLayerVol: electrodeBladeLayerVols) {
@@ -396,7 +453,7 @@ namespace det {
electrodeBladeVol_pv.addPhysVolID("type", 2); // 0 = active, 1 = passive, 2 = readout
// electrodeBladeVol_pv.addPhysVolID("layer", iWheel*ECalEndcapNumLayers+iLayer);
electrodeBladeVol_pv.addPhysVolID("layer", iLayer);
- dd4hep::DetElement electrodeBladeDetElem(bathDetElem, "electrode"+std::to_string(sign)+"_"+std::to_string(iWheel)+"_"+std::to_string(iUnitCell)+"_"+std::to_string(iWheel*ECalEndcapNumLayers+iLayer), ECalEndCapElementCounter++);
+ dd4hep::DetElement electrodeBladeDetElem(bathDetElem, "electrode"+std::to_string(sign)+"_"+std::to_string(iWheel)+"_"+std::to_string(iUnitCell)+"_"+std::to_string(iWheel*ECalEndcapNumCalibLayers+iLayer), ECalEndCapElementCounter++);
electrodeBladeDetElem.setPlacement(electrodeBladeVol_pv);
riLayer = roLayer;
iLayer++;
@@ -424,7 +481,7 @@ namespace det {
lLog << MSG::DEBUG << "LAr layer: " << iLayer << endmsg;
// LArVol_pv.addPhysVolID("layer", iWheel*ECalEndcapNumLayers+iLayer);
LArVol_pv.addPhysVolID("layer", iLayer);
- dd4hep::DetElement LArDetElem(bathDetElem, "LAr"+std::to_string(sign)+"_"+std::to_string(iWheel)+"_"+std::to_string(iUnitCell)+"_"+std::to_string(iWheel*ECalEndcapNumLayers+iLayer), ECalEndCapElementCounter++);
+ dd4hep::DetElement LArDetElem(bathDetElem, "LAr"+std::to_string(sign)+"_"+std::to_string(iWheel)+"_"+std::to_string(iUnitCell)+"_"+std::to_string(iWheel*ECalEndcapNumCalibLayers+iLayer), ECalEndCapElementCounter++);
LArDetElem.setPlacement(LArVol_pv);
lLog << MSG::INFO << "How big is a LArTotalLayerVol: " << sizeof(LArTotalLayerVol) << endmsg;
lLog << MSG::INFO << "How big is a LAVol_pv: " << sizeof(LArVol_pv) << endmsg;
@@ -596,7 +653,7 @@ createECalEndcapTurbine(dd4hep::Detector& aLcdd, dd4hep::xml::Handle_t aXmlEleme
dd4hep::xml::Dimension sdType = xmlDetElem.child(_U(sensitive));
aSensDet.setType(sdType.typeStr());
- ECalEndcapNumLayers = aLcdd.constant("ECalEndcapNumLayers");
+ ECalEndcapNumCalibLayers = aLcdd.constant("ECalEndcapNumCalibLayers");
// Create air envelope for the whole endcap