{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Анализ димюонного спектра с использованием данных детектора CMS" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Открыть файл с данными" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "f = TFile::Open(\"root://eospublic.cern.ch//eos/opendata/cms/derived-data/AOD2NanoAODOutreachTool/Run2012BC_DoubleMuParked_Muons.root\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Здесь есть дерево `Events`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Дерево содержит следующие поля\n", "\n", "| Поле | Тип | Описание |\n", "|-------------|-----------|-------------|\n", "| `nMuon` | `unsigned int` | Number of muons in this event |\n", "| `Muon_pt` | `float[nMuon]` | Transverse momentum of the muons (stored as an array of size `nMuon`) |\n", "| `Muon_eta` | `float[nMuon]` | Pseudorapidity of the muons |\n", "| `Muon_phi` | `float[nMuon]` | Azimuth of the muons |\n", "| `Muon_mass` | `float[nMuon]` | Mass of the muons |\n", "| `Muon_charge` | `int[nMuon]` | Charge of the muons (either 1 or -1) |" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Events->GetEntries() //событий в дереве" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Приступаем к анализу" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$X \\to \\mu^+ \\mu^-$\n", "\n", "*Условия отбора*:\n", "ищем события с\n", "1. двумя мюонами\n", "2. суммарный заряд которых равен нулю\n", "\n", "*Картинка*:\n", "построим инвариантную массу пары $\\mu^+\\mu^-$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Пишем вспомогательную функцию, которая вернёт инвариантную массу пары мюонов" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Double_t InvariantMass(Float_t pt0, Float_t eta0, Float_t phi0, Float_t mass0, Float_t pt1, Float_t eta1, Float_t phi1, Float_t mass1){\n", " ROOT::Math::PtEtaPhiMVector m1(pt0, eta0, phi0, mass0);\n", " ROOT::Math::PtEtaPhiMVector m2(pt1, eta1, phi1, mass1);\n", " return (m1+m2).mass();\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Создаю гистограмму" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "invMass_hist = new TH1D(\"hist\", \"InvMass\", 10000, 0, 120)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь нужно пройти по нашему дереву `Events` и вытащить оттуда события, удовлетворяющие критериям отбора, вычислить их инвариантную массу и записать в гистограмму" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Проход по дереву осуществляется с помощью [`TTreeReader`](https://root.cern.ch/7-using-ttreereader)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "TTreeReader reader(\"Events\", f);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ему дополнительно нужно показать ветки дерева, которые мы будем использовать" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "TTreeReaderArray pt(reader, \"Muon_pt\");\n", "TTreeReaderArray eta(reader, \"Muon_eta\");\n", "TTreeReaderArray phi(reader, \"Muon_phi\");\n", "TTreeReaderArray m(reader, \"Muon_mass\");\n", "TTreeReaderArray ch(reader, \"Muon_charge\");\n", "TTreeReaderValue num(reader, \"nMuon\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Пара вспомогательных переменных" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "int i=0;\n", "double mass;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Пример: пройти по дереву и выписать поперечные импульсы треков в событиях с `nMuon==1` и `Muon_phi<0.1`\n", "```c++\n", "while(reader.Next()){\n", " if((*num==1)&&(phi[0]<0.1)){\n", " cout << \"MOM: \" << pt[0] << endl;\n", " }\n", "}\n", "\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь по нашему анализу" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задача**: исправьте ошибки в следующем блоке" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "invMass_hist->Reset(); //на всякий случай чищу гистограмму\n", "reader.Restart();//на всякий случай сбрасываю reader\n", "i = 0;\n", "while(reader.Next()){\n", " if((*num==2)&&(ch[0]==ch[1])&&(phi[0]*phi[1]<0)){\n", " mass = InvariantMass(eta[0], phi[0], m[0], pt[0], pt[1], eta[1], phi[1], m[1]);\n", " hist->Fill(mass);\n", " i++;\n", " if(i%1000==0)\n", " cout << i << '\\t' << mass << endl;\n", " }\n", " if(i==10000) //дерево гигантское, поэтому если мы не хотим ждать сутки, то лучше остановиться пораньше\n", " break;\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задача**: постройте гистограмму с инвариантной массой двух мюонов, подпишите оси, добавьте заголовок" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "TCanvas c1(\"can1\", \"Canvas\", 600, 600);" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "//код\n", "c1.Draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задача**: постройте гистограмму в окне `c2` в логарифмическом масштабе по оси x, уберите окно со статистикой, добавьте сетку" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "TCanvas c2(\"can2\", \"Canvas\", 1000, 600);" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "//код\n", "c2.Draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Вы видите что-то необычное? Например пик от $Z$-бозона где-то около 90 ГэВ?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Ищем массу Z" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь наша глобальная задача будет определить **массу $Z$-бозона**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Клонируем нашу гистограмму в новую гистограмму `hist_Z` для дальнейшейшей работы" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "hist_Z = (TH1D*)(invMass_hist->Clone())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задача**: [сфокусировать](https://root.cern.ch/how/how-set-ranges-axis) гистограмму на Z-бозоне, построить её в окне `c3`\n", "\n", "p.s: если событий мало, то перебинируйте гистограмму `hist_Z->Rebin(2);` (можно несколько раз, или вставьте другое число)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "TCanvas c3(\"can3\", \"Canvas\", 1000, 600);" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "hist_Z->Draw(); //добавьте свой код сюда\n", "c3.Draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задача**: \n", "1. придумать и написать функцию = сигнал + фон, которой вы будете подгонять данные\n", "2. фитировать гистограмму, отрисовать результат в окне `c3`, добавить окно со статистикой\n", "3. **найти массу Z-бозона**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data_dist = new TF1(\"sig_bkg\", \"\", 80, 100); //напишите ваш код" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data_dist->SetParameters //не забудьте выставить начальные параметры" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "//добавьте код" ] } ], "metadata": { "kernelspec": { "display_name": "ROOT C++", "language": "c++", "name": "root" }, "language_info": { "codemirror_mode": "text/x-c++src", "file_extension": ".C", "mimetype": " text/x-c++src", "name": "c++" } }, "nbformat": 4, "nbformat_minor": 2 }