From b047ec4dd763a081e68bce758258f56778ae1790 Mon Sep 17 00:00:00 2001 From: Mario Sitta Date: Thu, 30 Jul 2026 14:27:59 +0200 Subject: [PATCH 1/2] mplementation of OB FPC Capacitors --- .../include/ITSSimulation/V3Layer.h | 11 ++ .../ITSMFT/ITS/simulation/src/Detector.cxx | 8 +- .../ITSMFT/ITS/simulation/src/V3Layer.cxx | 100 +++++++++++++++++- 3 files changed, 114 insertions(+), 5 deletions(-) diff --git a/Detectors/ITSMFT/ITS/simulation/include/ITSSimulation/V3Layer.h b/Detectors/ITSMFT/ITS/simulation/include/ITSSimulation/V3Layer.h index bc4fd6b0dadd4..2aa9efc5514ff 100644 --- a/Detectors/ITSMFT/ITS/simulation/include/ITSSimulation/V3Layer.h +++ b/Detectors/ITSMFT/ITS/simulation/include/ITSSimulation/V3Layer.h @@ -241,6 +241,14 @@ class V3Layer : public V11Geometry /// \param mgr The GeoManager (used only to get the proper material) TGeoVolume* createOBFPCCuSig(Double_t z, const TGeoManager* mgr = gGeoManager); + /// Creates the OB FPC capacitors + /// \param modvol The OB module mother volume + /// \param xmodlen The module half X length + /// \param zmodlen The module half Z length + /// \param yzero The Y base position of capacitors + /// \param mgr The GeoManager (used only to get the proper material) + void createOBFPCCapacitors(TGeoVolume* modvol, Double_t xmodlen, Double_t zmodlen, Double_t yzero, const TGeoManager* mgr = gGeoManager); + /// Creates the OB Power and Bias Buses /// Returns a TGeoVolume with both buses /// \param z Z stave half lengths @@ -458,6 +466,9 @@ class V3Layer : public V11Geometry static const Double_t sOBFPCCopperThick; ///< Thickness of FPC Copper static const Double_t sOBFPCCuAreaFracGnd; ///< Fraction of Cu on Gnd FPC static const Double_t sOBFPCCuAreaFracSig; ///< Fraction of Cu on Sig FPC + static const Double_t sOBFPCCapacitorXWid; ///< OB FPC capacitor X width + static const Double_t sOBFPCCapacitorYHi; ///< OB FPC capacitor Y height + static const Double_t sOBFPCCapacitorZLen; ///< OB FPC capacitor Z length static const Double_t sOBGlueFPCThick; ///< Thickness of Glue to FPC static const Double_t sOBGlueColdPlThick; ///< Thickness of Glue to Cold Pl static const Double_t sOBPowerBusXWidth; ///< OB Power Bus X width diff --git a/Detectors/ITSMFT/ITS/simulation/src/Detector.cxx b/Detectors/ITSMFT/ITS/simulation/src/Detector.cxx index 63d7a8ad8dfa2..c01657d4a7c39 100644 --- a/Detectors/ITSMFT/ITS/simulation/src/Detector.cxx +++ b/Detectors/ITSMFT/ITS/simulation/src/Detector.cxx @@ -101,10 +101,10 @@ void Detector::configOuterBarrelITS(int nInnerBarrelLayers, int buildLevel) // Radii are from last TDR (ALICE-TDR-017.pdf Tab. 1.1, rMid is mean value) const double tdr5dat[kNLr][kNPar] = { - {-1, 19.45, -1, 4., 7.5, 24}, // for others: -, rMid, -, NMod/HStave, phi0, nStaves // 24 was 49 - {-1, 24.40, -1, 4., 6., 30}, // 30 was 61 - {-1, 34.24, -1, 7., 4.29, 42}, // 42 was 88 - {-1, 39.20, -1, 7., 3.75, 48} // 48 was 100 + {-1, 19.40, -1, 4., 7.5, 24}, // for others: -, rMid, -, NMod/HStave, phi0, nStaves // 24 was 49 + {-1, 24.35, -1, 4., 6., 30}, // 30 was 61 + {-1, 34.19, -1, 7., 4.29, 42}, // 42 was 88 + {-1, 39.15, -1, 7., 3.75, 48} // 48 was 100 }; double rLr, phi0, turbo; diff --git a/Detectors/ITSMFT/ITS/simulation/src/V3Layer.cxx b/Detectors/ITSMFT/ITS/simulation/src/V3Layer.cxx index e930aa23de030..4da5409b14d92 100644 --- a/Detectors/ITSMFT/ITS/simulation/src/V3Layer.cxx +++ b/Detectors/ITSMFT/ITS/simulation/src/V3Layer.cxx @@ -157,6 +157,9 @@ const Double_t V3Layer::sOBFPCSoldMaskThick = 30.0 * sMicron; const Double_t V3Layer::sOBFPCCopperThick = 18.0 * sMicron; const Double_t V3Layer::sOBFPCCuAreaFracGnd = 0.954; // F.Benotto const Double_t V3Layer::sOBFPCCuAreaFracSig = 0.617; // F.Benotto +const Double_t V3Layer::sOBFPCCapacitorXWid = 0.5 * sMm; +const Double_t V3Layer::sOBFPCCapacitorYHi = 0.5 * sMm; +const Double_t V3Layer::sOBFPCCapacitorZLen = 1.0 * sMm; const Double_t V3Layer::sOBGlueFPCThick = 50 * sMicron; const Double_t V3Layer::sOBGlueColdPlThick = 80 * sMicron; const Double_t V3Layer::sOBPowerBusXWidth = 3.04 * sCm; @@ -3426,6 +3429,7 @@ TGeoVolume* V3Layer::createModuleOuterB(const TGeoManager* mgr) // and Cu instead of Al // Updated: 20 Jul 2017 M. Sitta O2 version // Updated: 30 Jul 2018 M. Sitta Updated geometry + // Updated: 13 Jun 2026 M. Sitta Add FPC capacitors // const Int_t nameLen = 30; @@ -3486,7 +3490,8 @@ TGeoVolume* V3Layer::createModuleOuterB(const TGeoManager* mgr) Double_t ysig = (static_cast(cuSignalCableVol->GetShape()))->GetDY(); xlen = (static_cast(cuGndCableVol->GetShape()))->GetDX(); - ylen = glueCP->GetDY() + ychip + glueFPC->GetDY() + ysig + flexKap->GetDY() + ygnd; +// ylen = glueCP->GetDY() + ychip + glueFPC->GetDY() + ysig + flexKap->GetDY() + ygnd; + ylen = glueCP->GetDY() + ychip + glueFPC->GetDY() + ysig + flexKap->GetDY() + ygnd + sOBFPCCapacitorYHi / 2; TGeoBBox* module = new TGeoBBox("OBModule", xlen, ylen, zlen); // We have all shapes: now create the real volumes @@ -3559,6 +3564,10 @@ TGeoVolume* V3Layer::createModuleOuterB(const TGeoManager* mgr) modVol->AddNode(cuGndCableVol, 1, new TGeoTranslation(0, ypos, 0)); } + // Add the FPC capacitors + ypos += ygnd; + createOBFPCCapacitors(modVol, xlen, zlen, ypos); + // Done, return the module return modVol; } @@ -3655,6 +3664,95 @@ TGeoVolume* V3Layer::createOBFPCCuSig(const Double_t zcable, const TGeoManager* return soldmaskVol; } +void V3Layer::createOBFPCCapacitors(TGeoVolume* modvol, Double_t xmodlen, Double_t zmodlen, Double_t yzero, const TGeoManager* mgr) +{ + // + // Adds the capacitors to the OB FPC + // + // Input: + // modvol : the OB module mother volume + // xmodlen : the module half X length + // zmodlen : the module half Z length + // yzero : the Y base position of capacitors + // mgr : the GeoManager (used only to get the proper material) + // + // Output: + // + // Return: + // + // Created: 13 Jun 2026 Mario Sitta + // + + // Number of capacitors and their positions from Gerber files + // and F.Benotto communications + + // Capacitors position (Gerber X,Y with respect to bottom left corner + // will be translated to TGeo Z,X with respect center of module) + const Int_t nGroups = 10; + const Double_t xyCapacitors[nGroups][2] = { + {26.34 * sMm, 14.02 * sMm}, {7.16 * sMm, 18.96 * sMm}, + {26.04 * sMm, 10.34 * sMm}, {7.91 * sMm, 22.67 * sMm}, + {41.36 * sMm, 18.78 * sMm}, {41.56 * sMm, 14.23 * sMm}, + {64.35 * sMm, 13.54 * sMm}, {25.95 * sMm, 19.38 * sMm}, + {64.39 * sMm, 10.45 * sMm}, {22.21 * sMm, 22.63 * sMm} + }; + + const Double_t deltaYCapacitors = 30 * sMm; + + const Int_t nCapacitors[nGroups] = {7, 7, 7, 7, 5, 5, 5, 7, 5, 7}; + + const Double_t xyCapacitorSingle[8][2] = { + {14.91 * sMm, 18.78 * sMm}, {195.81 * sMm, 18.78 * sMm}, + {15.11 * sMm, 14.23 * sMm}, {196.01 * sMm, 14.23 * sMm}, + {34.20 * sMm, 13.54 * sMm}, {36.59 * sMm, 10.33 * sMm}, + {7.73 * sMm, 13.54 * sMm}, {11.44 * sMm, 12.13 * sMm}, + }; + + // Local variables + Double_t xpos, ypos, zpos; + Int_t idCapacitor; + + TGeoVolume *capacitorOB; + + // Check whether we already have the volumes, otherwise create them + // (so as to avoid creating multiple copies of the very same volumes + // for each layer) + capacitorOB = mgr->GetVolume("OBFPCCapacitor"); + + if (!capacitorOB) { + TGeoBBox* capacit = new TGeoBBox(sOBFPCCapacitorXWid / 2, sOBFPCCapacitorYHi / 2, sOBFPCCapacitorZLen / 2); + + TGeoMedium* medCeramic = mgr->GetMedium(Form("%s_CERAMIC$", GetDetName())); + + capacitorOB = new TGeoVolume("OBFPCCapacitor", capacit, medCeramic); + capacitorOB->SetLineColor(kBlack); + capacitorOB->SetFillColor(kBlack); + } + + // Place all the capacitors (they are really a lot...) + ypos = yzero + sOBFPCCapacitorYHi / 2; + idCapacitor = 0; + + for (Int_t jgrp = 0; jgrp < nGroups; jgrp++) { // Loop on the groups of cap's + xpos = xyCapacitors[jgrp][1] - xmodlen; + for (Int_t jcap = 0; jcap < nCapacitors[jgrp]; jcap++) { // Loop on cap's + zpos = xyCapacitors[jgrp][0] - zmodlen + jcap * deltaYCapacitors; + idCapacitor++; + modvol->AddNode(capacitorOB, idCapacitor, new TGeoTranslation(xpos, ypos, zpos)); + } + } + + // Add single capacitors + for (Int_t jcap = 0; jcap < 8; jcap++) { + xpos = xyCapacitorSingle[jcap][1] - xmodlen; + zpos = xyCapacitorSingle[jcap][0] - zmodlen; + idCapacitor++; + modvol->AddNode(capacitorOB, idCapacitor, new TGeoTranslation(xpos, ypos, zpos)); + } + + // We've done +} + Double_t V3Layer::radiusOmTurboContainer() { Double_t rr, delta, z, lstav, rstav; From 347faeb95cb37dfbd5dbdecb5e9ee0bf84b88e99 Mon Sep 17 00:00:00 2001 From: Mario Sitta Date: Thu, 30 Jul 2026 14:35:40 +0200 Subject: [PATCH 2/2] Fixing Clang format --- .../ITSMFT/ITS/simulation/src/V3Layer.cxx | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/Detectors/ITSMFT/ITS/simulation/src/V3Layer.cxx b/Detectors/ITSMFT/ITS/simulation/src/V3Layer.cxx index 4da5409b14d92..e5f225b2d6b5d 100644 --- a/Detectors/ITSMFT/ITS/simulation/src/V3Layer.cxx +++ b/Detectors/ITSMFT/ITS/simulation/src/V3Layer.cxx @@ -3490,7 +3490,7 @@ TGeoVolume* V3Layer::createModuleOuterB(const TGeoManager* mgr) Double_t ysig = (static_cast(cuSignalCableVol->GetShape()))->GetDY(); xlen = (static_cast(cuGndCableVol->GetShape()))->GetDX(); -// ylen = glueCP->GetDY() + ychip + glueFPC->GetDY() + ysig + flexKap->GetDY() + ygnd; + // ylen = glueCP->GetDY() + ychip + glueFPC->GetDY() + ysig + flexKap->GetDY() + ygnd; ylen = glueCP->GetDY() + ychip + glueFPC->GetDY() + ysig + flexKap->GetDY() + ygnd + sOBFPCCapacitorYHi / 2; TGeoBBox* module = new TGeoBBox("OBModule", xlen, ylen, zlen); @@ -3690,29 +3690,28 @@ void V3Layer::createOBFPCCapacitors(TGeoVolume* modvol, Double_t xmodlen, Double // will be translated to TGeo Z,X with respect center of module) const Int_t nGroups = 10; const Double_t xyCapacitors[nGroups][2] = { - {26.34 * sMm, 14.02 * sMm}, {7.16 * sMm, 18.96 * sMm}, - {26.04 * sMm, 10.34 * sMm}, {7.91 * sMm, 22.67 * sMm}, - {41.36 * sMm, 18.78 * sMm}, {41.56 * sMm, 14.23 * sMm}, - {64.35 * sMm, 13.54 * sMm}, {25.95 * sMm, 19.38 * sMm}, - {64.39 * sMm, 10.45 * sMm}, {22.21 * sMm, 22.63 * sMm} - }; + {26.34 * sMm, 14.02 * sMm}, {7.16 * sMm, 18.96 * sMm}, {26.04 * sMm, 10.34 * sMm}, {7.91 * sMm, 22.67 * sMm}, {41.36 * sMm, 18.78 * sMm}, {41.56 * sMm, 14.23 * sMm}, {64.35 * sMm, 13.54 * sMm}, {25.95 * sMm, 19.38 * sMm}, {64.39 * sMm, 10.45 * sMm}, {22.21 * sMm, 22.63 * sMm}}; const Double_t deltaYCapacitors = 30 * sMm; const Int_t nCapacitors[nGroups] = {7, 7, 7, 7, 5, 5, 5, 7, 5, 7}; const Double_t xyCapacitorSingle[8][2] = { - {14.91 * sMm, 18.78 * sMm}, {195.81 * sMm, 18.78 * sMm}, - {15.11 * sMm, 14.23 * sMm}, {196.01 * sMm, 14.23 * sMm}, - {34.20 * sMm, 13.54 * sMm}, {36.59 * sMm, 10.33 * sMm}, - {7.73 * sMm, 13.54 * sMm}, {11.44 * sMm, 12.13 * sMm}, + {14.91 * sMm, 18.78 * sMm}, + {195.81 * sMm, 18.78 * sMm}, + {15.11 * sMm, 14.23 * sMm}, + {196.01 * sMm, 14.23 * sMm}, + {34.20 * sMm, 13.54 * sMm}, + {36.59 * sMm, 10.33 * sMm}, + {7.73 * sMm, 13.54 * sMm}, + {11.44 * sMm, 12.13 * sMm}, }; // Local variables Double_t xpos, ypos, zpos; Int_t idCapacitor; - TGeoVolume *capacitorOB; + TGeoVolume* capacitorOB; // Check whether we already have the volumes, otherwise create them // (so as to avoid creating multiple copies of the very same volumes @@ -3732,7 +3731,7 @@ void V3Layer::createOBFPCCapacitors(TGeoVolume* modvol, Double_t xmodlen, Double // Place all the capacitors (they are really a lot...) ypos = yzero + sOBFPCCapacitorYHi / 2; idCapacitor = 0; - + for (Int_t jgrp = 0; jgrp < nGroups; jgrp++) { // Loop on the groups of cap's xpos = xyCapacitors[jgrp][1] - xmodlen; for (Int_t jcap = 0; jcap < nCapacitors[jgrp]; jcap++) { // Loop on cap's @@ -3748,7 +3747,7 @@ void V3Layer::createOBFPCCapacitors(TGeoVolume* modvol, Double_t xmodlen, Double zpos = xyCapacitorSingle[jcap][0] - zmodlen; idCapacitor++; modvol->AddNode(capacitorOB, idCapacitor, new TGeoTranslation(xpos, ypos, zpos)); - } + } // We've done }