fillChain.cxx

Calibration of raw data - Vratislav Chudoba, 06/17/2018 09:52 PM

Download (9.08 KB)

 
1
#include "TSystem.h"
2
#include "TFile.h"
3
#include "TTree.h"
4
#include "../src/TNeEvent.h"
5
//#include "../../AculUtils/TELoss/TELoss.h"
6

    
7
using std::cout;
8
using std::endl;
9

    
10
void fillTree(Int_t nofile = 0, const Int_t noevents = 0) {
11

    
12
        TString inFile;
13
//        inFile.Form("~/data/exp1804/h5_14_%02d.root", nofile);
14
        inFile.Form("~/data/exp1804/be_01_%02d.root", nofile);
15
//        inFile.Form("~/data/exp1804/calib/si_20_03.root");
16

    
17
        TString outFile;
18
//        outFile.Form("~/data/exp1804/h5_14_%02d_calib.root", nofile);
19
        outFile.Form("~/data/exp1804/be_01_%02d_calib.root", nofile);
20
//        outFile.Form("~/data/exp1804/calib/si_20_03_calib.root");
21

    
22
        cout << "Input file: " << inFile << endl;
23
        cout << "Output file: " << outFile << endl;
24

    
25
        TFile *fr = new TFile(inFile);
26
        TTree *tr = (TTree*)fr->Get("AnalysisxTree");
27

    
28
        TNeEvent *revent = new TNeEvent();
29

    
30
        tr->SetBranchAddress("NeEvent.", &revent);
31

    
32
        TFile *fw = new TFile(outFile, "RECREATE");
33
        TTree *tw = new TTree("cal", "Calibrated information");
34

    
35
        Float_t SQ20E[16];
36
        Float_t SQ20Ecorr[16];
37
        Float_t SQ20Esum;
38
        Float_t SQLXE[32];
39
        Float_t SQLXEsum;
40
        Float_t SQLYE[16];
41
        Float_t SQLYEsum;
42

    
43
        Int_t SQLXmult;
44
        Int_t SQLYmult;
45
        Int_t SQ20EcorrMult;
46

    
47
        Float_t SQRXE[32];
48
        Float_t SQRXEsum;
49
        Int_t SQRXmult;
50
        Float_t TOF, dEbeam;
51
        Float_t x1p, y1p, x2p, y2p, xt, yt;
52

    
53
        tw->Branch("SQ20E",SQ20E,"SQ20E[16]/F");
54
        tw->Branch("SQ20Ecorr",SQ20Ecorr,"SQ20Ecorr[16]/F");
55
        tw->Branch("SQ20Esum",&SQ20Esum,"SQ20Esum/F");
56
        tw->Branch("SQLXE",SQLXE,"SQLXE[32]/F");
57
        tw->Branch("SQLXEsum",&SQLXEsum,"SQLXE/F");
58
        tw->Branch("SQLYE",SQLYE,"SQLYE[16]/F");
59
        tw->Branch("SQLYEsum",&SQLYEsum,"SQLYEsum/F");
60

    
61
        tw->Branch("SQLXmult",&SQLXmult,"SQLXmult/I");
62
        tw->Branch("SQLYmult",&SQLYmult,"SQLYmult/I");
63
        tw->Branch("SQ20EcorrMult",&SQ20EcorrMult,"SQ20EcorrMult/I");
64

    
65
        tw->Branch("SQRXE",SQRXE,"SQRXE[32]/F");
66
        tw->Branch("SQRXEsum",&SQRXEsum,"SQRXE/F");
67
        tw->Branch("SQRXmult",&SQRXmult,"SQRXmult/I");
68

    
69
        tw->Branch("TOF", &TOF, "TOF/F");
70
        tw->Branch("dEbeam", &dEbeam, "dEbeam/F");
71

    
72
        tw->Branch("x1p", &x1p, "x1p/F");
73
        tw->Branch("y1p", &y1p, "y1p/F");
74
        tw->Branch("x2p", &x2p, "x2p/F");
75
        tw->Branch("y2p", &y2p, "y2p/F");
76

    
77
        tw->Branch("xt", &xt, "xt/F");
78
        tw->Branch("yt", &yt, "yt/F");
79

    
80

    
81
        Long64_t nevents;
82
        if (noevents == 0) nevents = tr->GetEntries();
83
        else nevents = noevents;
84
        if (nevents > tr->GetEntries()) nevents = tr->GetEntries();
85

    
86
//        TNeDet16 *pSQX_L_EC = new TNeDet16("SQX_L_EC");
87
//        TNeDet16 pSQX_L_EC("../SQX_L_EC");
88
        TNeDet16 pSQX_L_EC("./SQX_L");
89
        pSQX_L_EC.ReadData();
90

    
91
        TNeDet16 pSQX_L_TC("./SQX_L_time");
92
        pSQX_L_TC.ReadData();
93

    
94
        TNeDet16 pSQY_L_EC("./SQY_L");
95
        pSQY_L_EC.ReadData();
96

    
97
        TNeDet16 pSQX_R_EC("../SQX_R_EC");
98
        pSQX_R_EC.ReadData();
99

    
100
        TNeDet16 pSQ20_EC("./sq20_58");
101
        pSQ20_EC.ReadData();
102

    
103
//        for (Int_t i = 0; i < 32; i++) {
104
//                cout << pSQX_L_EC.Energy(1, i) << endl;
105
//        }
106

    
107
        Float_t energy = 0;
108

    
109
        cout << nevents << " entries will be treated." << endl;
110

    
111
//        TFile fThickness("thicknessPreliminary.root", "OPEN");
112
        TFile fThickness("thicknessFinal.root", "OPEN");
113
        fr->cd();
114
        TH2F *hThickness = new TH2F(*(TH2F*)fThickness.Get("hTh"));
115
        hThickness->Draw("col");
116

    
117
//        std::cout << std::setprecision(1) << std::fixed;
118

    
119

    
120
        const Int_t kSQL_X_strips = 32;
121
        const Int_t kSQL_Y_strips = 16;
122
        const Int_t kSQL_20_strips = 16;
123

    
124
        const Double_t kSQLY_energy_thr = 1.;
125
        const Double_t kSQLX_energy_thr = 1.;
126
        const Double_t kSQL20_energy_thr = 1.2;
127

    
128
        const Double_t kSQ20_norm_thickness = 20.;
129

    
130
//        for (Int_t yi = 0; yi < kSQL_Y_strips; yi++) {
131
//                cout << "y bin: " << yi+1 << "\t\t";
132
//                for (Int_t xi = 0; xi < kSQL_X_strips; xi++) {
133
//                        cout << hThickness->GetBinContent(xi+1, yi+1) << "\t";
134
//                        if (xi == kSQL_X_strips-1) cout << endl;
135
//                }
136
//        }
137

    
138

    
139
        fw->cd();
140

    
141

    
142
//        TELoss fAlphaSi;
143
//        fAlphaSi.SetEL(1, 2.321); // density in g/cm3
144
//        fAlphaSi.AddEL(14., 28.086, 1);  //Z, mass
145
//        //        mSi.SetZP(1., 1.);                //protons
146
//        fAlphaSi.SetZP(2., 3.);                //3He, Z, A
147
//        fAlphaSi.SetEtab(100000, 100.);        // ?, MeV calculate ranges
148
//        fAlphaSi.SetDeltaEtab(300);
149

    
150
        //////////////////////////////////
151
        //event processing
152
        //////////////////////////////////
153

    
154
        for (Int_t eventNo = 0; eventNo < nevents; eventNo++) {
155
                tr->GetEvent(eventNo);
156
//                cout << revent->SQX_L[0] << endl;
157
//                SQLXE[0] = revent->SQX_L[0];
158

    
159
                SQ20Esum = 0.;
160
                SQLXEsum = 0.;
161
                SQLYEsum = 0.;
162
                SQRXEsum = 0.;
163
                SQRXmult = 0;
164

    
165
                SQLXmult = 0;
166
                SQLYmult = 0;
167
                SQ20EcorrMult = 0;
168

    
169

    
170
                for (Int_t i = 0; i < 32; i++) {
171
//                        cout << pSQX_L_EC.Energy(1, i) << endl;
172
                        SQLXE[i] = 0;
173
                        SQRXE[i] = 0;
174

    
175
                        energy = pSQX_L_EC.Energy(revent->SQX_L[i], i);
176

    
177
//                        cout << energy << "\t" << pSQX_L_EC.a[i][0] << "\t" << pSQX_L_EC.a[i][1] << "\t" << pSQX_L_EC.a[i][2] << endl;
178
//                        cout << energy << endl;
179

    
180
//                        if (i == 5 && i == 6) continue;
181

    
182
                        if (energy > kSQLX_energy_thr) {
183
                                SQLXE[i] = energy;
184
                                SQLXEsum += SQLXE[i];
185
                                SQLXmult++;
186
                        }
187

    
188
                        energy = pSQX_R_EC.Energy(revent->SQX_R[i], i);
189

    
190
                        if (energy > 1.0) {
191
                                SQRXE[i] = energy;
192
                                SQRXEsum += SQRXE[i];
193
                                SQRXmult++;
194
                        }
195
                }
196

    
197
                for (Int_t i = 0; i < 16; i++) {
198
                        //                        cout << pSQX_L_EC.Energy(1, i) << endl;
199

    
200
                        SQLYE[i] = 0.;
201
                        SQ20E[i] = 0.;
202
                        SQ20Ecorr[i] = 0.;
203
                        //                                SQRXE[i] = 0;
204

    
205
                        energy = pSQ20_EC.Energy(revent->SQ20[i], i);
206

    
207
//                        if (energy > 1.) {
208
                                SQ20E[i] = energy;
209
                                SQ20Esum += SQ20E[i];
210
//                                cout << energy << endl;
211
//                                cout << i << "\t" << energy << "\t" << pSQ20_EC.a[i][0] << "\t" << pSQ20_EC.a[i][1] << "\t" << pSQ20_EC.a[i][2] << endl;
212
//                        }
213

    
214

    
215
                        if (i==0) continue;
216

    
217
                        energy = pSQY_L_EC.Energy(revent->SQY_L[i], i);
218

    
219
                        //                                cout << energy << "\t" << pSQY_L_EC.a[i][0] << "\t" << pSQY_L_EC.a[i][1] << "\t" << pSQY_L_EC.a[i][2] << endl;
220
                        //                        cout << energy << endl;
221

    
222
                        if (energy > kSQLY_energy_thr) {
223
                                SQLYE[i] = energy;
224
                                SQLYEsum += SQLYE[i];
225
                                SQLYmult++;
226
                        }
227

    
228
                        //                                energy = pSQX_R_EC.Energy(revent->SQX_R[i], i);
229
                        //
230
                        //                                if (energy > 1.0) {
231
                        //                                        SQRXE[i] = energy;
232
                        //                                        SQRXEsum += SQRXE[i];
233
                        //                                        SQRXmult++;
234
                        //                                }
235
                }//for 16
236

    
237
//                cout << endl;
238

    
239
                ///////////////////////////////////////////////
240
                //correction for thickness inhomogeneity
241
                ///////////////////////////////////////////////
242

    
243
                Double_t currThickness;
244

    
245
                if (SQLXmult == 1 && SQLYmult == 1) {
246

    
247
                        for (Int_t yi = 0; yi < kSQL_Y_strips; yi++) {
248
                                //                        cout << "y bin: " << yi+1 << "\t\t";
249
                                if (SQLYE[yi]>kSQLY_energy_thr) {
250

    
251
                                        for (Int_t xi = 0; xi < kSQL_X_strips; xi++) {
252

    
253
                                                if (SQLXE[xi] > kSQLX_energy_thr) {
254
                                                        currThickness = hThickness->GetBinContent(xi+1, yi+1);
255
//                                                        if (currThickness<30.) {
256
//                                                                Int_t probableThinStrip = xi-2/2;
257
//                                                                SQ20Ecorr[0] =
258
//                                                        }
259

    
260
                                                        for (Int_t x20 = 0; x20 < kSQL_20_strips; x20++) {
261
                                                                if (SQ20E[x20] > kSQL20_energy_thr && currThickness<30.) {
262
//                                                                        SQ20Ecorr[x20] = SQ20E[x20] + 1.;
263

    
264
//                                                                        currThickness = kSQ20_norm_thickness + (currThickness - kSQ20_norm_thickness)*0.5;
265

    
266
                                                                        SQ20Ecorr[x20] = (kSQ20_norm_thickness/currThickness)*SQ20E[x20];
267
                                                                        SQ20EcorrMult++;
268

    
269
//                                                                        cout << xi << "\t" << yi << "\t" << x20
270
//                                                                                        << "\t" << currThickness
271
//                                                                                        << "\t" << SQ20E[x20]  << "\t" << SQ20Ecorr[x20] << "\t" << endl;
272
                                                                }
273
                                                        }//for*/
274
                                                }
275

    
276

    
277

    
278
                                                //                                        cout << hThickness->GetBinContent(xi+1, yi+1) << "\t";
279
                                                //                                        if (xi == kSQL_X_strips-1) cout << endl;
280
                                        }
281
                                }
282
                        }
283

    
284
                }
285

    
286

    
287
                ///////////////////////////////////////////////
288
                //beam diagnostics
289
                ///////////////////////////////////////////////
290

    
291
                dEbeam = 0.;
292
                TOF = 0.;
293
                if (revent->tF5[0]>0 && revent->tF5[1]>0 && revent->tF5[2]>0 && revent->tF5[3]>0
294
                                && revent->tF3[0]>0 && revent->tF3[1]>0 && revent->tF3[2]>0 && revent->tF3[3]>0
295
                                && revent->F5[0]>0 && revent->F5[1]>0 && revent->F5[2]>0 && revent->F5[3]>0
296
//                                && ( (revent->tF5[0]+revent->tF5[1]+revent->tF5[2]+revent->tF5[3]) - (revent->tF3[0]+revent->tF3[1]+revent->tF3[2]+revent->tF3[3]) )/4.*0.125+89.165<200
297
//                                && ( (tF5[0]+tF5[1]+tF5[2]+tF5[3]) - (tF3[0]+tF3[1]+tF3[2]+tF3[3]) )/4.*0.125+89.165>100
298
//                                && (F5[0]+F5[1]+F5[2]+F5[3])/4. < 2500
299
                ) {
300
                        dEbeam = (revent->F5[0]+revent->F5[1]+revent->F5[2]+revent->F5[3])/4.;
301
                        TOF = ( (revent->tF5[0]+revent->tF5[1]+revent->tF5[2]+revent->tF5[3]) - (revent->tF3[0]+revent->tF3[1]+revent->tF3[2]+revent->tF3[3]) )/4.*0.125+89.165;
302
                }
303

    
304
                const Float_t l12 = 546.;
305
                const Float_t lt = 270.;
306

    
307
                x1p = -100.;
308
                y1p = -100.;
309
                x2p = -100.;
310
                y2p = -100.;
311
                xt = -100.;
312
                yt = -100.;
313

    
314
                if (revent->x1[0]<1000 && revent->y1[0]<1000 && revent->nx1==1 && revent->ny1==1) {
315
                        x1p = revent->x1[0]*1.25-20.;
316
                        y1p = revent->y1[0]*1.25-20.;
317
                }
318

    
319
                if (revent->x2[0]<1000 && revent->y2[0]<1000 && revent->nx2==1 && revent->ny2==1) {
320
                        x2p = revent->x2[0]*1.25-20.;
321
                        y2p = revent->y2[0]*1.25-20.;
322
                }
323

    
324
                if (x1p > -50. && y1p > -50. && x2p > -50. && y2p > -50.) {
325
                        xt = x1p - (x1p - x2p)*(l12/lt);
326
                        yt = y1p - (y1p - y2p)*(l12/lt);
327
                }
328

    
329

    
330
//                cout << endl;
331

    
332
                tw->Fill();
333

    
334
//                cout << eventNo << "\t" << eventNo%100 << endl;
335
                if (eventNo%100000 == 0 && eventNo !=0) {
336
                        cout << eventNo << " events processed." << endl;
337
                }
338
        }
339

    
340
        cout << nevents << " entries processed." << endl;
341

    
342
        fw->cd();
343
        tw->Write();
344
        fw->Close();
345

    
346
}
347

    
348

    
349
void fillChain(const Int_t from = 0, const Int_t to = 9, const Int_t noevents = 0) {
350
        for (Int_t i = from; i <= to; i++) {
351
                fillTree(i, noevents);
352
        }
353
}