Uniwersytet Jagielloński Wydział Fizyki, Astronomii i Informatyki
Transkrypt
Uniwersytet Jagielloński Wydział Fizyki, Astronomii i Informatyki
Uniwersytet Jagielloński Wydział Fizyki, Astronomii i Informatyki Stosowanej Praca magisterska WINHAC++ – obiektowy generator Monte Carlo do modelowania naładowanych procesów Drella-Yana Autor: Kamil Sobol Promotor: dr hab. prof. UJ Wiesław Płaczek Kraków 2010 Wydział Fizyki, Astronomii i Informatyki Stosowanej Uniwersytet Jagielloński Oświadczenie Ja niżej podpisany Kamil Sobol (nr indeksu: 1000848) student Wydziału Fizyki, Astronomii i Informatyki Stosowanej Uniwersytetu Jagiellońskiego kierunku fizyka, oświadczam, że przedłożona przeze mnie praca magisterska pt. ”WINHAC++ — obiektowy generator Monte Carlo do modelowania naładowanych procesów Drella-Yana” przedstawia wyniki badań wykonanych przeze mnie osobiście, pod kierunkiem dr hab. Wiesława Płaczka. Pracę napisałem samodzielnie. Oświadczam, że moja praca dyplomowa została opracowana zgodnie z Ustawą o prawie autorskim i prawach pokrewnych z dnia 4 lutego 1994 r. (Dziennik Ustaw 1994 nr 24 poz. 83 wraz z późniejszymi zmianami). Jestem świadom, że niezgodność niniejszego oświadczenia z prawdą ujawniona w dowolnym czasie, niezależnie od skutków prawnych wynikających z ww. ustawy, może spowodować unieważnienie tytułu nabytego na podstawie tej pracy. Kraków, dnia 22. czerwca 2010 .................................. Streszczenie Niniejsza praca poświęcona jest implementacji generatora WINHAC++. Jest to nowa, obiektowa wersja generatora Monte Carlo WINHAC, napisanego w języku Fortran, służącego do modelowania naładowanych procesów Drella–Yana z uwzględnieniem poprawek radiacyjnych poprzez schemat ekskluzywnej eksponencjacji Yennie–Frautschi–Suura. Na dzień dzisiejszy do nowej wersji został przeniesiony poziom Borna oraz radiacja ze stanu końcowego (FSR). Poprawność implementacji została potwierdzona szeregiem testów numerycznych. Abstract This thesis is devoted to the implementation of the generator WINHAC++. This is a new, object–oriented version of the Monte Carlo generator WINHAC written in Fortran, which is used for modeling the charged Drella–Yan processes, taking into account the radiative corrections by exclusive Yennie–Frautschi–Suura exponentiation. At present, the Born level and the final–state radiation (FSR) has been included into the new version. The correctness of the implementation has been confirmed in a series of numerical tests. Spis treści Wstęp 4 1 Teoria 1.1 Proces 1.1.1 1.1.2 1.2 Proces 1.2.1 1.2.2 1.2.3 . . . . . . . 5 5 5 6 6 6 7 8 . . . . . . . . . . . . . . . . . 10 11 11 12 12 12 12 13 13 13 14 14 15 15 15 17 18 18 . . . . . . . . 20 20 21 21 21 21 21 21 21 Drella–Yana . . . . . . . . . . . . Wprowadzenie . . . . . . . . . . . Przekrój czynny . . . . . . . . . . partonowy . . . . . . . . . . . . . Poziom Borna, amplitudy spinowe Poprawki radiacyjne O(α) . . . . Eksponencjacja YFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Algorytm Monte Carlo 2.1 Inicjalizacja . . . . . . . . . . . . . . . . . . . . . 2.1.1 Uproszczony przekrój czynny . . . . . . . 2.2 Generacja kwarków . . . . . . . . . . . . . . . . 2.2.1 Poziom partonowy . . . . . . . . . . . . . 2.2.2 Poziom hadronowy . . . . . . . . . . . . . 2.3 Generacja procesu twardego . . . . . . . . . . . . 2.3.1 Generacja leptonu i neutrina . . . . . . . . 2.3.2 Generacja kątów leptonu . . . . . . . . . . 2.3.3 Generacja twardych fotonów . . . . . . . . 2.3.4 Konstrukcja kinematyki . . . . . . . . . . 2.3.5 Wagi „crude” . . . . . . . . . . . . . . . . 2.4 Obliczanie wag modelowych . . . . . . . . . . . . 2.4.1 Poziom Borna . . . . . . . . . . . . . . . . 2.4.2 Poprawki radiacyjne . . . . . . . . . . . . 2.5 Kumulowanie statystyk . . . . . . . . . . . . . . 2.6 Opcjonalna obsługa przypadku przez użytkownika 2.7 Finalizacja . . . . . . . . . . . . . . . . . . . . . 3 Projekt oraz implementacja 3.1 Źródła programu oraz dokumentacja techniczna 3.2 Pakiety zewnętrzne . . . . . . . . . . . . . . . . 3.2.1 Xerces-C . . . . . . . . . . . . . . . . . 3.2.2 FOAM . . . . . . . . . . . . . . . . . . . . 3.2.3 CLHEP . . . . . . . . . . . . . . . . . . . 3.2.4 SANC . . . . . . . . . . . . . . . . . . . . 3.2.5 LHAPDF . . . . . . . . . . . . . . . . . . . 3.2.6 ROOT – opcjonalnie . . . . . . . . . . . . 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 22 22 22 23 24 24 25 25 27 28 28 35 4 Testy 4.1 Przekroje czynne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Histogramy obserwabli . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 36 37 Podsumowanie 44 Podziękowania 44 A Struktura katalogów pakietu WINHAC++ 45 B Instalacja pakietu WINHAC++ 47 C Wydruk programu Demo 49 3.3 3.4 3.5 3.6 3.2.7 Doxygen – opcjonalnie . . . . . . . . . . Budowanie pakietu WINHAC++ . . . . . . . . Wejście–wyjście . . . . . . . . . . . . . . . . . . 3.4.1 Wejście . . . . . . . . . . . . . . . . . . 3.4.2 Wyjście . . . . . . . . . . . . . . . . . . Struktura obiektowa . . . . . . . . . . . . . . . 3.5.1 Klasa Event . . . . . . . . . . . . . . . . 3.5.2 Nadrzędna klasa Manager i jej pochodna 3.5.3 Interfejs ProcessHandler i jego pochodne 3.5.4 Interfejs PDF i jego pochodne . . . . . 3.5.5 InitializationHandler – inicjalizacja . . . Demo . . . . . . . . . . . . . . . . . . . . . . . 3.6.1 Skrypty dla farm komputerowych . . . . 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WINHAC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wstęp W niniejszym opracowaniu opisuję wyniki mojej dwuletniej pracy nad nową obiektową wersją fortanowskiego generatora Monte Carlo WINHAC [1], która nazwana została WINHAC++. Nowy generator został zaimplementowany w języku C++. Nadano mu nową obiektową strukturę. Generator służy do modelowania naładowanych procesów Drella– Yana (DY) z uwzględnieniem poprawek radiacyjnych przy użyciu schematu ekskluzywnej eksponencjacji Yennie–Frautschi–Suura. Proces DY jest wyraźnie widoczny w akceleratorach hadronowych takich jak Tevatron (Fermilab, USA) czy uruchomiony obecnie Large Hadron Collider (CERN, Europa). Służy on do precyzyjnego wyznaczania parametrów modeli teoretycznych (np. Modelu Standardowego), czy też szukania „nowej fizyki”. Proces ten używany jest między innymi do precyzyjnego wyznaczania masy i szerokości bozonu W oraz badania funkcji rozkładu partonów w hadronach (PDF). Bardzo ważne jest uwględnienie poprawek radiacyjnych, które w wyraźny sposób wpływają na rozkłady obserwabli, między innymi masy transwersalnej bozonu W , czy pędu poprzecznego powstającego w rozpadzie naładowanego leptonu. Generator, przy użyciu technik Monte Carlo, produkuje, w oparciu o model teoretyczny, przypadki zdarzeń zachodzących podczas oddziaływania cząstek. W ten sposób można uzyskać symulację procesów zachodzących podczas prawdziwego eksperymentu. Techniki Monte Carlo pozwalają w prosty sposób uwzględniać ograniczenia detektorów poprzez nakładanie odpowiednich cięć kinematycznych. Podczas realizacji projektu szczególną uwagę poświecono analizie funkcjonalności oraz projektowi struktury obiektowej generatora, którą następnie implementowano przy użyciu współczesnych technologii informatycznych. Gotowy kod poddano szeregowi testów numerycznych, które potwierdziły zgodność nowej implementacji z jej pierwowzorem napisanym w języku Fortran. Pracę podzieliłem na cztery rozdziały. W rozdziale 1 przybliżam opis teoretyczny procesów DY, w rozdziale 2 omawiam algorytm Monte Carlo generatora, w rozdziale 3 przedstawiam szczegóły procesu projektowania i implementacji pakietu WINHAC++, zaś w rozdziale 4 przedstawiam wybrane wyniki uzyskane podczas testów numerycznych generatora. 4 Rozdział 1 Teoria 1.1 1.1.1 Proces Drella–Yana Wprowadzenie Proces Drella–Yana (DY) zachodzi przy wysokoenergetycznych zderzeniach hadron– hadron. Został on zaproponowany przez Sidneya Drella oraz Tung-Mowa Yana w 1970 roku [2]. Pierwsze obserwacje tego procesu zanotowano podczas rozpraszania wysokoenergetycznych protonów na jądrach uranu [3]. Proces ten zachodzi podczas zderzeń hadronów. Wówczas kwark z jedngo hadronu anihiluje z antykwarkiem z drugiego hadronu dając bozon pośredniczący. Rozróżnia się dwa rodzaje procesów DY: zachodzące przez prądy naładowane (wówczas bozonem pośredniczącym jest W + lub W − , patrz rysunek 1.1a) oraz zachodzące przez prądy neutralne (bozony pośredniczące to γ oraz Z, patrz rysunek 1.1b). Bozon rozpada się na parę naładowanych elektrycznie leptonów (prąd neutralny) lub na naładowany lepton i odpowiadające mu neutrino (prąd naładowany). Generator WINHAC++ realizuje naładowane procesy Drella–Yana. (a) Prąd naładowany (b) Prąd neutralny Rysunek 1.1: Proces Drella–Yana [4]. W dalszej części pracy będę rozważać naładowany proces Drella–Yana oraz będę nazywać pełny proces jako proces na poziomie hadronowym, zaś anihilację pary kwarków do pary lepton–neutrino będę nazywać procesem na poziomie partonowym. 5 1.1.2 Przekrój czynny Drell i Yan zauważyli, że przekrój czynny dla pełnego procesu może być wyrażony jako konwolucja przekroju czynnego na poziomie partonowym z funkcjami rozkładu partonów w hadronach (PDF – Parton Distribution Functions) oraz wysumowanie po zapachach kwarków [5]. Można to zapisać równaniem: σ= XZ dx1 dx2 fqA (x1 )fq̄B (x2 ) + (q ↔ q̄) σbqq̄→lν̄ , (1.1) q,q̄ gdzie 0 ¬ x1 , x2 ¬ 1 to ułamki pędów hadronów unoszone przez kwarki, fqA , fq̄B to PDFy kwarku i antykwarku pochodzącego odpowiednio z hadronu A i hadronu B (np. dla LHC A = p, B = p; dla Tevatronu A = p, B = p̄), zaś σbqq̄→lν̄ to przekrój czynny dla procesu na poziomie partonowym. Rysunek 1.2 przedstawia schemat tego mechanizmu. Rysunek 1.2: Proces Drella–Yana — schemat mechanizmu obliczania przekroju czynnego. 1.2 Proces partonowy W tym podrozdziale przybliżam proces partonowy realizowany przez program WINHAC. Znajdują się tutaj najważniejsze rezultaty otrzymane przez W. Płaczka oraz S. Jadacha [1], które są podstawą generatora WINHAC oraz jego obiektowej wersji WINHAC++. 1.2.1 Poziom Borna, amplitudy spinowe W najniższym rzędzie rozważany proces partonowy jest opisywany diagramem Feynmana przedstawionym na rysunku 1.3. Kwark oraz antykwark anihilują do bozonu W + lub W − , zgodnie z zachowaniem ładunku, następnie bozon rozpada się w lepton (antylepton) oraz antyneutrino (neutrino). Rysunek 1.3: Produkcja bozonu W na poziomie Borna. 6 Stosując reguły Feynmana, które można znaleźć w większości podręczników teorii pola, można obliczyć element macierzowy odpowiadający temu diagramowi. Zaś przekrój czynny jest proporcjonalny do kwadratu tego elementu macierzowego. Istnieje jednak lepsza droga do obliczania elementów macierzowych, a mianowicie amplitudy spinowe, które są swego rodzaju klockami do budowy elementów macierzowych. Pokażę to na przykładzie wyżej wymienionego diagramu. Diagram jest dekomponowany (rysunek 1.4) na wysumowane po polaryzacjach bozonu pośredniczącego amplitudy spinowe, odpowiadające produkcji oraz rozpadowi tego bozonu. Należy to jeszcze przemnożyć przez propagator bozonu. Rysunek 1.4: Dekompozycja diagramu na amplitudy spinowe; Q – czteropęd bozonu, λ – polaryzacja bozonu. Formalnie można to wyrazić za pomocą równania: M(0) (σ1 , σ2 ; τ1 , τ2 ) = X 1 (0) (0) MP (σ1 , σ2 ; λ)MD (λ; τ1 , τ2 ), 2 2 2 Q − MW + iγW (Q ) λ (1.2) gdzie σ1 , σ2 = ±1 to stany helicity wchodzących kwarków, τ1 , τ2 = ±1 to stany helicity (0) wychodzącego leptonu i neutrina, Q to czteropęd bozonu, MW to masa bozonu, MP (0) oraz MD oznaczają amplitudy spinowe odpowiednio dla produkcji (P) oraz rozpadu (D), λ oznacza polaryzację bozonu, zaś ( 2 γW (Q ) = ΓW MW Q2 ΓW /MW w schemacie stałej szerokości, w schemacie biegnącej szerokości. (1.3) Wyrażenia na wyżej wymienione amplitudy można znaleźć w pracy [1]. Zastosowanie amplitud spinowych jest korzystne, ponieważ jest łatwe w implementacji. Po drugie mając skonstruowane odpowiednie amplitudy spinowe, można z nich składać różne diagramy bez konieczności wielokrotnego obliczania tych samych wyrażeń. Amplitudy spinowe są sercem generatorów WINHAC oraz WINHAC++. W obiektowej wersji powstała specjalna klasa (SpecialMatrix [6]) realizująca dowolne amplitudy spinowe. 1.2.2 Poprawki radiacyjne O(α) Fotony wirtualne i miękkie Fotony wirtualne i miękkie realne uwzględniane są analitycznie poprzez odpowiednie czynniki mnożące amplitudy (patrz rozdział 2.2.1 w [1]). 7 Radiacja twardego fotonu Radiacja twardego realnego fotonu może następować z linii naładowanej cząstki. Może to być linia któregoś z kwarków (mówimy wtedy o radiacji ze stanu początkowego, ISR), linia wychodzącego leptonu (radiacja ze stanu końcowego, FSR) lub linia naładowanego bozonu. Jak pokazano w rozdziale 2.2.2 w [1] radiacja z linii naładowanego bozonu może być podzielona na dwie części – jedna jest uwzględniana w amplitudzie dla produkcji wraz z ISR, zaś druga w amplitudzie dla rozpadu wraz z FSR. Generator WINHAC realizuje radiację FSR oraz interferencję FSR z ISR. Na dzień dzisiejszy do generatora WINHAC++ została przeniesiona radiacja FSR, pozostała do przeniesienia interferencja ISR z FSR. Rysunek 1.5 przedstawia wkłady do amplitudy spinowej dla rozpadu, które po połączeniu z amplitudą dla produkcji na poziomie Borna dają wkład O(α) do rozważanego procesu. Rysunek 1.5: Wkłady do amplitudy spinowej rozpadu z pojedynczą radiacją twardego fotonu. Stosując reguły Feynmana można otrzymać (patrz rozdział 2.2.2 w [1]) wyrażenie (1) na amplitudę spinową dla rozpadu MD (λ, τ1 , τ2 , κ), gdzie nowy parametr κ = 1, 2 to polaryzacja fotonu. Następnie składając to z amplitudą dla produkcji na poziomie Borna dostaje się element macierzowy: M(1) (σ1 , σ2 ; τ1 , τ2 , κ) = 1.2.3 X 1 (0) (1) MP (σ1 , σ2 ; λ)MD (λ; τ1 , τ2 , κ). 2 2 2 Q − MW + iγW (Q ) λ (1.4) Eksponencjacja YFS Głównym celem generatora WINHAC jest symulacja procesu produkcji bozonu W z wielofotonową radiacją, patrz rysunek 1.6. W tym celu został użyty schemat ekskluzywnej eksponencjacji Yennie–Frautschi–Suura (YFS) [7]. Rozważany jest proces: q1 (p1 ) + q2 (p2 ) → W± (Q) → l(ql ) + ν̄(qν ) + γ(k1 ) + · · · + γ(kn ), n = 0, 1, . . . . (1.5) Całkowity przekrój czynny po zastosowaniu eksponencjacji dany jest wyrażeniem: σY F S = ∞ Z X n=0 d3 ql d3 qν (1) ρ (p1 , p2 , ql , qν , k1 , . . . , kn ), ql0 qν0 n gdzie 8 (1.6) Rysunek 1.6: Wielofotonowa radiacja w rozpadzie W [1]. ρ(1) n Y (Q,ql ;ks ) =e n n X 1 Y d3 ki 0 (4) S̃(Q, q , k )θ(k − k )δ p + p − q − q − ki l i s 1 2 l ν i n! i=1 ki0 i=1 (1) × β̄0 (p1 , p2 , ql , qν ) + ! (1) n X β̄1 (p1 , p2 , ql , qν , ki ) i=1 S̃(Q, ql , ki ) (1.7) , 2 Q ql gdzie S̃(Q, ql , k) = − 4πα2 kQ − kq jest czynnikiem odpowiadającym radiacji miękkich l fotonów; Y (Q, ql ; ks ) to czynnik postaci (ang. form factor ) YFS zawierający zregularyzowane osobliwości podczerwone; ks ECM jest granicą miękkich fotonów, tzn. realne fotony o energii poniżej progu są uwzględnione w analitycznych czynnikach, zaś powyżej są generowane przy użyciu technik Monte Carlo, wyniki nie zależą od ks . Funkcje (1) (1) β̄0 oraz β̄1 są funkcjami pozbawionymi osobliwości podczerwonych wyrażonymi przez elementy macierzowe do rzędu O(α) oraz wcześniej wspomniane poprawki wirtualne. 1 1 X 1 (0) 2 β̄0 = |M(0) | , 2 2 16s(2π) 12 (1) (1.8) h (0) i β̄0 (p1 , p2 , ql , qν ) = β̄0 (p1 , p2 , ql , qν ) 1 + δ (1) (Q, ql , qν ) , δ (1) = (1) δQED + (1) δweak , (1) δQED α M 1 = ln + . π ml 2 (1.9) (1.10) (1) Poprawka δweak jest dostarczana przez zewnętrzny pakiet SANC, patrz [8]. (1) β̄1 (p1 , p2 , ql , qν , k) = 1 1 X 2 (0) |M(1) | − S̃(Q, ql , k)β̄0 (p1 , p2 , ql , qν ) 5 16s(2π) 12 (1) (1) (1.11) Dokładne wyprowadzenie β̄0 oraz β̄1 , jak również pozostałe interesujące szczegóły można znaleźć w rozdziale 3 w pracy [1]. 9 Rozdział 2 Algorytm Monte Carlo Podstawowym zadaniem generatora WINHAC++ jest wygenerowanie pojedynczego przypadku (zdarzenia) mającego symulować (modelować) realną sytuację zachodzącą przy zderzaniu cząstek. Proces generacji przebiega w następujący sposób: • generacja parametrów zdarzenia z uproszczonych rozkładów, • kompensacja uproszczeń poprzez obliczenie wag korekcyjnych. Wygenerowany przypadek zawiera następujące informacje: • czteropędy oraz rodzaje cząstek (PDG id): – zderzanych hadronów, – reszt zderzanych hadronów, – kwarków biorących udział w procesie partonowym, – bozonu pośredniczącego, – naładowanego leptonu, – neutrina, – twardych fotonów; • wicrude – wagi tzw. surowe („crude”), pochodzące z generacji partonów i konstrukcji kinematyki procesu; • wjmodel – wagi modelowe, pochodzące z obliczania dokładnych elementów macierzowych dla różnych modeli teoretycznych, efektów itd.; • całkowity uproszczony przekrój czynny σ crude , wspólny dla wszystkich przypadków generowanych w jednym uruchomieniu generatora. Całkowitą wagę przypadku oblicza się poprzez wymnożenie przekroju czynnego „crude” przez wagi „crude” oraz przez wybraną wagę modelową (lub kombinację wag modelowych), w zależności od tego jakie efekty chce się uwzględnić: wjevent = σ crude Y wicrude wjmodel . (2.1) i Proces generacji można podzielić funkcjonalnie na pewne fazy (mają one odbicie w strukturze obiektowej generatora). Są to: 10 • inicjalizacja; • właściwa generacja pewnej ilości zdarzeń: – generacja kwarków, – generacja naładowanego leptonu, neutrina oraz fotonów, konstrukcja kinematyki procesu, – obliczanie wag modelowych, – kumulowanie statystyk, – opcjonalna obsługa przypadku przez użytkownika; • finalizacja. Etap generacji kwarków może być wyłączony, wtedy generowany jest sam proces na poziomie partonowym. 2.1 Inicjalizacja Ten etap jest wykonywany raz, przy uruchamianiu generatora. Tutaj ustawiane są wszelkie stałe fizyczne i inne parametry programu. Na tym etapie obliczany jest uproszczony przekrój czynny (σ crude ). 2.1.1 Uproszczony przekrój czynny Poziom partonowy W przypadku rozważania tylko procesu partonowego całkowity przekrój czynny „crude” dany jest wzorem: σ crude π =N 36 αef f VijCKM sin2 θW !2 s 2 2 (s − MW ) + γ(s) (2.2) gdzie: ( γ(s) = (ΓW MW )2 ΓW 2 ) (s M W w schemacie stałej szerokości, w schemacie biegnącej szerokości, (2.3) s to zmienna Mandelstama (w tym przypadku równa kwadratowi czteropędu bozonu), VijCKM to element macierzy CKM [5] odpowiadający mieszaniu wybranych kwarków, θW to kąt Weinberga, zaś N to czynnik normalizacyjny zależny od liczby rodzin leptonów oczekiwanych w stanie końcowym, występuje tu też konwersja jednostek z GeV −2 do nb (nanobarn): N = Conv GeV −2 →N b N final lepton families , N final lepton families = 1, 2, 3 dla jednej, dwóch, trzech rodzin leptonów; (2.4) (2.5) zaś efektywna stała sprzężenia: ( αef f = α αGµ = √ w schemacie α, 2 sin2 θ 2Gµ MW W π 11 w schemacie Gµ . (2.6) Poziom hadronowy Na poziomie hadronowym konstruuje się konwolucję (równanie 1.1) przekroju partonowego z funkcjami rozkładu partonów w hadronach (PDF). W tym celu tworzy się dwuwymiarowy rozkład prawdopodobieństwa zbudowany z przekroju 2.2 (bez czynnika normalizacyjnego, który będzie domnożony później), PDFów oraz macierzy CKM, patrz klasa ppWintegrand w [6]. Otrzymaną funkcję całkuje się (używając do tego pakietu FOAM, patrz [9][10]) po kwadracie [0, 1]2 otrzymując σ FOAM . Ostatecznie σ crude = N σ FOAM . 2.2 2.2.1 (2.7) Generacja kwarków Poziom partonowy W przypadku wyłączenia części hadronowej generatora i badania samego procesu partonowego ta część programu ustawia tylko czteropędy kwarków w układzie własnym bozonu W . Wtedy zwracana jest waga: crude wgen.quarks = 1. 2.2.2 (2.8) Poziom hadronowy Przy rozważaniu pełnego procesu, do generowania kwarków używa się adaptacyjnego generatora FOAM [9][10]. Korzystając z wcześniej wspomnianej funkcji gęstości prawdopodobieństwa losuje się parę liczb x1 , x2 będącymi ułamkami pędów unoszonymi z hadronów przez kwarki. W funkcji gęstości prawdopodobieństwa została zrobiona zamiana zmiennych mająca na celu zwiększenie wydajności generowania. Następnie w oparciu o wyewoluowane w trakcie tej generacji PDFy losuje się zapachy oraz ładunki kwarków, które determinują jednoznacznie jaki bozon powstanie z wylosowanej pary kwarków. W oparciu o wygenerowane x1 oraz x2 konstruowane są czteropędy kwarków, a następnie czteropędy w układzie własnym bozonu. Waga z tej części procesu powstaje z wagi zwróconej przez FOAM oraz wagi z konstrukcji kinematyki: crude wgen.quarks = wFOAM wkin , ( w 2.3 kin = 0: 1: któryś z kwarków poza przestrzenią fazową, w przeciwnym razie. (2.9) (2.10) Generacja procesu twardego Jako wejście dla tej części generacji otrzymywany jest bozon i kwarki. Tutaj generowana jest rodzina leptonów, twarde fotony oraz konstruowana jest kinematyka rozpadu W . Całość rozważana jest w układzie własnym bozonu gdzie trójpędy kwarków skierowane są wzdłóż osi z: 12 p1 = (E1 , 0, 0, p) p2 = (E2 , 0, 0, −p) Q = (E1 + E2 , 0, 0, 0) kwark antykwark bozon (2.11) (2.12) (2.13) Na końcu przeprowadzana jest transformacja Lorentza do układu laboratoryjnego. 2.3.1 Generacja leptonu i neutrina W zależności od ustawień generatora w stanie końcowym może być otrzymywana od jednej do trzech rodzin leptonów, tj. elektrony, miony, tau’y. Generacja odbywa się z rozkładu równomiernego, tj. każda rodzina ma jednakowe prawdopodobieństwo wylosowania. Ładunek leptonu jest jednoznacznie określony przez wytworzony bozon W , zaś neutrino determinuje zachowanie liczby leptonowej. Dozwolone są rozpady: W 2.3.2 + e+ + νe → µ+ + νµ , + τ + ντ W − e− + ν̄e → µ− + ν̄µ . − τ + ν̄τ (2.14) Generacja kątów leptonu Aby skonstruować kinematykę generowane są dwa kąty opisujące położenie czteropędu emitowanego leptonu. Są to standardowe kąty w układzie współrzędnych sferycznych, θ – kąt polarny oraz φ – kąt azymutalny. Kąt azymutalny generowany jest z rozkładu jednorodnego na przedziale [0, 2π), zaś polarny z uproszczonego rozkładu: φ ∈ U[0, 2π), 1 cos(θ) = QW (1 − 2(X) 3 ), 2.3.3 (2.15) ( X ∈ U[0, 1), QW = + W . W− +1 : −1 : (2.16) Generacja twardych fotonów Liczba fotonów generowana jest przez generator rozkładu Poissona. Ponadto generator ten wykorzystywany jest do produkcji liczb losowych, z których konstruuje się czteropędy fotonów. Wynikiem działania tego generatora jest krotność N fotonów oraz liczby ri , i = 1, . . . , N . Moduły czteropędów fotonów (równe ich energiom) konstruuje się w następujący sposób: √ |~ki | = Eiγ = γ Q2 2Emin 1 CM CM 2 E max(2E1 /E , 2E2 /E CM ) " #ri (2.17) γ gdzie Emin to granica miękkich fotonów, E CM energia zderzenia w układzie środka masy wiązek. 13 2.3.4 Konstrukcja kinematyki Poziom Borna Kinematyka produkcji pary leptonów bez radiacji jest standardową kinematyką procesu 2 → 2. Do sparametryzowania jej wystarczają wygenerowane kąty leptonu. El = (E1 + E2 )2 + m2l − m2ν , 2(E1 + E2 ) (2.18) q q = |~ql | = [(E1 + E2 )2 − (ml + mν )2 ] [(E1 + E2 )2 − (ml − mν )2 ] 2(E1 + E2 ) ql = (El , q sin θ cos φ, q sin θ sin φ, q cos θ), , (2.19) (2.20) qν = p 1 + p2 − ql . (2.21) Poprawki radiacyjne Na początku kinematyka konstruowana jest w układzie, w którym trójpęd leptonu skierowany jest wzdłóż osi z. W tym układzie generowane są kąty polarne (θi ) i azymutalne (φi ) trójpędów fotonów z uproszczonego rozkładu. Ponieważ czteropędy fotonów są już ustalone, kinematyka konstruowana jest jako proces 2 → 3, gdzie oprócz naładowanego leptonu i neutrina pojawia się suma czteropędów fotonów. Rozważając ten (3) proces można dojść do równań na El oraz pl : (3) 2 El2 − pl = m2l , (1) 2 γ (E1 + E2 − Etot − El )2 = m2ν + ktot (2.22) (2) 2 + ktot (3) + ktot + pl 2 , (2.23) czteropęd neutrina uzyskuje się przez: qν = Q − pl − ktot . (2.24) Ostatecznie wszystkie skonstruowane czteropędy obracane są tak, aby wektor pędu leptonu był ustawiony pod kątami wygenerowanymi wcześniej. 2.3.5 Wagi „crude” Poziom Borna crude Na poziomie Borna nie ma przybliżeń, więc waga „crude” z tego etapu whard = 1. Poprawki radiacyjne Gdy uwzględniane są poprawki radiacyjne na wagę „crude” z tego etapu składa się pięć wag korekcyjnych: f in crude whard = wY wS wP S wm wkin . (2.25) Waga wY koryguje uproszczenia w czynniku postaci YFS, wS koryguje uproszczenia w S̃ z równania 1.7 (dla FSR wS = 1), wP S odpowiada wycałkowaniu delty zachowania czteropędu po przestrzeni fazowej, wm kompensuje opuszczenie wyrazów masowych f in przy generowaniu kątów fotonów, a wkin to waga kinematyczna dla stanu końcowego f in (wkin = 0/1, gdy przypadek jest poza/w przestrzeni fazowej). 14 2.4 Obliczanie wag modelowych Wagi modelowe korygują uproszczenia w elementach macierzowych użytych do wyprodukowania uproszczonego przekroju czynnego. Z wag modelowych wybiera się jedną lub kombinację kilku wag (w zależności od pożądanych efektów) i mnożąc ją przez wagi z poprzednich etapów dostaje się pełną wagę zdarzenia. model , która odpowiada najlepszemu przewidywaDodatkowo ustawiana jest waga wbest niu oferowanemu przez generator. Jest ona używana domyślnie do wyliczania pełnej wagi przypadku. Wagi te obliczane są w układzie własnym bozonu. 2.4.1 Poziom Borna model Na poziomie Borna obliczana jest jedna waga modelowa wborn . Otrzymuje się ją dzieląc dokładny różniczkowy przekrój czynny przez uproszczoną jego wersję dla konkretnego przypadku: dσ crude dσ (0) / , dΩl dΩl ! model wborn = ! (2.26) gdzie dσ crude 2 = dΩl 3 αef f VijCKM 8 sin2 θW !2 s(1 − QW cos θl )2 , 2 2 (s − MW ) + γ(s) (2.27) γ(s) dana jest równaniem 2.3. Dokładny przekrój czynny dany jest wzorem: dσ (0) 1 1 (0) 2 = M , dΩl 8(2π)2 s 12 (2.28) gdzie pojawia się dokładny element macierzowy uśredniony po kolorach i spinach cząstek początkowych. 2.4.2 Poprawki radiacyjne Eksponencjacja YFS Przy włączonych poprawkach radiacyjnych obliczane są funkcje β̄ (patrz równania 1.5 do 1.11): (0) β̄0 = (1) (2.29) uwzględnia poprawki elektrodynamiczne (QED); (2.30) (0) uwzględnia pełne poprawki elektrosłabe β̄0(EW ) = β̄0 (1 + δ QED + δ weak ), (1) odpowiada to wzorowi 1.8; (0) β̄0(QED) = β̄0 (1 + δ QED ), (1) dσ (0) dΩl (0) β̄0(LL) = β̄0 (1 + δ LL ), uwzględnia przybliżenie wiodących logarytmów: 15 (2.31) (2.32) δ ! √ 1α s = 2 ln −1 . 2π ml LL (2.33) (1) Następnie obliczana jest suma funkcji β̄1 widoczna w równaniu 1.7: (1) β̃1 (1) n X β̄1 (p1 , p2 , ql , qν , ki ) = S̃(Q, ql , ki ) i=1 . (2.34) (1) Dodatkowo obliczana jest β̃1 w przybliżeniu wiodących logarytmów: (1) β̃1(LL) = (1) n X zi2 , i=1 2(1 − zi ) (0) β̄0 2Eiγ zi = . E1 + E2 (2.35) (1) Z obliczonych funkcji β̃1 , β̄0 oraz uproszczonego przekroju czynnego (równanie 2.27) konstruowane są wagi modelowe. Obliczane są indywidualne stosunki tych funkcji do uproszczonego przekroju czynnego oraz następujące wagi: model wYFS O(α) = model wYFS O(α) EW = model wYFS O(α) QED model wLL O(α) QED = = dσ crude , dΩl ! (0) β̄0 / (1) β̄0(QED) (1) β̄0(EW ) (1) β̄0(LL) + + + (1) β̃1 (1) β̃1 (1) β̃1(LL) (2.36) dσ crude / , dΩl ! (2.37) dσ crude , / dΩl (2.38) dσ crude / . dΩl (2.39) ! ! Jako najlepsza waga, wybierana jest: model model wbest = wYFS O(α) EW (2.40) Rząd O(α) W celu obliczenia poprawek rzędu O(α) upraszcza się czynnik postaci YFS i uwzględnia się poprawki miękkie i wirtualne (patrz rozdział 2.2.1 w [1]). Oblicza się funkcje: (0) (0) dσ0 = β̄0 /eY (Q,ql ;ks ) , (2.41) (1) (0) (2.42) (0) (2.43) v+s dσ0(QED) = dσ0 (1 + δQED ), (1) v+s dσ0(EW ) = dσ0 (1 + δEW ), (1) dσ1 ! = dσ (1) / S̃(Q, ql , k)eY (Q,ql ;ks ) , dΩl (2.44) gdzie: dσ (1) 1 (1) 2 1 = M . dΩl 16(2π)5 s 12 16 (2.45) Z obliczonych funkcji definiuje się wagi modelowe: model wBorn model wO(α) QED model wO(α) EW = = = (1) dσ0(QED) (1) dσ0(EW ) model wBorn + virtual (QED) + soft model wBorn + virtual (EW) + soft model wOne photon 2.5 dσ crude , dΩl ! (0) dσ0 / = + (1) dσ1 dσ crude / , dΩl ! dσ crude / , dΩl + (1) dσ1 = (1) dσ0(QED) / = (1) dσ0(EW ) / (1) dσ1 / (2.46) (2.47) ! dσ crude , dΩl (2.48) ! dσ crude , dΩl (2.49) ! dσ crude . dΩl (2.50) ! (2.51) Kumulowanie statystyk Generator w trakcie generowania przypadków kumuluje statystyki wag zdarzeń. Informacje zbierane są dla: • indywidualnych wag, • wag wymienionych w sekcji 2.4, • iloczynów wszystkich wag modelowych z wagami „crude” – pełnych wag przypadku: Y wjevent = wicrude wjmodel , (2.52) i • najlepszej wagi przypadku: event wbest = Y model wicrude wbest . (2.53) i Przy generowaniu przypadków dla każdej z wymienionych wyżej wag zbierane są informacje: • P wi , • P wi2 , i i • N – ilość przypadków, • waga minimalna i maksymalna: wmin , wmax . Skumulowane statystyki posłużą później do wyliczania przekrojów czynnych. 17 2.6 Opcjonalna obsługa przypadku przez użytkownika Generator WINHAC++ pozwala na zbudowanie dodatkowej, własnej obsługi przypadków przez użytkownika. Jest ona wykonywana na końcu generacji każdego przypadku. Jako przykład demonstracyjny w wydanej wersji generatora zostało stworzone histogramowanie następujących obserwabli (kostruowanych w układzie LAB): • rapidity bozonu W : (3) yW 1 EW + pW , = ln 2 EW − p(3) W (2.54) • cosinus kąta polarnego leptonu: (3) p cos θl = l , |~ pl | (2.55) • pseudorapidity leptonu: ! θ ηl = − ln tan , 2 (2.56) • pęd poprzeczny leptonu: pTl = r (1) 2 (2) 2 pl + pl 2 (1) (1) , (2.57) • masa transwersalna bozonu W : mTW = r h (2) (2) i 2 (pTl ) − pl pν − pl pν , (2.58) • krotność fotonów nγ , • suma energii fotonów Eγtot , • energia najtwardszego fotonu Eγhardest , • pęd poprzeczny najtwardszego fotonu pTγ (hardest) , • pseudorapidity najtwardszego fotonu ηγhardest . 2.7 Finalizacja W procesie finalizacji przetwarzane są informacje zebrane w etapie opisanym w rozdziale 2.5. Obliczane są średnie wagi wraz z błędami statystycznymi (odchyleniami standardowymi): PN i=1 hwi = N 18 wi , (2.59) δ(w) = hwi v u u PN 2 u u i=1 wi t P 2 N i=1 wi 1 − . N (2.60) Wśród obliczonych średnich wag są wymienione wcześniej pełne wagi (rozdział 2.5) przypadku odpowiadające różnym typom poprawek/efektów. Z tych wag i przekroju czynnego „crude” konstruuje się pełny przekrój czynny rozważanego procesu: σitot = σ crude hwievent i, (2.61) δ(σitot ) = σ crude hwievent iδ(wievent ). (2.62) Najlepszą wartość całkowitego przekroju czynnego wylicza się korzystając z wagi model : wbest tot event σbest = σ crude hwbest i, (2.63) tot event event δ(σbest ) = σ crude hwbest iδ(wbest ). (2.64) 19 Rozdział 3 Projekt oraz implementacja WINHAC++ jest pakietem dostarczającym generator Monte Carlo, który może być używany przez użytkownika w jego własnym projekcie. Jego zadaniem jest produkowanie przypadków, które mogą być dalej obsługiwane przez użytkownika w dowolny sposób, np. przekazane innym generatorom. Finalnym produktem są trzy biblioteki dzielone (ang. shared libraries), które mogą być skonsolidowane (ang. linked ) z aplikacją użytkownika. W tym rozdziale omówię koncepcję implementacji generatora. Równolegle tworzony był przez Andrzeja Siódmoka bliźniaczy generator ZINHAC [11] do generowania procesów Drella–Yana przez prądy neutralne. Ponieważ oba generatory mają ze sobą wiele wspólnego, to we współpracy z Wiesławem Płaczkiem i Andrzejem Siódmokiem został opracowany w UMLu wstępny szkic struktury obu generatorów. Planowanie to okazało się bardzo ważnym etapem rozwoju pakietu WINHAC++, ponieważ dało mi pełny pogląd na oczekiwane funkcjonalności oraz trafnie nakreśliło przyszłą strukturę obiektową generatora. W dystrybucji generatora można odnaleźć tę pierwotną wersję struktury w katalogu vpproject (są to pliki pakietu Visual Paradigm [12]). Podczas modelowania zostały również podjęte decyzje o używanych pakietach zewnętrznych. W czasie implementacji zaszły drobne zmiany w planowanej strukturze, więc aktualna wersja generatora może różnić się nieco od założonej struktury, jednak główne idee zaproponowane na początku zostały zachowane. Projekt rozwijany był przy pomocy zintegrowanego środowiska programistycznego Eclipse [13]. W dodatku A można znaleźć strukturę katalogową pakietu WINHAC++, zaś w dodatku B zamieściłem instrukcję instalacji i uruchomienia programu. 3.1 Źródła programu oraz dokumentacja techniczna Dokumentacja techniczna oraz źródła programu dostępne są na stronie WWW [6]. Użytkownicy Subversion mogą skorzystać z repozytorium znajdującego się pod adresem [14]: $ svn c h e c k o u t h t t p : / / w i n h a c p l u s p l u s . g o o g l e c o d e . com/ svn / t r u n k / WINHAC 20 3.2 Pakiety zewnętrzne WINHAC++ używa pakietów zewnętrzych wymienionych poniżej. Część z nich powinna być dostępna w systemie operacyjnym, na którym chce się uruchamiać generator. 3.2.1 Xerces-C Zdecydowano, że główne pliki wejściowe będą w postaci XMLa. Główną przesłanką ku temu było to, że jest to dobrze zdefiniowany standard przechowywania danych. Drugą przesłanką była dostępność gotowych parserów do plików tego formatu. Zdecydowano, że będzie to Xerces-C [15]. Jest on dostarczany z generatorem WINHAC++ w postaci źródeł i w razie niewykrycia go w systemie operacyjnym jest on automatycznie budowany przy kompilacji. 3.2.2 FOAM Pakiet FOAM (patrz [9][10]) jest dobrze znanym narzędziem Monte Carlo. Jest używany do całkowania, jak również do generowania zdarzeń losowych z zadanej gęstości prawdopodobieństwa. Narzędzie to jest używane w fortranowskiej wersji generatora WINHAC. W pakiecie WINHAC++ jest używana wersja 2.06 (w C++), włączona w postaci źródeł. 3.2.3 CLHEP Część pakietu CLHEP jest włączona w postaci źródeł. Ten pakiet został wybrany, ponieważ miał dobrze wytestowane klasy obsługujące czterowektory oraz dobrze wytestowane generatory liczb losowych. Poza tym dzięki przejrzystej strukturze łatwo było wydobyć z niego interesujące klasy (próbowano tego samego z systemem ROOT, jednak z powodu zawiłości jego struktury szybko porzucono ten pomysł). Dodatkowo zmieniono interfejs generatorów liczb losowych tak, aby mógł go używać FOAM, tj. dodano dziedziczenie interfejsu z pakietu CLHEP po interfejsie używanym przez pakiet FOAM. 3.2.4 SANC Pakiet SANC dostarcza poprawki elektrosłabe do rozpadu bozonu W (patrz [8]). Jest on włączony w postaci źródeł fortranowskich. Została napisana nakładka (wrapper) pozwalająca na wywoływanie tego narzędzia z kodu w języku C++. 3.2.5 LHAPDF Pakiet LHAPDF dostarcza funkcje rozkładów partonów w hadronach (PDF). Ponieważ jest to duży pakiet, to nie jest on dołączany do generatora WINHAC++, należy zainstalować go samodzielnie w systemie operacyjnym. Dostępny jest na stronie [16]. 3.2.6 ROOT – opcjonalnie Pakiet ROOT [17] nie jest wymagany do działania generatora. Był on używany przy testach numerycznych do histogramowania. Jest on natomiast potrzebny do pełnego uruchomienia programu demonstracyjnego. 21 3.2.7 Doxygen – opcjonalnie Pakiet Doxygen [18] również nie jest wymagany do pracy generatora. Jest on wymagany do wygenerowania dokumentacji ze źródeł programu. Dokumentacja techniczna [6] jest wygenerowana tym narzędziem. 3.3 Budowanie pakietu WINHAC++ Do budowania pakietu WINHAC++ postanowiono użyć nowoczesnego systemu budowania CMake [19]. Narzędzie to jest następcą Autotools (GNU Build System). Cechuje się prostotą i wysoką konfigurowalnością. Korzystają z niego takie znane pakiety jak: Boost C++ Libraries, KDE 4, MySQL oraz wiele, wiele innych. Zasada działania jest prosta. Programista przygotowuje proste skrypty zawierające informacje o strukturze projektu i zależnościach. Następnie należy wywołać: $ cmake . w katalogu budowanego projektu. Zaowocuje to sprawdzeniem konfiguracji systemu operacyjnego i wygenerowaniem plików Makefile dla narzędzia make. W przypadku niespełniania wymagań przez system operacyjny użytkownika zostanie wyrzucony błąd. Ponadto CMake potrafi generować konfigurację dla zintegrowanych środowisk programistycznych, takich jak Eclipse czy Microsoft Visual Studio. W repozytorium [14], jak i w archiwach z dystrubucją pakietu WINHAC++ znajdują się wygenerowane pliki konfiguracyjne dla Eclipse. 3.4 Wejście–wyjście Przed inicjalizacją generatora należy podać mu ścieżki do katalogu z danymi wejściowymi oraz sprecyzować ścieżkę, do której ma być zapisane wyjście generatora (patrz sekcja 3.6). 3.4.1 Wejście Wejście generatora podzielone jest na kilka plików. Większość z nich została stworzona w XML, poza plikiem z ziarnem generatora liczb losowych, ze względu na wygodę przy używaniu generatora na farmach obliczeniowych. Predefiniowane pliki wejściowe można znaleźć w katalogu input w wersji dystrybucyjnej generatora, jest to katalog wzorcowy. InputData.xml, UserFile.xml Są to główne pliki wejściowe generatora. W pliku InputData.xml zawarte są wszystkie (poza ziarnem generatora) ustawienia generatora WINHAC++ (dokumentacja dostępna na [6]). Plik ten nie powinien być modyfikowany przez użytkownika, gdyż grozi to nieprawidłowym działaniem generatora. 22 Dla użytkownika udostępniono wzorzec pliku (UserFile.xml ) służącego do wprowadzania własnych ustawień. Polega to na tym, że plik użytkownika jest podzbiorem pliku głównego. Następnie tagi występujące w pliku głównym są w odpowiedni sposób podmieniane tymi, które zdefiniowane zostały w pliku użytkownika. Generatorowi należy podać ścieżkę do pliku ze swoimi ustawieniami, w przeciwnym razie zostaną zastosowane ustawienia domyślne. W trakcie inicjalizacji tworzone jest echo wczytanych parametrów, tak aby użytkownik mógł sprawdzić czy poprawnie przygotował swój plik. ParticleDataBase.xml Jest to plik z danymi używanych w programie cząstek. Zawarto w nim ekstrakt danych z pliku generatora Pythia [20]: ParticleData.xml. Aby zmienić dane cząstek należy go edytować. seed.dat Plik zawierający ziarno generatora liczb losowych – liczbę typu long. semaphore W przypadku generowania zdarzeń metodą generateEvents(double NbEvents) sterowanie procesem odbywa się przez plik semaphore/semaphore w katalogu wejściowym. Jeśli użytkownik używa metody generateEvent() (generującej jedno zdarzenie), to również może używać tego pliku, jednak wtedy musi sam wywołać odpowiednie metody udostępniane przez generator. Semafor może mieć trzy stany: • continue – nie zatrzymuj generacji, • stop – zatrzymaj generację, zrzuć wyniki, • resume – wznów generację ze zrzutu danych innej (wymaga obecności zrzutu danych w katalogu wyjściowym). W przypadku ręcznego wznawiania generatora należy ustawić semafor na resume i użyć odpowiedniej metody. 3.4.2 Wyjście Pliki wyjściowe zrzucane są do wcześniej ustawionego katalogu. Ponadto pliki niezbędne do wznowienia pracy generatora zrzucane są do podkatalogu snapshots co 105 zdarzeń w przypadku generowania metodą generateEvents(double NbEvents). Użytkownik nie korzystający z tej metody może samodzielnie wywołać zrzucanie tych plików używając odpowiedniej metody generatora. Przy zapisywaniu nowych plików robione są kopie zapasowe starych. generator.dat Do tego pliku zrzucany jest stan generatora liczb losowych, służący do wznawiania go. Jest to realizowane dzięki wbudowanej funkcjonalności generatorów z pakietu CLHEP. 23 MonitorsBackup.dat Do tego pliku zrzucane są niezbędne dane potrzebne do wznowienia monitorów wag. numberOfEvents.dat Do tego pliku zapisywana całkowita liczba wygenerowanych przypadków. XSections.dat Do tego pliku zrzucane są wszystkie obliczane przekroje czynne wraz z błędami statystycznymi, w postaci: nazwa : w a r t o s c : b l a d InputEcho.xml Plik tworzony przez parser Xerces-C zawierający ustawienia, jakie zostały wczytane z plików wejściowych. XSectionCrude.dat Plik zawierający uproszczony przekrój czynny w formacie: wartosc : blad histograms.root (tylko w programie demonstracyjnym) Plik zawiera zserializowane obiekty histogramów pakietu ROOT używanych w programie demonstracyjnym. W innych przypadkach plik ten nie występuje. 3.5 Struktura obiektowa Zaprojektowana struktura obiektowa została w pełni oparta na analizie algorytmu realizowanego przez generator (patrz rozdział 2). Algorytm został funkcjonalnie zdekomponowany na odpowiednie interfejsy i klasy. Klasy generatora znajdują się w przestrzeni nazw VINHAC. Pełną strukturę obiektową można znaleźć w dokumentacji technicznej [6]. Tutaj przybliżę tylko najważniejsze jej składniki. 3.5.1 Klasa Event Klasa Event jest prostą klasą będącą nośnikiem informacji o przypadku. Zawiera w sobie obiekty reprezentujące cząstki biorące udział w zdarzeniu oraz informację o 24 obliczonych wagach. Dostęp do większości składowych przypadku realizowany jest przez referencję ze względów wydajnościowych. Dodatkowo klasa posiada dwie metody: s t r i n g printInLabFrame ( ) ; s t r i n g printInQuarksCMSFrame ( ) ; zwracające sformatowane napisy zawierające informacje o czteropędach i rodzajach cząstek w układzie laboratoryjnym (LAB) i w układzie środka masy (CMS) zderzających się kwarków. 3.5.2 Nadrzędna klasa Manager i jej pochodna WINHAC Klasa Manager początkowo była planowana jako wspólny rdzeń generatorów WINHAC++ oraz ZINHAC. Oba generatory miały mieć bardzo podobny przepływ sterowania, stąd był powód takiego planowania. Jednak wraz z upływem czasu oba projekty ewoluowały osobno i nie wiadomo czy będzie to potrzebne. Klasa WINHAC rozszerza Manager i w ten sposób staje się podstawową klasą używaną przez użytkownika. Aby korzystać z generatora należy utworzyć instancję klasy WINHAC. Obiekt klasy Manager jest, jak sama nazwa wskazuje, odpowiedzialny za tworzenie i uruchamianie wewnętrzych obiektów klas, m. in. takich jak: • InitializationHandler — odpowiada za przeprowadzenie inicjalizacji generatora • implementujących interfejs ProcessHandler — odpowiadają za generowanie przypadku; generator posiada wektor takich obiektów, na których jest wywoływana metoda eventEvolve, sukcesywnie prowadząc do stworzenia przypadku. Najważniejszą metodą udostępnioną użytkownikowi jest: Event g e n e r a t e E v e n t ( ) ; Generator wytwarza w niej jeden przypadek i zwraca go użytkownikowi, który może następnie przy pomocy metod klasy Event wyciągnąć z niej wszelkie informacje. Z punktu widzenia użytkownika innymi ważnymi metodami są: void a d d P r o c e s s H a n d l e r (VINHAC : : P r o c e s s H a n d l e r ∗ h a n d l e r ) ; void r e m o v e P r o c e s s H a n d l e r ( s t r i n g Name ) ; umożliwiające dodawanie własnych obiektów sterowania procesem generacji. 3.5.3 Interfejs ProcessHandler i jego pochodne Interfejs ProcessHandler został wyspecyfikowany w celu ujednolicenia dostępu poszczególnych modułów programu do generowanego przypadku. 25 class ProcessHandler { private : s t r i n g handlerName ; public : v i r t u a l bool e v e n t E v o l v e (VINHAC : : Event& e v e n t ) = 0 ; v i r t u a l ˜ P r o c e s s H a n d l e r ( ) {} i n l i n e s t r i n g getHandlerName ( ) { return handlerName ; } i n l i n e void setHandlerName ( s t r i n g name ) { handlerName = name ; } }; Czysto wirtualna metoda eventEvolve służy jako uniwersalny dostęp modułów do generowanego zdarzenia. Dostęp jest realizowany przez referencję, aby niepotrzebnie nie kopiować przypadku. Interfejs ten służy również do włączenia obsługi użytkownika generowanych przypadków. Użytkownik może rozszerzyć ten interfejs i włączyć swój ProcessHandler w obsługę przypadków (patrz rozdział 3.6). Poniższy diagram przedstawia klasy pochodne. Rysunek 3.1: Klasy pochodne interfejsu ProcessHandler. BeamHandler Obiekt klasy BeamHandler realizuje część algorytmu opisaną w rozdziale 2.2. Dodatkowo w czasie inicjalizacji obiektu wyliczany jest przekrój czynny „crude” (rozdział 2.1.1). 26 BeamHandler odpowiada również za obsługę FOAMa i PDFów (patrz rozdział 3.2). Dostęp do PDFów realizowany jest przez interfejs PDF (patrz rozdział 3.5.4). HardProcessHandler Obiekt klasy HardProcessHandler realizuje część algorytmu opisaną w rozdziale 2.3. ModelHandler Obiekt klasy ModelHandler realizuje część algorytmu opisaną w rozdziale 2.4. MonitorHandler Obiekt klasy MonitorHandler realizuje część algorytmu opisaną w rozdziale 2.5. Dokonuje on również finalizacji (rozdział 2.7). Dla każdej wykrytej wagi tworzy obiekt klasy WeightMonitor, będący nośnikiem danych dla kumulowanych statystyk. Potrafi również zrzucać i przywracać stan monitorów wag. DemoAnalysisHandler Klasa DemoAnalysisHandler pokazuje jak realizować część algorytmu opisaną w rozdziale 2.6. Jest to wzorzec dla użytkownika. Patrz rozdział 3.6. 3.5.4 Interfejs PDF i jego pochodne Interfejs został stworzony aby ujednolicić dostęp do różnych parametryzacji PDFów. Dzięki temu łatwo będzie można rozszerzyć generator WINHAC++ o inne pakiety z PDFami. Najważniejszymi deklarowanymi metodami są: v i r t u a l v e c t o r <double> x f x ( double x , double q ) = 0 ; v i r t u a l double x f x ( double x , double q , int f l ) = 0 ; zwracają one wartości PDFów pomnożone przez x Bjorkena. Obecnie realizowane są trzy typy obsługi: • PDF noPDF — brak hadronów, x = 1, • PDF Simple — prosta parametryzacja, • PDF LHA — pakiet LHAPDF (patrz rozdział 3.2). 27 Rysunek 3.2: Klasy pochodne interfejsu PDF. 3.5.5 InitializationHandler – inicjalizacja Obiekt klasy InitializationHandler jest używany przez klasę nadrzędną do: • przetworzenia plików wejściowych, • stworzenia i zainicjalizowania podstawowych ProcessHandlerów. Przetwarzanie wejścia odbywa się przez interfejs Reader. Interfejs Reader i jego pochodne Interfejs Reader został stworzony w celu ujednolicenia dostępu do różnych formatów plików wejściowych. Obecnie zaimplementowane jest przetwarzanie plików formatu XML, używana jest do tego klasa XercesReader implementująca interfejs. Korzysta ona wewnętrznie z pakietu Xerces-C (patrz rozdział 3.2). Rysunek 3.3: Klasy pochodne interfejsu Reader. Obecność interfejsu Reader pozwoli w przyszłości na „bezbolesne” dodanie nowego typu plików inputowych lub przeorganizowanie istniejącego. 3.6 Demo Został napisany program demonstracyjny używający biblioteki pakietu WINHAC++. Był on używany przeze mnie do robienia testów. Jest to bardzo prosta i przejrzysta aplikacja, która może służyć użytkownikowi jako wzór postępowania ze stworzoną biblioteką. Program demonstracyjny składa się z dwóch części, można je znaleźć w katalogu src w dystrybucji programu. Są to: • Demo.cpp • vinhac/DemoAnalysisHandler.h wraz z vinhac/DemoAnalysisHandler.cpp. 28 Po zbudowaniu projektu, plik wykonywalny Demo można znaleźć w katalogu build/exec, zaś przykładowy wydruk z uruchomienia programu można znaleźć w pliku example run 100000 i386.log w dystrybucji programu oraz w dodatku C. Jeśli użytkownik posiada zainstalowany system ROOT to wyświetlą mu się również histogramy obserwabli kolekcjonowanych przez DemoAnalysisHandler, podobne do przedstawionych w rozdziale 4.2. Demo.cpp W tym pliku znajduje się główna część aplikacji demonstracyjnej. Tworzony jest obiekt generatora WINHAC++. Jest on inicjalizowany. Następnie generowane są zdarzenia. Na końcu wypisywane jest podsumowanie zawierające skumulowane wagi i przekroje czynne. Dodatkowo uruchamiana jest ROOTowska aplikacja rysująca histogramy zarejestrowane przez obiekt klasy DemoAnalysisHandler, włączony w obsługę przypadku. Poniżej można znaleźć źródło tego programu #include <i o s t r e a m > #include ”LHAPDF/LHAPDF. h” using namespace s t d ; //CMake a u t o m a t i c a l l y c h e c k s i f t h e r e i s ROOT on your s y st e m and s e t s p r o p e r f l a g #i f d e f ROOT HIST #include ”TCanvas . h” #include ” T A p p l i c a t i o n . h” #endif #include #include #include #include ” v i n h a c /WINHAC. h” ” v i n h a c / V i n h a c E x c e p t i o n . h” ” v i n h a c / DemoAnalysisHandler . h” ” v i n h a c / Event . h” i n t main ( i n t a r g c , char∗ a r g v [ ] ) { string string string double userPath ; inputPath ; outputPath ; eventsNb ; /∗ Reading command l i n e p a r a m e t e r s ∗/ i f ( a r g c <3 ) { cout<<” Usage : Demo [ i n p u t path ] [ ou tp ut path ] ” <<”<number o f e v e n t s > <u s e r f i l e path>”<<e n d l ; return 1 ; } i f ( a r g c >= 3 ) { /∗ r e a d i n g p a t h t o i n p u t and o u t p u t d i r e c t o r y ∗/ inputPath = argv [ 1 ] ; outputPath = a r g v [ 2 ] ; } i f ( a r g c >3 ) { /∗ r e a d i n g number o f e v e n t s t o g e n e r a t e ∗/ eventsNb = a t o f ( a r g v [ 3 ] ) ; } else { /∗ d e f a u l t number o f e v e n t s ∗/ eventsNb = 1 0 0 0 0 ; } i f ( a r g c >4){ /∗ p a t h t o U s e r F i l e . xml−l i k e f i l e ∗/ userPath = argv [ 4 ] ; } 29 try { // C r e a t i o n o f WINHAC i n s t a n c e VINHAC : : WINHAC g e n e r a t o r ; // C r e a t i o n o f DemoAnalysisHandler i n s t a n c e VINHAC : : DemoAnalysisHandler d e m o A n a l y s i s H a n d l e r ; // S e t t i n g p a t h t o i n p u t , o u t p u t and U s e r F i l e . xml−l i k e g e n e r a t o r . setInputPath ( inputPath ) ; g e n e r a t o r . setOutputPath ( outputPath ) ; g e ne r a to r . setUserFilePath ( userPath ) ; file // I n i t i a l i z a t i o n o f WINHAC g e n e r a t o r . i n i t i a l i z e G e n e r a t o r ( argc , argv ) ; // Adding own DemoAnalysisHandler t o g e n e r a t o r ’ s P r o c e s s H a n d l e r s v e c t o r // This s t e p s h o u l d be done a f t e r i n i t i a l i z a t i o n g e n e r a t o r . a d d P r o c e s s H a n d l e r (& d e m o A n a l y s i s H a n d l e r ) ; // The main e v e n t s g e n e r a t i o n l o o p cout<<”######## GENERATION #########”<<e n d l ; double i =0; f o r ( i =0; i <eventsNb ; i ++){ VINHAC : : Event e v e n t = g e n e r a t o r . g e n e r a t e E v e n t ( ) ; // Generator makes s n a p s h o t i f ( fmod ( i ,100000)==0){ g e n e r a t o r . makeSnapshot ( outputPath+” / s n a p s h o t s ” , i +1); cout<<i +1<<e n d l ; } // Here c o u l d be some u s e r ’ s code h a n d l i n g e v e n t } cout<<”############################”<<e n d l ; cout<<” Generated : ”<<i <<” e v e n t s ”<<e n d l ; // Generator makes s n a p s h o t g e n e r a t o r . makeSnapshot ( outputPath , i ) ; // Here a r e some o u t p u t s a f t e r g e n e r a t i o n cout . p r e c i s i o n ( 1 5 ) ; // The main c r o s s s e c t i o n w i t h i t s e r r o r cout<<” X s e c t i o n = ”<<g e n e r a t o r . g e t F i n a l X s e c t i o n ()<<” +/− ” <<g e n e r a t o r . g e t F i n a l X s e c t i o n E r r o r ()<< e n d l ; // This method p r i n t s w e i g h t s and c r o s s s e c t i o n s g e n e r a t o r . printSummary ( ) ; // This method c a u s e s t h a t // demoAnalysisHandler w r i t e s ROOT’ s h i s t o g r a m s t o o u t p u t d i r e c t o r y d e m o A n a l y s i s H a n d l e r . makeSnapshot ( outputPath ) ; // Below you can f i n d ROOT a p p l i c a t i o n drawing c o l l e c t e d h i s t o g r a m s #i f d e f ROOT HIST T A p p l i c a t i o n theApp ( ” theApp ” ,& a r g c , a r g v ) ; TCanvas kanwa ( ”kanwa” , ” H i s t o g r a m s ” , 5 , 5 , 1 0 2 4 , 7 6 8 ) ; kanwa . D i v i d e ( 2 , 3 ) ; kanwa . cd ( 1 ) ; d e m o A n a l y s i s H a n d l e r . g e t W r a p i d i t y H i s t ( ) . Draw ( ) ; kanwa . cd ( 2 ) ; d e m o A n a l y s i s H a n d l e r . g e t C o s T h e t a H i s t ( ) . Draw ( ) ; kanwa . cd ( 3 ) ; d e m o A n a l y s i s H a n d l e r . getLeptonPTHist ( ) . Draw ( ) ; kanwa . cd ( 4 ) ; d e m o A n a l y s i s H a n d l e r . g e t L e p t o n P s e u d o r a p i d i t y H i s t ( ) . Draw ( ) ; kanwa . cd ( 5 ) ; d e m o A n a l y s i s H a n d l e r . getWTransverseMass ( ) . Draw ( ) ; kanwa . cd ( 6 ) ; 30 d e m o A n a l y s i s H a n d l e r . g e t P h o t o n M u l t i p l i c i t y ( ) . Draw ( ) ; TCanvas kanwa2 ( ”kanwa2” , ” H i s t o g r a m s 2 ” , 5 , 5 , 1 0 2 4 , 7 6 8 ) ; kanwa2 . cd ( 1 ) ; d e m o A n a l y s i s H a n d l e r . g et P ho t on s En e rg y ( ) . Draw ( ) ; TCanvas kanwa4 ( ”kanwa4” , ” H i s t o g r a m s 4 ” , 5 , 5 , 1 0 2 4 , 7 6 8 ) ; kanwa4 . cd ( 1 ) ; d e m o A n a l y s i s H a n d l e r . getHardPhotonPt ( ) . Draw ( ) ; TCanvas kanwa3 ( ”kanwa3” , ” H i s t o g r a m s 3 ” , 5 , 5 , 1 0 2 4 , 7 6 8 ) ; kanwa3 . cd ( 1 ) ; d e m o A n a l y s i s H a n d l e r . getHardPhotonEnergy ( ) . Draw ( ) ; TCanvas kanwa5 ( ”kanwa5” , ” H i s t o g r a m s 5 ” , 5 , 5 , 1 0 2 4 , 7 6 8 ) ; kanwa5 . cd ( 1 ) ; d e m o A n a l y s i s H a n d l e r . getHardPhotonEta ( ) . Draw ( ) ; theApp . Connect ( ”TCanvas” , ” C l o s e d ( ) ” , ” T A p p l i c a t i o n ” ,&theApp , ” Terminate ( ) ” ) ; theApp . Run ( ) ; #endif } catch (VINHAC : : V i n h a c E x c e p t i o n e ) { // In c a s e o f p r o b l e m s WINHAC t h r o w s // V i n h a c E x c e p t i o n w i t h message what ’ s wrong . cout<<”EXCEPTION : ”<<e . g e t M e s s a g e ()<< e n d l ; } } Klasa DemoAnalysisHandler Ta klasa jest integralną częścią programu demonstracyjnego. Pokazuje ona użytkownikowi w jaki sposób może być realizowana jego własna obsługa zdarzenia włączona w zestaw ProcessHandlerów wywoływanych przy generowaniu każdego zdarzenia. Implementuje ona wirtualną metodę eventEvolve, która wydobywa ze zdarzenia potrzebne informacje i konstruuje obserwable. DemoAnalysisHandler.h #include <s t r i n g > using namespace s t d ; #i f n d e f #define #include #include #include #include #include #include #include DemoAnalysisHandler h DemoAnalysisHandler h ” Manager . h” ” Event . h” ” P r o c e s s H a n d l e r . h” ” P a r t i c l e . h” <f s t r e a m > ” . . / u t i l s /CLHEP/ V e c t o r / V e c t o r / L o r e n t z V e c t o r . h” <c s t r i n g > #i f d e f ROOT HIST #include ”TH1D . h” #include ” T F i l e . h” #include ” TObject . h” #endif namespace VINHAC { c l a s s Manager ; c l a s s Event ; class P a r t i c l e ; 31 class AnalisysHandler ; } namespace VINHAC { // ! d e m o n s t r a t i o n c l a s s showing how t o w r i t e your own h a n d l e r . /∗ ! ∗ I t i s showed h e r e how t o w r i t e your own h a n d l e r by e x t e n d i n g P r o c e s s H a n d l e r ∗ and you can p a s s i t t o g e n e r a t o r u s i n g Manager ( i . e . WINHAC) methods . ∗ This example j u s t c u m u l a t e s some o b s e r v a b l e s u s i n g ROOT h i s t o g r a m s . ∗ @see P r o c e s s H a n d l e r ∗ @see Manager ∗ @see WINHAC ∗/ c l a s s DemoAnalysisHandler : public VINHAC : : P r o c e s s H a n d l e r { private : #i f d e f ROOT HIST // //ROOT h i s t o g r a m s : TFile h f i l e ; i n t numberOfBins ; TH1D h s t W r a p i d i t y ; TH1D h s t c o s T h e t a ; TH1D h s t l e p t o n P T ; TH1D h s t l e p t o n P s e u d o r a p i d i t y ; TH1D h s t p h o t o n m u l t i p l i c i t y ; TH1D hst WTransverseMass ; TH1D TH1D TH1D TH1D hst hst hst hst photonsEnergy ; hardPhotonEnergy ; hardPhotonPt ; hardPhotonEta ; #endif VINHAC : : Manager ∗ p Manager ; public : /∗ ∗ ∗ \ b r i e f evolves the event ∗ ∗ I t d o e s w h o l e p a r t o f g e n e r a t i o n p r o c e s s which i s t o do i n t h i s h a n d l e r ∗ @see Event ∗ @param e v e n t r e f e r e n c e t o c u r r e n t Event o b j e c t ∗ @return i f w e i g h t was z e r o ∗/ bool e v e n t E v o l v e (VINHAC : : Event& e v e n t ) ; #i f d e f ROOT HIST i n l i n e TH1D& g e t W r a p i d i t y H i s t ( ) { return h s t W r a p i d i t y ; } i n l i n e TH1D& g e t C o s T h e t a H i s t ( ) { return h s t c o s T h e t a ; } i n l i n e TH1D& getLeptonPTHist ( ) { return h s t l e p t o n P T ; } i n l i n e TH1D& g e t L e p t o n P s e u d o r a p i d i t y H i s t ( ) { return h s t l e p t o n P s e u d o r a p i d i t y ; } i n l i n e TH1D& getWTransverseMass ( ) { return hst WTransverseMass ; } i n l i n e TH1D& g e t P h o t o n M u l t i p l i c i t y ( ) { return h s t p h o t o n m u l t i p l i c i t y ; } i n l i n e TH1D& g et P ho to n sE n er g y ( ) { return h s t p h o t o n s E n e r g y ; 32 } i n l i n e TH1D& getHardPhotonEnergy ( ) { return h s t h a r d P h o t o n E n e r g y ; } i n l i n e TH1D& getHardPhotonPt ( ) { return h s t h a r d P h o t o n P t ; } i n l i n e TH1D& getHardPhotonEta ( ) { return h s t h a r d P h o t o n E t a ; } #endif /∗ ∗ ∗ \ b r i e f saves histograms to s p e c i f i e d path ∗ ∗ @param s n a p s h o t P a t h p a t h t o f o l d e r where h i s t o g r a m s have t o be s a v e d ∗/ bool makeSnapshot ( s t r i n g s n a p s h o t P a t h ) ; DemoAnalysisHandler ( ) ; ˜ DemoAnalysisHandler ( ) { } ; } ; // c l a s s DemoAnalysisHandler } // namespace VINHAC #endif DemoAnalysisHandler.cpp #include <s t r i n g > using namespace s t d ; #include ” DemoAnalysisHandler . h” // C r e a t e s h i s t o g r a m s o b j e c t s VINHAC : : DemoAnalysisHandler : : DemoAnalysisHandler ( ) #i f d e f ROOT HIST : numberOfBins ( 1 0 0 ) , h s t W r a p i d i t y ( ”W: r a p i d i t y y” , ”W: r a p i d i t y y” , numberOfBins , −6, 6 ) , hst cosTheta ( ” lepton : cos ( theta ) ” , ” l e p t o n : c o s ( t h e t a ) ” , numberOfBins , −1, 1 ) , h s t l e p t o n P T ( ” l e p t o n : p T” , ” l e p t o n : p T” , numberOfBins , 0 , 5 0 ) , hst leptonPseudorapidity ( ” lepton : pseudorapidity eta ” , ” l e p t o n : p s e u d o r a p i d i t y e t a ” , numberOfBins , −6, 6 ) , h s t p h o t o n m u l t i p l i c i t y ( ” photon : m u l t i p l i c i t y ” , ” photon : m u l t i p l i c i t y ” , 1 0 , 0 , 1 0 ) , hst WTransverseMass ( ”W: t r a n s v e r s e mass ” , ”W: t r a n s v e r s e mass ” , numberOfBins , 0 , 150) , h s t p h o t o n s E n e r g y ( ” photon : e n e r g y sum” , ” photon : e n e r g y sum” , numberOfBins , −1, 5 0 ) , h s t h a r d P h o t o n E n e r g y ( ” photon : hard photon e n e r g y ” , ” photon : hard photon e n e r g y ” , numberOfBins , −1, 5 0 ) , h s t h a r d P h o t o n P t ( ” photon : hard photon pt ” , ” photon : hard photon pt ” , numberOfBins , −1, 5 0 ) , h s t h a r d P h o t o n E t a ( ” photon : hard photon e t a ” , ” photon : hard photon e t a ” , numberOfBins , −6, 6 ) #endif { // Fo r ce s h i s t o g r a m s t o s t o r e sum o f w e i g h t s s q u a r e d #i f d e f ROOT HIST h s t W r a p i d i t y . Sumw2 ( ) ; h s t c o s T h e t a . Sumw2 ( ) ; h s t l e p t o n P T . Sumw2 ( ) ; h s t l e p t o n P s e u d o r a p i d i t y . Sumw2 ( ) ; h s t p h o t o n m u l t i p l i c i t y . Sumw2 ( ) ; 33 hst hst hst hst hst WTransverseMass . Sumw2 ( ) ; p h o t o n s E n e r g y . Sumw2 ( ) ; h a r d P h o t o n E n e r g y . Sumw2 ( ) ; h a r d P h o t o n P t . Sumw2 ( ) ; h a r d P h o t o n E t a . Sumw2 ( ) ; #endif setHandlerName ( ” DemoAnalysisHandler ” ) ; } bool VINHAC : : DemoAnalysisHandler : : e v e n t E v o l v e (VINHAC : : Event& e v e n t ) { // E x t r a c t i n g d a t a from Event o b j e c t P a r t i c l e& boson = e v e n t . getBoson ( ) ; P a r t i c l e& l e p t o n = e v e n t . g e t L e p t o n ( ) ; P a r t i c l e& n e u t r i n o = e v e n t . g e t N e u t r i n o ( ) ; double double double double double double double double double double yw = − 5 0 . 0 ; cosTheta = −2.0; e t a l = −50.0; pTl = − 1 0 . 0 ; pTn = − 1 0 . 0 ; wTransverseMass = − 1 0 . 0 ; photonsEnergy = − 1 0 . 0 ; hardPhotonE = − 1 0 . 0 ; hardPhotonPt = − 1 0 . 0 ; hardPhotonEta = − 1 0 . 0 ; // E x t r a c t i n g main w e i g h t from e v e n t double mainWt = e v e n t . mainWt ( ) ; // C o n s t r u c t i o n o f o b s e r v a b l e s i f ( mainWt != 0 . 0 ) { double EnW = boson . getFourMomentum ( ) . e ( ) ; double pzW = boson . getFourMomentum ( ) . pz ( ) ; yw = 0 . 5 ∗ l o g ( (EnW + pzW) / (EnW − pzW ) ) ; CLHEP : : H epLore ntzVe ctor p l = l e p t o n . getFourMomentum ( ) ; CLHEP : : H epLore ntzVe ctor pn = n e u t r i n o . getFourMomentum ( ) ; c o s T h e t a = p l . z ( ) / p l . getV ( ) . mag ( ) ; double t h e t a = a c o s ( c o s T h e t a ) ; e t a l = −l o g ( tan ( t h e t a / 2 ) ) ; pTl = l e p t o n . getFourMomentum ( ) . getV ( ) . rho ( ) ; pTn = n e u t r i n o . getFourMomentum ( ) . getV ( ) . rho ( ) ; wTransverseMass = s q r t ( 2 ∗ ( pTl ∗ pTn − p l . x ( ) ∗ pn . x ( ) − p l . y ( ) ∗ pn . y ( ) ) ) ; photonsEnergy = 0 . 0 ; f o r ( unsigned i = 0 ; i < e v e n t . g e t P h o t o n s ( ) . s i z e ( ) ; ++i ) { photonsEnergy += e v e n t . g e t P h o t o n s ( ) [ i ] . getFourMomentum ( ) . e ( ) ; } i f ( event . getPhotons ( ) . s i z e ( ) > 0) { hardPhotonE = e v e n t . g e t P h o t o n s ( ) [ 0 ] . getFourMomentum ( ) . e ( ) ; hardPhotonPt = e v e n t . g e t P h o t o n s ( ) [ 0 ] . getFourMomentum ( ) . getV ( ) . rho ( ) ; double cosThetaPhoton = e v e n t . g e t P h o t o n s ( ) [ 0 ] . getFourMomentum ( ) . z ( ) / e v e n t . g e t P h o t o n s ( ) [ 0 ] . getFourMomentum ( ) . getV ( ) . mag ( ) ; double t h e t a P h o t o n = a c o s ( cosThetaPhoton ) ; hardPhotonEta = −l o g ( tan ( t h e t a P h o t o n / 2 ) ) ; } } // F i l l i n g h i s t o g r a m s #i f d e f ROOT HIST 34 hst hst hst hst hst hst hst hst hst hst W r a p i d i t y . F i l l (yw , mainWt ) ; c o s T h e t a . F i l l ( cosTheta , mainWt ) ; l e p t o n P T . F i l l ( pTl , mainWt ) ; l e p t o n P s e u d o r a p i d i t y . F i l l ( e t a l , mainWt ) ; WTransverseMass . F i l l ( wTransverseMass , mainWt ) ; p h o t o n m u l t i p l i c i t y . F i l l ( e v e n t . g e t P h o t o n s ( ) . s i z e ( ) , mainWt ) ; p h o t o n s E n e r g y . F i l l ( photonsEnergy , mainWt ) ; h a r d P h o t o n E n e r g y . F i l l ( hardPhotonE , mainWt ) ; h a r d P h o t o n P t . F i l l ( hardPhotonPt , mainWt ) ; h a r d P h o t o n E t a . F i l l ( hardPhotonEta , mainWt ) ; #endif return true ; } bool VINHAC : : DemoAnalysisHandler : : makeSnapshot ( s t r i n g s n a p s h o t P a t h ) { #i f d e f ROOT HIST s t r i n g f i l e P a t h = snapshotPath + ”/ histograms . r o o t ” ; s t r i n g filePathBak = snapshotPath + ”/ histogramsBak . r o o t ” ; s t r i n g m v f i l e c o m a n d = ”mv ” + f i l e P a t h + ” ” + f i l e P a t h B a k ; system ( m v f i l e c o m a n d . c s t r ( ) ) ; T F i l e r o o t S a n p s h o t ( f i l e P a t h . c s t r ( ) , ”RECREATE” , ” Snapshot h i s t o g r a m s ” ) ; hst hst hst hst hst hst hst hst hst hst W r a p i d i t y . Write ( ) ; c o s T h e t a . Write ( ) ; l e p t o n P T . Write ( ) ; l e p t o n P s e u d o r a p i d i t y . Write ( ) ; p h o t o n m u l t i p l i c i t y . Write ( ) ; WTransverseMass . Write ( ) ; p h o t o n s E n e r g y . Write ( ) ; h a r d P h o t o n E n e r g y . Write ( ) ; h a r d P h o t o n P t . Write ( ) ; h a r d P h o t o n E t a . Write ( ) ; r o o t S a n p s h o t . Write ( ) ; rootSanpshot . Close ( ) ; #endif return true ; } 3.6.1 Skrypty dla farm komputerowych Podczas rozwoju projektu WINHAC++ powstały skrypty uruchamiające program demonstracyjny na farmie obliczeniowej. Skrypty zostały napisane dla systemu kolejkowego PBS, a konkretnie uruchamiane były na systemie TORQUE. Użytkownik znający programowanie skryptów powłoki łatwo może dostosować je do swojego systemu kolejkowego. Można je znaleźć w dystrybucji w katalogu farm. Uruchamianie na farmie przebiega w następujący sposób: • pliki wejściowe należy przygotować w katalogu głównym w podkatalogu input, • przejść do podkatalogu farm i tam wykonać następujące kroki: – uruchomić skrypt make jobs.sh, który stworzy zadania w katalogu jobs (ustawienia PBS są w pliku pbs.properties), – uruchomić skrypt run jobs.sh, który wysyła zadania do systemu kolejkowego, – po zakończeniu zadań uruchomić skrypt combine.sh, który połączy wyniki z poszczególnych zadań w jedno wyjście w katalogu output. 35 Rozdział 4 Testy W czasie fazy implementacji były robione testy porównawcze (na małych statystykach) z wersją fortranową generatora WINHAC w celu sprawdzania poprawności implementacji i wychwytywania błędów. Po zakończeniu fazy implementacyjnej przeprowadzono ostateczne testy przy użyciu farmy obliczeniowej. W tym rozdziale zamieszczam część wyników uzyskanych w czasie tych testów, zaś wszystkie wyniki i parametry wejściowe można znaleźć na stronie WWW generatora [6]. W testach sprawdzano zgodność przekrojów czynnych uzyskiwanych z obu generatorów jak również tworzono histogramy obserwabli wymienionych w rozdziale 2.6. Rozważano procesy wyszczególnione w tabeli 4.1 w podrozdziale 4.1. Dla każdego procesu generowano statystyki wielkości dwóch miliardów (2 × 109 ) przypadków. Energie wiązek wynosiły w przypadku procesu partonowego i hadronowego odpowiednio po 40 GeV i 7 TeV. Uzyskano bardzo dobrą zgodność generatora WINHAC++ z pierwowzorem, zaimplementowanym w języku Fortran. 4.1 Przekroje czynne W tabeli 4.1 zamieściłem zestawienie otrzymanych całkowitych przekrojów czynnych. Podano przekrój czynny na poziomie Borna oraz względne przyczynki poprawek elektrodynamicznych (QED) i „słabych” (weak) do całkowitego przekroju czynnego. W testach używano schematu Gµ . Obliczano: model • σBorn z użyciem wagi wBorn , model • σQED z użyciem wagi wYFS O(α) QED , model • σEW z użyciem wagi wYFS O(α) EW , oraz względne przyczynki poprawek do całkowitego przekroju czynnego: δQED = σQED − σBorn , σBorn (4.1) δweak = σEW − σQED . σBorn (4.2) 36 Proces Generator ud¯ → W + + X → e+ νe , µ+ νµ + X WINHAC pp → W + X → eνe , µνµ + X WINHAC++ WINHAC WINHAC++ pp → W − + X → e− ν̄e + X WINHAC pp → W + + X → e+ νe + X WINHAC pp → W − + X → µ− ν̄µ + X WINHAC pp → W + + X → µ+ νµ + X WINHAC pp → W − + X → τ − ν̄τ + X WINHAC pp → W + + X → τ + ντ + X WINHAC WINHAC++ WINHAC++ WINHAC++ WINHAC++ WINHAC++ WINHAC++ σBorn [nb] 15.00753135(2) 15.00753132(3) 35.54376(5) 35.54384(5) 7.574157(12) 7.574149(12) 10.197775(16) 10.197802(15) 7.574150(12) 7.574116(12) 10.197765(16) 10.197749(15) 7.572035(12) 7.572021(12) 10.194957(16) 10.194945(15) δQED [%] −0.0349(5) −0.0345(5) −0.0368(5) −0.0390(5) −0.0352(6) −0.0344(6) −0.0349(6) −0.0369(6) −0.0326(5) −0.0317(5) −0.0328(5) −0.0323(5) −0.0793(5) −0.0796(5) −0.0799(5) −0.0799(5) δweak [%] −0.2837(7) −0.2837(7) −0.2837(7) −0.2830(7) −0.2794(8) −0.2809(8) −0.2794(8) −0.2794(8) −0.2880(7) −0.2887(7) −0.2880(7) −0.2885(7) −0.2928(7) −0.2926(7) −0.2928(7) −0.2938(7) Tabela 4.1: Porównanie przekrojów czynnych otrzymanych przy użyciu generatorów WINHAC i WINHAC++ (w nawiasach podano błąd statystyczny dla ostatnich cyfr). Dla uzyskanych przekrojów czynnych na poziomie Borna uzyskano zgodność między oboma generatorami na poziomie < 0.01%. Podobną zgodność uzyskano dla względnych poprawek radiacyjnych δQED i δweak . 4.2 Histogramy obserwabli W tym podrozdziale przedstawiam wybrane histogramy obserwabli opisanych w rozdziale 2.6. Wszystkie otrzymane rozkłady wykazują bardzo dobrą zgodność obu generatorów. Na potwierdzenie tego pod każdym histogramem można znaleźć względną różnicę w procentach między rozkładami z generatorów WINHAC i WINHAC++. Na rysunkach 4.1–4.12 przedstawiam wybrane rozkłady: • rapidity bozonu W , • pseudorapidity naładowanego leptonu, • pędu poprzecznego naładowanego leptonu, • masy transwersalnej bozonu W . W procesach: • pp → W + X → eνe , µνµ + X, • pp → W − + X → e− ν̄e + X, • pp → W + + X → e+ νe + X. Pozostałe rozkłady dostępne są na stronie WWW [6]. 37 A. Poziom Borna (a) (b) Rysunek 4.1: Rozkłady rapidity (a) oraz masy transwersalnej (b) bozonu W dla procesu pp → W + X → eνe , µνµ + X. (a) pp → W − + X → e− ν̄e + X (b) pp → W + + X → e+ νe + X Rysunek 4.2: Rozkłady pseudorapidity elektronu (a) i pozytonu (b) z rozpadów bozonów W . 38 (a) pp → W − + X → e− ν̄e + X (b) pp → W + + X → e+ νe + X Rysunek 4.3: Rozkłady pędu poprzecznego elektronu (a) i pozytonu (b) z rozpadów bozonów W . (a) pp → W − + X → e− ν̄e + X (b) pp → W + + X → e+ νe + X Rysunek 4.4: Rozkłady masy transwersalnej W − (a) i W + (b) dla rozpadów elektronowych. 39 B. Eksponencjacja – względne poprawki elektrodynamiczne (QED) (a) (b) Rysunek 4.5: Rozkłady rapidity (a) oraz masy transwersalnej (b) bozonu W dla procesu pp → W + X → eνe , µνµ + X. (a) pp → W − + X → e− ν̄e + X (b) pp → W + + X → e+ νe + X Rysunek 4.6: Rozkłady pseudorapidity elektronu (a) i pozytonu (b) z rozpadów bozonów W . 40 (a) pp → W − + X → e− ν̄e + X (b) pp → W + + X → e+ νe + X Rysunek 4.7: Rozkłady pędu poprzecznego elektronu (a) i pozytonu (b) z rozpadów bozonów W . (a) pp → W − + X → e− ν̄e + X (b) pp → W + + X → e+ νe + X Rysunek 4.8: Rozkłady masy transwersalnej W − (a) i W + (b) dla rozpadów elektronowych. 41 C. Eksponencjacja – względne poprawki elektrosłabe (EW) (a) (b) Rysunek 4.9: Rozkłady rapidity (a) oraz masy transwersalnej (b) bozonu W dla procesu pp → W + X → eνe , µνµ + X. (a) pp → W − + X → e− ν̄e + X (b) pp → W + + X → e+ νe + X Rysunek 4.10: Rozkłady pseudorapidity elektronu (a) i pozytonu (b) z rozpadów bozonów W . 42 (a) pp → W − + X → e− ν̄e + X (b) pp → W + + X → e+ νe + X Rysunek 4.11: Rozkłady pędu poprzecznego elektronu (a) i pozytonu (b) z rozpadów bozonów W . (a) pp → W − + X → e− ν̄e + X (b) pp → W + + X → e+ νe + X Rysunek 4.12: Rozkłady masy transwersalnej W − (a) i W + (b) dla rozpadów elektronowych. 43 Podsumowanie W tej pracy omówiłem konstrukcję obiektowego generatora Monte Carlo WINHAC++, służącego do modelowania naładowanych procesów Drella–Yana. Generator uwzględnia poprawki radiacyjne w rozpadach bozonów W poprzez schemat ekskluzywnej eksponenecjacji YFS. Wiarygodność jego implementacji została potwierdzona przez testy numeryczne polegające na porównaniach z jego pierwowzorem – generatorem WINHAC, napisanym w języku Fortran. Efektem niniejszej pracy jest pakiet dostarczający generator WINHAC++. Może on być dołączony do programu użytkownika i w dowolny sposób przez niego używany. Planowane jest: • uwzględnienie interferencji radiacji ze stanu początkowego (ISR) z radiacją ze stanu końcowego (FSR), • dodanie opcji: generowanie przypadków nieważonych, • dodanie nowej fizyki w postaci dodatkowych ciężkich bozonów naładowanych (W 0 itd.), • implementacja procesów ze spolaryzowanymi bozonami W , • implementacja amplitud spinowych dla podwójnej radiacji, • implementacja algorytmu kaskad partonowych stanu początkowego. Dodatkowo podjęte zostaną próby podniesienia efektywności generacji przypadków, ponieważ obecnie wydajność jest 4–5 razy gorsza od wersji fortranowskiej. Podziękowania Pragnę podziękować mojemu opiekunowi dr. hab. prof. UJ Wiesławowi Płaczkowi za opiekę naukową w czasie moich ostatnich dwóch lat studiów. Dziękuję za wszelką pomoc i rady udzielone mi w czasie rozwijania projektu WINHAC++. Chciałbym podziękować również dr. Andrzejowi Siódmokowi za owocną współpracę w czasie pierwszej fazy projektu. Szczególnie chciałbym podziękować rodzinie za wsparcie materialne i duchowe w czasie moich studiów magisterskich, zwłaszcza mamie Dorocie, która zachęcała mnie do podjęcia studiów w naukach ścisłych oraz żonie Agnieszce, która motywowała mnie do bardziej wytężonej pracy. 44 Dodatek A Struktura katalogów pakietu WINHAC++ Poniżej przedstawiam opis struktury katalogowej pakietu WINHAC++ (widocznej na rysunku A.1). WINHAC – główny katalog pakietu WINHAC++. build – pliki wynikowe budowania pakietu. bin – binaria. exec – pliki wykonywalne. lib – biblioteki dzielone. cmake – pliki pakietu CMake. config – konfiguracja pakietu Doxygen. farm – narzędzia przydatne do obliczeń na farmach komputerowych. jobs – zadania. output – tutaj zapisywany jest złączony wynik z wszystkich zadań. input – pliki wejściowe. semaphore – tutaj znajduje się plik semaphore. lib – biblioteki potrzebne do zbudowania pakietu. output – pliki wyjściowe. snapshots – zrzuty stanu generatora. src – źródła pakietu WINHAC++. utils – źródła narzędzi zewnętrznych i pomocniczych. CLHEP – klasy wyodrębnione z pakietu CLHEP. farm – narzędzie do złączania wyników z farm komputerowych. FOAM – źródła pakietu FOAM. SANC – źródła pakietu SANC (dostarcza poprawki elektrosłabe). vinhac – główne źródła pakietu WINHAC++. vpproject – pliki z wstępnej analizy, otwierane pakietem Visual Paradigm. 45 Rysunek A.1: Struktura katalogów pakietu WINHAC++. 46 Dodatek B Instalacja pakietu WINHAC++ Przedstawiam tutaj przykładową instalację pakietu WINHAC++. Zakładam, że użytkownik używa powłoki systemu Linux. Pobranie pakietu Używając Subversion $ svn c h e c k o u t h t t p : / / w i n h a c p l u s p l u s . g o o g l e c o d e . com/ svn / t r u n k / WINHAC Używając archiwum Pobieranie $ wget h t t p : / / th . i f . u j . edu . p l /˜ s o b o l /WINHAC/ r e l e a s e s /WINHAC−l a t e s t . t a r . gz Rozpakowanie $ t a r −z x v f WINHAC−l a t e s t . t a r . gz Konfiguracja pakietu $ cd WINHAC $ cmake . 47 Budowanie pakietu $ make Uruchomienie programu demonstracyjnego Bezpośrednio $ . / b u i l d / exec /Demo i n p u t o ut pu t 100000 i n p u t / U s e r F i l e . xml Narzędziem make $ make run100000 Instalacja w systemie Linux Uwaga! Należy mieć uprawnienia administratora. Biblioteki dzielone: • libwinhac.so, • libwinhacUtils.so, • libwinhacUtilsSanc.so zostaną zainstalowane w katalogu /usr/local/lib, zaś pliki nagłówkowe zostaną skopiowane do katalogu /usr/local/include. # make i n s t a l l Użytkownik korzystający z pakietu WINHAC++ powinien skonsolidować wymienione biblioteki dzielone ze swoim programem. 48 Dodatek C Wydruk programu Demo $$$$$$$$$$ SEED = 123456789 Reading user file: input/UserFile.xml ====================Initialize beamA=================== PDFinterface => LHAPDF PDFsubset => 0 atomicNb => chargeNb => energy => 7000 idPDG => 2212 name => cteq61 nuclearCorre => 0 switchOn => off xMax => 1.0 xMin => 1e-6 ====================Initialize beamB=================== PDFinterface => LHAPDF PDFsubset => 0 atomicNb => chargeNb => energy => 7000 idPDG => 2212 name => cteq61 nuclearCorre => 0 switchOn => off xMax => 1.0 xMin => 1e-6 ========================LHAPDF============================== 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222|1000 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222|2000 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222|3000 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222|4000 222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 ######## GENERATION ######### 100000 ############################ Generated: 100000 events Xsection = 35.4279828430281 +/- 0.0255806475700515 ######################################################################## Weights ======================================================================== Crude -----------------------------------------------------------------------HardProcessWeight 0.9681913045054 +/- 0.0007322965199577 PartonsGeneration 0.9684025667996 +/- 0.0002073056049222 XsCrudWt 36.69772346097 +/- 9.407186083896e-08 ======================================================================== Model -----------------------------------------------------------------------ModelBest 419.1830825492 +/- 194.5638284501 beta00 0.9592010001072 +/- 0.0004397286140017 beta01_EW 0.9780643000345 +/- 0.0004479817161729 beta01_EW + beta11 419.1830825492 +/- 194.5638284501 beta01_LL 0.9786969353816 +/- 0.0004482714755075 beta01_LL + beta11_LL 0.9885627251707 +/- 0.0003312758176593 49 beta01_QED 0.9809249862169 +/- 0.0004492919689975 beta01_QED + beta11 419.1859432354 +/- 194.5638283888 beta11 418.2050182492 +/- 194.563849431 beta11_LL 0.009865789789061 +/- 0.0001809025277456 xs00 0.8677579916274 +/- 0.00234192704801 xs0gEW 0.5411924345893 +/- 0.001440388588756 xs0gEW + xs1g 377.692553895 +/- 197.5341353221 xs0gQED 0.5437804045791 +/- 0.001447048556406 xs0gQED + xs1g 377.695141865 +/- 197.5341352726 xs1g 377.1513614605 +/- 197.5341456795 ======================================================================== Main Weight 35.42798284303 +/- 0.02558064757005 ######################################################################## ######################################################################## Cross Sections [nb] ======================================================================== Best -----------------------------------------------------------------------Best 35.42798284303 +/- 0.02558064757005 ======================================================================== YFS exponentiation -----------------------------------------------------------------------XsTot O(alf0) 33.82060643907 +/- 0.02980816578882 XsTot_EW O(alf1)_EW 35.42798284303 +/- 0.02558064757005 XsTot_LL O(alf1)_LL 34.61149849327 +/- 0.02963853186642 XsTot_QED O(alf1)_QED 35.5288481906 +/- 0.02566437639096 ======================================================================== Fixed Order -----------------------------------------------------------------------Born 32.91291329328 +/- 0.08941723512663 Born + virtual_EW + soft 20.51381935047 +/- 0.05488088720806 Born + virtual_QED + soft 20.6119776296 +/- 0.05513528901415 O(alpha)_EW 35.40626611712 +/- 0.05213035937837 O(alpha)_QED 35.50442439625 +/- 0.05211838777165 One real hard photon 14.89244676666 +/- 0.07626061789237 ======================================================================== All -----------------------------------------------------------------------ModelBest 35.52959749185 +/- 0.02493836032027 beta00 33.91761080598 +/- 0.02933658254663 beta01_EW 34.58402225302 +/- 0.0299108957458 beta01_EW + beta11 35.52959749185 +/- 0.02493836032027 beta01_LL 34.60639241343 +/- 0.02993023936467 beta01_LL + beta11_LL 34.71077129918 +/- 0.02913643270782 beta01_QED 34.68517690289 +/- 0.02999836488673 beta01_QED + beta11 35.63075214173 +/- 0.0250206053146 beta11 0.9455752388329 +/- 0.01065249706878 beta11_LL 0.10437888575 +/- 0.001547518286787 xs00 33.00731421193 +/- 0.08949929740622 xs0gEW 20.57265714992 +/- 0.05492790630239 xs0gEW + xs1g 35.50781847797 +/- 0.05193287381771 xs0gQED 20.67109696692 +/- 0.05518249303395 xs0gQED + xs1g 35.60625829497 +/- 0.05191885400512 xs1g 14.93516132805 +/- 0.07643751049806 ======================================================================== ######################################################################## ************************************* * LHAPDF Version 5.7.0 * ************************************* >>>>>> PDF description: <<<<<< CTEQ6.1 Reference: J. Pumplin, D.R. Stump, J. Huston, H.L. Lai W.K. Tung, S. Kuhlmann, J. Owens hep-ph/0303013 This set has 41 member PDFs. mem=0 --> central value (cteq61m) mem=1-40 --> 20 sets of +ve/-ve error values >>>>>> <<<<<< ************************************* * LHAPDF Version 5.7.0 * 50 ************************************* >>>>>> PDF description: <<<<<< CTEQ6.1 Reference: J. Pumplin, D.R. Stump, J. Huston, H.L. Lai W.K. Tung, S. Kuhlmann, J. Owens hep-ph/0303013 This set has 41 member PDFs. mem=0 --> central value (cteq61m) mem=1-40 --> 20 sets of +ve/-ve error values >>>>>> <<<<<< 51 Bibliografia [1] W. Płaczek and S. Jadach, Eur. Phys. J. C29, 325 (2003). [2] S. D. Drell and T.-M. Yan, Phys. Rev. Lett. 25, 316 (1970). [3] J. H. Christenson, G. S. Hicks, L. M. Lederman, P. J. Limon, B. G. Pope, and E. Zavattini, Phys. Rev. Lett. 25, 1523 (1970). [4] Wikipedia, the free encyclopedia, http://www.wikipedia.org, Grafiki. [5] R. K. Ellis, W. J. Stirling, and B. R. Webber, QCD and Collider Physics, Cambridge Univ. Press, Cambridge, 2003. [6] K. Sobol, WINHAC++ Home Page, http://th.if.uj.edu.pl/~sobol/WINHAC/index.html, 2010. [7] D. Yennie, S. Frautschi, and H. Suura, Ann. Phys. (NY) 13, 379 (1961). [8] D. Bardin, S. Bondarenko, S. Jadach, L. Kalinovskaya, and W. Placzek, Acta Phys. Polon. B40, 75 (2009). [9] S. Jadach, Computer Physics Communications 152, 55 (2003). [10] S. Jadach and P. Sawicki, Computer Physics Communications 177, 441 (2007). [11] A. Siódmok, ZINHAC Home Page, http://th.if.uj.edu.pl/ZINHAC, 2010. [12] Visual Paradigm, http://www.visual-paradigm.com. [13] Eclipse, http://www.eclipse.org. [14] K. Sobol, WINHAC++ @ Google Code, http://code.google.com/p/winhacplusplus/, 2010. [15] Xerces-C, http://xerces.apache.org/xerces-c. [16] LHAPDF, http://projects.hepforge.org/lhapdf. [17] ROOT, http://root.cern.ch. [18] Doxygen, http://www.doxygen.org. [19] Cmake, http://www.cmake.org. [20] Pythia, http://home.thep.lu.se/~torbjorn/Pythia.html. 52