File indexing completed on 2025-08-05 08:12:44
0001
0002
0003 #include "SaveCanvas.C"
0004 #include "sPhenixStyle.C"
0005
0006 #include <TCanvas.h>
0007 #include <TDatabasePDG.h>
0008 #include <TFile.h>
0009 #include <TH1D.h>
0010 #include <TH1F.h>
0011 #include <TH2F.h>
0012 #include <TH3F.h>
0013 #include <TLegend.h>
0014 #include <TLine.h>
0015 #include <TLorentzVector.h>
0016 #include <TRandom3.h>
0017 #include <TString.h>
0018 #include <TTree.h>
0019 #include <TVirtualFitter.h>
0020
0021 #include <assert.h>
0022
0023 #include <cmath>
0024 #include <cstddef>
0025 #include <iostream>
0026
0027 using namespace std;
0028
0029 TFile *_file0 = NULL;
0030 TFile *_file_trigger = NULL;
0031 TString description;
0032
0033 typedef vector<vector<TH1 *> > chipMultiplicitySet_vec;
0034
0035 chipMultiplicitySet_vec MakeChipMultiplicitySet(TFile *file)
0036 {
0037 assert(file);
0038
0039 TH3 *LayerChipMultiplicity = (TH3 *) file->GetObjectChecked("LayerChipMultiplicity", "TH3");
0040
0041 TCanvas *c1 = new TCanvas("MakeChipMultiplicitySet", "MakeChipMultiplicitySet", 1800, 960);
0042 c1->Divide(9, 3, 0, 0);
0043 int idx = 1;
0044 TPad *p;
0045
0046 chipMultiplicitySet_vec chipMultiplicitySet;
0047
0048 for (int ilayer = 1; ilayer <= LayerChipMultiplicity->GetNbinsX(); ++ilayer)
0049 {
0050 vector<TH1 *> chipMultiplicityLayer;
0051
0052 for (int ichip = 1; ichip <= LayerChipMultiplicity->GetNbinsY(); ++ichip)
0053 {
0054 p = (TPad *) c1->cd(idx++);
0055 c1->Update();
0056 p->SetLogy();
0057
0058 LayerChipMultiplicity->GetXaxis()->SetRange(ilayer, ilayer);
0059 LayerChipMultiplicity->GetYaxis()->SetRange(ichip, ichip);
0060
0061 TString histname(Form("ChipMultiplicity_Layer%dChip%d", ilayer - 1, ichip - 1));
0062 TH1 *h = LayerChipMultiplicity->Project3D("z");
0063 h->SetTitle(";Chip Multiplicity [pixel];Count");
0064
0065 h->SetName(histname);
0066
0067 h->Draw();
0068
0069 h->SetDirectory(NULL);
0070 h->ComputeIntegral(true);
0071
0072 chipMultiplicityLayer.push_back(h);
0073 }
0074
0075 chipMultiplicitySet.push_back(chipMultiplicityLayer);
0076 }
0077
0078 SaveCanvas(c1, TString(file->GetName()) + TString(c1->GetName()), false);
0079
0080 c1 = new TCanvas("MakeChipMultiplicitySetChip4", "MakeChipMultiplicitySetChip4", 1200, 960);
0081 gPad->SetLogy();
0082 TH1 *LayerMultiplicityLayer0 = chipMultiplicitySet[0][4];
0083 TH1 *LayerMultiplicityLayer1 = chipMultiplicitySet[1][4];
0084 TH1 *LayerMultiplicityLayer2 = chipMultiplicitySet[2][4];
0085
0086 LayerMultiplicityLayer0->SetLineColor(kRed + 2);
0087 LayerMultiplicityLayer1->SetLineColor(kBlue + 2);
0088 LayerMultiplicityLayer2->SetLineColor(kGreen + 2);
0089
0090 LayerMultiplicityLayer0->Draw();
0091 LayerMultiplicityLayer1->Draw("same");
0092 LayerMultiplicityLayer2->Draw("same");
0093
0094 LayerMultiplicityLayer0->SetTitle(";Chip multiplicity [Pixel];Count");
0095
0096 TLegend *leg = new TLegend(.5, .5, .93, .93);
0097 leg->AddEntry("", "#it{#bf{sPHENIX}} Simulation", "");
0098 leg->AddEntry("", description, "");
0099 leg->AddEntry(LayerMultiplicityLayer0, Form("MVTX Layer0 Chip4, <hit> = %.1f", LayerMultiplicityLayer0->GetMean()), "l");
0100 leg->AddEntry(LayerMultiplicityLayer1, Form("MVTX Layer1 Chip4, <hit> = %.1f", LayerMultiplicityLayer1->GetMean()), "l");
0101 leg->AddEntry(LayerMultiplicityLayer2, Form("MVTX Layer2 Chip4, <hit> = %.1f", LayerMultiplicityLayer2->GetMean()), "l");
0102 leg->Draw();
0103
0104 SaveCanvas(c1, TString(file->GetName()) + TString(c1->GetName()), false);
0105
0106 return chipMultiplicitySet;
0107 }
0108
0109 void Check(TFile *file)
0110 {
0111 assert(file);
0112
0113 TCanvas *c1 = new TCanvas("Check", "Check", 1800, 960);
0114 c1->Divide(2, 2);
0115 int idx = 1;
0116 TPad *p;
0117
0118 p = (TPad *) c1->cd(idx++);
0119 c1->Update();
0120
0121
0122 TH1 *hNormalization = (TH1 *) file->GetObjectChecked("hNormalization", "TH1");
0123 hNormalization->Draw();
0124
0125 p = (TPad *) c1->cd(idx++);
0126 c1->Update();
0127
0128
0129 TH1 *hNChEta = (TH1 *) file->GetObjectChecked("hNChEta", "TH1");
0130 assert(hNChEta);
0131 double norm = hNChEta->GetBinWidth(1) * hNormalization->GetBinContent(2);
0132 hNChEta->Scale(1. / norm);
0133 hNChEta->Draw();
0134
0135 hNChEta->GetYaxis()->SetTitle("dN_{Ch}/d#eta");
0136
0137
0138 p = (TPad *) c1->cd(idx++);
0139 c1->Update();
0140 TH1 *hVertexZ = (TH1 *) file->GetObjectChecked("hVertexZ", "TH1");
0141 hVertexZ->Draw();
0142
0143 p = (TPad *) c1->cd(idx++);
0144 c1->Update();
0145 p->SetLogy();
0146
0147 TH2 *LayerMultiplicity = (TH2 *) file->GetObjectChecked("LayerMultiplicity", "TH2");
0148 TH1 *LayerMultiplicityLayer0 =
0149 LayerMultiplicity->ProjectionY("LayerMultiplicityLayer0", 1, 1);
0150 TH1 *LayerMultiplicityLayer1 =
0151 LayerMultiplicity->ProjectionY("LayerMultiplicityLayer1", 2, 2);
0152 TH1 *LayerMultiplicityLayer2 =
0153 LayerMultiplicity->ProjectionY("LayerMultiplicityLayer2", 3, 3);
0154
0155 LayerMultiplicityLayer0->SetLineColor(kRed + 2);
0156 LayerMultiplicityLayer1->SetLineColor(kBlue + 2);
0157 LayerMultiplicityLayer2->SetLineColor(kGreen + 2);
0158
0159 LayerMultiplicityLayer0->Draw();
0160 LayerMultiplicityLayer1->Draw("same");
0161 LayerMultiplicityLayer2->Draw("same");
0162
0163 LayerMultiplicityLayer0->SetTitle(";Chip multiplicity [Pixel];Count");
0164
0165 TLegend *leg = new TLegend(.5, .5, .93, .93);
0166 leg->AddEntry("", "#it{#bf{sPHENIX}} Simulation", "");
0167 leg->AddEntry("", description, "");
0168 leg->AddEntry(LayerMultiplicityLayer0, Form("MVTX Layer0, <hit> = %.1f", LayerMultiplicityLayer0->GetMean()), "l");
0169 leg->AddEntry(LayerMultiplicityLayer1, Form("MVTX Layer1, <hit> = %.1f", LayerMultiplicityLayer1->GetMean()), "l");
0170 leg->AddEntry(LayerMultiplicityLayer2, Form("MVTX Layer2, <hit> = %.1f", LayerMultiplicityLayer2->GetMean()), "l");
0171 leg->Draw();
0172
0173 SaveCanvas(c1, TString(file->GetName()) + TString(c1->GetName()), false);
0174 }
0175
0176 TH1 *MakeCDF(TH1 *h)
0177 {
0178 assert(h);
0179
0180 TH1 *hCDF = (TH1 *) h->Clone(TString("CDF") + h->GetName());
0181 hCDF->SetDirectory(NULL);
0182
0183 double integral = 0;
0184
0185 for (int bin = h->GetNbinsX() + 1; bin >= 0; --bin)
0186 {
0187 integral += h->GetBinContent(bin);
0188 hCDF->SetBinContent(bin, integral);
0189 }
0190
0191 for (int bin = h->GetNbinsX(); bin >= 1; --bin)
0192 {
0193 hCDF->SetBinContent(bin, hCDF->GetBinContent(bin) / integral);
0194 }
0195
0196 return hCDF;
0197 }
0198
0199 chipMultiplicitySet_vec TriggerMultiplicity(chipMultiplicitySet_vec cm_MB, chipMultiplicitySet_vec cm_Trigger, const double mu_MB, const int n_Trigger, const double mu_Noise)
0200 {
0201
0202 chipMultiplicitySet_vec cm;
0203
0204 const static int MaxMultiplicity(2000);
0205
0206 for (auto &layer : cm_MB)
0207 {
0208 vector<TH1 *> chipMultiplicityLayer;
0209
0210 for (auto &chip : layer)
0211 {
0212 TH1 *h = new TH1D(
0213 TString("Trigger") + chip->GetName(), TString("Trigger") + chip->GetName(),
0214 MaxMultiplicity, -.5, MaxMultiplicity - .5);
0215
0216
0217 h->SetDirectory(NULL);
0218 h->GetXaxis()->SetTitle(chip->GetXaxis()->GetTitle());
0219 h->GetYaxis()->SetTitle(chip->GetYaxis()->GetTitle());
0220
0221 assert(h);
0222 chipMultiplicityLayer.push_back(h);
0223 }
0224 cm.push_back(chipMultiplicityLayer);
0225 }
0226
0227
0228 TRandom3 rnd(1234);
0229 assert(mu_MB >= 0);
0230 assert(n_Trigger >= 0 && n_Trigger <= 1);
0231 assert(mu_Noise >= 0);
0232
0233
0234 const int NSample = 10000000;
0235 for (int i = 0; i < NSample; ++i)
0236 {
0237 if (i % (NSample / 10) == 0)
0238 {
0239 cout << "TriggerMultiplicity - " << i << endl;
0240 }
0241
0242 int n_MB = rnd.Poisson(mu_MB);
0243 int n_Noise = rnd.Poisson(mu_Noise);
0244
0245 int ilayer = 0;
0246 for (auto &layer : cm)
0247 {
0248 int ichip = 0;
0249 for (auto &chip : layer)
0250 {
0251 assert(chip);
0252 int n_hit = n_Noise;
0253
0254 assert(ilayer < cm_Trigger.size());
0255 assert(ichip < cm_Trigger[ilayer].size());
0256 assert(cm_Trigger[ilayer][ichip]);
0257 if (n_Trigger)
0258 {
0259 double rndHit = cm_Trigger[ilayer][ichip]->GetRandom();
0260 if (rndHit < .5) rndHit = 0;
0261
0262
0263 n_hit += rndHit;
0264 }
0265
0266 assert(ilayer < cm_MB.size());
0267 assert(ichip < cm_MB[ilayer].size());
0268 assert(cm_MB[ilayer][ichip]);
0269 for (int iMB = 0; iMB < n_MB; ++iMB)
0270 {
0271 double rndHit = cm_MB[ilayer][ichip]->GetRandom();
0272 if (rndHit < .5) rndHit = 0;
0273
0274 n_hit += rndHit;
0275 }
0276
0277
0278 chip->Fill(n_hit);
0279
0280 ++ichip;
0281 }
0282 ++ilayer;
0283 }
0284 }
0285
0286 TString UniqueName(Form("_muMB%.0f_nTrig%d_muNoise%.0f", mu_MB * 100, n_Trigger, mu_Noise));
0287
0288
0289 TCanvas *c1 = new TCanvas("TriggerMultiplicity" + UniqueName, "TriggerMultiplicity" + UniqueName, 1800, 960);
0290 c1->Divide(9, 3, 0, 0);
0291 int idx = 1;
0292 TPad *p;
0293
0294 for (auto &layer : cm)
0295 {
0296 vector<TH1 *> chipMultiplicityLayer;
0297
0298 for (auto &chip : layer)
0299 {
0300 p = (TPad *) c1->cd(idx++);
0301 c1->Update();
0302 p->SetLogy();
0303
0304 chip->SetTitle(";Chip Multiplicity [pixel];Count");
0305 chip->Draw();
0306 }
0307 }
0308
0309 SaveCanvas(c1, TString(_file0->GetName()) + TString(c1->GetName()), false);
0310
0311 c1 = new TCanvas("TriggerMultiplicityChip4" + UniqueName, "TriggerMultiplicityChip4" + UniqueName, 1900, 750);
0312 c1->Divide(2, 1);
0313 idx = 1;
0314
0315 p = (TPad *) c1->cd(idx++);
0316 c1->Update();
0317 p->SetLogy();
0318
0319 TH1 *LayerMultiplicityLayer0 = cm[0][4];
0320 TH1 *LayerMultiplicityLayer1 = cm[1][4];
0321 TH1 *LayerMultiplicityLayer2 = cm[2][4];
0322
0323 LayerMultiplicityLayer0->SetLineColor(kRed + 2);
0324 LayerMultiplicityLayer1->SetLineColor(kBlue + 2);
0325 LayerMultiplicityLayer2->SetLineColor(kGreen + 2);
0326
0327 LayerMultiplicityLayer0->Draw();
0328 LayerMultiplicityLayer1->Draw("same");
0329 LayerMultiplicityLayer2->Draw("same");
0330
0331 LayerMultiplicityLayer0->SetTitle(";Chip multiplicity [Pixel];Count");
0332
0333 TLegend *leg = new TLegend(.45, .55, .93, .93);
0334 leg->AddEntry("", "#it{#bf{sPHENIX}} Simulation", "");
0335 leg->AddEntry("", description, "");
0336 leg->AddEntry("", Form("#mu_{MB} = %.1f, N_{Trig} = %d, #mu_{Noise} = %.1f", mu_MB, n_Trigger, mu_Noise), "");
0337 leg->AddEntry(LayerMultiplicityLayer0, Form("MVTX Layer0 Chip4, <hit> = %.1f", LayerMultiplicityLayer0->GetMean()), "l");
0338 leg->AddEntry(LayerMultiplicityLayer1, Form("MVTX Layer1 Chip4, <hit> = %.1f", LayerMultiplicityLayer1->GetMean()), "l");
0339 leg->AddEntry(LayerMultiplicityLayer2, Form("MVTX Layer2 Chip4, <hit> = %.1f", LayerMultiplicityLayer2->GetMean()), "l");
0340 leg->Draw();
0341
0342 p = (TPad *) c1->cd(idx++);
0343 c1->Update();
0344 p->SetLogy();
0345
0346 p->DrawFrame(0, 1. / NSample, MaxMultiplicity, 1)->SetTitle(";Chip multiplicity [Pixel];CCDF");
0347 TLine *line = new TLine(0, 1e-3, MaxMultiplicity, 1e-3);
0348 line->SetLineColor(kGray);
0349 line->SetLineWidth(3);
0350 line->Draw("same");
0351
0352 MakeCDF(LayerMultiplicityLayer0)->Draw("same");
0353 MakeCDF(LayerMultiplicityLayer1)->Draw("same");
0354 MakeCDF(LayerMultiplicityLayer2)->Draw("same");
0355
0356 SaveCanvas(c1, TString(_file0->GetName()) + TString(c1->GetName()), false);
0357
0358 return cm;
0359 }
0360
0361 void OccupancySim(
0362
0363
0364
0365 const TString infile = "/sphenix/user/jinhuang/HF-jet/MVTX_Multiplicity/AuAu200MB_30cmVZ_Iter5/AuAu200MB_30cmVZ_Iter5_SUM.xml_HFMLTriggerOccupancy.root",
0366 const TString infile_trigger = "/sphenix/user/jinhuang/HF-jet/MVTX_Multiplicity/AuAu200MB_10cmVZ_Iter5/AuAu200MB_10cmVZ_Iter5_SUM.xml_HFMLTriggerOccupancy.root",
0367 const TString disc = "Au+Au MB, #sqrt{s_{NN}} = 200 GeV"
0368 )
0369 {
0370 SetsPhenixStyle();
0371 TVirtualFitter::SetDefaultFitter("Minuit2");
0372
0373 description = disc;
0374 _file0 = new TFile(infile);
0375 assert(_file0->IsOpen());
0376 _file_trigger = new TFile(infile_trigger);
0377 assert(_file_trigger->IsOpen());
0378
0379 _file0->cd();
0380 Check(_file0);
0381 chipMultiplicitySet_vec chipMultiplicity = MakeChipMultiplicitySet(_file0);
0382
0383 _file_trigger->cd();
0384 Check(_file_trigger);
0385 chipMultiplicitySet_vec chipMultiplicityTrigger = MakeChipMultiplicitySet(_file_trigger);
0386
0387
0388 TriggerMultiplicity(chipMultiplicity, chipMultiplicityTrigger,
0389 200e3 * 10e-6, 1, 1024 * 512 * 1e-6 + 2);
0390
0391 TriggerMultiplicity(chipMultiplicity, chipMultiplicityTrigger,
0392 200e3 * 15e-6, 0, 1024 * 512 * 1e-6 + 2);
0393
0394 TriggerMultiplicity(chipMultiplicity, chipMultiplicityTrigger,
0395 200e3 * 10e-6, 0, 1024 * 512 * 1e-6 + 2);
0396
0397 TriggerMultiplicity(chipMultiplicity, chipMultiplicityTrigger,
0398 200e3 * 5e-6, 0, 1024 * 512 * 1e-6 + 2);
0399
0400 TriggerMultiplicity(chipMultiplicity, chipMultiplicityTrigger,
0401 100e3 * 5e-6, 0, 1024 * 512 * 1e-6 + 2);
0402
0403 TriggerMultiplicity(chipMultiplicity, chipMultiplicityTrigger,
0404 50e3 * 5e-6, 0, 1024 * 512 * 1e-6 + 2);
0405
0406 TriggerMultiplicity(chipMultiplicity, chipMultiplicityTrigger,
0407 200e3 * 15e-6, 0, 1024 * 512 * 1e-5 + 2);
0408
0409 TriggerMultiplicity(chipMultiplicity, chipMultiplicityTrigger,
0410 200e3 * 10e-6, 0, 1024 * 512 * 1e-5 + 2);
0411
0412 TriggerMultiplicity(chipMultiplicity, chipMultiplicityTrigger,
0413 200e3 * 5e-6, 0, 1024 * 512 * 1e-5 + 2);
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436 }