Geant4

37
Universidad Nacional de Ingeniería. GEANT4 Ticse Torres Royer Dávila Aguilar Houston Tópicos Especiales IV: Física de Partículas Diciembre-2009

description

software para simulacion de interaccion con la materia

Transcript of Geant4

Page 1: Geant4

Universidad Nacional de Ingeniería.

GEANT4 Ticse Torres Royer

Dávila Aguilar Houston

Tópicos Especiales IV: Física de Partículas

Diciembre-2009

Page 2: Geant4

INTRODUCCIÓN

La Física Nuclear y la Investigación de altas energías tal como la conocemos hoy en día no sería

posible sin las simulaciones. La producción masiva de muestras de eventos similares a los

previstos en los experimentos reales es una parte integral del proceso de diseño, construcción, y la

comisión de la muy complejo de aceleradores y detectores de partículas utilizados en

experimentación y la física nuclear.

Las simulaciones son también esenciales para desarrollar las herramientas de software, el estrés,

la infraestructura informática de prueba, y analizar los datos recogidos por los experimentos.

GEANT4

GEANT4 es un conjunto de herramientas para la simulación de partículas elementales y los

núcleos que al pasar por un material, interaccionan con los núcleos de dicho material. En él se

describe el seguimiento de las partículas a través de una geometría compuesta de diferentes los

materiales, sus interacciones con los electrones y los núcleos que se encuentran y la creación de

otras partículas en estas interacciones. GEANT4 es completamente una re-ingeniería de objetos,

sucesor orientada a Geant3, y un proyecto pionero para adaptarse con éxito las técnicas modernas

de ingeniería de software a la simulación del detector de partículas y física nuclear. Es un conjunto

de herramientas, está diseñada para el modelo de todos los elementos asociados con la

simulación del detector: la geometría del sistema, los materiales involucrados, las partículas de

fundamental interés, la generación de eventos primarios, el seguimiento de las partículas de

a través de materiales y campos electromagnéticos, los procesos que rigen la física de partículas

interacciones, la respuesta de los componentes del detector, sensibilidad, la generación de datos

de eventos, almacenamiento de eventos y pistas, la visualización del detector y trayectorias de las

partículas, y la captura y análisis de datos de simulación en los diferentes niveles de detalle y el

refinamiento.

GEANT4 ofrece importantes ventajas sobre otros paquetes de simulación, tales como MCNP2,

EGS3, o de Fluka4, también utilizado en el HEP y comunidades de la física nuclear. Estos incluyen

la capacidad de manejar las geometrías más complejas y realistas, la cobertura de la mayoría de la

física conocida los procesos para todo tipo de partículas elementales y los núcleos necesarios para

la simulación del detector, la disponibilidad de varios modelos de la física de alternativas que

permitan al usuario elegir entre ellos basados en sus necesidades de precisión y velocidad,

facilidad de adaptación a los marcos de los usuarios de software, y extensión fácil por los usuarios

de acuerdo a sus necesidades particulares.

GUIA DE INSTALACIÓN DEL GEANT4

A continuación daremos los pasos a seguir para la instalación de GEANT4.

Instalaleremos la versiòn geant4.9.2.p01 para Linux en este caso sobre Ubuntu 9.04

PASO Nº1 (GCC)

GCC es un compilador integrado del proyecto GNU para C, C++, Objective C y Fortran; es capaz de

recibir un programa fuente en cualquiera de estos lenguajes y generar un programa ejecutable

binario en el lenguaje de la máquina donde ha de correr. La sigla GCC significa "GNU Compiler

Page 3: Geant4

Collection". Originalmente significaba "GNU C Compiler"; todavía se usa GCC para designar una

compilación en C. G++ refiere a una compilación en C++.

Verificar que versiòn de gcc tiene para ello escriba en el terminal: gcc -v en el terminal te

indicara si esta o no instalado alguna versiòn gcc, si no esta instalado se tendra que intalar

alguna versiòn recomendados:

gcc 3.4.6 (para SLC4 o RedHat 4)

gcc 4.2.1 (para SLC5 o RedHat 5)

PASO Nº2 (C++)

C++ es un lenguaje de programación diseñado a mediados de los años 1980 por Bjarne Stroustrup.

La intención de su creación fue el extender al exitoso lenguaje de programación C con mecanismos

que permitan la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes

orientados a objetos, el C++ es un lenguaje híbrido.

Posteriormente se añadieron facilidades de programación genérica, que se sumó a los otros dos

paradigmas que ya estaban admitidos (programación estructurada y la programación orientada a

objetos). Por esto se suele decir que el C++ es un lenguaje de programación multiparadigma.

Actualmente existe un estándar, denominado ISO C++, al que se han adherido la mayoría de los

fabricantes de compiladores más modernos. Existen también algunos intérpretes, tales como ROOT.

Una particularidad del C++ es la posibilidad de redefinir los operadores (sobrecarga de operadores), y de poder crear nuevos tipos que se comporten como tipos fundamentales. El nombre C++ fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue utilizado por

primera vez fuera de un laboratorio científico. Antes se había usado el nombre "C con clases". En

C++, la expresión "C++" significa "incremento de C" y se refiere a que C++ es una extensión de C.

verificar si esta instalado librerias para c++ asi como g++

PASO Nº3 (OpenGL)

OpenGL (Open Graphics Library) es una especificación estándar que define una API multilenguaje

y multiplataforma para escribir aplicaciones que produzcan gráficos 2D y 3D. La interfaz consiste en

más de 250 funciones diferentes que pueden usarse para dibujar escenas tridimensionales

complejas a partir de primitivas geométricas simples, tales como puntos, líneas y triángulos. Fue

desarrollada originalmente por Silicon Graphics Inc. (SGI) en 19921 y se usa ampliamente en CAD,

realidad virtual, representación científica, visualización de información y simulación de vuelo.

También se usa en desarrollo de videojuegos, donde compite con Direct3D en plataformas Microsoft

Windows.

Fundamentalmente OpenGL es una especificación, es decir, un documento que describe un conjunto

de funciones y el comportamiento exacto que deben tener. Partiendo de ella, los fabricantes de

hardware crean implementaciones, que son bibliotecas de funciones que se ajustan a los requisitos

de la especificación, utilizando aceleración hardware cuando es posible. Dichas implementaciones

deben superar unos tests de conformidad para que sus fabricantes puedan calificar su

implementación como conforme a OpenGL y para poder usar el logotipo oficial de OpenGL.

En este caso usaremos el visor OpenGL para lo cual se tendra que instalar las librerias necesarias para su correcto funcionamiento.

Recomendaciones: se sugiere que se instale con sumo cuidado dichas librerias ya que algunas desinstalan otras las cuales podrian producir algùn error en el sistema operativo por lo cual no instalar dichas librerias.

Si desea pude utilizar otros visores como es el caso de VRML la cual conyeva a instalar sus respectivas librerias. Recomendación no utilice dos visores o mas ya que podria generar conflictos.

Page 4: Geant4

PASO Nº4 (CLHEP)

CLHEP es un conjunto de bibliotecas de base relacionadas con el cálculo y manipulación de datos

teniendo presente las propiedades relacionadas con la física de partículas.

Crear una carpeta con el nombre CLHEP. Luego descargue el archivo clhep-2.0.4.2.tgz de

3.4 Mb que lo puede obtener de la siguiente dirección:

http://proj-clhep.web.cern.ch/proj-clhep/DISTRIBUTION/distributions/clhep2.0.4.2.tgz

Una vez descargado el archivo descomprima en la carpeta CLHEP antes creada. Obtendrá

la siguiente carpeta 2.0.4.2.

En el terminal escriba: cd CLHEP/2.0.4.2./CLHEP

Luego escriba en el terminal: ./configure --prefix /home/hovi/CLHEP

Obteniendo la siguiente respuestainicia con:

Finaliza con:

Page 5: Geant4

Luego de obtenido lo anterior, escriba en el terminal: make

Obteniendo la siguiente respuesta inicia con:

Making all in Units

make[1]:Enteringdirectory`/afs/slac.stanford.edu/home/hovi/CLHEP/2.0.4.2/CLHEP/Units‘

Making all in Units

make[2]:Enteringdirectory`/afs/slac.stanford.edu/home/hovi//CLHEP/2.0.4.2/CLHEP/Units/Units'

make all-am

make[3]:Enteringdirectory`/afs/slac.stanford.edu/home/hovi//CLHEP/2.0.4.2/CLHEP/Units/Units'

make[3]: Nothing to be done for `all-am'.

make[3]:Leavingdirectory`/afs/slac.stanford.edu/home/hovi//CLHEP/2.0.4.2/CLHEP/Units/Units'

make[2]:Leavingdirectory`/afs/slac.stanford.edu/home/hovi//CLHEP/2.0.4.2/CLHEP/Units/Units'

Termina con:

make[1]:Enteringdirectory`/afs/slac.stanford.edu/home/hovi/CLHEP/2.0.4.2/CLHEP' ./build-

clheplib Units Vector Evaluator GenericFunctions Geometry Random Matrix RandomObjects

RefCount Cast Exceptions rm -f libCLHEP-2.0.4.2.a liblist=`./getObjectList -static Units

Vector Evaluator GenericFunctions Geometry Random Matrix RandomObjects RefCount

Cast Exceptions`; \ ar cru libCLHEP-2.0.4.2.a $liblist; ranlib libCLHEP-2.0.4.2.a rm -f

libCLHEP-2.0.4.2.so liblist=`./getObjectList -shared Units Vector Evaluator GenericFunctions

Geometry Random Matrix RandomObjects RefCount Cast Exceptions`; \ g++ -O -ansi -

pedantic -Wall -D_GNU_SOURCE -g -O2 -o libCLHEP-2.0.4.2.so -shared -Wl,-

soname,libCLHEP-2.0.4.2.so $liblist -o libCLHEP-2.0.4.2.so ./build-header

make[1]:Leavingdirectory`/afs/slac.stanford.edu/home/hovi/CLHEP/2.0.4.2/CLHEP'

Ahora escribir en el terminal: make install

Page 6: Geant4

Obtendrá una respuesta inicia con:

Making install in Units

make[1]:Enteringdirectory`/afs/slac.stanford.edu/home/hovi/CLHEP/2.0.4.2/CLHEP/Units'

Making install in Units

make[2]:Enteringdirectory`/afs/slac.stanford.edu/home/hovi/CLHEP/2.0.4.2/CLHEP/Units/Uni

ts‘

make[3]:Enteringdirectory`/afs/slac.stanford.edu/home/hovi/CLHEP/2.0.4.2/CLHEP/Units/Uni

ts‘

make[3]: Nothing to be done for `install-exec-am'.

Termina con:

if test -f ClhepVersion.h; then \ echo " /usr/bin/install -c –m

644'ClhepVersion.h''/home/hovi/CLHEP/include/CLHEP/ClhepVersion.h'"; \ /usr/bin/install -c

-m644"ClhepVersion.h"/home/hovi/CLHEP/Include /CLHEP/ClhepVersion.h"; \

else :; fi /usr/bin/install -c -m 644

'ClhepVersion.h''/home/hovi/CLHEP/include/CLHEP/ClhepVersion.h'

make[2]: Nothing to be done for `install-data-am'.

make[2]: Leaving directory `/afs/slac.stanford.edu/home/hovi/CLHEP/2.0.4.2/CLHEP'

make[1]: Leaving directory `/afs/slac.stanford.edu/home/hovi/CLHEP/2.0.4.2/CLHEP‘

NOTA: Si esta todo correcto en la carpeta CLHEP aparecerá dos directorios con los

nombres include y lib.

PASO Nº5 (GEANT4)

Crear una carpeta con el nombre geant4. Luego descargue el archivo geant4.9.2.p01tgz

de 18 Mb que lo puede obtener de la siguiente dirección:

http://geant4.web.cern.ch/geant4/support/source/geant4.9.2.p01.tar.gz

una vez descargado el archivo descomprima en la carpeta geant4, antes creada. Obtendrá

la siguiente carpeta geant4.9.2.p01

PASO Nº6 (data)

Ahora crear una carpeta con el nombre data dentro de /home/hovi/geant4/geant4.9.2.p01.

Luego descargue el archivo de datos de procesos electromagneticos de bajas energias de

8 Mb que lo puede obtener de la siguiente dirección:

http://geant4.web.cern.ch/geant4/support/source/G4EMLOW.6.2.tar.gz

una vez descargado el archivo descomprima en la carpeta data, antes creada.

PASO Nº7

Por medio del terminal ingrese a la carpeta geant4.9.2.p01 es decir:

cd /home/hovi/geant4/geant4.9.2.p01

luego vuelva a escribir en el terminal: ./Configure –build

Page 7: Geant4

se mostrara el siguiente mensaje en la cual se le pedirá que conteste una serie de

preguntas, como en este caso usaremos el visor OpenGL daremos

Especificar donde se instalo CLHEP

/home/hovi/CLHEP

Cuando pregunte:

G4VIS_BUILD_OPENGLX_DRIVER

G4VIS_USE_OPENGLX

responder: Y

cuando pregunte

G4VIS_BUILD_RAYTRACERX_DRIVER

G4VIS_USE_RAYTRACERX

responder: Y

NOTA: para el resto de las preguntas acepte las respuestas que se indican por defecto.

luego vuelva a escribir en el terminal:

./Configure –build

Page 8: Geant4

luego vuelva a escribir en el terminal: ./Configure –install

Page 9: Geant4

(genera los scrips: env.csh . env.sh)

luego vuelva a escribir en el terminal: ./Configure

Ahora procedemos a ejecutar uno de los ejemplos para ello realizamos lo siguiente:

Page 10: Geant4

Termina en:

Ahora ingresamos a la carpeta del ejemplo copiado en la zona de trabajo G4WORK

luego escribimos make

Page 11: Geant4

Termina en:

Ahora escribimos: vis/open OGLIX

Aparecerá un mensaje

Ahora escribimos: vis/drawVolume

Aparecerá un mensaje

Ahora escribimos: vis/scene/add/trayectories

Aparecerá un mensaje

Ahora escribimos: vis/scene/add/hits

Aparecerá un mensaje

Ahora escribimos: run/veamOm 4

Tal como se muestra en la siguiente imagen

Page 12: Geant4

Mostrara los resultados obtenidos tal como se muestra en la grafica

Page 13: Geant4

Se observara

Digitamos un comando tal como se ve en la imagen para girar y ver mejor, obteniendo

Page 14: Geant4

Se obtendrá

Otro angulo

Page 15: Geant4

Bueno eso es todo referente a la instalación del GEANT4 con su respectivo ejemplo de prueba

para ver si todo a sido instalado de forma correcta.

Por algún motivo no se lograra obtener lo antes expuesto se sugiere visitar las siguientes páginas

donde se presentan otras alternativas de instalación.

http://geant4.kek.jp/g4users/g4space5/

http://www-geant4.kek.jp/g4users/g4tut07/install-win.html

Page 16: Geant4

Geant4 - Aplicación

La siguiente aplicación está basado en el tutorial, que se realizo en el Fermilab (octubre

27-29, 2003) disponible en el siguiente link:

http://conferences.fnal.gov/g4tutorial/

A continuación vamos a desarrollar los ejercicios 1,2 y 3 de este tutorial.

1. Geometría.

Antes de comenzar describimos algunas características del ejemplo escogido.

Espectómetro de doble brazo con cámaras de deriva, hodoscope y calorímetros.

Un brazo proporciona información de posición y el momento de la partícula incidente,

mientras que el otro recoge información de la posición, el tiempo y energía de la partícula

después de haber sido desviada por un campo magnético en el centro del espectrómetro.

Este ejemplo utiliza la física de los procesos siguientes:

Page 17: Geant4

Electromagnética: efecto foto-eléctrico, Dispersión de Compton, producción de pares,

bremsstrahlung, ionización, dispersión múltiple, aniquilación.

Decaimiento.

Transporte en un campo.

Se definen las partículas: geantino, gamma, leptones, piones, muones.

Materiales.

Hodoscope, conjunto de centelladores(C,H)

Camara de deriva – gas de argon.

Calorimetro EM – cristales de CsI

Calorimetro hadronico – Plomo y centelladores.

En el ejercicio 1, tenemos el código incompleto, que al compilarlo y ejecutarlo tenemos:

Es decir solo tenemos el primer brazo del espectrómetro. Que consiste en una caja con

aire, Hodoscope (15 centelladores verticales) y la cámara de deriva (5 capas de gas Argón

con una placa en el centro de cada capa).

El primer paso es agregar el campo magnético. Dado en la clase A01MagneticField. y la clase A01MagneticFieldMessenger. permite cambiar el valor del campo desde terminal mediante G4UImessenger . A01MagneticField deriva de G4MagneticField . El método GetFieldvalue da el valor del campo.

Page 18: Geant4

Luego agregamos G4FieldManager y G4TransportationManager en

A01Detectorconstruction

Parte de A01MagneticField.cc

void A01MagneticField::GetFieldValue(const double Point[3],double *Bfield) const {

Bfield[0] = 0.; Bfield[2] = 0.; if(std::abs(Point[1])<ymax && (sqr(Point[0])+sqr(Point[2]))<rmax_sq)

{ Bfield[1] = By; }

else { Bfield[1] = 0.; }

}

Parte A01Detectorconstruction.cc

#include "G4FieldManager.hh" #include "G4TransportationManager.hh"

#include "A01MagneticField.hh“ A01DetectorConstruction::A01DetectorConstruction() : air(0), argonGas(0), scintillator(0), …

{ messenger = new A01DetectorConstMessenger(this); magneticField = new A01MagneticField(); …

A01DetectorConstruction::~A01DetectorConstruction() { delete magneticField; delete armRotation; . . . // campo magnetico static G4bool fieldIsInitialized = false; if(!fieldIsInitialized)

{ G4FieldManager* fieldMgr = G4TransportationManager::GetTransportationManager()->GetFieldManager(); fieldMgr->SetDetectorField(magneticField); fieldMgr->CreateChordFinder(magneticField); fieldIsInitialized = true; }

Con el cual hemos agregado el campo magnético.

Page 19: Geant4

Agregamos el Hodoscopo (centelladores) Primero definimos los materiales (Plomo, Iodo, Cesio) Parte A01Detectorconstruction.cc // Definimos los materiales -plomo

a= 2007.19*g/mole; density = 11.35*g/cm3;

plomo = new G4Material(name="Plomo" , z=82. , a, density); //CsI a= 126.9*g/mole;

G4Element* elI = new G4Element(name="Iodo" , symbol="I", z=53. , a); a= 132.9*g/mole; G4Element* elCs = new G4Element(name="Cesio" ,symbol="Cs", z=55. ,a);

density= 4.51*g/cm3; CsI = new G4Material(name ="CsI" , density, nElem=2);

CsI-> AddElement (elI, weightRatio=.5); CsI-> AddElement(elCs, weightRatio=.5); G4cout << G4endl << "The materials defined are : " << G4endl << G4endl;

G4cout << *(G4Material::GetMaterialTable()) << G4endl;

El cual nos la salida.

Page 20: Geant4

En A01Detectorconstruction.hh definimos los punteros a G4Material plomo y CsI. Inicializamos en cero ( Cs(0), plomo(0) ) en A01Detectorconstruction.cc

Parte A01Detectorconstruction.cc

//hodoscopes en el segundo brazo

G4VSolid* hodoscope2Solid = new G4Box("hodoscope2Caja",5.*cm,20.*cm,0.5*cm); G4LogicalVolume* hodoscope2Logical = new G4LogicalVolume(hodoscope2Solid,scintillator,"hodoscope2Logical",0,0,0); for(int i2=0;i2<25;i2++) {

G4double x2 = (i2-12)*10.*cm; new G4PVPlacement(0,G4ThreeVector(x2,0.,0.),hodoscope2Logical, "hodoscope2Physical",secondArmLogical,0,i2); }

Page 21: Geant4

Agregamos la cámara de deriva. Cámaras de 3m de ancho, 60cm de altura y 2cm de espesor, con placas en el centro de 2mm de espesor.

Parte A01Detectorconstruction.cc

G4VSolid* camara2Solid = new G4Box("camara2Box", 1.5*m, 30.*cm, 1.*cm); G4LogicalVolume* camara2Logical = new G4LogicalVolume(camara2Solid, argonGas, "camara2Logical",0,0,0); for(int j2=0;j2<9;j2++) {

G4double z2= (j2-4)*0.25*m - 1.5*m ; new G4PVPlacement(0,G4ThreeVector(0.,0.,z2),camara2Logical,"camara2Phisico",secondArmLogical,0,j2); }

G4VSolid* placa2Solid = new G4Box("placa2caja",1.5*m,30.*cm,0.1*mm); G4LogicalVolume* placa2Logical = new G4LogicalVolume(placa2Solid,argonGas,"placa2Logical",0,0,0); new G4PVPlacement(0,G4ThreeVector(0.,0.,0.),placa2Logical,"placa2Physical",camara2Logical,0,0);

Agregamos el calorímetro electromagnético. El calorímetro es un arreglo de 20x4 de estos cristales. Cristales de 15cm de ancho, 15cm de altura y 30cm de espesor. Parte A01Detectorconstruction.cc

G4VSolid* EMcalorimetroSolid = new G4Box("EMCajaCalorimetro",1.5*m,30.*cm,15.*cm);

Page 22: Geant4

G4LogicalVolume* EMcalorimetroLogical = new G4LogicalVolume(EMcalorimetroSolid,CsI,"EMcalorimetroLogical",0,0,0); new G4PVPlacement(0,G4ThreeVector(0.,0.,2.*m),EMcalorimetroLogical, "EMcalorimetroPhysical", secondArmLogical,0,0); //celdas calorimetro EM

G4VSolid* celdaSolid = new G4Box("celdaCaja", 7.5*cm, 7.5*cm,15.*cm); G4LogicalVolume* celdaLogical = new G4LogicalVolume(celdaSolid, CsI,"celdaLogical",0,0,0); G4VPVParameterisation* celdaParam = new A01CellParameterisation(); new G4PVParameterised("celdaPhysical", celdaLogical,EMcalorimetroLogical,kXAxis,80,celdaParam);

parte de A01CellParameterisation.cc

A01CellParameterisation::A01CellParameterisation() {

for(int copyNo=0;copyNo<80;copyNo++) { G4int column = copyNo / 4; G4int row = copyNo % 4; xCell[copyNo] = (column-9)*15.*cm - 7.5*cm; yCell[copyNo] = (row-1)*15*cm - 7.5*cm; }

}

A01CellParameterisation::~A01CellParameterisation() {;}

void A01CellParameterisation::ComputeTransformation (const G4int copyNo,G4VPhysicalVolume *physVol) const {

physVol->SetTranslation(G4ThreeVector(xCell[copyNo],yCell[copyNo],0.)); }

Page 23: Geant4

Agregamos el calorímetro Hadrónico. Sándwiches de plomo y centellador de 30cm de ancho, 30cm de altura y 5cm de espesor. Colocados en un arreglo de 3m de ancho, 60cm de altura y 1m de espesor. Parte A01Detectorconstruction.cc

G4VSolid* CalorimetroHadSolid = new G4Box("HadCalorimetroCaja",1.5*m,30.*cm,50.*cm); G4LogicalVolume* CalorimetroHadLogical = new G4LogicalVolume(CalorimetroHadSolid,lead,"CalorimetroHadLogical",0,0,0); new G4PVPlacement(0,G4ThreeVector(0.,0.,3.*m),CalorimetroHadLogical,"CalorimetroHadphysical",secondArmLogical,0,0); //columnas calorimetro hadronico G4VSolid* ColumCalHadSolid = new G4Box("ColumCalHadCaja",15.*cm,30.*cm,50.*cm); G4LogicalVolume* ColumCalHadLogical = new G4LogicalVolume(ColumCalHadSolid,lead,"CalorimetroHadLogical",0,0,0); new G4PVReplica("ColumCalHadPhysical",ColumCalHadLogical,CalorimetroHadLogical,kXAxis,10,30.*cm); //celda calorimetro hadronico G4VSolid* CelCalHadSolid = new G4Box("CelCalHadCaja",15.*cm,30.*cm,50.*cm); G4LogicalVolume* CelCalHadLogical = new G4LogicalVolume(CelCalHadSolid,lead,"CelCalHadLogical",0,0,0); new G4PVReplica("CelCalHadPhysical",CelCalHadLogical, ColumCalHadLogical,kYAxis,2,30.*cm); //nivel colorimetro hadronico G4VSolid* CapaCalHadSolid = new G4Box("CapaCalHadCaja",15.*cm,15.*cm,2.5*cm); G4LogicalVolume* CapaCalHadLogical = new G4LogicalVolume(CapaCalHadSolid,lead,"CapaCalHadLogical",0,0,0); new G4PVReplica("CapaCalHadPhysical",CapaCalHadLogical, CelCalHadLogical,kZAxis,20,5.*cm); //plano centillador G4VSolid* CentiCalHadSolid = new G4Box("CentiCalHadCaja",15.*cm,15.*cm,0.5*cm); G4LogicalVolume* CentiCalHadLogical = new G4LogicalVolume(CentiCalHadSolid,scintillator,"CentiCalHadLogical",0,0,0); new G4PVPlacement(0,G4ThreeVector(0.,0.,2.*cm),CentiCalHadLogical, "CentiCalHadPhysical",CapaCalHadLogical,0,0);

Page 24: Geant4

2. Partículas.

Geant4 posee varios tipos de partículas para simulación, cada partícula representado por

su propia clase que deriva de G4ParticleDefinition. Las partículas son organizados en 6

categorías: leptones, mesones, bariones, bosones, de vida-corta e iones.

Los procesos físicos describen como interactúan las partículas con el material tenemos 7

categorías principales de procesos: electromagnetico, hadrónico, decaimiento, fotolepton-

hadron, ópticos, parametrización y de transporte.

Cada proceso tiene dos grupos de métodos que desempeñan un papel importante en el seguimiento, GetPhysicalInteractionLength (GPIL) y DoIt. El método de GPIL da la longitud del paso desde el punto espacio – tiempo actual a el punto espacio-tiempo siguiente .Esto se hace mediante el cálculo de la probabilidad de interacción basado en la información la sección transversal del proceso.. Al final de este paso, el método DoIt debe invocarse El método de DoIt implementa los detalles de la interacción, el cambio de energía de la partícula, el impulso, dirección y posición, y la producción secundaria si es necesario. Estos cambios se registran como objetos G4VParticleChange

Geantino. Esta partícula fue inventado para la simulación en Geant4, no interactúa con la materia , solo es necesario el proceso de transporte.

Page 25: Geant4

Positrón. Para incluir la física electromagnética , incluimos A01EMPhysics.hh en A01EMPhysicsList. Se desvía en el campo y produce una lluvia de cargas en el calorímetro EM. Procesos: dispersión múltiple, bremsstrahlung e, ionización ,aniquilación e+.

Muones. Incluir en A01EMPhysicsList.cc , A01MuonPhysics.hh

Ioniza el aire produciendo cargas negativas(rojo)

Procesos: dispersión múltiple , bremsstrahlung mu, ionización de mu, producción de pares e + e- por muones

Page 26: Geant4

Pion. Agregamos física hidrómica (A01HadronPhysics.hh y A01HadronPhysics.cc) El pion se desintegra en muon y neutrino en la primera cámara de deriva. Procesos: Hadron elástica ,Hadron inelástica ,captura y fisión de neutrones ,aniquilación en reposo para anti-protones y anti-neutrones , scattering múltiple para hadrones cargados, ionización de hadrones cargados .

3. Sensibilidad.

Hit es la interacción física instantánea en la trayectoria de la partícula o acumulación de interacciones en la región sensible del detector. La región sensible del detector crea hits usando la información dado en el objeto G4Step y almacenados en G4Event al final de un evento. El usuario define su clase hit derivado de G4VHit, pudiendo almacenar varios tipos de información en esta clase como: posición y tiempo de paso, momento y energía

Page 27: Geant4

de la trayectoria, energia de deposición, información geométrica y combinaciones de estos. Los objetos de una clase hit deben ser almacenados en una colección, el cual es una instancia de G4THitsCollection template class. La colección hits son accesibles a través de G4Event al final de un evento, para ser usado en el análisis del evento, y a través de G4SDManager durante el proceso del evento, que se utiliza para el filtrado del evento.

Hodoscope y cámara de deriva Parte de A01DetectorConstruction.cc G4VPhysicalVolume* A01DetectorConstruction::Construct()

{

// G4VSensitiveDetector* hodoscope1; G4VSensitiveDetector* chamber1; G4VSensitiveDetector* hodoscope2; G4VSensitiveDetector* camara2; G4SDManager* SDman = G4SDManager::GetSDMpointer(); G4String SDname; hodoscope1 = new A01Hodoscope(SDname="/hodoscope1"); SDman->AddNewDetector(hodoscope1); hodoscope1Logical->SetSensitiveDetector(hodoscope1);

hodoscope2 = new A01Hodoscope(SDname="/hodoscope2"); SDman->AddNewDetector(hodoscope2); hodoscope2Logical->SetSensitiveDetector(hodoscope2); chamber1 = new A01DriftChamber(SDname="/chamber1"); SDman->AddNewDetector(chamber1); wirePlane1Logical->SetSensitiveDetector(chamber1); camara2 = new A01DriftChamber(SDname="/camara2"); SDman->AddNewDetector(camara2); wirePlane2Logical->SetSensitiveDetector(camara2);

Parte de A01EvenAction.cc A01EventAction::A01EventAction() {

G4String colName; G4SDManager* SDman = G4SDManager::GetSDMpointer(); HHC1ID = SDman->GetCollectionID(colName="hodoscope1/hodoscopeColl"); DHC1ID = SDman->GetCollectionID(colName="chamber1/driftChamberColl"); //colocando ID

Page 28: Geant4

HHC2ID = SDman->GetCollectionID(colName="hodoscope2/hodoscopeColl"); DHC2ID = SDman->GetCollectionID(colName="camara2/driftChamberColl"); void A01EventAction::EndOfEventAction(const G4Event* evt) {

G4HCofThisEvent * HCE = evt->GetHCofThisEvent(); A01HodoscopeHitsCollection* HHC1 = 0; A01DriftChamberHitsCollection* DHC1 = 0; //... A01HodoscopeHitsCollection* HHC2 = 0; A01DriftChamberHitsCollection* DHC2 = 0; //.... A01EmCalorimeterHitsCollection* ECHC = 0; A01HadCalorimeterHitsCollection* HCHC = 0; if(HCE) {

HHC1 = (A01HodoscopeHitsCollection*)(HCE->GetHC(HHC1ID)); DHC1 = (A01DriftChamberHitsCollection*)(HCE->GetHC(DHC1ID)); //... HHC2 = (A01HodoscopeHitsCollection*)(HCE->GetHC(HHC2ID)); DHC2 = (A01DriftChamberHitsCollection*)(HCE->GetHC(DHC2ID)); //.... ECHC = (A01EmCalorimeterHitsCollection*)(HCE->GetHC(ECHCID)); HCHC = (A01HadCalorimeterHitsCollection*)(HCE->GetHC(HCHCID)); } . . . // if(HHC2) { int n_hit = HHC2->entries(); G4cout << "Hodoscope 2 tiene " << n_hit << " colisiones." << G4endl; for(int i1=0;i1<n_hit;i1++) {

A01HodoscopeHit* aHit = (*HHC2)[i1]; aHit->Print(); }

}

}

// if(DHC2) {

int n_hit = DHC2->entries(); G4cout << "Camara de deriva 2 tiene " << n_hit << " colisiones." << G4endl; for(int i2=0;i2<5;i2++) {

for(int i1=0;i1<n_hit;i1++) {

A01DriftChamberHit* aHit = (*DHC2)[i1];

Page 29: Geant4

if(aHit->GetLayerID()==i2) aHit->Print(); }

}

}

Salida. >>> Event 0 >>> Simulation truth : e+ (-4.615962429507,0,989.29283496844)

Hodoscope 1 has 1 hits.

Hodoscope[7] 4.9868571910584 (nsec)

Hodoscope 2 tiene 1 colisiones.

Hodoscope[8] 43.07777699026 (nsec)

Drift Chamber 1 has 6 hits.

Layer[0] : time 6.6711038083754 (nsec) --- local (x,y) -12.964912979212, -0.039498654249376

Layer[1] : time 8.3390095958199 (nsec) --- local (x,y) -17.974093214733, -0.68236328588736

Layer[2] : time 10.006909835187 (nsec) --- local (x,y) -22.798176055634, -1.4412423578075

Layer[3] : time 11.674807992901 (nsec) --- local (x,y) -27.5507927848, -2.2321515445323

Layer[3] : time 12.332190636356 (nsec) --- local (x,y) -6.0281819661482, -86.553137480673

Layer[4] : time 13.342699048469 (nsec) --- local (x,y) -32.01375154174, -3.297089404578

Camara de deriva 2 tiene 5 colisiones.

Layer[0] : time 34.737886998822 (nsec) --- local (x,y) -224.55971729671, -23.354142901273

Layer[1] : time 36.409114104763 (nsec) --- local (x,y) -256.50456338376, -24.689009720259

Layer[2] : time 38.080321993001 (nsec) --- local (x,y) -288.35526777196, -26.116257650382

Layer[3] : time 39.751583993649 (nsec) --- local (x,y) -320.45799915737, -27.582919723848

Layer[4] : time 41.422867626714 (nsec) --- local (x,y) -352.647703604, -29.33252167976

Calorímetro EM y Hadrónico. Parte de A01HadCalorimeter.cc

A01HadCalorimeter::A01HadCalorimeter(G4String name)

:G4VSensitiveDetector(name) {

//definimos coleccion de hits

Page 30: Geant4

G4String HCname; collectionName.insert(HCname="HadCalorimeterColl"); HCID = -1; }

void A01HadCalorimeter::Initialize(G4HCofThisEvent*HCE) { //inicializacion hitsCollection = new A01HadCalorimeterHitsCollection

(SensitiveDetectorName,collectionName[0]); if(HCID<0) { HCID = G4SDManager::GetSDMpointer()->GetCollectionID(hitsCollection); }

HCE->AddHitsCollection(HCID,hitsCollection); // llenado de las colisiones del calorimetro con energia cero. for(int iColumn=0;iColumn<10;iColumn++) for(int iRow=0;iRow<2;iRow++) {

A01HadCalorimeterHit* aHit = new A01HadCalorimeterHit(); hitsCollection->insert( aHit ); }

}

G4bool A01HadCalorimeter::ProcessHits(G4Step*aStep,G4TouchableHistory* )

{//.... G4double edep = aStep->GetTotalEnergyDeposit(); if(edep==0.) return true; G4StepPoint* preStepPoint = aStep->GetPreStepPoint(); G4TouchableHistory* theTouchable = (G4TouchableHistory*)(preStepPoint->GetTouchable()); G4VPhysicalVolume* theCellPhysical = theTouchable->GetVolume(2); G4int rowNo = theCellPhysical->GetCopyNo(); G4VPhysicalVolume* theColumnPhysical = theTouchable->GetVolume(3); G4int columnNo = theColumnPhysical->GetCopyNo(); G4int hitID = 2*columnNo+rowNo; A01HadCalorimeterHit* aHit = (*hitsCollection)[hitID]; // agregar energia de depsicion aHit->AddEdep(edep); // check if it is first touch.... if(aHit->GetColumnID()<0) {aHit->SetColumnID(columnNo); aHit->SetRowID(rowNo); G4int depth = theTouchable->GetHistory()->GetDepth(); G4AffineTransform aTrans = theTouchable->GetHistory()->GetTransform(depth-2); aTrans.Invert(); aHit->SetRot(aTrans.NetRotation()); aHit->SetPos(aTrans.NetTranslation()); } return true; }

Page 31: Geant4

Parte de A01DetectorConstruction.cc

G4VPhysicalVolume* A01DetectorConstruction::Construct()

{// All managed (deleted) by SDManager G4VSensitiveDetector* hodoscope1; G4VSensitiveDetector* chamber1; G4VSensitiveDetector* hodoscope2; G4VSensitiveDetector* camara2; G4VSensitiveDetector* calorimetroEM; G4VSensitiveDetector* calorimetroHad; ConstructMaterials(); . . . //sensibilidad del calorimetro EM y Had calorimetroEM = new A01EmCalorimeter(SDname="/calorimetroEM"); SDman->AddNewDetector(calorimetroEM); cellLogical->SetSensitiveDetector(calorimetroEM); calorimetroHad = new A01HadCalorimeter(SDname="/calorimetroHad"); SDman->AddNewDetector(calorimetroHad); HadCalScintiLogical->SetSensitiveDetector(calorimetroHad); Parte de A01EvenAction.cc void A01EventAction::EndOfEventAction(const G4Event* evt) {G4HCofThisEvent * HCE = evt->GetHCofThisEvent(); A01HodoscopeHitsCollection* HHC1 = 0; A01DriftChamberHitsCollection* DHC1 = 0; A01HodoscopeHitsCollection* HHC2 = 0; A01DriftChamberHitsCollection* DHC2 = 0; //.... A01EmCalorimeterHitsCollection* ECHC = 0; A01HadCalorimeterHitsCollection* HCHC = 0; if(HCE) {HHC1 = (A01HodoscopeHitsCollection*)(HCE->GetHC(HHC1ID)); DHC1 = (A01DriftChamberHitsCollection*)(HCE->GetHC(DHC1ID)); HHC2 = (A01HodoscopeHitsCollection*)(HCE->GetHC(HHC2ID)); DHC2 = (A01DriftChamberHitsCollection*)(HCE->GetHC(DHC2ID)); //.... ECHC = (A01EmCalorimeterHitsCollection*)(HCE->GetHC(ECHCID)); HCHC = (A01HadCalorimeterHitsCollection*)(HCE->GetHC(HCHCID)); }

if(ECHC) { int iHit = 0; double totalE = 0.; for(int i1=0;i1<80;i1++) {A01EmCalorimeterHit* aHit = (*ECHC)[i1]; double eDep = aHit->GetEdep(); if(eDep>0.) {iHit++;

Page 32: Geant4

totalE += eDep; }

}

G4cout << "Calorimetro EM tiene " << iHit << " colisiones. Total de Edep es " << totalE/MeV << " (MeV)" << G4endl; }

if(HCHC) {int iHit = 0; double totalE = 0.; for(int i1=0;i1<20;i1++) {A01HadCalorimeterHit* aHit = (*HCHC)[i1]; double eDep = aHit->GetEdep(); if(eDep>0.) { iHit++; totalE += eDep; }

}

G4cout << "Calorimetro Hadronico tiene " << iHit << " colisiones. Total de Edep es "<< totalE/MeV << " (MeV)" << G4endl; }

}

Page 33: Geant4

Salida. >>> Event 0 >>> Simulation truth : e+ (-46.608796284877,0,9989.1948678744) Hodoscope 1 has 1 hits. Hodoscope[7] 4.9868392083869 (nsec) Hodoscope 2 tiene 1 colisiones. Hodoscope[9] 43.118621962955 (nsec) Drift Chamber 1 has 5 hits. Layer[0] : time 6.6710266335687 (nsec) --- local (x,y) -9.6803244995177, -0.022961927981725 Layer[1] : time 8.3388694462032 (nsec) --- local (x,y) -12.266712177533, -0.10238247445638 Layer[2] : time 10.006712426243 (nsec) --- local (x,y) -14.862827971551, -0.18045061768859 Layer[3] : time 11.674555380763 (nsec) --- local (x,y) -17.457833952939, -0.2422246088771 Layer[4] : time 13.34239750811 (nsec) --- local (x,y) -20.004972727609, -0.29014202087488 Camara de deriva 2 tiene 8 colisiones. Layer[0] : time 34.782064077075 (nsec) --- local (x,y) -184.26271026763, -1.2616713099189 Layer[1] : time 36.452645892551 (nsec) --- local (x,y) -213.04660965888, -1.2832391910433 Layer[2] : time 38.123231045669 (nsec) --- local (x,y) -241.84791896898, -1.2889280136141 Layer[2] : time 38.374680336176 (nsec) --- local (x,y) -148.7895788798, 13.368171076805 Layer[2] : time 40.25655731369 (nsec) --- local (x,y) 247.34773628013, 149.34457425109 Layer[2] : time 41.766655754835 (nsec) --- local (x,y) 386.00350941469, 254.73904448587 Layer[3] : time 39.79382044807 (nsec) --- local (x,y) -270.6713482343, -1.2522298797379 Layer[4] : time 41.464407407445 (nsec) --- local (x,y) -299.4820409237, -1.2075098221661 Calorimetro EM tiene 17 colisiones. Total de Edep es 9593.7519690313 (MeV) Calorimetro Hadronico tiene 2 colisiones. Total de Edep es 3.347249882462 (MeV)

Page 34: Geant4

Idle> gun/particle proton Idle> run/beamOn 1 >>> Event 0 >>> Simulation truth : proton (-24.860054213226,0,10017.118355756) Hodoscope 1 has 2 hits. Hodoscope[7] 5.008630250396 (nsec) Hodoscope[13] 6.4100617879675 (nsec) Hodoscope 2 tiene 1 colisiones. Hodoscope[9] 43.340078743539 (nsec) Drift Chamber 1 has 5 hits. Layer[0] : time 6.700176378978 (nsec) --- local (x,y) -5.1183167816382, 0.009114904954258 Layer[1] : time 8.3753064279533 (nsec) --- local (x,y) -6.3389177805586, 0.012143046731096 Layer[2] : time 10.050436548432 (nsec) --- local (x,y) -7.5509602398323, 0.0072864347224467 Layer[3] : time 11.725566866727 (nsec) --- local (x,y) -8.7739975034423, 0.0023298499659164 Layer[4] : time 13.40069757257 (nsec) --- local (x,y) -10.022792328185, -0.025842586251126 Camara de deriva 2 tiene 5 colisiones. Layer[0] : time 34.966983005503 (nsec) --- local (x,y) -164.71958608517, -0.6706775751057 Layer[1] : time 36.644891754846 (nsec) --- local (x,y) -193.54353351681, -0.6908194338258 Layer[2] : time 38.322799773489 (nsec) --- local (x,y) -222.36292543159, -0.71962802755192 Layer[3] : time 40.000708857268 (nsec) --- local (x,y) -251.18732150957, -0.72463658746971 Layer[4] : time 41.678613487695 (nsec) --- local (x,y) -279.98782294257, -0.72526568035024 Calorimetro EM tiene 23 colisiones. Total de Edep es 2660.7790862454 (MeV) Calorimetro Hadronico tiene 4 colisiones. Total de Edep es 46.360669294988 (MeV)

Page 35: Geant4

Idle> /gun/particle pi+ Idle> run/beamOn 1 >>> Event 0 >>> Simulation truth : pi+ (-100.01578037668,0,10009.321970853) Hodoscope 1 has 1 hits. Hodoscope[7] 4.9875191754795 (nsec) Hodoscope 2 tiene 2 colisiones. Hodoscope[9] 43.058033207213 (nsec) Hodoscope[8] 43.085932873146 (nsec) Drift Chamber 1 has 5 hits. Layer[0] : time 6.6719312979471 (nsec) --- local (x,y) -20.024890301602, 0.022300102668735 Layer[1] : time 8.3399967066626 (nsec) --- local (x,y) -25.005323481939, 0.016015943064595 Layer[2] : time 10.008061353803 (nsec) --- local (x,y) -29.96253176031, -0.01731869898438 Layer[3] : time 11.676125557418 (nsec) --- local (x,y) -34.906162693683, -0.060860781414065 Layer[4] : time 13.344190184267 (nsec) --- local (x,y) -39.862597955862, -0.082772181616971 Camara de deriva 2 tiene 5 colisiones. Layer[0] : time 34.722308209234 (nsec) --- local (x,y) -214.64573319133, -0.65892891581623 Layer[1] : time 36.392725278052 (nsec) --- local (x,y) -241.6687448664, -0.77834267183107 Layer[2] : time 38.063144636993 (nsec) --- local (x,y) -268.70429106872, -0.92980235450965 Layer[3] : time 39.733563273723 (nsec) --- local (x,y) -295.73566446459, -1.1059736664348 Layer[4] : time 41.403983744721 (nsec) --- local (x,y) -322.77699078216, -1.3104826542075 Calorimetro EM tiene 13 colisiones. Total de Edep es 223.62332294036 (MeV) Calorimetro Hadronico tiene 10 colisiones. Total de Edep es 180.89798770084 (MeV)

Page 36: Geant4

Idle> gun/particle mu+ Idle> run/beamOn 1 >>> Event 0 >>> Simulation truth : mu+ (19.091996847819,0,9995.58869582) Hodoscope 1 has 1 hits. Hodoscope[7] 4.9870690478664 (nsec) Hodoscope 2 tiene 1 colisiones. Hodoscope[9] 43.210911299625 (nsec) Drift Chamber 1 has 6 hits. Layer[0] : time 6.6713321466766 (nsec) --- local (x,y) 3.5731949397791, 0.24265023963362 Layer[1] : time 8.3392497281279 (nsec) --- local (x,y) 4.6120422311356, 0.51069100168785 Layer[2] : time 10.007167132624 (nsec) --- local (x,y) 5.6304440755348, 0.75378439758907 Layer[3] : time 11.67508459521 (nsec) --- local (x,y) 6.6573901237194, 0.99358949558899 Layer[4] : time 13.343001523032 (nsec) --- local (x,y) 7.431936008789, 1.368029997944 Layer[4] : time 13.357431738106 (nsec) --- local (x,y) 59.785817940045, -24.216671453576 Camara de deriva 2 tiene 5 colisiones. Layer[0] : time 34.871246852893 (nsec) --- local (x,y) -144.25614381923, 6.5529674676622 Layer[1] : time 36.542450687345 (nsec) --- local (x,y) -175.67010865111, 6.9498349897422 Layer[2] : time 38.213660212294 (nsec) --- local (x,y) -207.11095730946, 7.3688477217281 Layer[3] : time 39.884862648778 (nsec) --- local (x,y) -238.51785871302, 7.7916414103438 Layer[4] : time 41.556077462969 (nsec) --- local (x,y) -269.9832192661, 8.2594004357906 Calorimetro EM tiene 4 colisiones. Total de Edep es 414.10963164764 (MeV) Calorimetro Hadronico tiene 2 colisiones. Total de Edep es 114.56583443596 (MeV) Idle> exit