Oprogramowanie w eksperymentach fizyki Wykład 4, Paweł Staszel
Plan 1. Obiekty (klasy) danych 2. Kontenery danych (data containers) 3. Moduły obiekty operujące na danych 4. Kontenery modułów (module containers) 5. Konstruowanie programów (rekonstrukcja śladów) używając modułów klasa typy singleton: MainModule 6. Struktura programu głównego: bratmain 2
BRAT moduły brat/modules klasy które przetwarzają dane: dig -> rdo -> tory lokalne -> tory globalne -> dst -> zrekonstruowane zdarzenia fizyczne. Klasy danych: definiują strukturę danych Moduły: definiują algorytm(y) przetwarzania danych, nie posiadają żadnych struktur danych jak kontenery (np. BrDataTable), mogą posiadać wewnętrzne parametry używane w algorytmie, w zależności od roli parametrów mogą one być definiowane w module, z linii komend lub pobierane z DB podczas inicjalizacji modułu. abc BrModule klasa bazowa dla każdego modułu, BrModuleContainer kasa, która zapewnia odpowiednią kolejność wywoływania funkcji modułów. Definicja (setup) obiektu tej klasy definiuje proces (job) będący fragmentem analizy/rekonstrukcji danych. 3
BrModule- stanowi schemat dla każdego pochodnego modułu 4
BrModule- jako podstawowa definicja interfejsu Funkcje publiczne stanowiące rodzaj interfejsu do każdego modułu to: Init(), Begin(), Event(...), End(), Finish(). Są one wirtualne co pozwala na ich przeładowanie w klasach pochodnych. Funkcji tych nie zmieniamy lecz tworzymy funkcje przeładowane we własnych klasach pochodnych, czyli modułach naszego autorstwa. wszystkie moduły posiadają wspólny interface, możemy moduły możemy zagnieżdżać w kontenerach tworząc tzw. kompozyty. 5
BrMojModule- omówienie podstawowych funkcji Każdy pochodny moduł musi dziedziczyć z BrModule Pozostawiamy funkcje publiczne na wzów klasy bazowej:init(), Begin(), Event(...), End(), Finish(). Dodatkowo umieszczamy funkcje Book(). Jeżeli, któraś z tych funkcji nie jest używana może pozostać niezdefiniowana. Inne dopuszczalne publiczne funkcje to Set-ersy i ewentualnie Get-ersy. Jeżeli którąś z powyższych funkcji chcemy rozdzielić na więcej funkcji to powinny to być funkcje wirtualne i protegowane (zadeklarowane w bloku protected). To zabezpiecza je przed użyciem przez przypadkowego użytkownika i umożliwia ich przeładowanie w klasach pochodnych. Po utworzeniu modułu w programie zewnętrznym (operatorem new wołając konstruktor) dokonujemy wstępnej inicjalizacji modułu przy użyciu Set-ersów. 6
BrMojModule- funkcje interfejsu Init(): dopełnia inicjalizacji modułu, wołana jest po zdefiniowaniu wszystkich parametrów użytkownika, tylko raz podczas wykonywania programu (once per job). W tej funkcji powinniśmy zdefiniować wszystkie parametry zewnętrzne (z DB), które nie zmieniają się podczas wykonywania programu. Book(): zdefiniowanie histogramów diagnostycznych. Wyciągnięcie tej funkcji poza Init() jest wyborem stylu (w zasadzie można by wołać tą funkcję z Init()). Begin(): wołana przed rozpoczęciem analizy danego runu (jednostki pomiaru). Pozwala na inicjalizację modułu specyficzną dla danego runu, np. parametry kalibracyjne mogą się zmieniać od runu do runu i należy je uaktualnić podczas tego wywołania. 7
BrMojModule- funkcje interfejsu (c.d.) Event(BrEventNode* innode, BrEventNode* outnode): funkcja wołana w pętli po (analizowanych) zdarzeniach. Moduł może używać obu nodów. Ogólna reguła jest taka, że pierwszy argument jest kontenerem danych wejściowych, drugi node może być pusty. Jeżeli moduł utworzy nową tablicę danych to jest ona dodawana do nodu (kontenera) wyjściowego. Nody władają obiektami składowy dlatego po zakończeniu obróbki zdarzenia usunięcie nodu powoduje usunięcie wszystkich danych. End(): wołana po zakończeniu analizy runu. Porządkuje czyści informacje związane z danym runem, np. zapisuje na dysk histogramy odnoszące się do danego runu. Może zdarzyć się konieczność posprzątania przed następnym Begin(). Finish(): wołana na zakończenia całego programy (once per job). Końcowe operacje na obiektach (np. normalizacja histogramów) przed ich zapisem na dysk. Zapis wszystkich wymaganych danych na dysk, itd., 8
Schemat blokowy analizy dla pojedynczego modułu konstruktor + set-ersy tworzenie (book-owanie) histogramów globalnych wczytanie globalnych parametrów z bazy danych itd. operacje konieczne po zakończeniu analizy run-u dla danego runu: tworzenie (book-owanie) histogramów, wczytanie parametrów z db, itd. obróbka danych zdarzenie po zdarzeniu tworzenie nowych struktur i zapisanie ich w tablicy wyjściowej (outnode) operacje końcowe 9
BRAT: kontener modułów brat/modules/abs klasa umożliwiająca łatwe manipulowanie modułami, chodzi głównie o wywołanie ich w odpowiedniej kolejności Definicja (setup) obiektu tej klasy (BrModuleContainer) definiuje proces (job) będący fragmentem analizy/rekonstrukcji danych. 10
BrModuleContainer- uporządkowana kolekcja (łańcuch/sekwencja) modułów 11
BrModuleContainer- przykładowe funkcje 12
BrModuleContainer- schemat kolejnego wywołania modułów (ordered execution) dane podstawowe: hity, dane kalibracyjne parametry użytkownika dane kalibracyjne zrekonstruowane dane fizyczne, tory+pid=cząstki, globalna informacja o zdarzeniu: parametr zderzenia, pozycja wierzchołka 13
BrModuleContainer funkcje określające łańcuch wywołań (Init()) 14
BrModuleContainer funkcje określające łańcuch wywołań (Event()) 15
BrModuleContainer funkcje kontrolne 16
BrMainModule singleton, podstawowy moduł jednokrotnej analizy 17
BrMainModule fginstance i konstruktor 18
BrMainModule definicja interfejsu 19
BrMainModule funkcja Main() 20
BrMainModule funkcja Main(), cd. 21
BrMainModule wywołanie funkcji łańcucha modułów (Init(), Begin(),Event() End(), Finish() ) 22
BrMainModule wywołanie funkcji łańcucha modułów: funkcja Event 23
bratmain >bratmain mainconfig.c [opcje] program główny, w którym interpreter wykonuje zawartość skryptu mainconfig.c opcje definiujące ustawienie (setup) BrMainModule skrypt w którym określony jest setup BrMainModule 24
bratmain: 25
bratmain: 26
przyklad skryptu: oficjalny skrypt do lokalnego trakowania i inne 27