/[PAMELA software]/calo/flight/FUTILITIES/macros/FCaloTRKCALOALIG.cxx
ViewVC logotype

Contents of /calo/flight/FUTILITIES/macros/FCaloTRKCALOALIG.cxx

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (show annotations) (download) (vendor branch)
Wed Mar 22 15:07:46 2006 UTC (18 years, 8 months ago) by mocchiut
Branch: FUTILITIES, MAIN
CVS Tags: start, v1r03, v1r01, HEAD
Changes since 1.1: +0 -0 lines
Flight Utilities calorimeter package 1st release

1 //
2 //- Emiliano Mocchiutti
3 //
4 // Version 1.01 (2005-11-18)
5 //
6 // questo e` tutto da risistemare una volta che si ha l'output finale.
7 // per ora ho sistemato tutto ma mai provato a compilare, si deve comunque cambiare l'apertura
8 // del file (ora ne apre due...) attenzione alle strutture che non esistono piu`!
9 //
10 // Changelog:
11 //
12 // 1.00 - 1.01 (2005-11-18): Use pathtocalibration routine.
13 //
14 // 0.00 - 1.00 (2005-09-09): Working.
15 //
16 // 0.00 (2005-07-25): Created.
17 //
18 #include <fstream>
19 #include <TTree.h>
20 #include <TClassEdit.h>
21 #include <TObject.h>
22 #include <TList.h>
23 #include <TSystem.h>
24 #include <TSystemDirectory.h>
25 #include <TString.h>
26 #include <TFile.h>
27 #include <TClass.h>
28 #include <TCanvas.h>
29 #include <TH1.h>
30 #include <TH1F.h>
31 #include <TH2D.h>
32 #include <TLatex.h>
33 #include <TPad.h>
34 #include <TGraph.h>
35 #include <TF1.h>
36 #include <TStyle.h>
37 //
38 #include <string>
39 extern const char *pathtocalibration();
40 extern void creadB(const char []);
41 extern void ctrack(int , Double_t [], Double_t [], Double_t [], Double_t [], int &);
42 //
43 extern void stringcopy(TString&, const TString&, Int_t, Int_t);
44 extern bool existfile(TString);
45 //
46 //
47 void FCaloTrackerAlignmentRT(TString filename){
48 if ( !existfile(filename) ){
49 printf(" %s :no such file or directory \n",filename.Data());
50 return;
51 };
52 const char* startingdir = gSystem->WorkingDirectory();
53 TString path;
54 stringcopy(path,startingdir);
55 //
56 //
57 Long64_t nevents = 0;
58 Long64_t trnevents = 0;
59 //
60 // Read the magnetic field map (two files), here it goes the path AND name of one of them.
61 //
62 printf("\n\n TRACKER: loading the magnetic field maps...\n\n\n");
63 const char *pam_calib = pathtocalibration();
64 stringstream bdir;
65 bdir.str("");
66 bdir << pam_calib << ".";
67 creadB((char *)bdir.str().c_str());
68 //
69 printf(" ...done! \n");
70 //
71 Float_t rig;
72 //
73 Float_t sigmacalo = 10.;
74 //
75 Float_t piano[22];
76 piano[0] = 0.;
77 for ( Int_t ee = 1; ee<22; ee++){
78 if ( ee%2 ){
79 piano[ee] = piano[ee-1] - 8.09;
80 } else {
81 piano[ee] = piano[ee-1] - 10.09;
82 };
83 };
84 //
85 Float_t zoff = 0.; // 260
86 //
87 Float_t chi2 = 0.;
88 Float_t chi2nev = 0.;
89 //
90 Float_t xalign0 = -120.;
91 Float_t yalign0 = -120.;
92 Float_t zalign0 = -260.; // 0
93 Float_t phi0 = 0.;
94 Float_t the0 = 0.;
95 Float_t psi0 = 0.;
96 Float_t dxalig = 100.; //50
97 Float_t dyalig = 100.; //50
98 Float_t dzalig = 140.; //80
99 //
100 Float_t dpsi = 0.20;
101 Float_t dthe = 0.20;
102 Float_t dphi = 0.20;
103 //
104 TString lfile;
105 TString sfile;
106 TString file2f;
107 TString pfile;
108 TString fififile;
109 //
110 Float_t minxalign;
111 Float_t minyalign;
112 Float_t minzalign;
113 Float_t minpsialign;
114 Float_t minthealign;
115 Float_t minphialign;
116 Float_t minxalign0;
117 Float_t minyalign0;
118 Float_t minzalign0;
119 Float_t minpsi0;
120 Float_t minthe0;
121 Float_t minphi0;
122 Int_t minnxa;
123 Int_t minnza;
124 Int_t minnya;
125 Int_t minphi;
126 Int_t minpsi;
127 Int_t minthe;
128 //
129 const int npia = 0;
130 TFile *hfile = 0;
131 //
132 //
133 const string myfil = (const char *)filename;
134 Int_t myposiz = myfil.find("dw_");
135 if ( myposiz == -1 ) {
136 myposiz = myfil.find("DW_");
137 };
138 TString fileid;
139 stringcopy(fileid,filename,myposiz+3,myposiz+13);
140 //
141 //
142 stringstream namefile;
143 TTree *tree;
144 const char *pattho = path;
145 namefile.str("");
146 namefile << pattho << "/CaloTrkAlignData_";
147 namefile << fileid.Data() << ".root";
148 printf(" Save file %s\n",namefile.str().c_str());
149 hfile = new TFile(namefile.str().c_str(),"RECREATE","Calorimeter-Tracker alignment data");
150 tree = new TTree("CaloTrkAlign","Calorimeter-Tracker alignment data");
151 tree->Branch("chi2",&chi2,"chi2/F");
152 tree->Branch("chi2nev",&chi2nev,"chi2nev/F");
153 tree->Branch("minnxa",&minnxa,"minnxa/I");
154 tree->Branch("minnya",&minnya,"minnya/I");
155 tree->Branch("minnza",&minnza,"minnza/I");
156 tree->Branch("minpsi",&minpsi,"minpsi/I");
157 tree->Branch("minphi",&minphi,"minphi/I");
158 tree->Branch("minthe",&minthe,"minthe/I");
159 tree->Branch("minxalign",&minxalign,"minxalign/F");
160 tree->Branch("minyalign",&minyalign,"minyalign/F");
161 tree->Branch("minzalign",&minzalign,"minzalign/F");
162 tree->Branch("minpsialign",&minpsialign,"minpsialign/F");
163 tree->Branch("minphialign",&minphialign,"minphialign/F");
164 tree->Branch("minthealign",&minthealign,"minthealign/F");
165 //
166 const int ngrid = 11;
167 Float_t togl = ((float)ngrid-1.)/2.;
168 //
169 struct Tracklev2 trk;
170 struct CaLevel2 calo;
171 //
172 Int_t i = -1;
173 Int_t itr = -1;
174 Int_t syncro = 1;
175 Int_t pktnum = 0;
176 Int_t obt = 0;
177 //
178 // open files
179 //
180 TFile *caloFile = 0;
181 TFile *trackerFile = 0;
182 TTree *tr = 0;
183 TTree *otr = 0;
184 //
185 caloFile = emigetFile(filename, "Physics.Level2", "Calorimeter");
186 if ( !caloFile ){
187 printf("\n ERROR: no calorimeter file! \n\n");
188 return;
189 };
190 trackerFile = emigetFile(filename, "Physics.Level2", "Tracker");
191 if ( !trackerFile ){
192 printf("\n ERROR: no tracker file! \n\n");
193 caloFile->Close();
194 return;
195 }
196 //
197 //Takes the tree of the header file
198 //
199 tr = (TTree*)trackerFile->Get("TrkLevel2");
200 settrklev2(tr,trk);
201 //
202 otr = (TTree*)caloFile->Get("CaloLevel2");
203 setcalolevel2(otr,calo);
204 //
205 trnevents = tr->GetEntries();
206 nevents = otr->GetEntries();
207 const int lung = nevents;
208 Int_t goodev[lung];
209 Float_t mxtb[11][lung];
210 Float_t mytb[11][lung];
211 //
212 i = -1;
213 itr = -1;
214 syncro = 1;
215 pktnum = 0;
216 obt = 0;
217 printf(" Initializing... \n");
218 Int_t npoint = 44;
219 Int_t goodevno = 0;
220 while ( i < (nevents-1) ){
221 //
222 if ( i%1000 == 0 && i > 0 ) printf(" %iK \n",i/1000);
223 //
224 // look for tracker data
225 //
226 itr++;
227 i++;
228 syncro = 1;
229 //
230 trkcalosync0:
231 //
232 // check if we have tracker data
233 //
234 if ( i >= nevents ){
235 printf(" WARNING: no more calorimeter data.\n");
236 goto skipthisev0;
237 };
238 if ( itr > trnevents ){
239 printf(" WARNING: no more tracker data.\n");
240 goto skipthisev0;
241 };
242 //
243 // retrieve tracker informations
244 //
245 tr->GetEntry(itr);
246 //
247 // check synchronization tracker and calorimeter informations:
248 //
249 otr->GetEntry(i);
250 //
251 pktnum = calo.pkt_num;
252 obt = calo.OBT;
253 if ( pktnum != trk.pkt_num || obt != trk.obt ){
254 if ( pktnum > trk.pkt_num || obt > trk.obt ){
255 itr++;
256 syncro = 0;
257 goto trkcalosync0;
258 };
259 if ( pktnum < trk.pkt_num || obt < trk.obt ){
260 i++;
261 syncro = 0;
262 goto trkcalosync0;
263 };
264 };
265 //
266 // here we have synchronized data
267 //
268 if ( !syncro ) {
269 syncro = 1;
270 };
271 //
272 // here we go!
273 //
274 goodev[i] = 0;
275 //
276 // select events with one track...
277 //
278 if ( trk.ntrk == 1 && trk.good2 ){
279 //
280 // a good chi2 from tracker and rigidity greater than 1 GV (notice correction in deflection)
281 //
282 rig = 1./(trk.al[0][4]);
283 if ( trk.chi2[0] < 25 && (rig > 0.5 || rig < -0.5) ){
284 //
285 // a good fit of the track from calorimeter information
286 //
287 if ( calo.npcfit[0]>15 && calo.npcfit[1]>15 && calo.varcfit[0]<20. && calo.varcfit[1]<20. && calo.good == 1 ){ //era 19!
288 //
289 // determine the position of the track according to tracker:
290 //
291 Double_t zin[22];
292 Double_t xtb[22];
293 Double_t ytb[22];
294 Double_t al_p[5];
295 Int_t ifail;
296 Int_t ee;
297 Int_t eb;
298 //
299 minzalign0 = zalign0;
300 minzalign = 0.;
301 //
302 ee = 0;
303 eb = 11;
304 //
305 for ( Int_t ea = 0; ea < 11; ea++) {
306 //
307 eb--;
308 minzalign = minzalign0 + ((float)eb - togl)*(dzalig/((float)ngrid+1.));
309 //
310 if ( ea < 5 ) al_p[ea] = (Double_t)trk.al[0][ea];
311 xtb[ee] = 0.;
312 ytb[ee] = 0.;
313 zin[ee] = (piano[npia] + minzalign)/10.;
314 ee++;
315 xtb[ee] = 0.;
316 ytb[ee] = 0.;
317 zin[ee] = (piano[npia] - 5.1 + minzalign)/10.;
318 ee++;
319 };
320 //
321 npoint = 22;
322 ifail = 0;
323 //
324 ctrack(npoint,zin,xtb,ytb,al_p,ifail);
325 //
326 // here alignment factors for x and y
327 //
328 if ( !ifail ){
329 goodev[i] = 1;
330 goodevno++;
331 //
332 minzalign0 = zalign0;
333 minzalign = 0.;
334 ee = 21;
335 for ( Int_t ea = 0; ea < 11 ; ea++) {
336 mxtb[ea][i] = (float)xtb[ee] * 10.;
337 ee--;
338 mytb[ea][i] = (float)ytb[ee] * 10.;
339 ee--;
340 };
341 //
342 };
343 };
344 };
345 };
346 //
347 skipthisev0:
348 continue;
349 };
350 printf(" ...done! \n");
351 printf(" %i good events \n",goodevno);
352 //
353 Int_t ee = 0;
354 Float_t the;
355 Float_t psi;
356 Float_t phi;
357 //
358 Float_t xcbar;
359 Float_t ycbar;
360 Float_t xtbar;
361 Float_t ytbar;
362 //
363 // for (Int_t it = 0; it < 3; it++){
364 for (Int_t it = 0; it < 1; it++){
365 // printf(" iteraction %i \n",it);
366 //
367 if ( it == 0 ){
368 minxalign0 = xalign0;
369 minyalign0 = yalign0;
370 minzalign0 = zalign0;
371 minpsi0 = psi0;
372 minthe0 = the0;
373 minphi0 = phi0;
374 } else {
375 minxalign0 = minxalign;
376 minyalign0 = minyalign;
377 minzalign0 = minzalign;
378 minpsi0 = minpsialign;
379 minthe0 = minthealign;
380 minphi0 = minphialign;
381 };
382 //
383 for (Int_t nthe = 0; nthe<ngrid; nthe++){
384 //for (Int_t nthe = 5; nthe<6; nthe++){
385 //for (Int_t nthe = 4; nthe<7; nthe++){
386 minthealign = minthe0 + ((float)nthe - togl)*(dthe/((float)ngrid+1.));
387 //
388 for (Int_t nphi = 0; nphi<ngrid; nphi++){
389 //for (Int_t nphi = 4; nphi<5; nphi++){
390 //for (Int_t nphi = 5; nphi<6; nphi++){
391 //for (Int_t nphi = 4; nphi<7; nphi++){
392 minphialign = minphi0 + ((float)nphi - togl)*(dphi/((float)ngrid+1.));
393 //
394 for (Int_t npsi = 0; npsi<ngrid; npsi++){
395 //for (Int_t npsi = 5; npsi<6; npsi++){
396 //for (Int_t npsi = 4; npsi<7; npsi++){
397 minpsialign = minpsi0 + ((float)npsi - togl)*(dpsi/((float)ngrid+1.));
398 //
399 for (Int_t nxa = 0; nxa<ngrid; nxa++){
400 //for (Int_t nxa = 4; nxa<5; nxa++){
401 // printf(" nxa %i \n",nxa);
402 minxalign = minxalign0 + ((float)nxa - togl)*(dxalig/((float)ngrid+1.));
403 //printf("minxalign[%i][%i] = %f\n",g,h,minxalign[g][h]);
404 //for (Int_t nya = 6; nya<7; nya++){
405 for (Int_t nya = 0; nya<ngrid; nya++){
406 // printf(" nya %i \n",nya);
407 minyalign = minyalign0 + ((float)nya - togl)*(dyalig/((float)ngrid+1.));
408 //printf("minyalign[%i][%i] = %f\n",g,h,minyalign[g][h]);
409 //for (Int_t nza = 5; nza<6; nza++){
410 //for (Int_t nza = ngrid ; nza>=0; nza--){
411 for (Int_t nza = 0 ; nza < ngrid; nza++){
412 //
413 minzalign = minzalign0 + ((float)nza - togl)*(dzalig/((float)ngrid+1.));
414 printf(" Step %i xa %f ya %f za %f phi %f the %f psi %f \n",it,minxalign,minyalign,minzalign,minphialign,minthealign,minpsialign);
415 //
416 i = -1;
417 itr = -1;
418 syncro = 1;
419 pktnum = 0;
420 obt = 0;
421 //
422 while ( i < (nevents-1) ){
423 //
424 // look for tracker data
425 //
426 Int_t ea = npia;
427 itr++;
428 i++;
429 syncro = 1;
430 if ( goodev[i] == 0 ) {
431 goto skipthisev;
432 };
433 ee = 0;
434 the = minthealign;
435 psi = minpsialign;
436 phi = minphialign;
437 trkcalosync:
438 //
439 // check if we have tracker data
440 //
441 if ( i >= nevents ){
442 printf(" WARNING: no more calorimeter data.\n");
443 goto closeandexit;
444 };
445 if ( itr > trnevents ){
446 printf(" WARNING: no more tracker data.\n");
447 goto closeandexit;
448 };
449 //
450 // retrieve tracker informations
451 //
452 tr->GetEntry(itr);
453 //
454 // check synchronization tracker and calorimeter informations:
455 //
456 otr->GetEntry(i);
457 //
458 pktnum = calo.pkt_num;
459 obt = calo.OBT;
460 if ( pktnum != trk.pkt_num || obt != trk.obt ){
461 if ( pktnum > trk.pkt_num || obt > trk.obt ){
462 itr++;
463 syncro = 0;
464 goto trkcalosync;
465 };
466 if ( pktnum < trk.pkt_num || obt < trk.obt ){
467 i++;
468 syncro = 0;
469 goto trkcalosync;
470 };
471 };
472 //
473 // here we have synchronized data
474 //
475 if ( !syncro ) {
476 syncro = 1;
477 };
478 //
479 if ( goodev[i] == 0 ) {
480 goto skipthisev;
481 };
482 ea = npia;
483 //
484 xcbar = (calo.cbar[ea][0] + minxalign) * cos(phi) * cos(the) + (calo.cbar[ea][1] + minyalign) * (cos(phi) * sin(the) * sin(psi) - sin(phi) * cos(psi)) + (piano[ea] - zoff + minzalign) * (cos(phi) * sin(the) * cos(psi) + sin(phi) * sin (psi));
485 ycbar = (calo.cbar[ea][0] + minxalign) * sin(phi) * cos(the) + (calo.cbar[ea][1] + minyalign) * (sin(phi) * sin(the) * sin(phi) + cos(the) * cos(psi) ) + (piano[ea] - 5.1 - zoff + minzalign) * (sin(phi) * sin(the) * cos(psi) - cos(the) * sin(psi));
486 //
487 xtbar = mxtb[nza][i];
488 ytbar = -mytb[nza][i];
489 //
490 //
491 chi2nev += 1.;
492 //
493 chi2 += ((xcbar-xtbar)*(xcbar-xtbar)+(ycbar-ytbar)*(ycbar-ytbar))/(sigmacalo*sigmacalo);
494 //
495 skipthisev:
496 continue;
497 };
498 closeandexit:
499 //
500 minnxa = nxa;
501 minnya = nya;
502 minnza = nza;
503 minphi = nphi;
504 minpsi = npsi;
505 minthe = nthe;
506 tree->Fill();
507 chi2nev = 0.;
508 chi2 = 0.;
509 };
510 };
511 };
512 };
513 };
514 };
515 //
516 // run over different alignment parameters
517 //
518 printf("\n\n");
519 dxalig -= 7.;
520 dyalig -= 7.;
521 dzalig -= 7.;
522 dphi -= 0.02;
523 dpsi -= 0.02;
524 dthe -= 0.02;
525 };
526 hfile->Write();
527 hfile->Close();
528 };
529
530
531 void Ffindminimum(TString filename){
532 const char* startingdir = gSystem->WorkingDirectory();
533 TString path;
534 stringcopy(path,startingdir);
535 Int_t minnxa;
536 Int_t minnza;
537 Int_t minnya;
538 Int_t minphi;
539 Int_t minpsi;
540 Int_t minthe;
541 Float_t minxalign;
542 Float_t minyalign;
543 Float_t minzalign;
544 Float_t minpsialign;
545 Float_t minthealign;
546 Float_t minphialign;
547 Int_t nxa = 0;
548 Int_t nza = 0;
549 Int_t nya = 0;
550 Int_t phi = 0;
551 Int_t psi = 0;
552 Int_t the = 0;
553 Float_t chi2;
554 Float_t chi2nev;
555 TFile *f = new TFile(filename);
556 TTree *tr = (TTree*) f->Get("CaloTrkAlign");
557 tr->SetBranchAddress("chi2",&chi2);
558 tr->SetBranchAddress("chi2nev",&chi2nev);
559 tr->SetBranchAddress("minnxa",&minnxa);
560 tr->SetBranchAddress("minnya",&minnya);
561 tr->SetBranchAddress("minnza",&minnza);
562 tr->SetBranchAddress("minphi",&minphi);
563 tr->SetBranchAddress("minpsi",&minpsi);
564 tr->SetBranchAddress("minthe",&minthe);
565 tr->SetBranchAddress("minxalign",&minxalign);
566 tr->SetBranchAddress("minyalign",&minyalign);
567 tr->SetBranchAddress("minzalign",&minzalign);
568 tr->SetBranchAddress("minpsialign",&minpsialign);
569 tr->SetBranchAddress("minphialign",&minphialign);
570 tr->SetBranchAddress("minthealign",&minthealign);
571 //
572 Long64_t nevents = tr->GetEntries();
573 // Float_t min = 1000000000.;
574 Float_t min2 = 1000000000.;
575 for (Int_t i = nevents-1; i>=0; i--){
576 tr->GetEntry(i);
577 // if ( chi2/chi2nev <= min ){
578 // min = chi2/chi2nev;
579 // printf(" New minimum found:\n chi2 = %f minnxa = %i minnya = %i minnza = %i minthe = %i minpsi = %i minphi = %i \n\n",chi2/chi2nev,minnxa,minnya,minnza,minthe,minpsi,minphi);
580 // };
581 // if ( minnxa==4 && minnya==6 && minnza==6 && chi2/chi2nev <= min2 ){
582 if ( minnxa<6 && minnxa>2 && minnya<8 && minnya>4 && chi2/chi2nev <= min2 ){
583 min2 = chi2/chi2nev;
584 // printf(" 2- New minimum found:\n chi2 = %f minnxa = %i minnya = %i minnza = %i minthe = %i minpsi = %i minphi = %i \n\n",chi2/chi2nev,minnxa,minnya,minnza,minthe,minpsi,minphi);
585 nxa = minnxa;
586 nya = minnya;
587 nza = minnza;
588 the = minthe;
589 phi = minphi;
590 psi = minpsi;
591 };
592 };
593 printf("\n The best minimum found is for chi2 = %f with:\n minnxa = %i minnya = %i minnza = %i minthe = %i minpsi = %i minphi = %i \n\n",min2,nxa,nya,nza,the,psi,phi);
594 Int_t nps = 0;
595 Int_t nph = 0;
596 Int_t nth = 0;
597 Int_t nx = 0;
598 Int_t ny = 0;
599 Int_t nz = 0;
600 Float_t vnpsi[11];
601 Float_t vnphi[11];
602 Float_t vnthe[11];
603 Float_t vnx[11];
604 Float_t vny[11];
605 Float_t vnz[11];
606 Float_t vrpsi[11];
607 Float_t vrphi[11];
608 Float_t vrthe[11];
609 Float_t vrx[11];
610 Float_t vry[11];
611 Float_t vrz[11];
612 for (Int_t i = nevents-1; i>=0; i--){
613 tr->GetEntry(i);
614 if ( minnxa==nxa && minnya==nya && minnza==nza && minthe==the && minphi==phi ){
615 vnpsi[nps] = chi2/chi2nev;
616 vrpsi[nps] = minpsialign;
617 nps++;
618 };
619 if ( minnxa==nxa && minnya==nya && minnza==nza && minthe==the && minpsi==psi ){
620 vnphi[nph] = chi2/chi2nev;
621 vrphi[nph] = minphialign;
622 nph++;
623 };
624 if ( minnxa==nxa && minnya==nya && minnza==nza && minphi==phi && minpsi==psi ){
625 vnthe[nth] = chi2/chi2nev;
626 vrthe[nth] = minthealign;
627 nth++;
628 };
629 if ( minnxa==nxa && minnya==nya && minthe==the && minphi==phi && minpsi==psi ){
630 vnz[nz] = chi2/chi2nev;
631 vrz[nz] = minzalign;
632 nz++;
633 };
634 if ( minnxa==nxa && minnza==nza && minthe==the && minphi==phi && minpsi==psi ){
635 vny[ny] = chi2/chi2nev;
636 vry[ny] = -minyalign;
637 ny++;
638 };
639 if ( minnya==nya && minnza==nza && minthe==the && minphi==phi && minpsi==psi ){
640 vnx[nx] = chi2/chi2nev;
641 vrx[nx] = -minxalign;
642 nx++;
643 };
644 };
645 //
646 //
647 //
648 const string myfil = (const char *)filename;
649 Int_t myposiz = myfil.find("dw_");
650 if ( myposiz == -1 ) {
651 myposiz = myfil.find("DW_");
652 };
653 TString fileid;
654 stringcopy(fileid,filename,myposiz+18,myposiz+28);
655 //
656 //
657 stringstream namefile;
658 const char *pattho = path;
659 //
660 TCanvas *figura1 = new TCanvas("figura1","figura1", 1100, 900);
661 TGraph *gr;
662 TF1 *fit;
663 Float_t par2;
664 Float_t par3;
665 stringstream titolo;
666 //
667 figura1->Clear();
668 figura1->cd();
669 gPad->SetTickx();
670 gPad->SetTicky();
671 gr = new TGraph(11,vrx,vnx);
672 gr->SetLineWidth(1);
673 gr->SetMarkerStyle(20);
674 gStyle->SetOptFit(0);
675 gr->GetXaxis()->SetTitle("x offset [mm]");
676 gr->GetYaxis()->SetTitle("#chi^{2}");
677 gr->Fit("pol2","q");
678 fit = gr->GetFunction("pol2");
679 par2 = (float)fit->GetParameter(1);
680 par3 = (float)fit->GetParameter(2);
681 titolo.str("");
682 titolo << " Minimum at x = " << -par2/(2.*par3);
683 titolo << " mm";
684 gr->SetTitle(titolo.str().c_str());
685 gr->Draw("AP");
686 namefile.str("");
687 namefile << pattho << "/x_chi2_";
688 namefile << fileid.Data() << ".ps";
689 printf(" Save figure %s\n",namefile.str().c_str());
690 figura1->SaveAs(namefile.str().c_str());
691 //
692 figura1->Clear();
693 figura1->cd();
694 gPad->SetTickx();
695 gPad->SetTicky();
696 gr = new TGraph(11,vry,vny);
697 gr->SetLineWidth(1);
698 gr->SetMarkerStyle(20);
699 gStyle->SetOptFit(0);
700 gr->GetXaxis()->SetTitle("y offset [mm]");
701 gr->GetYaxis()->SetTitle("#chi^{2}");
702 gr->Fit("pol2","q");
703 fit = gr->GetFunction("pol2");
704 par2 = (float)fit->GetParameter(1);
705 par3 = (float)fit->GetParameter(2);
706 titolo.str("");
707 titolo << " Minimum at y = " << -par2/(2.*par3);
708 titolo << " mm";
709 gr->SetTitle(titolo.str().c_str());
710 gr->Draw("AP");
711 namefile.str("");
712 namefile << pattho << "/y_chi2_";
713 namefile << fileid.Data() << ".ps";
714 printf(" Save figure %s\n",namefile.str().c_str());
715 figura1->SaveAs(namefile.str().c_str());
716 //
717 figura1->Clear();
718 figura1->cd();
719 gPad->SetTickx();
720 gPad->SetTicky();
721 gr = new TGraph(11,vrz,vnz);
722 gr->SetLineWidth(1);
723 gr->SetMarkerStyle(20);
724 gStyle->SetOptFit(0);
725 gr->GetXaxis()->SetTitle("z offset [mm]");
726 gr->GetYaxis()->SetTitle("#chi^{2}");
727 gr->Fit("pol2","q");
728 fit = gr->GetFunction("pol2");
729 par2 = (float)fit->GetParameter(1);
730 par3 = (float)fit->GetParameter(2);
731 titolo.str("");
732 titolo << " Minimum at z = " << -par2/(2.*par3);
733 titolo << " mm";
734 gr->SetTitle(titolo.str().c_str());
735 gr->Draw("AP");
736 namefile.str("");
737 namefile << pattho << "/z_chi2_";
738 namefile << fileid.Data() << ".ps";
739 printf(" Save figure %s\n",namefile.str().c_str());
740 figura1->SaveAs(namefile.str().c_str());
741 //
742 figura1->Clear();
743 figura1->cd();
744 gPad->SetTickx();
745 gPad->SetTicky();
746 gr = new TGraph(11,vrphi,vnphi);
747 gr->SetLineWidth(1);
748 gr->SetMarkerStyle(20);
749 gStyle->SetOptFit(0);
750 gr->GetXaxis()->SetTitle("#phi_{z} offset [rad]");
751 gr->GetYaxis()->SetTitle("#chi^{2}");
752 gr->Fit("pol2","q");
753 fit = gr->GetFunction("pol2");
754 par2 = (float)fit->GetParameter(1);
755 par3 = (float)fit->GetParameter(2);
756 titolo.str("");
757 titolo << " Minimum at #phi_{z} = " << -par2/(2.*par3);
758 titolo << " rad";
759 gr->SetTitle(titolo.str().c_str());
760 gr->Draw("AP");
761 namefile.str("");
762 namefile << pattho << "/phi_chi2_";
763 namefile << fileid.Data() << ".ps";
764 printf(" Save figure %s\n",namefile.str().c_str());
765 figura1->SaveAs(namefile.str().c_str());
766 //
767 figura1->Clear();
768 figura1->cd();
769 gPad->SetTickx();
770 gPad->SetTicky();
771 gr = new TGraph(11,vrthe,vnthe);
772 gr->SetLineWidth(1);
773 gr->SetMarkerStyle(20);
774 gStyle->SetOptFit(0);
775 gr->GetXaxis()->SetTitle("#theta_{y} offset [rad]");
776 gr->GetYaxis()->SetTitle("#chi^{2}");
777 gr->Fit("pol2","q");
778 fit = gr->GetFunction("pol2");
779 par2 = (float)fit->GetParameter(1);
780 par3 = (float)fit->GetParameter(2);
781 titolo.str("");
782 titolo << " Minimum at #theta_{y} = " << -par2/(2.*par3);
783 titolo << " rad";
784 gr->SetTitle(titolo.str().c_str());
785 gr->Draw("AP");
786 namefile.str("");
787 namefile << pattho << "/the_chi2_";
788 namefile << fileid.Data() << ".ps";
789 printf(" Save figure %s\n",namefile.str().c_str());
790 figura1->SaveAs(namefile.str().c_str());
791 //
792 figura1->Clear();
793 figura1->cd();
794 gPad->SetTickx();
795 gPad->SetTicky();
796 gr = new TGraph(11,vrpsi,vnpsi);
797 gr->SetLineWidth(1);
798 gr->SetMarkerStyle(20);
799 gStyle->SetOptFit(0);
800 gr->GetXaxis()->SetTitle("#psi_{x} offset [rad]");
801 gr->GetYaxis()->SetTitle("#chi^{2}");
802 gr->Fit("pol2","q");
803 fit = gr->GetFunction("pol2");
804 par2 = (float)fit->GetParameter(1);
805 par3 = (float)fit->GetParameter(2);
806 titolo.str("");
807 titolo << " Minimum at #psi_{x} = " << -par2/(2.*par3);
808 titolo << " rad";
809 gr->SetTitle(titolo.str().c_str());
810 gr->Draw("AP");
811 namefile.str("");
812 namefile << pattho << "/psi_chi2_";
813 namefile << fileid.Data() << ".ps";
814 printf(" Save figure %s\n",namefile.str().c_str());
815 figura1->SaveAs(namefile.str().c_str());
816 //
817 }
818
819 void Ffindminimumnorotation(TString filename){
820 Int_t minnxa;
821 Int_t minnza;
822 Int_t minnya;
823 Int_t minphi;
824 Int_t minpsi;
825 Int_t minthe;
826 Float_t chi2;
827 Float_t chi2nev;
828 TFile *f = new TFile(filename);
829 TTree *tr = (TTree*) f->Get("CaloTrkAlign");
830 tr->SetBranchAddress("chi2",&chi2);
831 tr->SetBranchAddress("chi2nev",&chi2nev);
832 tr->SetBranchAddress("minnxa",&minnxa);
833 tr->SetBranchAddress("minnya",&minnya);
834 tr->SetBranchAddress("minnza",&minnza);
835 tr->SetBranchAddress("minphi",&minphi);
836 tr->SetBranchAddress("minpsi",&minpsi);
837 tr->SetBranchAddress("minthe",&minthe);
838 Long64_t nevents = tr->GetEntries();
839 Float_t min = 1000000000.;
840 for (Int_t i = nevents-1; i>=0; i--){
841 tr->GetEntry(i);
842 if ( chi2/chi2nev <= min && minthe==5 && minpsi==5 && minphi == 5 ){
843 min = chi2/chi2nev;
844 printf(" New minimum found:\n chi2 = %f minnxa = %i minnya = %i minnza = %i minthe = %i minpsi = %i minphi = %i \n\n",chi2/chi2nev,minnxa,minnya,minnza,minthe,minpsi,minphi);
845 };
846 };
847
848
849 }

  ViewVC Help
Powered by ViewVC 1.1.23