/[PAMELA software]/calo/flight/CaloFranzini/src/Calib.cpp
ViewVC logotype

Contents of /calo/flight/CaloFranzini/src/Calib.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (show annotations) (download)
Tue Dec 18 09:55:05 2007 UTC (16 years, 11 months ago) by mocchiut
Branch: MAIN
Changes since 1.1: +97 -168 lines
Upgrade

1 #include <stdlib.h>
2 #include <iostream>
3 #include <iomanip>
4 //
5 #include <TString.h>
6 #include <TH1F.h>
7 #include <TH2F.h>
8 #include <TMatrixD.h>
9 #include <TArrayF.h>
10 #include <TArrayI.h>
11 //
12 #include <PamLevel2.h>
13 #include <CaloFranzini.h>
14 //
15 using namespace std;
16 //
17 extern Bool_t MATRIX;
18 CaloFranzini *cf;
19 Int_t nbin;
20 Float_t rig[18];
21 Float_t rmean[17];
22 //Float_t qqplane[17][43];
23 //Int_t nnqplane[17][43];
24
25 TArrayF *qplane[17];
26 TArrayI *nqplane[17];
27 TMatrixD *matrix[17];
28 TMatrixD *nmat[17];
29
30 //===============================================================================
31 bool Select( PamLevel2* event ){
32
33 //---------------------------------------------------------
34 // single track
35 //---------------------------------------------------------
36 if( event->GetTrkLevel2()->GetNTracks()!=1 ) return false;
37 PamTrack *track = event->GetTrack(0);
38 if(!track)return false;
39
40 //------------------------------------------------------------------
41 // tracker pre-selection
42 //------------------------------------------------------------------
43 TrkTrack *trk = track->GetTrkTrack();
44
45 bool TRACK__OK = false;
46 if(
47 trk->chi2 >0 &&
48 trk->GetNX()>=4 &&
49 trk->GetNY()>=3 &&
50 trk->GetLeverArmX()>=5 &&
51 true ) TRACK__OK = true;
52
53 if( !TRACK__OK )return false;
54
55 //------------------------------------------------------------------
56 // TOF pre-selection
57 //------------------------------------------------------------------
58 bool TOF__OK = false;
59 if(
60 event->GetToFLevel2()->GetNHitPaddles(0) == 1 &&
61 event->GetToFLevel2()->GetNHitPaddles(1) == 1 &&
62 event->GetToFLevel2()->GetNHitPaddles(2) == 1 &&
63 event->GetToFLevel2()->GetNHitPaddles(3) == 1 &&
64 event->GetToFLevel2()->GetNHitPaddles(4) >= 1 &&
65 event->GetToFLevel2()->GetNHitPaddles(5) >= 1 &&
66 event->GetToFLevel2()->npmt() <= 18 &&
67 !event->GetAcLevel2()->CARDhit() &&
68 !event->GetAcLevel2()->CAThit() &&
69 true ) TOF__OK = true;
70 if( !TOF__OK )return false;
71 //------------------------------------------------------
72 // no albedo
73 //------------------------------------------------------
74 if( track->GetToFTrack()->beta[12]<=0.2 ||
75 track->GetToFTrack()->beta[12] >= 1.5 ) return false;
76
77 //------------------------------------------------------
78 bool CUT1 = false;
79 if(
80 trk->nstep<100 &&
81 trk->GetRigidity()<400. &&
82 trk->GetRigidity()>0.1 &&
83 trk->GetDeflection()<0. &&
84 trk->resx[0]<0.001 &&
85 trk->resx[5]<0.001 &&
86 track->IsSolved() &&
87 trk->IsInsideCavity() &&
88 true ) CUT1 = true;
89 //------------------------------------------------------
90 if( !CUT1 )return false;
91 Float_t defl = trk->GetDeflection();
92 float p0 = 1.111588e+00;
93 float p1 = 1.707656e+00;
94 float p2 = 1.489693e-01;
95 float chi2m025 = p0 + fabs(defl)*p1 + defl*defl*p2;
96
97 float def_0 = 0.07;
98 float chi2m025_0 = p0 + fabs(def_0)*p1 + def_0*def_0*p2;
99
100 // int nchi2cut=5;
101 float chi2cut=3.;
102 float chi2m = pow( chi2m025-chi2m025_0+pow(chi2cut,0.25), 4.);
103 bool CUT2 = false;
104 if(
105 track->GetTrkTrack()->chi2 < chi2m &&
106 true ) CUT2 = true;
107 if ( !CUT2 ) return false;
108 //------------------------------------------------------
109 //
110 // energy momentum match
111 //
112 Float_t qtotimp = event->GetCaloLevel2()->qtot / trk->GetRigidity();
113 Float_t qcut2 = (-0.5 * trk->GetRigidity() + 150.) * 1.1;
114 if ( qcut2 < 55. ) qcut2 = 55.;
115 if ( qtotimp <= qcut2 ) return false;
116 //
117 for (Int_t i=0; i < 22; i++){
118 if ( track->GetCaloTrack()->tibar[i][1] < 0 || track->GetCaloTrack()->tibar[i][0] < 0 ){
119 return false;
120 };
121 };
122 //
123 if ( event->GetCaloLevel1()->qtotpl(0) > 7. ) return false;
124 //
125 return true;
126 }
127 //===============================================================
128 // Create histograms
129 //
130 //
131 //
132 //
133 //
134 //===============================================================
135 void CreateHistos( PamLevel2* event , TString file){
136
137 cf = new CaloFranzini(event);
138 //
139 if ( MATRIX ){
140 cf->UpdateMatrixFile(file.Data());
141 cf->LoadBin();
142 } else {
143 cf->CreateMatrixFile(file.Data());
144 };
145 //
146 //
147 nbin = 18;
148 rig[0] = 0.1;
149 rig[1] = 0.5;
150 rig[2] = 1.;
151 rig[3] = 1.5;
152 rig[4] = 2.2;
153 rig[5] = 3.;
154 rig[6] = 4.;
155 rig[7] = 5.;
156 rig[8] = 6.;
157 rig[9] = 8.;
158 rig[10] = 10.;
159 rig[11] = 15.;
160 rig[12] = 25.;
161 rig[13] = 35.;
162 rig[14] = 50.;
163 rig[15] = 100.;
164 rig[16] = 200.;
165 rig[17] = 400.;
166 //
167 memset(rmean, 0, 17*sizeof(Float_t));
168 //
169 for (Int_t i=0; i < 17 ; i++){
170 matrix[i] = new TMatrixD(43,43);
171 qplane[i] = new TArrayF(43);
172 nqplane[i] = new TArrayI(43);
173 nmat[i] = new TMatrixD(43,43);
174 };
175 //
176 }
177
178 //===============================================================
179 void FindAverage( PamLevel2* L2, int iev ){
180 //
181 Float_t erig = L2->GetTrack(0)->GetTrkTrack()->GetRigidity();
182 //
183 Int_t rbi = 0;
184 for (Int_t i = 0; i<nbin-1; i++){
185 if ( erig>=rig[i] && erig < rig[i+1] ){
186 rbi = i;
187 break;
188 };
189 };
190 //
191 if ( erig < rig[0] ) return;
192 if ( erig >= rig[nbin-1] ) return;
193 //
194 rmean[rbi] += erig;
195 //
196 Int_t dgf = 43;
197 //
198 for (Int_t i=0; i<dgf; i++){
199 (*nqplane[rbi])[i]++;
200 };
201 //
202 // Fill the estrip matrix
203 //
204 Int_t nplane = 0;
205 Int_t view = 0;
206 Int_t plane = 0;
207 Int_t strip = 0;
208 Float_t mip = 0.;
209 //
210 for ( Int_t i=0; i<L2->GetCaloLevel1()->istrip; i++ ){
211 //
212 mip = L2->GetCaloLevel1()->DecodeEstrip(i,view,plane,strip);
213 //
214 nplane = 1 - view + 2 * plane;
215 if ( nplane > 37 ) nplane--;
216 if ( nplane < dgf ){
217 (*qplane[rbi])[nplane] += mip;
218 };
219 //
220 };
221 }
222
223 void CalculateAverage(){
224 for (Int_t i=0; i<nbin-1; i++){
225 if ( (*nqplane[i])[0] > 0 ) rmean[i] /= (Float_t)(*nqplane[i])[0];
226 for (Int_t j=0; j<43 ; j++){
227 if ( (*nqplane[i])[j] > 0 ){
228 (*qplane[i])[j] /= (Float_t)(*nqplane[i])[j];
229 } else {
230 (*qplane[i])[j] = 0.;
231 };
232 printf(" BIN %i plane %i average energy %f qplane %f nqplane %i \n",i,j,rmean[i],(*qplane[i])[j],(*nqplane[i])[j]);
233 };
234 };
235
236 cf->WriteNumBin(nbin);
237
238 TArrayF *rigbin = new TArrayF(18, rig);
239 cf->WriteRigBin(rigbin);
240
241 TArrayF *rmeanbin = new TArrayF(17, rmean);
242 TFile *file = cf->GetFile();
243 file->cd();
244 file->WriteObject(&(*rmeanbin), "binrigmean");
245 //
246 for (Int_t i=0; i<nbin-1; i++){
247 //
248 cf->WriteLongMean(qplane[i], i);
249 //
250 };
251 //
252 }
253
254 //===============================================================
255 void FindMatrix( PamLevel2* L2, int iev ){
256 //
257 Float_t erig = L2->GetTrack(0)->GetTrkTrack()->GetRigidity();
258 //
259 Int_t rbi = 0;
260 for (Int_t i = 0; i<nbin-1; i++){
261 if ( erig>=rig[i] && erig < rig[i+1] ){
262 rbi = i;
263 break;
264 };
265 };
266 //
267 if ( erig < rig[0] ) return;
268 if ( erig >= rig[nbin-1] ) return;
269 //
270 Int_t dgf = 43;
271 // printf("1qui \n");
272 //
273 for (Int_t i=0; i<dgf; i++){
274 for (Int_t j=0; j<dgf; j++){
275 (*nmat[rbi])[i][j] += 1.;
276 };
277 };
278 // printf("2qui \n");
279 //
280 // Fill the estrip matrix
281 //
282 Int_t nplane = 0;
283 Int_t view = 0;
284 Int_t plane = 0;
285 Int_t strip = 0;
286 Float_t mip = 0.;
287 Float_t hpl[43];
288 memset(hpl,0,43*sizeof(Float_t));
289 for ( Int_t i=0; i<L2->GetCaloLevel1()->istrip; i++ ){
290 //
291 mip = L2->GetCaloLevel1()->DecodeEstrip(i,view,plane,strip);
292 //
293 nplane = 1 - view + 2 * plane;
294 if ( nplane > 37 ) nplane--;
295 if ( nplane < dgf ){
296 hpl[nplane] += mip;
297 };
298 //
299 };
300 //
301 // printf("3qui \n");
302 //
303 for (Int_t i=0; i<dgf; i++){
304 for (Int_t j=0; j<dgf; j++){
305 (*matrix[rbi])[i][j] += (hpl[i] - cf->GetAverageAt(i,erig)) * (hpl[j] - cf->GetAverageAt(j,erig));
306 };
307 };
308 // printf("4qui \n");
309 // gObjectTable->Print();
310 }
311
312 //===============================================================
313 // Save histograms
314 //
315 //
316 //
317 //
318 //
319 //===============================================================
320 void SaveHistos(){
321 //
322 if ( MATRIX ){
323 //
324 printf("Finished, calculating average and inverting matrices\n");
325 //
326 for (Int_t i=0; i<nbin-1; i++){
327 //
328 // determine the average matrix
329 //
330 for (Int_t ii=0; ii<43; ii++){
331 for (Int_t j=0; j<43; j++){
332 if ( (*nmat[i])[ii][j] > 0. ){
333 (*matrix[i])[ii][j] /= (*nmat[i])[ii][j];
334 } else {
335 (*matrix[i])[ii][j] = 0.;
336 };
337 };
338 };
339 //
340 cf->WriteLongMatrix(matrix[i],i);
341 //
342 if ( matrix[i]->Determinant() == 0. ){
343 printf("\n");
344 for (Int_t ii=0; ii<43; ii++){
345 for (Int_t j=0; j<43; j++){
346 printf(" %.f",(*matrix[i])[ii][j]);
347 };
348 printf("\n");
349 };
350 printf("\n");
351 printf(" ERROR: the matrix at bin %i is singular, determinant = 0., it cannot be inverted! \n",i);
352 } else {
353 Double_t det = 0.;
354 TMatrixD invmatrix = (TMatrixD)(matrix[i]->Invert(&det));
355 printf(" Bin %i determinant is %f \n",i,det);
356 cf->WriteInvertedLongMatrix((TMatrixD)invmatrix,i);
357 };
358 };
359 //
360 printf(" done, closing file and exiting\n");
361 //
362 };
363 //
364 cf->CloseMatrixFile();
365 //
366 cf->Delete();
367 //
368 }

  ViewVC Help
Powered by ViewVC 1.1.23