Symulacje dla detektora ND280
Transkrypt
Symulacje dla detektora ND280
Symulacje dla detektora ND280 Oprogranowanie do symulacji • NEUT - generator verteksów oddziaływań neutrin • nd280MC – symulacja monte carlo propagacji cząstek w detektorze (korzysta z biblioteki GEANT) • ElecSim – symulacja odczytów z elektroniki na podstawie danych z nd280MC • Oprogranowanie do analizy wyników – oaEvent, EventDisplay • Oprogranowanie do rekonstrukcji trajektori z hitów • Biblioteka ROOT – pełni role warstwy pośredniczącej między wszystkimi pozostałymi programami • oaCalibrationDatabase – ustawienia detektora np. pole magnetyczne itp. Neut • To generator wierzchołków oddziaływań neutrin z materią w których produkowane są cząstki takie jak miony czy piony • Jest uważany za przestarzały • Produkuje wierzchołki oddziaływań tylko w płaszczyźnie 2D • Możliwe jest zastąpieni go przez inny generator , najlepiej NuWro !!! nd280MC • Symuluje propagacje cząstek w detektorze przez uwzględnienie efektów materiałowych i geometrycznych. Wykorzystuje w tym celu bibliotekę GEANT • Uwzględnia strukturę czasowa wiązki padających neutrin (czyli zależność liczby wierzchołków od czasu) ElecSim • Symuluje odczyt sygnałów z elektroniki na podstawie danych z nd280mc • Umożliwia testowanie różnych modeli pomiaru oraz budowy scyntylatorów • Umożliwia oszacowanie błędów pomiarowych Oprogranowanie do rekonstrukcji trajektorii • tpcRecon, fgdRecon, p0dRecon, ecalRecon, sbcat(biblioteka) • Rekonstrukcja jest dokonywana na podstawie hitów z elektroniki zgodnie z zadanym algorytmem. Zrekonstruowane trajektorie są dopisywane do pliku. ROOT • Całe oprogramowanie napisane jest z wykorzystaniem ROOT’a poza Neut’em • Wymian danych między poszczególnymi programami następuje poprzez pliki wygenerowane za pomocą tej biblioteki • ROOT dostarcza narzędzi do analizy danych i zarządzania pamięcią Kolejność wymiany danych 1. 2. 3. 4. NEUT nd280MC ElecSim/analiza Rekonstrukcja/analiza Sposób uporządkowania danych • • • • • Trajektorie Trajektorie zrekonstruowane Hity Hity rejestrowane przez elektronikę Wierzchołki Każdy hit, trajektoria i wierzchołek należy do zdarzenia (event) Przetwarzanie danych #include <nd280EventLoop.hxx> class TMyEventLoop: public ND::TND280EventLoopFunction { public: TMyEventLoop() {} virtual ~TMyEventLoop() {} bool operator () (ND::TND280Event& event) { event.ls(); return true; } }; int main(int argc, char **argv) { TMyEventLoop userCode; nd280EventLoop(argc,argv,userCode); } Dzięki przedstawionemu powyżej framworkowi nie musimy przejmować się implementacją interface’u użytkownika Dzięki przedstawionemu powyżej framworkowi nie musimy przejmować się implementacją interface’u użytkownika usage: myprogram.exe [options] [input-file] ... Options: -o <file> Set the name of an output file. -a Read all events -n <cnt> Only read <cnt> events [Default: 1] -s <cnt> Skip <cnt> events -O <opt>[=<val>] Set an option for the user code -O quiet Very little output -O <option> Set the option for TObject::ls() Run Id: 0 Event Id: 0 Reaction Code: 0 TDataVector(0x8690848):: hits TDataVector(0x86936f0):: fits TDataVector(0x8693760):: truth TG4TrajectoryContainer(0x86937e0):: G4Trajectories TG4Trajectory(0x876a3b4):: Id: 1 13(mu-) Points: 7 E: 741.3 P: (-528.1, -65.2, 505.2) from: 0 TG4Trajectory(0x875ea64):: Id: 2 2212(proton) Points: 2 E: 1092.0 P: (419.4, -98.6, 355.7) from: 0 TG4Trajectory(0x876a804):: Id: 3 22(gamma) Points: 2 E: 6.2 P: (-5.1, -3.3, 1.0) from: 0 TG4Trajectory(0x876a95c):: Id: 50 11(e-) Points: 2 E: 8.4 P: (-7.6, 0.7, 3.5) from: 1 TG4Trajectory(0x876aab4):: Id: 52 11(e-) Points: 2 E: 7.7 P: (-6.3, 1.1, 4.3) from: 1 TG4Trajectory(0x876ac0c):: Id: 124 11(e-) Points: 2 E: 5.3 P: (-4.7, 0.5, 2.3) from: 1 TG4Trajectory(0x876ad64):: Id: 137 2112(neutron) Points: 3 E: 941.9 P: (60.8, -26.9, -3.6) from: 1 TG4Trajectory(0x876af24):: Id: 138 1000070150(N15[0.0]) Points: 2 E: 13969.6 P: (-81.5, 85.2, 67.0) from: 1 TG4Trajectory(0x876b07c):: Id: 140 14(nu_mu) Points: 2 E: 87.5 P: (20.2, -56.9, -63.4) from: 1 TG4Trajectory(0x876b1d4):: Id: 172 1000080160(O16[0.0]) Points: 2 E: 14895.5 P: (111.5, 2.8, -17.1) from: 137 TG4Trajectory(0x876b32c):: Id: 173 1000080160(O16[0.0]) Points: 2 E: 14895.2 P: (-46.3, 50.9, 3.7) from: 137 TG4Trajectory(0x876b484):: Id: 174 1000140280(Si28[0.0]) Points: 2 E: 26053.4 P: (-10.5, -62.2, 62.5) from: 137 TG4Trajectory(0x876b5dc):: Id: 175 1000140280(Si28[0.0]) Points: 2 E: 26053.3 P: (-54.5, -8.5, -47.7) from: 137 TG4Trajectory(0x876b734):: Id: 176 1000080160(O16[0.0]) Points: 2 E: 14895.3 P: (15.7, 60.8, 31.5) from: 137 TG4Trajectory(0x876b88c):: Id: 177 1000080160(O16[0.0]) Points: 2 E: 14895.3 P: (-46.5, -25.7, -46.6) from: 137 TG4Trajectory(0x876b9e4):: Id: 193 11(e-) Points: 2 E: 6.8 P: (-4.7, 4.8, 0.4) from: 137 TG4PrimaryVertexContainer(0x8769a80):: G4PrimVertex00 TG4PrimaryVertex(0x877b8d8):: at: (1409.96,-534.052,2380.64,3547.41) TG4PrimaryParticle(0x87868b8):: Id: 1 Particle: 13 (mu-) E: 741.308 TG4PrimaryParticle(0x878691c):: Id: 2 Particle: 2212 (proton) E: 1092.04 TG4PrimaryParticle(0x8786980):: Id: 3 Particle: 22 (gamma) E: 6.18 Informational Vertex: TG4PrimaryVertexContainer(0x877b930):: Informational TG4PrimaryVertex(0x878de40):: at: (-731.457,-1428.96,0,0) TG4PrimaryParticle(0x878def8):: Id: -1 Particle: 14 (nu_mu) E: 903.499 TG4PrimaryParticle(0x878df5c):: Id: -1 Particle: 2112 (neutron) E: 956.85 TG4PrimaryParticle(0x878dfc0):: Id: -1 Particle: 13 (mu-) E: 741.308 TG4PrimaryParticle(0x878e024):: Id: -1 Particle: 2212 (proton) E: 1092.04 TDataVector(0x878e150):: g4Hits TG4HitContainer(0x878e240):: tec Przetwarzanie danych class TDumpEvent: public TND280EventLoopFunction { public: virtual void Initialize(void) { muonTdist = new TH1F("muonTdist","Number of muons ",400,0,8000); } virtual void Finalize(TND280Output* output) { muonTdist->Draw("same"); gPad->Print("muonTime2.gif"); } bool operator () (TND280Event& evt) { TG4PrimaryVertex vertex; TG4PrimaryParticleContainer particles; TG4PrimaryParticle pt; unsigned int NV; unsigned int j; unsigned int N; unsigned int i; double t; try { TG4PrimaryVertexContainer& vertexCont = evt.Use<TG4PrimaryVertexContainer>("truth/G4PrimVertex00"); NV = vertexCont.size(); for(j=0; j< NV; j++) { vertex = vertexCont[j]; t = vertex.GetPosition().T(); particles = vertex.GetPrimaryParticles(); N = particles.size(); for(i=0; i< N; i++) { pt = particles[i]; if(abs(pt.GetPDGCode())==13)muonxTdist->Fill(t/unit::ns ); }//konie pętli po cząstkach }//koniec petli po vertexach } catch (...) {... } return true; } private: TH1F* muonTdist; }; Struktura czasowa wiązki Hity Hity odczytane przez elektronikę Rozkład długości trajektorii Rozkład długości w SMRD