GEANT4 Leszek Adamczyk Geometria detektora
Geometria detektora Trzy poziomy definicji geometrii: G4VSolid kształt, rozmiar G4LogicalVolume materiał, wizualizacja, G4VPhysicalVolume położenie, orientacja G4VSolid G4LogicalVolume G4VPhysicalVolume G4Box G4Material G4VisAttributes G4PVPlacement G4Tubs G4VSensitiveDetector G4PVParameterised
Typowa strategia G4VSolid * solidworld = new G4Box( "World", //its name WorldSizeX/2,WorldSizeYZ/2,WorldSizeYZ/2); //its size G4LogicalVolume * logicworld = new G4LogicalVolume( solidworld, //its solid defaultmaterial, //its material "World"); //its name G4VPhysicalVolume * physiworld = new G4PVPlacement( 0, //no rotation G4ThreeVector(), //at (0,0,0) logicworld, //its logical volume "World", //its name 0, //its mother volume false, //no boolean operation 0); //copy number Każdy obszar jest umieszczany wewnątrz obszaru matki. Pozycja i orientacja obszaru określana jest względem lokalnego układu współrzędnych obszaru matki. Początek układu jest środkiem obszaru matki. Obszar nie może wystawać poza obszar matki
Hierarchia geometrii detektora
Hierarchia geometrii detektora Jeden obszar logiczny może być umieszczony więcej niż jeden raz Kilka obszarów może być umieszczonych w jednym obszarze logicznym Jeśli obszar matka jest umieszczony kilka razy to z definicji wszystkie obszary córki pojawią się w każdej kopii obszaru matki. Obszar world musi być jeden i zawierać całkowicie wszystkie pozostałe. Obszar world definiuje globalny układ współrzędnych Pozycje cząstek, depozytów energii podawane są względem globalnego układu współrzędnych
G4VUserDetectorConstruction Definicja:, materiałów, geometrii,... Należy wyprowadzić z abstrakcyjnej klasy G4VUserDetectorConstruction klasę pochodną Zaimplementować funkcję Construct() Opis klasy G4VUserDetectorConstruction (Software Reference Manual) Class Description: This is the abstract base class of the user's mandatory initialization class for detector setup. It has only one pure virtual method Construct() which is invoked by G4RunManager when it's Initialize() method is invoked. The Construct() method must return the G4VPhysicalVolume pointer which represents the world volume.
examplen03.: GNUmakefile examplen03.cc include src./include: ExN03DetectorConstruction.hh ExN03EventAction.hh ExN03PhysicsList.hh ExN03PrimaryGeneratorMessenger.hh ExN03SteppingAction.hh deklaracja klasy pochodnej ExN03DetectorMessenger.hh ExN03EventActionMessenger.hh ExN03PrimaryGeneratorAction.hh ExN03RunAction.hh ExN03SteppingVerbose.hh definicja klasy pochodnej./src: ExN03DetectorConstruction.cc ExN03EventAction.cc ExN03PhysicsList.cc ExN03PrimaryGeneratorMessenger.cc ExN03SteppingAction.cc ExN03DetectorMessenger.cc ExN03EventActionMessenger.cc ExN03PrimaryGeneratorAction.cc ExN03RunAction.cc ExN03SteppingVerbose.cc
examplen03.cc // Set mandatory initialization classes // ExN03DetectorConstruction* detector = new ExN03DetectorConstruction; runmanager->setuserinitialization(detector); // // Initialize G4 kernel // runmanager->initialize(); Wywołanie konstruktora klasy ExN03DetectorConstruction ExN03DetectorConstruction::ExN03DetectorConstruction {...} Wywołanie funkcji ExN03DetectorConstruction::Construct {...} Materiały, geometria mogą być zdefiniowane w dowolnej z powyższych funkcji (lub innej funkcji wywoływanej przez powyższe dwie). Musimy jednak zapewnić aby funkcja Construct wzracała wskaźnik do obszaru fizycznego world. Ten obiekt reprezentuje cały nasz detektor
ExN03DetectorConstruction.hh #ifndef ExN03DetectorConstruction_h #define ExN03DetectorConstruction_h 1 #include "G4VUserDetectorConstruction.hh class ExN03DetectorConstruction : public G4VUserDetectorConstruction { public: ExN03DetectorConstruction(); //konstruktor ~ExN03DetectorConstruction(); //destruktor G4VPhysicalVolume * Construct(); //funkcja Construct public: inne funkcje lub dane publiczne (jeśli potrzebne) private: inne funkcje lub dane prywatne (jeśli potrzebne) void DefineMaterials(); }; #endif G4VPhysicalVolume* ConstructCalorimeter(); // meteriały // geometria
ExN03DetectorConstruction.cc #include "ExN03DetectorConstruction.hh"... ExN03DetectorConstruction::ExN03DetectorConstruction():Lista inicjalizacji {... DefineMaterials();... } ExN03DetectorConstruction::~ExN03DetectorConstruction() {...} G4VPhysicalVolume* ExN03DetectorConstruction::Construct() {return ConstructCalorimeter();}... void ExN03DetectorConstruction::DefineMaterials() {... // definicje materiałów } G4VPhysicalVolume* ExN03DetectorConstruction::ConstructCalorimeter() {...// definicja geometrii detektora }......
Bryły Wszystkie bryły w GEANT4 są wyprowadzone z abstrakcyjnej klasy bazowej G4VSolid. Klasa ta deklaruje (ale nie implementuje) wszystkie funkcje potrzebne do: Obliczenia odległości bryły od dowolnego punktu Obliczenie wektora normalnego do powierzchni bryły w dowolnym punkcie Sprawdzenia czy dany punkt znajduje się wewnątrz bryły Obliczenia objętości, pola powierzchni,... Użytkownik może zdefiniować swoją własną klasę
Bryły elementarne Prostopadłościan G4Box(const G4String& pname, // name G4double px, // half length in X G4double py, // half length in Y G4double pz) // half length in Z Wycinek powłoki cylindrycznej G4Tubs(const G4String& pname, // name G4double prmin, // inner radius G4double prmax, // outer radius G4double pdz, // half length in Z G4double psphi, // the starting phi angle G4double pdphi) // the angle of the segment
Inne bryły elementarne G4Cons powłoka stożkowa G4Orb pełna sfera G4Para graniastosłup G4Sphere powłoka sferyczna Opis wszystkich brył Rozdział 4.1.2 Przewodnika dla twórców aplikacji G4Torus torus G4Trap ostrosłup G4Trd ostrosłup foremny
Bryły specjalne Wielostożek G4Polycone(const G4String& pname, // name G4double phistart, // starting phi angle G4double phitotal, // total phi angle G4int numrz, // number of corners in R-Z space const G4double r[], // r coordinate of corners const G4double z[]) // z coordinate of corners
Inne bryły specjalne G4Polyhedra G4Ellipsoid G4TwistedTrap G4EllipticalTube Opis wszystkich brył Rozdział 4.1.2 Przewodnika dla twórców aplikacji G4Paraboloid G4Hype G4TwistedBox
Bryły reprezentowane przez ich granice Można zdefiniować bryłę podając wszystkie płaszczyzny które ją ograniczają Płaszczyzny mogą być płaskie, zakrzywione, płaty Beziera
Bryły powstałe z operacji logicznych Dwie bryły mogą być łączone za pomocą operacji logicznych: G4UnionSolid, G4SubtractionSolid, G4IntersectionSolid - druga bryła pozycjonowana jest względem lokalnego układu współrzędnych pierwszej Union Subtraction Intersection
Bryły powstałe z operacji logicznych przykład G4Box* box = new G4Box("Box",20*mm,30*mm,40*mm); G4Tubs* cyl = new G4Tubs("Cylinder",0,50*mm,50*mm,0,twopi); // r: G4UnionSolid* union = new G4UnionSolid("Box+Cylinder", box, cyl); G4IntersectionSolid* intersection = new G4IntersectionSolid("Box*Cylinder", box, cyl); G4SubtractionSolid* subtraction = new G4SubtractionSolid("Box-Cylinder", box, cyl); 0 mm -> 50 mm // z: -50 mm -> 50 mm // phi: 0 -> 2 pi Lokalny układ współrzędnych powstałej bryły jest taki sam jak pierwszej bryły
Obszar logiczny G4LogicalVolume( G4VSolid* psolid, G4Material* pmaterial, const G4String& Name, G4FieldManager* pfieldmgr=0, G4VSensitiveDetector* psdetector=0, G4UserLimits* pulimits=0) Obszar logiczny posiada pełną informację o obszarze oprócz jego położenia i orientacji: kształt, rozmiar, materiał, pole magnetyczne, atrybut obszaru czułego detektora, atrybuty wizualizacji, warunki produkcji cząstek, pozycje i orientacje obszarów córek.
Objętość i ciężar obszaru logicznego Objętość bryły można obliczyć za pomocą funkcji składowej G4VSolid::GetCubicVolume() Dla większości elementarnych brył objętość jest obliczana analitycznie dla pozostałych metodą Monte Carlo Ciężar obszaru logicznego można obliczyć przy użyciu funkcji składowej: G4LogicalVolume::GetMass()
Obszar fizyczny Obszary fizyczne dzielimy na: - jednokrotny : obszar umieszczony jednokrotnie jeden fizyczny obszar = jeden obszar rzeczywisty - wielokrotny : obszar umieszczany wielokrotnie jeden fizyczny obszar = wiele obszarów rzeczywistych Obszary wielokrotne ze względu na sposób repetycji dzielimy na: - parametryzowane w funkcji numeru kopii - powielane wzdłuż jednej osi Obszar matka może zawierać: - albo wiele obszarów jednokrotnych - albo jeden obszar wielokrotny
Obszar fizyczny (przegląd) G4PVPlacement reprezentuje obszar jednokrotny G4PVParameterised reprezentuje obszar wielokrotny parametryzowany numerem kopii - kształt, rozmiar, materiał,... mogą być parametryzowane numerem kopii - powielane obszary mogą zawierać w sobie obszary wnuczki o ile wnuczki mają identyczne rozmiary i kształty - wymaga implementacji klasy G4PVParameterisation
Obszar fizyczny (przegląd) G4PVReplica (obszar wielokrotny) obszary córki mające ten sam kształt ustawiane są wzdłuż jednej osi i wypełniają cały obszar matki bez żadnych przerw G4PVDivision (obszar wielokrotny) tak jak G4PVReplica ale dopuszcza istnienie przerwy między brzegiem obszaru matki a najbardziej zewnętrznymi córkami, brak przerw między córkami G4ReflectionFactory (para obszarów) umożliwia umieszczenie obszaru i jego odbicia G4AssemblyVolume (wiele obszarów) umożliwia umieszczenie jednokrotnych obszarów połączonych w grupę
G4PVPlacement G4PVPlacement( G4RotationMatrix* prot, // obrót układu matki const G4ThreeVector& tlate, // pozycja w obróconym układzie G4LogicalVolume* pcurrentlogical, const G4String& pname, G4LogicalVolume* pmotherlogical, G4bool pmany, // false G4int pcopyno, // dowolna unikalna liczba całk. G4bool psurfchk=false ) Mother volume rotation translation in rotated frame
G4PVPlacement - II Tra = G4Transform3D ( G4RotationMatrix &prot //obrót układu córki const G4ThreeVector &tlate) // pozycja w układzie matki G4PVPlacement( G4Transform3D Tra, // transformacja córki G4LogicalVolume* pcurrentlogical,... Mother Mother volume volume rotatio n translation in mother frame
G4PVPlacement przykład examplen03 physicalor = new G4PVPlacement( 0, //no rotation G4ThreeVector(0,0,0),//at (0,0,0) logiccalor, //its logical volume "Calorimeter", //its name logicworld, //its mother volume false, //no boolean operation 0); //copy number
G4PVParameterised G4PVParameterised( const G4String& pname, G4LogicalVolume* pdlogical, G4LogicalVolume* pmlogical, const EAxis paxis, const G4int n, G4VPVParameterisation* pparam, G4bool psurfchk=false ) Umieszcza obszar (pdlogical), n razy używając parametryzacji (pparam) wewnątrz obszaru matki (pmlogical) paxis sugeruje wzdłuż której osi będą powielane obszary (kxaxis, kyaxis, kzaxis, kundefined)
G4PVParameterised Użytkownik musi zaimplementować klasę wyprowadzoną z klasy G4VPVParameterisation oraz zdefiniować następujące wielkości w funkcji numeru kopii: - położenie i orientacje ComputeTransformation - opcjonalnie rozmiar ComputeDimensions kształt ComputeSolid materiał ComputeMaterial Wszystkie kopie muszą zawierać się w obszarze matki i nie nachodzić na siebie
G4PVParameterised: przykład examplen02 Tarcza + układ 5 komór śladowych o rosnących rozmiarach poprzecznych
ExN02DetectorConstruction.cc solidchamber = new G4Box("chamber", 100*cm, 100*cm, 10*cm); logicchamber = new G4LogicalVolume(solidChamber,ChamberMater,"Chamber",0,0,0); chamberparam = new ExN02ChamberParameterisation( NbOfChambers, // NoChambers firstposition, // Z of center of first ChamberSpacing, // Z spacing of centers ChamberWidth, // Width Chamber firstlength, // lengthinitial lastlength); // lengthfinal physichamber = new G4PVParameterised( "Chamber", // their name logicchamber, // their logical volume LogicTracker, // Mother logical volume kzaxis, // Are placed along this axis NbOfChambers, // Number of chambers chamberparam); // The parametrisation
ExN02ChamberParameterisation.hh... class ExN02ChamberParameterisation : public G4VPVParameterisation { public: ExN02ChamberParameterisation(G4int NoChambers, G4double startz, G4double spacing, G4double widthchamber, G4double lengthinitial, G4double lengthfinal ); virtual ~ExN02ChamberParameterisation(); void ComputeTransformation (const G4int copyno, G4VPhysicalVolume* physvol) const; void ComputeDimensions (G4Box & trackerlayer, const G4int copyno, const G4VPhysicalVolume* physvol) const;...};
ExN02ChamberParameterisation.cc... ExN02ChamberParameterisation::ExN02ChamberParameterisation( G4int NoChambers, G4double startz, // Z of center of first G4double spacingz, // Z spacing of centers G4double widthchamber, G4double lengthinitial, G4double lengthfinal ) { fnochambers = NoChambers; fstartz = startz; fhalfwidth = widthchamber*0.5; fspacing = spacingz; fhalflengthfirst = 0.5 * lengthinitial;... }
ExN02ChamberParameterisation.cc void ExN02ChamberParameterisation::ComputeTransformation (const G4int copyno, G4VPhysicalVolume* physvol) const { G4double Zposition= fstartz + (copyno+1) * fspacing; G4ThreeVector origin(0,0,zposition); physvol->settranslation(origin); physvol->setrotation(0); } void ExN02ChamberParameterisation::ComputeDimensions (G4Box& trackerchamber, const G4int copyno, const G4VPhysicalVolume*) const { G4double halflength= fhalflengthfirst + copyno * fhalflengthincr; trackerchamber.setxhalflength(halflength); trackerchamber.setyhalflength(halflength); trackerchamber.setzhalflength(fhalfwidth); }
G4PVReplica Obszar matki musi być całkowicie wypełniony kopiami o takich samych rozmiarach (szerokościach) i kształtach Powielanie może się odbywać wzdłuż: - osi układu kartezjańskiego (X,Y,Z), powielane plastry są prostopadłe do tej osi a lokalny układ współrzędnych związany jest ze środkiem plastra - osi radialnej (R), powielane wycinki stożka/cylindra są współosiowe i nieobrócone a układy współrzędnych kopii są takie same jak obszaru matki - osi kąta azymutalnego (Phi), powielane wycinki stożka /cylindra są współosiowe i obracane o stały kąt a lokalny układ współrzędnych kopii jest obrócony względem układu matki w taki sposób, że oś X dzieli na pół każdy klin
G4PVReplica G4PVReplica( const G4String& pname, G4LogicalVolume* pcurrentlogical, G4LogicalVolume* pmotherlogical, const EAxis paxis, const G4int nreplicas, const G4double width, const G4double offset=0 ) - Obszar matka może sam być klasy G4PVReplica - Obszar klasy G4Placement może znajdować się w powielanym obszarze o ile powielanie nie następuje wzdłuż osi radialnej -Obszar klasy G4Parameterised nie może znajdować się w powielanym obszarze
G4PVReplica paxis, width, offset Osie kartezjańskie paxis=kxaxis (YZ) offset musi mieć wartość 0 Oś radialna paxis=kraxis offset musi być równy wewnętrznemu promieniowi obszaru matki Oś kąta azymutalnego paxis=kphi offset musi być równy początkowemu kątowi obszaru matki width width offset width offset
G4PVReplica przykład ExN03DetectorConstruction.cc solidlayer = new G4Box("Layer", //its name LayerThickness/2,CalorSizeYZ/2,CalorSizeYZ/2); //size logiclayer = new G4LogicalVolume(solidLayer, //its solid defaultmaterial, //its material "Layer"); //its name width physilayer = new G4PVReplica("Layer", //its name logiclayer, //its logical volume logiccalor, //its mother kxaxis, //axis of replication NbOfLayers, //number of replica LayerThickness); //witdth of replica physiabsorber = new G4PVPlacement(0, //no rotation G4ThreeVector(-GapThickness/2,0.,0.), //its position logicabsorber, //its logical volume AbsorberMaterial->GetName(), //its name logiclayer, //its mother offset false, //no boulean operat 0); //copy number