1 |
pam-fi |
1.1 |
#ifndef caloelectron_h |
2 |
|
|
#define caloelectron_h |
3 |
|
|
|
4 |
|
|
|
5 |
|
|
#if !defined(__CINT__) || defined(__MAKECINT__) |
6 |
|
|
|
7 |
|
|
#include <PamLevel2.h> |
8 |
|
|
|
9 |
|
|
//#include <TMinuit.h> |
10 |
|
|
#include <TPaveStats.h> |
11 |
|
|
#include <TStyle.h> |
12 |
|
|
#include <TSystem.h> |
13 |
|
|
#include <TCanvas.h> |
14 |
|
|
#include <TGraphErrors.h> |
15 |
|
|
#include <TH1F.h> |
16 |
|
|
#include <TF2.h> |
17 |
|
|
#include <TH2F.h> |
18 |
|
|
#include <TProfile.h> |
19 |
|
|
#include <TBenchmark.h> |
20 |
|
|
|
21 |
|
|
#include <iostream> |
22 |
|
|
#include <iomanip> |
23 |
|
|
using namespace std; |
24 |
|
|
|
25 |
|
|
#endif |
26 |
|
|
|
27 |
|
|
//CaloLevel1* cl1; |
28 |
|
|
|
29 |
|
|
#define NTAUBINMAX 100 |
30 |
|
|
|
31 |
|
|
#define WX0 0.350 //cm |
32 |
|
|
#define WTICK 0.26 //cm |
33 |
|
|
#define PITCH 0.244 //cm |
34 |
|
|
#define DEAD 0.096 //cm |
35 |
|
|
#define GLUE 0.05 //cm |
36 |
|
|
|
37 |
|
|
#define CALIBNBIN 600 |
38 |
|
|
#define CALIBRANGE 15.//cm |
39 |
|
|
|
40 |
|
|
double fradpro(Double_t *xi, Double_t *parmin); |
41 |
|
|
|
42 |
|
|
/////////////////////////////////////////////////// |
43 |
|
|
/// |
44 |
|
|
/// |
45 |
|
|
/// CLASS FOR INITIALIZATIONS & PARAMETERS |
46 |
|
|
/// |
47 |
|
|
/// |
48 |
|
|
/////////////////////////////////////////////////// |
49 |
|
|
|
50 |
|
|
class CaloElectron_parameters : public TObject{ |
51 |
|
|
|
52 |
|
|
private: |
53 |
|
|
|
54 |
|
|
CaloElectron_parameters(){ SetDefault(); }; |
55 |
|
|
|
56 |
|
|
static CaloElectron_parameters * _parameters; |
57 |
|
|
|
58 |
|
|
public: |
59 |
|
|
|
60 |
|
|
static CaloElectron_parameters *Get(){ |
61 |
|
|
if(_parameters==0) { |
62 |
|
|
// cout << "**NEW**"<<endl; |
63 |
|
|
_parameters = new CaloElectron_parameters(); |
64 |
|
|
} |
65 |
|
|
return _parameters; |
66 |
|
|
} |
67 |
|
|
|
68 |
|
|
// ------ |
69 |
|
|
//general |
70 |
|
|
// ------ |
71 |
|
|
|
72 |
|
|
bool debug; |
73 |
|
|
|
74 |
|
|
int isimu; //simulation flag |
75 |
|
|
int dolongfit; //longitudinal-fit flag |
76 |
|
|
int dolatcorr; //lateral-correction flag |
77 |
|
|
int calibmode; //calibration flag |
78 |
|
|
|
79 |
|
|
float TAUMAX; // max longitudinal depth to evaluate qtot (TAU=t/T) |
80 |
|
|
float RMAX; // max radius around the track to evaluate qtot |
81 |
|
|
|
82 |
|
|
float RMAXsp; // radius around the track to integrate the profile |
83 |
|
|
|
84 |
|
|
int ipmin; // first plane (0-21) |
85 |
|
|
int ipmax; // last plane (0-21) |
86 |
|
|
|
87 |
|
|
bool maskpl[22][2]; // plane masks |
88 |
|
|
|
89 |
|
|
CaloLevel1* cl1; |
90 |
|
|
|
91 |
|
|
// ----------------------- |
92 |
|
|
// plots of energy deposit |
93 |
|
|
// ----------------------- |
94 |
|
|
TH2F *h_qtot[2]; //matrix of energy deposits (measured) 192x22 |
95 |
|
|
TH2F *h_qfit[2]; //matrix of energy deposits (fit) 192x22 |
96 |
|
|
|
97 |
|
|
// -------------------------------------- |
98 |
|
|
// parameters for lateral profile (fixed) |
99 |
|
|
// -------------------------------------- |
100 |
|
|
|
101 |
|
|
float file_rt[12][3]; |
102 |
|
|
float file_rc[12][3]; |
103 |
|
|
float file_p[12][3]; |
104 |
|
|
float file_tau[12]; |
105 |
|
|
|
106 |
|
|
void Dump(); |
107 |
|
|
|
108 |
|
|
void SetCalo(int icalo,int notused); |
109 |
|
|
void SetPar(); |
110 |
|
|
void SetPar(TString pathx,TString pathyd,TString pathyp); |
111 |
|
|
void SetRMAX(float setRMAX) {RMAX = setRMAX;}; |
112 |
|
|
void SetRMAXsp(float setRMAX) {RMAXsp = setRMAX;}; |
113 |
|
|
void SetTAUMAX(float setTAUMAX){TAUMAX = setTAUMAX;}; |
114 |
|
|
void Setsimu(int isetsimu) {isimu=isetsimu; SetPar();}; |
115 |
|
|
void SetLongitudinalFit(int isetdolongfit) {dolongfit = isetdolongfit;}; |
116 |
|
|
void SetLateralCorrection(int isetdolatcorr) {dolatcorr = isetdolatcorr;}; |
117 |
|
|
void SetCalibrationMode(int icalibmode){calibmode=icalibmode;}; |
118 |
|
|
void SetDebug(bool isetdebug) {debug = isetdebug;}; |
119 |
|
|
// |
120 |
|
|
void SetCaloLevel1(CaloLevel1 *cl1in) {cl1 = cl1in; }; |
121 |
|
|
|
122 |
|
|
void SetDefault(); |
123 |
|
|
|
124 |
|
|
|
125 |
|
|
// -------------------------------------- |
126 |
|
|
// tools for calibration (NTAUBINMAX) |
127 |
|
|
// -------------------------------------- |
128 |
|
|
// |
129 |
|
|
TH2F *h_qtot_tau[100][3];///< profile histos for x,yodd,yeven |
130 |
|
|
TH1F *h_qtot_tau_wav[100][3];///< profile histos for x,yodd,yeven (weighted average) |
131 |
|
|
double summW[100][3][1000]; |
132 |
|
|
double summWF[100][3][1000]; |
133 |
|
|
// |
134 |
|
|
float par_rt[100][3]; |
135 |
|
|
float par_rc[100][3]; |
136 |
|
|
float par_p[100][3]; |
137 |
|
|
int par_ntau; |
138 |
|
|
float par_taubin[101]; |
139 |
|
|
// |
140 |
|
|
void Calibration_SetTools(); |
141 |
|
|
void Calibration_SetTools(int ntau, float* taubin); |
142 |
|
|
void Calibration_Fit(); |
143 |
|
|
void Calibration_Save(TFile* file); |
144 |
|
|
void Calibration_Load(TFile* file); |
145 |
|
|
|
146 |
|
|
ClassDef(CaloElectron_parameters,2); |
147 |
|
|
|
148 |
|
|
}; |
149 |
|
|
|
150 |
|
|
/////////////////////////////////////////////////// |
151 |
|
|
/// |
152 |
|
|
/// |
153 |
|
|
/// CLASS INPLEMENTATION |
154 |
|
|
/// |
155 |
|
|
/// |
156 |
|
|
/////////////////////////////////////////////////// |
157 |
|
|
class CaloElectron : public TObject{ |
158 |
|
|
|
159 |
|
|
private: |
160 |
|
|
|
161 |
|
|
public: |
162 |
|
|
|
163 |
|
|
|
164 |
|
|
// ----------- |
165 |
|
|
// shower axis |
166 |
|
|
// ----------- |
167 |
|
|
float trkcoordx[22][2]; ///< track coordinates (PAMELA r.s.) |
168 |
|
|
float trkcoordy[22][2]; ///< track coordinates (PAMELA r.s.) |
169 |
|
|
float trkstrip[22][2]; ///< strip traversed by the track |
170 |
|
|
float tgx,tgy,tg; |
171 |
|
|
// -------------- |
172 |
|
|
// energy deposit |
173 |
|
|
// -------------- |
174 |
|
|
float qtot; ///< total collected charge |
175 |
|
|
float qplane0[22][2]; ///< collected charge (within RMAX & TAUMAX) |
176 |
|
|
float qplane1[22][2]; ///< corrected charge (lateral leakage & gaps) |
177 |
|
|
float qplanefit[22][2]; ///< fitted values |
178 |
|
|
float tplane[22][2]; ///< shower depth (in units of radiation lenth) |
179 |
|
|
// -------------------------------- |
180 |
|
|
// parameters from longitudinal fit |
181 |
|
|
// -------------------------------- |
182 |
|
|
float chi2__l; // output longitudinal fit (chi2) |
183 |
|
|
float par__l[4]; // parameters (E,alpha,T,t0) |
184 |
|
|
int err__l; // minuit flag (0=ok ecc...) |
185 |
|
|
float corr__l; // longitudinal correction factor |
186 |
|
|
|
187 |
|
|
float chi2; ///< global chi2 (lateral+longitudinal) |
188 |
|
|
|
189 |
|
|
// -------------- |
190 |
|
|
// new variables |
191 |
|
|
// -------------- |
192 |
|
|
float RMS[22][2]; |
193 |
|
|
float SKEW[22][2]; |
194 |
|
|
float KURT[22][2]; |
195 |
|
|
float TAU[22][2]; |
196 |
|
|
|
197 |
|
|
|
198 |
|
|
CaloElectron(){ Reset(); }; |
199 |
|
|
CaloElectron(PamLevel2 *l2, int ntr){ Reset(); Set(l2,ntr); }; |
200 |
|
|
|
201 |
|
|
/* CaloElectron(){ Reset(); SetDefault(); SetPar(); }; */ |
202 |
|
|
/* CaloElectron(PamLevel2 *l2, int ntr){ Reset(); SetPar(); Set(l2,ntr); SetDefault();}; */ |
203 |
|
|
/* CaloElectron(PamLevel2 *l2){ Reset(); SetPar(); Set(l2); SetDefault();}; */ |
204 |
|
|
|
205 |
|
|
~CaloElectron(){ Reset(); }; |
206 |
|
|
|
207 |
|
|
void Reset(); |
208 |
|
|
void Clear(){ Reset(); }; |
209 |
|
|
void Delete(){ Reset(); }; |
210 |
|
|
|
211 |
|
|
bool Set(CaloLevel1*,float tracoo[][2]);//main set |
212 |
|
|
bool Set(CaloLevel1*,CaloTrkVar*); |
213 |
|
|
bool Set(PamLevel2*,int); |
214 |
|
|
|
215 |
|
|
// bool Set(PamLevel2* l2){ return Set(l2,0); }; |
216 |
|
|
// bool Set(CaloLevel1*,float tracoo[][2]); |
217 |
|
|
// bool Set(CaloLevel1*,CaloLevel2*); |
218 |
|
|
|
219 |
|
|
// ------------------------------------- |
220 |
|
|
// methods to perform lateral correction |
221 |
|
|
// ------------------------------------- |
222 |
|
|
double GetLateralCorrection(double,double,int,int); |
223 |
|
|
double GetLateralCorrection(double,double,TF2*,int); |
224 |
|
|
float ApplyLateralCorrection(float); |
225 |
|
|
void GetProfile(int,int,float xx[],float qq[],float errxx[],float errqq[]); |
226 |
|
|
// float GetLateralFactor(){return corr;}; |
227 |
|
|
TGraphErrors* GetGraph_Lateral(int, int); |
228 |
|
|
TGraphErrors* GetFunc_Lateral(int,int); |
229 |
|
|
// ------------------------------------------ |
230 |
|
|
// methods to perform longitudinal correction |
231 |
|
|
// ------------------------------------------ |
232 |
|
|
int ApplyLongitudinalFit(int longto);//return the ierflg value of gminuit minimization |
233 |
|
|
float GetLongitudinalCorrection(); |
234 |
|
|
// float GetLongitudinalFactor(){return corr__l;}; |
235 |
|
|
// float GetLongitudinalFcnout(){return chi2__l;}; |
236 |
|
|
float GetIerflg(){return err__l;}; |
237 |
|
|
TGraphErrors* GetGraph_Longitudinal(); |
238 |
|
|
TGraphErrors* GetGraph_Longitudinal_Fit(); |
239 |
|
|
TGraphErrors* GetGraph_Longitudinal_Integral(); |
240 |
|
|
TGraphErrors* GetGraph_Longitudinal_Integral_Fit(); |
241 |
|
|
TF1* GetFunc_Longitudinal(); |
242 |
|
|
float GetMaxResidual(); |
243 |
|
|
int GetNRun(); |
244 |
|
|
float GetMaxRun(); |
245 |
|
|
// ------------------------------------ |
246 |
|
|
// other methods |
247 |
|
|
// ------------------------------------ |
248 |
|
|
float ProfileTest(); |
249 |
|
|
void GetCornerCoord(int,int,float&,float&); |
250 |
|
|
void Print(); |
251 |
|
|
int GetNWLayers(int ip,int iv){ return ip+(1-iv);}; ///< n.W-layers above an active layer |
252 |
|
|
// ------------------------------------ |
253 |
|
|
// methods to get some shower variables |
254 |
|
|
// ------------------------------------ |
255 |
|
|
float GetQ(int icorr); ///< shower charge (within RMAX and TAUMAX) |
256 |
|
|
float GetQ(){ return GetQ(1); }; ///< shower charge (within RMAX and TAUMAX) |
257 |
|
|
float GetQView(int icorr,int iv);///< shower charge on x or y view |
258 |
|
|
/* float GetQW(int icorr,int iw); */ |
259 |
|
|
/* float GetQW(int icorr,int iw,int iv); */ |
260 |
|
|
/* float GetQipiv(int icorr,int ip,int iv); */ |
261 |
|
|
float GetEnergy(int icorr); ///< shower energy |
262 |
|
|
float GetEnergy(){ return GetEnergy(1); };///< shower energy |
263 |
|
|
float GetShowerMaximum(float qplane[][2]); |
264 |
|
|
float GetShowerMaximum(int icorr);///< shower maximum (in units of W-layers) |
265 |
|
|
float GetShowerMaximumX0(int icorr);///< shower maximum (in units of X0) |
266 |
|
|
float GetShowerMaximumView(int view,float qplane[][2]); |
267 |
|
|
float GetShowerMaximumView(int view,int icorr);///< shower maximum (in units of W-layers) |
268 |
|
|
float GetShowerMaximumViewX0(int view,int icorr);///< shower maximum (in units of X0) |
269 |
|
|
/* float GetStripMaximum(int iv,int icorr);///< strip traversed by track on maximum plane */ |
270 |
|
|
/* float GetCoordMaximum(int iv,int icorr);///< coordinate traversed by track on maximum plane */ |
271 |
|
|
/* float GetStripW(int iw,int iv);///< coordinate traversed by track after iw tungsten planes */ |
272 |
|
|
/* float GetCoordW(int iw,int iv,int ixy);///< coordinate traversed by track after iw tungsten planes */ |
273 |
|
|
/* float GetmaxStrip(int ip,int iv); */ |
274 |
|
|
|
275 |
|
|
|
276 |
|
|
bool IsInsideFiducial(int level); |
277 |
|
|
|
278 |
|
|
// ------------------------------------ |
279 |
|
|
// methods to perform calibration |
280 |
|
|
// ------------------------------------ |
281 |
|
|
void Calibration_Fill(); |
282 |
|
|
|
283 |
|
|
|
284 |
|
|
ClassDef(CaloElectron,4); |
285 |
|
|
|
286 |
|
|
}; |
287 |
|
|
|
288 |
|
|
|
289 |
|
|
|
290 |
|
|
#endif |