1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
#include "TTree.h"
#include "TText.h"
#include "TGraph.h"
#include "TFile.h"
#include "TH1F.h"
#include "TCanvas.h"
#include "TLegend.h"
#include "TPaveStats.h"
TGraph* makegr(char* infileName, Double_t startPos = -300, Double_t step = 20, const Int_t n = 32, char* Det = "BPIX Half Barrels", char* ScanDirection = "delta z", char* plotVar = "Chi2", Double_t offset = 0, int lineColor = 1)
{
gStyle->SetPadLeftMargin(0.15);
gStyle->SetPadRightMargin(0.15);
gStyle->SetOptFit();
gStyle->SetOptStat(1111);
gStyle->SetTitleFontSize(0.05);
gStyle->SetTitleOffset(2, "Y");
TFile* inFile = TFile::Open(infileName);
char mytreeN[64];
Double_t zPos[n - 1];
Int_t zPosI[n-1];
Double_t chi2 = 0;
Int_t nhit = 0;
Double_t chi2Vec[n - 1];
Int_t nhitVec[n - 1];
Double_t chi2ph[n - 1];
for (int iter = 2; iter <= n; iter++) {
snprintf(mytreeN, sizeof(mytreeN), "T9_%d", iter);
TTree* mytree = (TTree*)inFile->Get(mytreeN);
mytree->SetBranchAddress("AlignableChi2", &chi2);
mytree->SetBranchAddress("Nhit", &nhit);
mytree->GetEntry(0);
//T9_1 has Chi2 at iter0, T9_2 has Chi2 at iter1
zPos[iter - 2] = startPos + step * (iter - 2);
zPosI[iter - 2] = startPos + step * (iter - 2);
chi2Vec[iter - 2] = chi2 - offset;
nhitVec[iter - 2] = nhit;
if (nhit != 0)
chi2ph[iter - 2] = chi2 / nhit;
else
chi2ph[iter - 2] = 0;
cout << ScanDirection << " position=" << zPos[iter - 2] << ", chi2=" << chi2Vec[iter - 2] << ", hit=" << nhitVec[iter - 2] << ", chi2 per hit=" << chi2ph[iter - 2] << endl;
}
TGraph* gr;
if (strcmp(plotVar, "Chi2") == 0)
gr = new TGraph(n - 1, zPos, chi2Vec);
else if (strcmp(plotVar, "Chi2PerHit") == 0)
gr = new TGraph(n - 1, zPos, chi2ph);
else if (strcmp(plotVar,"nhits")==0)
gr = new TGraph (n-1,zPosI,nhitVec);
gr->SetLineColor(lineColor);
char title[50];
sprintf(title, "%s scan of %s in %s", plotVar, ScanDirection, Det);
gr->SetTitle(title);
gr->GetXaxis()->SetTitle(ScanDirection);
gr->GetYaxis()->SetTitle(plotVar);
return gr;
}
void plotchi2()
{
/************* START DEFINED BY USER *****************/
char* infile = "/afs/cern.ch/cms/CAF/CMSALCA/ALCA_TRACKERALIGN2/HIP/public/AlignmentCamp2016/CMSSW_8_0_3/src/Alignment/HIPAlignmentAlgorithm/hp1609_scanBPIXz/main/IOUserVariables.root";
Double_t start = -300, end = 300, step = 20; //unit is um, the number of iterations must be bigger than (end-start)/step+2
char* detName = "BPIX_Half_Barrels"; //scanned detector
char* scanDir = "delta_z"; //scan direction
// char* scanVar = "Chi2"; // choose from: Chi2, Chi2PerHit,nhits
char* scanVar = "nhits"; // choose from: Chi2, Chi2PerHit,nhits
/************** END DEFINED BY USER ******************/
int n_iter = (end - start) / step + 2;
TGraph* gr1 = makegr(infile, start, step, n_iter, detName, scanDir, scanVar);
TCanvas* c = new TCanvas("c", "c", 1000, 10, 800, 800);
c->cd();
gr1->Draw("AC*");
c->Update();
TLine* l = new TLine(0, c->GetUymin(), 0, c->GetUymax());
l->SetLineStyle(2);
l->Draw();
char plotName[50];
sprintf(plotName, "%sscan_%s_%s.png", scanVar, scanDir, detName);
c->SaveAs(plotName);
}
|