/[PAMELA software]/calo/ground/UTILITIES/macros/CaloTRKCALOALIG.c
ViewVC logotype

Contents of /calo/ground/UTILITIES/macros/CaloTRKCALOALIG.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (show annotations) (download)
Tue Dec 6 10:59:28 2005 UTC (19 years, 2 months ago) by mocchiut
Branch point for: MAIN, UTILITIES
File MIME type: text/plain
Initial revision

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

  ViewVC Help
Powered by ViewVC 1.1.23