BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
FieldExtrapolator.C
Go to the documentation of this file.
1
2
3using namespace TMath;
4
6{
7
8 TString name1900 = "FieldMap_1900.root";
9 TFile* file1900 = TFile::Open(name1900);
10 TTreeReader reader("Field_map", file1900);
11 TTreeReaderArray<Double_t> x(reader, "field_points.X");
12 TTreeReaderArray<Double_t> y(reader, "field_points.Y");
13 TTreeReaderArray<Double_t> z(reader, "field_points.Z");
14 TTreeReaderArray<Double_t> bx(reader, "field_points.Bx");
15 TTreeReaderArray<Double_t> by(reader, "field_points.By");
16 TTreeReaderArray<Double_t> bz(reader, "field_points.Bz");
17
18 Int_t fNx = 126;
19 Double_t fXmin = -155.78;
20 Double_t fXmax = 144.82;
21 Double_t fXstep = (fXmax - fXmin) / (fNx - 1);
22
23 Int_t fNy = 47;
24 Double_t fYmin = -37.67;
25 Double_t fYmax = 54.33;
26 Double_t fYstep = (fYmax - fYmin) / (fNy - 1);
27
28 Int_t fNz = 241;
29 Double_t fZmin = -162.16;
30 Double_t fZmax = 439.04;
31 Double_t fZstep = (fZmax - fZmin) / (fNz - 1);
32
33 cout << fXstep << " " << fYstep << " " << fZstep << endl;
34 // fXstep = 2.4cm
35 // fYstep = 2.0cm
36 // fZstep = 2.5cm
37
38 Int_t nExtraPointsX = 40; // количество точек, добавляемых справа и слева от графиков после экстраполяции по X, 40
39 // точек соответствует +-96 см
40 Int_t nExtraPointsY = 20; // количество точек, добавляемых справа и слева от графиков после экстраполяции по Y, 20
41 // точек соответствует +-40 см
42 Int_t nExtraPointsZ = 50; // количество точек, добавляемых справа и слева от графиков после экстраполяции по z, 50
43 // точек соответствует +-125 см
44
45 TGraph* gBx_vs_z[fNy][fNx];
46 TGraph* gBy_vs_z[fNy][fNx];
47 TGraph* gBz_vs_z[fNy][fNx];
48
49 Int_t pntNumber = 0;
50 while (reader.Next()) {
51 if (pntNumber % 10000 == 0)
52 printf("pntNumber = %d\n", pntNumber);
53
54 Int_t iz = pntNumber % fNz;
55 Int_t ix = (pntNumber / fNz) % fNx;
56 Int_t iy = ((pntNumber / fNz) / fNx) % fNy;
57
58 if (iz == 0) {
59 gBx_vs_z[iy][ix] = new TGraph(fNz + nExtraPointsZ + nExtraPointsZ);
60 gBy_vs_z[iy][ix] = new TGraph(fNz + nExtraPointsZ + nExtraPointsZ);
61 gBz_vs_z[iy][ix] = new TGraph(fNz + nExtraPointsZ + nExtraPointsZ);
62 }
63 Double_t Bx = bx[0];
64 Double_t By = by[0];
65 Double_t Bz = bz[0];
66
67 gBx_vs_z[iy][ix]->SetPoint(iz + nExtraPointsZ, z[0], Bx);
68 gBy_vs_z[iy][ix]->SetPoint(iz + nExtraPointsZ, z[0], Abs(By));
69 gBz_vs_z[iy][ix]->SetPoint(iz + nExtraPointsZ, z[0], Bz);
70
71 pntNumber++;
72 }
73
74 for (Int_t iy = 0; iy < fNy; ++iy) {
75 for (Int_t ix = 0; ix < fNx; ++ix) {
76
77 TF1* ry = new TF1("rightY", "expo");
78 TF1* ly = new TF1("leftY", "expo");
79 Bool_t badFitL = kFALSE;
80 Bool_t badFitR = kFALSE;
81 if (gBy_vs_z[iy][ix]->Fit("rightY", "S0Q+", "", 420, fZmax)->IsValid() == kFALSE || ry->GetParameter(1) > 0)
82 {
83 badFitR = kTRUE;
84 }
85 if (gBy_vs_z[iy][ix]->Fit("leftY", "S0Q+", "", fZmin, -140)->IsValid() == kFALSE || ly->GetParameter(1) < 0)
86 {
87 badFitL = kTRUE;
88 }
89
90 for (Int_t iz = 0; iz < nExtraPointsZ; ++iz) {
91 Double_t z = fZmax + iz * fZstep;
92 gBx_vs_z[iy][ix]->SetPoint(fNz + nExtraPointsZ + iz, z, 0.0 /*rx->Eval(z)*/);
93 gBy_vs_z[iy][ix]->SetPoint(fNz + nExtraPointsZ + iz, z, (badFitR) ? 0.0 : ry->Eval(z));
94 gBz_vs_z[iy][ix]->SetPoint(fNz + nExtraPointsZ + iz, z, 0.0 /*rz->Eval(z)*/);
95 }
96 for (Int_t iz = 0; iz < nExtraPointsZ; ++iz) {
97 Double_t z = fZmin - iz * fZstep;
98 gBx_vs_z[iy][ix]->SetPoint(nExtraPointsZ - 1 - iz, z, 0.0 /*lx->Eval(z)*/);
99 gBy_vs_z[iy][ix]->SetPoint(nExtraPointsZ - 1 - iz, z, (badFitL) ? 0.0 : ly->Eval(z));
100 gBz_vs_z[iy][ix]->SetPoint(nExtraPointsZ - 1 - iz, z, 0.0 /*lz->Eval(z)*/);
101 }
102 delete ry;
103 delete ly;
104 }
105 }
106
107 fZmin -= (nExtraPointsZ)*fZstep;
108 fNz = gBy_vs_z[0][0]->GetN(); // обновляем количество узлов по Z после успешной (надеюсь :) ) экстраполяции
109
110 TGraph* gBx_vs_x[fNy][fNz];
111 TGraph* gBy_vs_x[fNy][fNz];
112 TGraph* gBz_vs_x[fNy][fNz];
113 for (Int_t iy = 0; iy < fNy; ++iy) {
114 for (Int_t iz = 0; iz < fNz; ++iz) {
115 gBx_vs_x[iy][iz] = new TGraph(fNx + nExtraPointsX + nExtraPointsX);
116 gBy_vs_x[iy][iz] = new TGraph(fNx + nExtraPointsX + nExtraPointsX);
117 gBz_vs_x[iy][iz] = new TGraph(fNx + nExtraPointsX + nExtraPointsX);
118 }
119 }
120
121 for (Int_t iy = 0; iy < fNy; ++iy) {
122 for (Int_t ix = 0; ix < fNx; ++ix) {
123 Double_t x = fXmin + ix * fXstep;
124 for (Int_t iz = 0; iz < fNz; ++iz) {
125 Double_t bx = gBx_vs_z[iy][ix]->GetPointY(iz);
126 Double_t by = gBy_vs_z[iy][ix]->GetPointY(iz);
127 Double_t bz = gBz_vs_z[iy][ix]->GetPointY(iz);
128 gBx_vs_x[iy][iz]->SetPoint(ix + nExtraPointsX, x, bx);
129 gBy_vs_x[iy][iz]->SetPoint(ix + nExtraPointsX, x, by);
130 gBz_vs_x[iy][iz]->SetPoint(ix + nExtraPointsX, x, bz);
131 }
132 }
133 }
134
135 for (Int_t iy = 0; iy < fNy; ++iy) {
136 for (Int_t iz = 0; iz < fNz; ++iz) {
137
138 TF1* ry = new TF1("rightY", "expo");
139 TF1* ly = new TF1("leftY", "expo");
140 Bool_t badFitL = kFALSE;
141 Bool_t badFitR = kFALSE;
142 if (gBy_vs_x[iy][iz]->Fit("rightY", "S0Q+", "", 120, 145)->IsValid() == kFALSE || ry->GetParameter(1) > 0) {
143 badFitR = kTRUE;
144 }
145 if (gBy_vs_x[iy][iz]->Fit("leftY", "S0Q+", "", -155, -130)->IsValid() == kFALSE || ly->GetParameter(1) < 0)
146 {
147 badFitL = kTRUE;
148 }
149
150 for (Int_t ix = 0; ix < nExtraPointsX; ++ix) {
151 Double_t x = fXmax + ix * fXstep;
152 gBx_vs_x[iy][iz]->SetPoint(fNx + nExtraPointsX + ix, x, 0.0 /*rx->Eval(x)*/);
153 gBy_vs_x[iy][iz]->SetPoint(fNx + nExtraPointsX + ix, x, (badFitR) ? 0.0 : ry->Eval(x));
154 gBz_vs_x[iy][iz]->SetPoint(fNx + nExtraPointsX + ix, x, 0.0 /*rz->Eval(x)*/);
155 }
156 for (Int_t ix = 0; ix < nExtraPointsX; ++ix) {
157 Double_t x = fXmin - ix * fXstep;
158 gBx_vs_x[iy][iz]->SetPoint(nExtraPointsX - 1 - ix, x, 0.0 /*lx->Eval(x)*/);
159 gBy_vs_x[iy][iz]->SetPoint(nExtraPointsX - 1 - ix, x, (badFitL) ? 0.0 : ly->Eval(x));
160 gBz_vs_x[iy][iz]->SetPoint(nExtraPointsX - 1 - ix, x, 0.0 /*lz->Eval(x)*/);
161 }
162
163 delete ry;
164 delete ly;
165 }
166 }
167
168 fXmin -= (nExtraPointsX)*fXstep;
169 fNx = gBy_vs_x[0][0]->GetN(); // обновляем количество узлов по X после успешной (надеюсь :) ) экстраполяции
170
171 TGraph* gBx_vs_y[fNx][fNz];
172 TGraph* gBy_vs_y[fNx][fNz];
173 TGraph* gBz_vs_y[fNx][fNz];
174 for (Int_t ix = 0; ix < fNx; ++ix) {
175 for (Int_t iz = 0; iz < fNz; ++iz) {
176 gBx_vs_y[ix][iz] = new TGraph(fNy + nExtraPointsY + nExtraPointsY);
177 gBy_vs_y[ix][iz] = new TGraph(fNy + nExtraPointsY + nExtraPointsY);
178 gBz_vs_y[ix][iz] = new TGraph(fNy + nExtraPointsY + nExtraPointsY);
179 }
180 }
181
182 for (Int_t iy = 0; iy < fNy; ++iy) {
183 Double_t y = fYmin + iy * fYstep;
184 for (Int_t ix = 0; ix < fNx; ++ix) {
185 for (Int_t iz = 0; iz < fNz; ++iz) {
186 Double_t bx = gBx_vs_x[iy][iz]->GetPointY(ix);
187 Double_t by = gBy_vs_x[iy][iz]->GetPointY(ix);
188 Double_t bz = gBz_vs_x[iy][iz]->GetPointY(ix);
189 gBx_vs_y[ix][iz]->SetPoint(iy + nExtraPointsY, y, bx);
190 gBy_vs_y[ix][iz]->SetPoint(iy + nExtraPointsY, y, by);
191 gBz_vs_y[ix][iz]->SetPoint(iy + nExtraPointsY, y, bz);
192 }
193 }
194 }
195
196 for (Int_t ix = 0; ix < fNx; ++ix) {
197 for (Int_t iz = 0; iz < fNz; ++iz) {
198
199 TF1* ry = new TF1("rightY", "expo");
200 TF1* ly = new TF1("leftY", "expo");
201 Bool_t badFitL = kFALSE;
202 Bool_t badFitR = kFALSE;
203 if (gBy_vs_y[ix][iz]->Fit("rightY", "S0Q+", "", 40, 55)->IsValid() == kFALSE || ry->GetParameter(1) > 0) {
204 badFitR = kTRUE;
205 }
206 if (gBy_vs_y[ix][iz]->Fit("leftY", "S0Q+", "", -40, -20)->IsValid() == kFALSE || ly->GetParameter(1) < 0) {
207 badFitL = kTRUE;
208 }
209
210 for (Int_t iy = 0; iy < nExtraPointsY; ++iy) {
211 Double_t y = fYmax + iy * fYstep;
212 gBx_vs_y[ix][iz]->SetPoint(fNy + nExtraPointsY + iy, y, 0.0 /*rx->Eval(y)*/);
213 gBy_vs_y[ix][iz]->SetPoint(fNy + nExtraPointsY + iy, y, (badFitR) ? 0.0 : ry->Eval(y));
214 gBz_vs_y[ix][iz]->SetPoint(fNy + nExtraPointsY + iy, y, 0.0 /*rz->Eval(y)*/);
215 }
216 for (Int_t iy = 0; iy < nExtraPointsY; ++iy) {
217 Double_t y = fYmin - iy * fYstep;
218 gBx_vs_y[ix][iz]->SetPoint(nExtraPointsY - 1 - iy, y, 0.0 /*lx->Eval(y)*/);
219 gBy_vs_y[ix][iz]->SetPoint(nExtraPointsY - 1 - iy, y, (badFitL) ? 0.0 : ly->Eval(y));
220 gBz_vs_y[ix][iz]->SetPoint(nExtraPointsY - 1 - iy, y, 0.0 /*lz->Eval(y)*/);
221 }
222
223 delete ry;
224 delete ly;
225 }
226 }
227
228 fYmin -= (nExtraPointsY)*fYstep;
229 fNy = gBy_vs_y[0][0]->GetN(); // обновляем количество узлов по Y после успешной (надеюсь :) ) экстраполяции
230
231 TString out = "FieldMap_1900_extrap.root";
232 TFile* f = new TFile(out.Data(), "RECREATE");
233 TTree* t = new TTree("Field_map", "data from ASCII");
234
235 BmnFieldPoint pointToWrite;
236 t->Branch("field_points", &pointToWrite, "X/D:Y/D:Z/D:Bx/D:By/D:Bz/D");
237
238 cout << fXmin << " " << fXmin + (fNx - 1) * fXstep << endl;
239 cout << fYmin << " " << fYmin + (fNy - 1) * fYstep << endl;
240 cout << fZmin << " " << fZmin + (fNz - 1) * fZstep << endl;
241
242 for (Int_t iy = 0; iy < fNy; ++iy) {
243 for (Int_t ix = 0; ix < fNx; ++ix) {
244 for (Int_t iz = 0; iz < fNz; ++iz) {
245 Double_t xOut = fXmin + ix * fXstep;
246 Double_t yOut = fYmin + iy * fYstep;
247 Double_t zOut = fZmin + iz * fZstep;
248
249 Double_t BxOut = gBx_vs_y[ix][iz]->GetPointY(iy);
250 Double_t ByOut =
251 -gBy_vs_y[ix][iz]->GetPointY(iy); // минуc так как брал модуль для нормального фитирования.
252 Double_t BzOut = gBz_vs_y[ix][iz]->GetPointY(iy);
253 BmnFieldPoint tmpPnt(xOut, yOut, zOut, BxOut, ByOut, BzOut);
254 pointToWrite = tmpPnt;
255 t->Fill();
256 }
257 }
258 }
259
260 f->Write();
261}
bool Bool_t
int Int_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
virtual Double_t GetParameter(const TString &name) const
virtual Double_t Eval(Double_t x, Double_t y=0, Double_t z=0, Double_t t=0) const
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Int_t GetN() const
virtual Double_t GetPointY(Int_t i) const
const char * Data() const
virtual Int_t Fill()
virtual Int_t Branch(const char *folder, Int_t bufsize=32000, Int_t splitlevel=99)
void FieldExtrapolator()
Double_t Abs(Double_t d)