]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/src/AliL3Transform.cxx
Removed ASV version in AliL3FileHandler by another effective i/o method using index...
[u/mrichter/AliRoot.git] / HLT / src / AliL3Transform.cxx
CommitLineData
3e87ef69 1// @(#) $Id$
2
3// Author: Anders Vestbo <mailto:vestbo@fi.uib.no>, Uli Frankenfeld <mailto:franken@fi.uib.no>, Constantin Loizides <mailto:loizides@ikf.uni-frankfurt.de>
4//*-- Copyright &copy ALICE HLT Group
cd058d23 5
108615fc 6
118c26c3 7#include "AliL3StandardIncludes.h"
3e87ef69 8#include "dirent.h"
118c26c3 9
5923e698 10#ifdef use_aliroot
5e0f9911 11#include <AliRun.h>
12#include <AliMagF.h>
13#include <AliTPCParamSR.h>
14#include <AliTPCPRF2D.h>
15#include <AliTPCRF1D.h>
3e87ef69 16#endif
17#ifdef use_root
5e0f9911 18#include <TFile.h>
2220326f 19#include <TUnixSystem.h>
20#include <TTimeStamp.h>
3e87ef69 21#include <TError.h>
5923e698 22#endif
b661165c 23
5e0f9911 24#include "AliL3Logging.h"
25#include "AliL3Transform.h"
26
3e87ef69 27#if GCCVERSION == 3
28using namespace std;
29#endif
30
4499ed26 31/** \class AliL3Transform
3e87ef69 32<pre>
b661165c 33//_____________________________________________________________
108615fc 34// AliL3Transform
35//
36// Transformation class for ALICE TPC.
494fad94 37//
38// Class which contains all detector specific parameters for the TPC,
39// and different useful functions for coordinate transforms.
40//
41// The class is completely static, which means that no object needs
5923e698 42// to be instantiated. Function calls should then be done like, e.g.:
494fad94 43//
5923e698 44// Double_t eta = AliL3Transform::GetEta(xyz);
494fad94 45//
46// IMPORTANT: If used as is, default detector parameters will be used,
47// and you really have to make sure that these correspond to
48// the AliROOT version you are currently working on!!
49// You should therefore always initialize the parameters by
50//
51// AliL3Transform::Init(path);
52//
53// where path is a char*, giving the path to where file containing
54// the detector parameter is located. This file should be called
5923e698 55// "l3transform.config", and can be created with the function MakeInitFile.
56//
57// You can also force reading the parameters from a AliTPCParam object
58// by setting the flag;
59//
2220326f 60// AliL3Transform::Init(path,kTRUE);
5923e698 61//
2220326f 62// where path is a char*
3e87ef69 63// either providing the rootfile name containing the geometry or
64// the path to the rootfile which should then be called alirunfile.root.
0ceee3a5 65// Note that for both of these cases you have to
5923e698 66// compile with USEPACKAGE=ALIROOT set (see level3code/Makefile.conf).
3e87ef69 67//
68// Currently, there are 4 versions of the Transformer:
69// fVersion==fV_aliroot: ALIROOT-head compatible
70// fVersion==fV_cosmics: Cosmics data run (2003) compatible
71// fVersion==fV_default: means no config file has been loaded
72// fVersion==fV_deprecated: dont use old (before July 2003) style of transformer
73//
74</pre>
4499ed26 75*/
494fad94 76
3e87ef69 77
494fad94 78ClassImp(AliL3Transform)
79
5e0f9911 80
3e87ef69 81const Double_t AliL3Transform::fAnodeWireSpacing = 0.25; //Taken from the TDR
82const Double_t AliL3Transform::fBFACT = 0.0029980; //Conversion Factor
83const Double_t AliL3Transform::fPi = 3.141592653589793;
84
85//Defined by HLT and GSI
5923e698 86Int_t AliL3Transform::fNPatches = 6;
3e87ef69 87Int_t AliL3Transform::fRows[6][2] = {{0,29},{30,62},{63,90},{91,116},{117,139},{140,158}};
88Int_t AliL3Transform::fNRows[6] = {30,33,28,26,23,19};
89
90// The following definition is generated by MakeInitFile function
91Double_t AliL3Transform::fBField = 0.2;
92Double_t AliL3Transform::fSolenoidBField = 2;
93Double_t AliL3Transform::fBFieldFactor = 1;
94Int_t AliL3Transform::fVersion = fV_default;
95Int_t AliL3Transform::fNTimeBins = 446;
96Int_t AliL3Transform::fNRowLow = 63;
97Int_t AliL3Transform::fNRowUp = 96;
98Int_t AliL3Transform::fNRowUp1 = 64;
99Int_t AliL3Transform::fNRowUp2 = 32;
100Int_t AliL3Transform::fNSectorLow = 36;
101Int_t AliL3Transform::fNSectorUp = 36;
102Int_t AliL3Transform::fNSector = 72;
103Double_t AliL3Transform::fPadPitchWidthLow = 0.4;
104Double_t AliL3Transform::fPadPitchWidthUp = 0.6;
105Double_t AliL3Transform::fZWidth = 0.5660;
106Double_t AliL3Transform::fZSigma = 0.2288;
107Double_t AliL3Transform::fZLength = 250.0000;
108Double_t AliL3Transform::fZOffset = 0.6864;
109Double_t AliL3Transform::fDiffT = 0.0220;
110Double_t AliL3Transform::fDiffL = 0.0220;
111Double_t AliL3Transform::fOmegaTau = 0.1450;
112Double_t AliL3Transform::fInnerPadLength = 0.75;
113Double_t AliL3Transform::fOuter1PadLength = 1.00;
114Double_t AliL3Transform::fOuter2PadLength = 1.50;
115Double_t AliL3Transform::fInnerPRFSigma = 0.203811;
116Double_t AliL3Transform::fOuter1PRFSigma = 0.299325;
117Double_t AliL3Transform::fOuter2PRFSigma = 0.299323;
118Double_t AliL3Transform::fTimeSigma = 0.228809;
119Int_t AliL3Transform::fADCSat = 1024;
120Int_t AliL3Transform::fZeroSup = 0;
121Int_t AliL3Transform::fNSlice = 36;
122Int_t AliL3Transform::fNRow = 159;
123Double_t AliL3Transform::fNRotShift = 0.5;
124Int_t AliL3Transform::fSlice2Sector[36][2] = { { 0, 36},
125 { 1, 37},
126 { 2, 38},
127 { 3, 39},
128 { 4, 40},
129 { 5, 41},
130 { 6, 42},
131 { 7, 43},
132 { 8, 44},
133 { 9, 45},
134 {10, 46},
135 {11, 47},
136 {12, 48},
137 {13, 49},
138 {14, 50},
139 {15, 51},
140 {16, 52},
141 {17, 53},
142 {18, 54},
143 {19, 55},
144 {20, 56},
145 {21, 57},
146 {22, 58},
147 {23, 59},
148 {24, 60},
149 {25, 61},
150 {26, 62},
151 {27, 63},
152 {28, 64},
153 {29, 65},
154 {30, 66},
155 {31, 67},
156 {32, 68},
157 {33, 69},
158 {34, 70},
159 {35, 71}
160};
161
162Int_t AliL3Transform::fSector2Slice[72] = { 0,
163 1,
164 2,
165 3,
166 4,
167 5,
168 6,
169 7,
170 8,
171 9,
172 10,
173 11,
174 12,
175 13,
176 14,
177 15,
178 16,
179 17,
180 18,
181 19,
182 20,
183 21,
184 22,
185 23,
186 24,
187 25,
188 26,
189 27,
190 28,
191 29,
192 30,
193 31,
194 32,
195 33,
196 34,
197 35,
198 0,
199 1,
200 2,
201 3,
202 4,
203 5,
204 6,
205 7,
206 8,
207 9,
208 10,
209 11,
210 12,
211 13,
212 14,
213 15,
214 16,
215 17,
216 18,
217 19,
218 20,
219 21,
220 22,
221 23,
222 24,
223 25,
224 26,
225 27,
226 28,
227 29,
228 30,
229 31,
230 32,
231 33,
232 34,
233 35
234};
235
236Int_t AliL3Transform::fSectorLow[72] = { 1,
237 1,
238 1,
239 1,
240 1,
241 1,
242 1,
243 1,
244 1,
245 1,
246 1,
247 1,
248 1,
249 1,
250 1,
251 1,
252 1,
253 1,
254 1,
255 1,
256 1,
257 1,
258 1,
259 1,
260 1,
261 1,
262 1,
263 1,
264 1,
265 1,
266 1,
267 1,
268 1,
269 1,
270 1,
271 1,
272 0,
273 0,
274 0,
275 0,
276 0,
277 0,
278 0,
279 0,
280 0,
281 0,
282 0,
283 0,
284 0,
285 0,
286 0,
287 0,
288 0,
289 0,
290 0,
291 0,
292 0,
293 0,
294 0,
295 0,
296 0,
297 0,
298 0,
299 0,
300 0,
301 0,
302 0,
303 0,
304 0,
305 0,
306 0,
307 0
308};
309
310Double_t AliL3Transform::fX[159] = { 85.195,
311 85.945,
312 86.695,
313 87.445,
314 88.195,
315 88.945,
316 89.695,
317 90.445,
318 91.195,
319 91.945,
320 92.695,
321 93.445,
322 94.195,
323 94.945,
324 95.695,
325 96.445,
326 97.195,
327 97.945,
328 98.695,
329 99.445,
330 100.195,
331 100.945,
332 101.695,
333 102.445,
334 103.195,
335 103.945,
336 104.695,
337 105.445,
338 106.195,
339 106.945,
340 107.695,
341 108.445,
342 109.195,
343 109.945,
344 110.695,
345 111.445,
346 112.195,
347 112.945,
348 113.695,
349 114.445,
350 115.195,
351 115.945,
352 116.695,
353 117.445,
354 118.195,
355 118.945,
356 119.695,
357 120.445,
358 121.195,
359 121.945,
360 122.695,
361 123.445,
362 124.195,
363 124.945,
364 125.695,
365 126.445,
366 127.195,
367 127.945,
368 128.695,
369 129.445,
370 130.195,
371 130.945,
372 131.695,
373 135.180,
374 136.180,
375 137.180,
376 138.180,
377 139.180,
378 140.180,
379 141.180,
380 142.180,
381 143.180,
382 144.180,
383 145.180,
384 146.180,
385 147.180,
386 148.180,
387 149.180,
388 150.180,
389 151.180,
390 152.180,
391 153.180,
392 154.180,
393 155.180,
394 156.180,
395 157.180,
396 158.180,
397 159.180,
398 160.180,
399 161.180,
400 162.180,
401 163.180,
402 164.180,
403 165.180,
404 166.180,
405 167.180,
406 168.180,
407 169.180,
408 170.180,
409 171.180,
410 172.180,
411 173.180,
412 174.180,
413 175.180,
414 176.180,
415 177.180,
416 178.180,
417 179.180,
418 180.180,
419 181.180,
420 182.180,
421 183.180,
422 184.180,
423 185.180,
424 186.180,
425 187.180,
426 188.180,
427 189.180,
428 190.180,
429 191.180,
430 192.180,
431 193.180,
432 194.180,
433 195.180,
434 196.180,
435 197.180,
436 198.180,
437 199.430,
438 200.930,
439 202.430,
440 203.930,
441 205.430,
442 206.930,
443 208.430,
444 209.930,
445 211.430,
446 212.930,
447 214.430,
448 215.930,
449 217.430,
450 218.930,
451 220.430,
452 221.930,
453 223.430,
454 224.930,
455 226.430,
456 227.930,
457 229.430,
458 230.930,
459 232.430,
460 233.930,
461 235.430,
462 236.930,
463 238.430,
464 239.930,
465 241.430,
466 242.930,
467 244.430,
468 245.930
494fad94 469};
470
5923e698 471Int_t AliL3Transform::fNPads[159] = {67,
494fad94 472 67,
473 69,
474 69,
475 69,
476 71,
477 71,
478 71,
479 73,
480 73,
481 73,
482 75,
483 75,
484 75,
485 77,
486 77,
487 77,
488 79,
489 79,
490 79,
491 81,
492 81,
493 81,
494 83,
495 83,
496 83,
497 85,
498 85,
499 85,
500 87,
501 87,
502 87,
503 89,
504 89,
505 89,
506 91,
507 91,
508 91,
509 93,
510 93,
511 93,
512 95,
513 95,
514 95,
515 97,
516 97,
517 97,
518 99,
519 99,
520 99,
5923e698 521 99,
494fad94 522 101,
523 101,
524 101,
525 103,
526 103,
527 103,
528 105,
529 105,
530 105,
531 107,
532 107,
533 107,
494fad94 534 73,
535 75,
536 75,
537 75,
5923e698 538 75,
494fad94 539 77,
540 77,
541 77,
542 79,
543 79,
544 79,
545 81,
546 81,
547 81,
5923e698 548 81,
494fad94 549 83,
550 83,
551 83,
552 85,
553 85,
554 85,
5923e698 555 85,
494fad94 556 87,
557 87,
558 87,
559 89,
560 89,
561 89,
562 91,
563 91,
564 91,
5923e698 565 91,
494fad94 566 93,
567 93,
568 93,
569 95,
570 95,
571 95,
5923e698 572 95,
494fad94 573 97,
574 97,
575 97,
576 99,
577 99,
578 99,
579 101,
580 101,
581 101,
5923e698 582 101,
494fad94 583 103,
584 103,
585 103,
586 105,
587 105,
588 105,
5923e698 589 105,
494fad94 590 107,
591 107,
592 107,
593 109,
594 109,
595 109,
596 111,
597 111,
598 111,
599 113,
600 113,
601 113,
494fad94 602 115,
603 115,
494fad94 604 117,
605 117,
494fad94 606 119,
607 119,
608 121,
609 121,
610 121,
611 123,
612 123,
494fad94 613 125,
614 125,
494fad94 615 127,
616 127,
617 127,
618 129,
619 129,
494fad94 620 131,
621 131,
622 133,
623 133,
494fad94 624 135,
625 135,
626 135,
627 137,
628 137,
118c26c3 629 139
494fad94 630};
631
3e87ef69 632Double_t AliL3Transform::fCos[36] = { 0.9848077297,
633 0.8660253882,
634 0.6427876353,
635 0.3420201540,
636 0.0000000000,
637 -0.3420201540,
638 -0.6427876353,
639 -0.8660253882,
640 -0.9848077297,
641 -0.9848077297,
642 -0.8660253882,
643 -0.6427876353,
644 -0.3420201540,
645 -0.0000000000,
646 0.3420201540,
647 0.6427876353,
648 0.8660253882,
649 0.9848077297,
650 0.9848077297,
651 0.8660253882,
652 0.6427876353,
653 0.3420201540,
654 0.0000000000,
655 -0.3420201540,
656 -0.6427876353,
657 -0.8660253882,
658 -0.9848077297,
659 -0.9848077297,
660 -0.8660253882,
661 -0.6427876353,
662 -0.3420201540,
663 -0.0000000000,
664 0.3420201540,
665 0.6427876353,
666 0.8660253882,
667 0.9848077297
668};
669
670Double_t AliL3Transform::fSin[36] = { 0.1736481786,
671 0.5000000000,
672 0.7660444379,
673 0.9396926165,
674 1.0000000000,
675 0.9396926165,
676 0.7660444379,
677 0.5000000000,
678 0.1736481786,
679 -0.1736481786,
680 -0.5000000000,
681 -0.7660444379,
682 -0.9396926165,
683 -1.0000000000,
684 -0.9396926165,
685 -0.7660444379,
686 -0.5000000000,
687 -0.1736481786,
688 0.1736481786,
689 0.5000000000,
690 0.7660444379,
691 0.9396926165,
692 1.0000000000,
693 0.9396926165,
694 0.7660444379,
695 0.5000000000,
696 0.1736481786,
697 -0.1736481786,
698 -0.5000000000,
699 -0.7660444379,
700 -0.9396926165,
701 -1.0000000000,
702 -0.9396926165,
703 -0.7660444379,
704 -0.5000000000,
705 -0.1736481786
706};
707
2220326f 708Bool_t AliL3Transform::Init(Char_t* path,Bool_t UseAliTPCParam)
f59eed2d 709{
494fad94 710 //Overwrite the parameters with values stored in file "l3transform.config" in path.
711 //If file does not exist, old default values will be used.
5923e698 712 //If flag UseAliTPCParam is set, the parameters will be read from the the rootfile
713 //which then has to be called path/digitfile.root
714
3e87ef69 715 if(fVersion != fV_default)
5923e698 716 LOG(AliL3Log::kWarning,"AliL3Transform::Init","Init values")
3e87ef69 717 <<AliL3Log::kDec<<"You are initializing the parameters more than once; check your code please! "<<fVersion<<ENDLOG;
b25c64e5 718
3e87ef69 719 if(UseAliTPCParam) //use rootfile to generate temporary init file
720 return ReadInit(path);
5923e698 721
3e87ef69 722 //create filename
723 Char_t pathname[1024];
a4e75a99 724 strcpy(pathname,path);
3e87ef69 725
726 //test whether provided path is the file itself
02f030e3 727 Int_t isdir = 0;
3e87ef69 728 DIR *testdir=opendir(pathname);
729 if(testdir){
730 isdir=1;
731 closedir(testdir);
732 }
733
734 if(isdir) strcat(pathname,"/l3transform.config");
735
736 return ReadInitFile(pathname);
737}
738
739Bool_t AliL3Transform::ReadInitFile(Char_t* pathname)
740{
741 //read transformer settings from pathname
742
a4e75a99 743 FILE *fptr=fopen(pathname,"r");
744 if(!fptr){
b25c64e5 745 LOG(AliL3Log::kWarning,"AliL3Transform::Init","File Open")
746 <<"Pointer to Config File \""<<pathname<<"\" 0x0!"<<ENDLOG;
2220326f 747 return kFALSE;
a4e75a99 748 }
749
f59eed2d 750 Char_t d1[250], d2[100], d3[100];
751 Int_t dummy=0;
752 Double_t ddummy=0.0;
a4e75a99 753
754 while(!feof(fptr)) {
755 fscanf(fptr,"%s",d1);
3e87ef69 756 if(strcmp(d1,"fVersion")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fVersion=dummy;}
757 else if(strcmp(d1,"fBFieldFactor")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fBFieldFactor=(Double_t)ddummy;}
758 else if(strcmp(d1,"fSolenoidBField")==0)
759 {
760 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);
761 fSolenoidBField=(Double_t)ddummy;
762 }
293aee2f 763 else if(strcmp(d1,"fNTimeBins")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNTimeBins=(Int_t)dummy;}
e1964feb 764 else if(strcmp(d1,"fNRowLow")==0)
765 {
766 fscanf(fptr,"%s %d %s",d2,&dummy,d3);
767 fNRowLow=(Int_t)dummy;
768 if(fNRowLow != 63)
769 LOG(AliL3Log::kError,"AliL3Transform::Init","Overflow")
770 <<"Number of inner PadRows should be 63! Check and fgrep the code for 63 to see the consequences of this major change!"<<ENDLOG;
771 }
a4e75a99 772 else if(strcmp(d1,"fNRowUp")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRowUp=(Int_t)dummy;}
5923e698 773 else if(strcmp(d1,"fNRowUp1")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRowUp1=(Int_t)dummy;}
774 else if(strcmp(d1,"fNRowUp2")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRowUp2=(Int_t)dummy;}
a4e75a99 775 else if(strcmp(d1,"fNSectorLow")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSectorLow=(Int_t)dummy;}
776 else if(strcmp(d1,"fNSectorUp")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSectorUp=(Int_t)dummy;}
777 else if(strcmp(d1,"fNSector")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSector=(Int_t)dummy;}
778 else if(strcmp(d1,"fPadPitchWidthLow")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fPadPitchWidthLow=(Double_t)ddummy;}
779 else if(strcmp(d1,"fPadPitchWidthUp")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fPadPitchWidthUp=(Double_t)ddummy;}
780 else if(strcmp(d1,"fZWidth")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZWidth=(Double_t)ddummy;}
781 else if(strcmp(d1,"fZSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZSigma=(Double_t)ddummy;}
740da2a6 782 else if(strcmp(d1,"fZLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZLength=(Double_t)ddummy;}
783 else if(strcmp(d1,"fZOffset")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZOffset=(Double_t)ddummy;}
a4e75a99 784 else if(strcmp(d1,"fNSlice")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSlice=(Int_t)dummy;}
768861a0 785 else if(strcmp(d1,"fDiffT")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fDiffT=(Double_t)ddummy;}
786 else if(strcmp(d1,"fDiffL")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fDiffL=(Double_t)ddummy;}
3e87ef69 787 else if(strcmp(d1,"fOmegaTau")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fOmegaTau=(Double_t)ddummy;}
768861a0 788 else if(strcmp(d1,"fInnerPadLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fInnerPadLength=(Double_t)ddummy;}
5923e698 789 else if(strcmp(d1,"fOuter1PadLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fOuter1PadLength=(Double_t)ddummy;}
790 else if(strcmp(d1,"fOuter2PadLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fOuter2PadLength=(Double_t)ddummy;}
768861a0 791 else if(strcmp(d1,"fInnerPRFSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fInnerPRFSigma=(Double_t)ddummy;}
5923e698 792 else if(strcmp(d1,"fOuter1PRFSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fOuter1PRFSigma=(Double_t)ddummy;}
793 else if(strcmp(d1,"fOuter2PRFSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fOuter2PRFSigma=(Double_t)ddummy;}
768861a0 794 else if(strcmp(d1,"fTimeSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fTimeSigma=(Double_t)ddummy;}
6f3df1c8 795 else if(strcmp(d1,"fADCSat")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fADCSat=(Int_t)dummy;}
3e87ef69 796 else if(strcmp(d1,"fZeroSup")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fZeroSup=(Int_t)dummy;}
a4e75a99 797 else if(strcmp(d1,"fNRow")==0){
798 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRow=(Int_t)dummy;
5923e698 799 if(fNRow!=159){
800 LOG(AliL3Log::kError,"AliL3Transform::Init","Overflow")<<"Number of PadRows should be 159! Check and fgrep the code for 159 to see the consequences of this major change!"<<ENDLOG;
a4e75a99 801 }
802 }
803 else if(strcmp(d1,"fNRotShift")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fNRotShift=(Double_t)ddummy;}
a4e75a99 804 else if(strcmp(d1,"fX[0]")==0){
805 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fX[0]=(Double_t)ddummy;
740da2a6 806 for(Int_t i=1;i<fNRow;i++){fscanf(fptr,"%s %s %lf %s",d1,d2,&ddummy,d3);fX[i]=(Double_t)ddummy;}
a4e75a99 807 }
808 else if(strcmp(d1,"fNPads[0]")==0){
809 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNPads[0]=(Int_t)dummy;
810 for(Int_t i=1;i<fNRow;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fNPads[i]=(Int_t)dummy;}
811 }
3e87ef69 812 else if(strcmp(d1,"fNRows[0]")==0){
813 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRows[0]=(Int_t)dummy;
814 for(Int_t i=1;i<fNPatches;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fNRows[i]=(Int_t)dummy;}
815 }
816 else if(strcmp(d1,"fRows[0][0]")==0){
817 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fRows[0][0]=(Int_t)dummy;
818 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fRows[0][1]=(Int_t)dummy;
819 for(Int_t i=1;i<fNPatches;i++){
820 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fRows[i][0]=(Int_t)dummy;
821 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fRows[i][1]=(Int_t)dummy;
822 }
823 }
824 else if(strcmp(d1,"fSlice2Sector[0][0]")==0){
825 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fSlice2Sector[0][0]=(Int_t)dummy;
826 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fSlice2Sector[0][1]=(Int_t)dummy;
827 for(Int_t i=1;i<fNSlice;i++){
828 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fSlice2Sector[i][0]=(Int_t)dummy;
829 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fSlice2Sector[i][1]=(Int_t)dummy;
830 }
831 }
832 else if(strcmp(d1,"fSector2Slice[0]")==0){
833 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fSector2Slice[0]=(Int_t)dummy;
834 for(Int_t i=1;i<fNSector;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fSector2Slice[i]=(Int_t)dummy;}
835 }
836 else if(strcmp(d1,"fSectorLow[0]")==0){
837 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fSectorLow[0]=(Int_t)dummy;
838 for(Int_t i=1;i<fNSector;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fSectorLow[i]=(Int_t)dummy;}
839 }
840 else if(strcmp(d1,"fCos[0]")==0){
841 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fCos[0]=(Double_t)ddummy;
842 for(Int_t i=1;i<fNSlice;i++){fscanf(fptr,"%s %s %lf %s",d1,d2,&ddummy,d3);fCos[0]=(Double_t)ddummy;}
843 }
844 else if(strcmp(d1,"fSin[0]")==0){
845 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fSin[0]=(Double_t)ddummy;
846 for(Int_t i=1;i<fNSlice;i++){fscanf(fptr,"%s %s %lf %s",d1,d2,&ddummy,d3);fSin[0]=(Double_t)ddummy;}
847 }
a4e75a99 848 }
849
3e87ef69 850 //The first multiplier gives the scale factor used to modify the field map
851 //defined by the second multiplier.
852 fBField=fBFieldFactor*fSolenoidBField*0.1;
853
a4e75a99 854 fclose(fptr);
3e87ef69 855
856 //Test if new config file has been used.
857 if(fVersion==fV_deprecated){
858 LOG(AliL3Log::kError,"AliL3Transform::Init","Version")
859 <<"Version is deprecated, you have to create a new config file."<<ENDLOG;
860 return kFALSE;
861 }
2220326f 862
863 return kTRUE;
5923e698 864}
2220326f 865
866Bool_t AliL3Transform::ReadInit(Char_t *path)
5923e698 867{
868 //Read all the parameters from a aliroot file, and store it in a temporary
869 //file which is read by Init. Use this if you want to read the parameters from
870 //the rootfile "every" time.
871
872#ifndef use_aliroot
873 LOG(AliL3Log::kError,"AliL3Transform::ReadInit","Version")
874 <<"You have to compile with use_aliroot flag in order to read from AliROOT file"<<ENDLOG;
2220326f 875 return kFALSE;
5923e698 876#else
877 Char_t filename[1024];
2220326f 878 //first test whether provided path is the rootfile itself
3e87ef69 879 Int_t saveErrIgLevel=gErrorIgnoreLevel;
880 gErrorIgnoreLevel=kFatal; //dont report errors
2220326f 881 TFile *rootfile = TFile::Open(path);
3e87ef69 882 if(rootfile->IsZombie())
883 { //ok assume its path to alirunfile file
2220326f 884 sprintf(filename,"%s/alirunfile.root",path); //create rootfile name
3e87ef69 885 } else { //path contains itself the rootfile name
2220326f 886 rootfile->Close();
3e87ef69 887 sprintf(filename,"%s",path);
2220326f 888 }
3e87ef69 889 gErrorIgnoreLevel=saveErrIgLevel;
2220326f 890
02f030e3 891 //finally make dummy init file /tmp/$USER/l3transform.config-`date`
892 Char_t tmppath[1024];
893 sprintf(tmppath,"/tmp/%s",gSystem->Getenv("USER"));
894 gSystem->mkdir(tmppath);
895 TTimeStamp time;
896 Char_t tmpfile[1024];
897 sprintf(tmpfile,"%s/l3transform.config-%d",tmppath,(Int_t)time.GetSec());
898 return MakeInitFile(filename,tmpfile);
5923e698 899#endif
900}
901
02f030e3 902Bool_t AliL3Transform::MakeInitFile(Char_t *rootfilename,Char_t *filename)
5923e698 903{
904 //Get the parameters from rootfile, and store it on the file "l3transform.config"
3e87ef69 905 //which is being read by Init. fVersion will be fV_aliroot!
5923e698 906
907#ifndef use_aliroot
908 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","Version")
909 <<"You have to compile with use_aliroot flag in order to use this function"<<ENDLOG;
2220326f 910 return kFALSE;
5923e698 911#else
02f030e3 912 TFile *rootfile = TFile::Open(rootfilename);
2220326f 913 if(!rootfile)
914 {
915 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","File")
02f030e3 916 <<"Could not open file: "<<rootfilename<<ENDLOG;
2220326f 917 return kFALSE;
918 }
5923e698 919 AliRun *gAlice = (AliRun*)rootfile->Get("gAlice");
920 if(!gAlice)
921 {
922 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","File")
02f030e3 923 <<"No gAlice in file: "<<rootfilename<<ENDLOG;
2220326f 924 return kFALSE;
5923e698 925 }
5e0f9911 926 AliTPCParamSR *param=(AliTPCParamSR*)rootfile->Get(GetParamName());
5923e698 927 if(!param)
928 {
02f030e3 929 LOG(AliL3Log::kWarning,"AliL3Transform::MakeInitFile","File")
930 <<"No TPC parameters found in \""<<rootfilename
931 <<"\", creating standard parameters "
932 <<"which might not be what you want!"<<ENDLOG;
933 param=new AliTPCParamSR;
5923e698 934 }
ef2318df 935
936 AliTPCPRF2D * prfinner = new AliTPCPRF2D;
5923e698 937 AliTPCPRF2D * prfouter1 = new AliTPCPRF2D;
938 AliTPCPRF2D * prfouter2 = new AliTPCPRF2D;
939 AliTPCRF1D * rf = new AliTPCRF1D(kTRUE);
940 rf->SetGauss(param->GetZSigma(),param->GetZWidth(),1.);
941 rf->SetOffset(3*param->GetZSigma());
942 rf->Update();
943
944 TDirectory *savedir=gDirectory;
945 TFile *prf_file = TFile::Open("$ALICE_ROOT/TPC/AliTPCprf2d.root");
946 if (!prf_file->IsOpen())
947 {
948 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","File")
949 <<"Can't open $ALICE_ROOT/TPC/AliTPCprf2d.root !"<<ENDLOG;
2220326f 950 return kFALSE;
5923e698 951 }
ef2318df 952 prfinner ->Read("prf_07504_Gati_056068_d02");
5923e698 953 prfouter1->Read("prf_10006_Gati_047051_d03");
954 prfouter2->Read("prf_15006_Gati_047051_d03");
955 prf_file->Close();
956 savedir->cd();
957
958 param->SetInnerPRF(prfinner);
959 param->SetOuter1PRF(prfouter1);
960 param->SetOuter2PRF(prfouter2);
961 param->SetTimeRF(rf);
962
3e87ef69 963 fNTimeBins = param->GetMaxTBin()+1;
964 fNRowLow = param->GetNRowLow();
965 fNRowUp = param->GetNRowUp();
966 fNRowUp1 = param->GetNRowUp1();
967 fNRowUp2 = param->GetNRowUp2();
968 fNRow= fNRowLow + fNRowUp;
969 if(fNRow!=159){
970 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","fNRow")
971 <<"Number of rows have changed in ALIROOT"<<ENDLOG;
972 return kFALSE;
973 }
974
975 fNSectorLow = param->GetNInnerSector();
976 fNSectorUp = param->GetNOuterSector();
977 fNSector = fNSectorLow + fNSectorUp;
978
979 //test whether they were changes to the rotation shift
980 fNRotShift=0;
981 Float_t irotshift = param->GetInnerAngleShift(); //shift angle
982 Float_t orotshift = param->GetOuterAngleShift(); //shift angle
983 const Float_t kDegtoRad = 0.01745329251994;
984 Int_t shift1=TMath::Nint(irotshift/kDegtoRad);
985 Int_t shift2=TMath::Nint(orotshift/kDegtoRad+0.1);
986 if((shift1!=shift2) || (shift1!=10)){
987 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","Rotshiftangle")
988 <<"Rotation shift angle has changed in ALIROOT"<<ENDLOG;
989 return kFALSE;
990 } else {
991 fNRotShift=0.5; //our version of the shift angle
992 }
993
994 fVersion=fV_aliroot;
995 fBFieldFactor=(Double_t)gAlice->Field()->Factor();
996 fSolenoidBField=(Double_t)gAlice->Field()->SolenoidField();
997 fPadPitchWidthLow=param->GetInnerPadPitchWidth();
998 fPadPitchWidthUp=param->GetOuterPadPitchWidth();
999 fZWidth=param->GetZWidth();
1000 fZSigma=param->GetZSigma();
1001 fZLength=param->GetZLength();
1002 fZOffset=param->GetZOffset();
1003 fDiffT=param->GetDiffT();
1004 fDiffL=param->GetDiffL();
1005 fOmegaTau=param->GetOmegaTau();
1006 fInnerPadLength=param->GetInnerPadLength();
1007 fOuter1PadLength=param->GetOuter1PadLength();
1008 fOuter2PadLength=param->GetOuter2PadLength();
1009 fInnerPRFSigma=param->GetInnerPRF()->GetSigmaX();
1010 fOuter1PRFSigma=param->GetOuter1PRF()->GetSigmaX();
1011 fOuter2PRFSigma=param->GetOuter2PRF()->GetSigmaX();
1012 fTimeSigma=param->GetTimeRF()->GetSigma();
1013 fADCSat=param->GetADCSat();
1014 fZeroSup=param->GetZeroSup();
1015 fNSlice=fNSectorLow;
1016
1017 //now do the arrays
1018 for(Int_t i=0;i<fNRow;i++){
1019 Int_t sec,row;
1020 if( i < fNRowLow){sec =0;row =i;}
1021 else{sec = fNSectorLow;row =i-fNRowLow;}
1022 fX[i]=param->GetPadRowRadii(sec,row);
1023 }
1024 for(Int_t i=0;i<fNRow;i++){
1025 Int_t sec,row;
1026 if( i < fNRowLow){sec =0;row =i;}
1027 else{sec = fNSectorLow;row =i-fNRowLow;}
1028 fNPads[i]=param->GetNPads(sec,row);
1029 }
1030 for(Int_t i=0;i<fNSector;i++){
1031 if(i<fNSectorLow) fSectorLow[i]=1;
1032 else fSectorLow[i]=0;
1033 }
02f030e3 1034 return SaveInitFile(filename);
3e87ef69 1035#endif
1036}
5923e698 1037
3e87ef69 1038Bool_t AliL3Transform::SaveInitFile(Char_t *filenamepath)
1039{
1040 //store the parameters in the file "filenamepath"
5923e698 1041
3e87ef69 1042 FILE *f = fopen(filenamepath,"w");
1043 if(!f){
02f030e3 1044 LOG(AliL3Log::kError,"AliL3Transform::SaveInitFile","File")
1045 <<"Could not open file: "<<filenamepath<<ENDLOG;
3e87ef69 1046 return kFALSE;
1047 }
6f3df1c8 1048
3e87ef69 1049 fprintf(f,"void AliL3Transform::Init(){\n");
1050 fprintf(f," fVersion = %d;\n", fVersion);
1051 fprintf(f," fBFieldFactor = %.3f;\n",fBFieldFactor);
1052 fprintf(f," fSolenoidBField = %.3f;\n",fSolenoidBField);
1053 fprintf(f," fNTimeBins = %d;\n",fNTimeBins);
1054 fprintf(f," fNRowLow = %d;\n",fNRowLow);
1055 fprintf(f," fNRowUp = %d;\n",fNRowUp);
1056 fprintf(f," fNRowUp1 = %d;\n",fNRowUp1);
1057 fprintf(f," fNRowUp2 = %d;\n",fNRowUp2);
1058 fprintf(f," fNSectorLow = %d;\n",fNSectorLow);
1059 fprintf(f," fNSectorUp = %d;\n",fNSectorUp);
1060 fprintf(f," fNSector = %d;\n",fNSector);
1061 fprintf(f," fPadPitchWidthLow = %.3f;\n",fPadPitchWidthLow);
1062 fprintf(f," fPadPitchWidthUp = %.3f;\n",fPadPitchWidthUp);
1063 fprintf(f," fZWidth = %.4f;\n",fZWidth);
1064 fprintf(f," fZSigma = %.4f;\n",fZSigma);
1065 fprintf(f," fZLength = %.4f;\n",fZLength);
1066 fprintf(f," fZOffset = %.4f;\n",fZOffset);
1067 fprintf(f," fDiffT = %.4f;\n",fDiffT);
1068 fprintf(f," fDiffL = %.4f;\n",fDiffL);
1069 fprintf(f," fOmegaTau = %.4f;\n",fOmegaTau);
1070 fprintf(f," fInnerPadLength = %.3f;\n",fInnerPadLength);
1071 fprintf(f," fOuter1PadLength = %.3f;\n",fOuter1PadLength);
1072 fprintf(f," fOuter2PadLength = %.3f;\n",fOuter2PadLength);
1073 fprintf(f," fInnerPRFSigma = %.6f;\n",fInnerPRFSigma);
1074 fprintf(f," fOuter1PRFSigma = %.6f;\n",fOuter1PRFSigma);
1075 fprintf(f," fOuter2PRFSigma = %.6f;\n",fOuter2PRFSigma);
1076 fprintf(f," fTimeSigma = %.6f;\n",fTimeSigma);
1077 fprintf(f," fADCSat = %d;\n",fADCSat);
1078 fprintf(f," fZeroSup = %d;\n",fZeroSup);
1079 fprintf(f," fNSlice = %d;\n",fNSlice);
1080 fprintf(f," fNRow = %d;\n",fNRow);
1081 fprintf(f," fNRotShift = %.2f;\n",fNRotShift);
1082 //now do the arrays
1083 for(Int_t i=0;i<fNRow;i++){
1084 fprintf(f," fX[%d] = %3.2f;\n",i,fX[i]);
1085 }
1086 for(Int_t i=0;i<fNRow;i++){
1087 fprintf(f," fNPads[%d] = %d;\n",i,fNPads[i]);
1088 }
5923e698 1089
3e87ef69 1090 //Slice/Sector dont belong to aliroot, but we want to be flexible
1091 for(Int_t i=0;i<fNSlice;i++){
1092 fprintf(f," fSlice2Sector[%d][0] = %d;\n",i,fSlice2Sector[i][0]);
1093 fprintf(f," fSlice2Sector[%d][1] = %d;\n",i,fSlice2Sector[i][1]);
1094 }
1095 for(Int_t i=0;i<fNSector;i++){
1096 fprintf(f," fSector2Slice[%d] = %d;\n",i,fSector2Slice[i]);
1097 }
1098 for(Int_t i=0;i<fNSector;i++){
1099 fprintf(f," fSectorLow[%d] = %d;\n",i,fSectorLow[i]);
1100 }
5923e698 1101
3e87ef69 1102 //Patches also dont really belong to the aliroot settings (but nevermind)
1103 for(Int_t i=0;i<fNPatches;i++){
1104 fprintf(f," fNRows[%d] = %d;\n",i,fNRows[i]);
1105 }
1106 for(Int_t i=0;i<fNPatches;i++){
1107 fprintf(f," fRows[%d][0] = %d;\n",i,fRows[i][0]);
1108 fprintf(f," fRows[%d][1] = %d;\n",i,fRows[i][1]);
1109 }
1110
1111 //Rotation shift is an addon, too
1112 for(Int_t i=0;i<fNSlice;i++){
1113 Float_t cs = cos( (2*fPi/18) * (i+fNRotShift) );
1114 fprintf(f," fCos[%d] = %.10f;\n",i,cs);
5923e698 1115 }
3e87ef69 1116 for(Int_t i=0;i<fNSlice;i++){
1117 Float_t sn = sin( (2*fPi/18) * (i+fNRotShift) );
1118 fprintf(f," fSin[%d] = %.10f;\n",i,sn);
5923e698 1119 }
3e87ef69 1120
5923e698 1121 fprintf(f,"}\n");
1122 fclose(f);
2220326f 1123
3e87ef69 1124 LOG(AliL3Log::kInformational,"AliL3Transform::SaveInitFile","File created")
1125 <<"Init file \""<<filenamepath<<"\" created"<<ENDLOG;
1126
2220326f 1127 return kTRUE;
3e87ef69 1128}
1129
1130Int_t AliL3Transform::GetNPads(Int_t row)
1131{
1132 if(row < 0 || row >= fNRow)
1133 {
1134 LOG(AliL3Log::kError,"AliL3Transform::GetNPads","Row")
1135 <<AliL3Log::kDec<<"Wrong row "<<row<<ENDLOG;
1136 return 0;
1137 }
1138
1139 return fNPads[row];
5923e698 1140}
1141
e376e129 1142Int_t AliL3Transform::GetFirstRow(Int_t patch)
1143{
1144 if(patch==-1)
1145 return 0;
1146 else if(patch < -1 || patch >= 6)
1147 {
3e87ef69 1148 LOG(AliL3Log::kError,"AliL3Transform::GetFirstRow","Patch")
1149 <<AliL3Log::kDec<<"Wrong patch "<<patch<<ENDLOG;
e376e129 1150 return 0;
1151 }
1152 else
1153 return fRows[patch][0];
1154}
1155
1156Int_t AliL3Transform::GetLastRow(Int_t patch)
1157{
1158 if(patch==-1)
1159 return fRows[5][1];
1160 else if(patch < -1 || patch >= 6)
1161 {
3e87ef69 1162 LOG(AliL3Log::kError,"AliL3Transform::GetLastRow","Patch")
1163 <<AliL3Log::kDec<<"Wrong patch "<<patch<<ENDLOG;
e376e129 1164 return 0;
1165 }
1166 else
1167 return fRows[patch][1];
1168}
1169
1170Int_t AliL3Transform::GetNRows(Int_t patch)
1171{
1172 if(patch==-1)
1173 return fNRow;
1174 else if(patch < -1 || patch >= 6)
1175 {
3e87ef69 1176 LOG(AliL3Log::kError,"AliL3Transform::GetNRows","Patch")
1177 <<AliL3Log::kDec<<"Wrong patch "<<patch<<ENDLOG;
e376e129 1178 return 0;
1179 }
1180 else
1181 return fNRows[patch];
1182}
1183
3e87ef69 1184Int_t AliL3Transform::GetPadRow(Float_t xvalue)
5923e698 1185{
3e87ef69 1186 //Find the padrow number corresponding to cartesian _local_ x value
1187
1188 if(xvalue < 0 || xvalue > 250)
1189 {
1190 LOG(AliL3Log::kError,"AliL3Transform::GetPadRow","X-value")
1191 <<AliL3Log::kDec<<"Suspicious x-value, make sure it is in local coordinate! "
1192 <<xvalue<<ENDLOG;
1193 return -1;
1194 }
1195
1196 Int_t x = (Int_t)rint(xvalue*10);
1197 if(x < (Int_t)rint(fX[1]*10))
5923e698 1198 return 0;
3e87ef69 1199 else if(x > (Int_t)rint(fX[fNRow-2]*10))
1200 return fNRow-1;
1201 else
1202 {
1203 Int_t padrow=1; //Of course, a more clever algorithm could help here
1204 while(padrow < fNRow-2)
1205 {
1206 if(x > (Int_t)rint(fX[padrow-1]*10) && x < (Int_t)rint(fX[padrow+1]*10))
1207 break;
1208 padrow++;
1209 }
1210 return padrow;
1211 }
1212}
1213
1214Int_t AliL3Transform::GetPatch(Int_t padrow)
1215{
1216 if(padrow < 0 || padrow >= fNRow)
1217 {
1218 LOG(AliL3Log::kError,"AliL3Transform::GetPatch","Padrow")
1219 <<AliL3Log::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1220 return -2;
1221 }
1222 Int_t patch=0;
1223 while(patch < fNPatches)
1224 {
1225 if(padrow >= fRows[patch][0] && padrow <= fRows[patch][1])
1226 break;
1227 patch++;
1228 }
1229 return patch;
1230}
1231
1232Double_t AliL3Transform::GetPadLength(Int_t padrow)
1233{
1234 if(padrow >= fNRow){
1235 LOG(AliL3Log::kError,"AliL3Transform::GetPadLength","Padrow")
1236 <<AliL3Log::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1237 return 0;
1238 }
1239
5923e698 1240 if(padrow < fNRowLow)
1241 return fInnerPadLength;
1242 if(padrow >= fNRowLow && padrow < fNRowLow + fNRowUp1 - 1)
1243 return fOuter1PadLength;
1244 if(padrow >= fNRowLow + fNRowUp1 - 1)
1245 return fOuter2PadLength;
5e0f9911 1246
3e87ef69 1247 //should never happen
1248 LOG(AliL3Log::kError,"AliL3Transform::GetPadLength","Padrow")
1249 <<AliL3Log::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1250 return -1.0;
1251}
1252
1253Double_t AliL3Transform::GetPadPitchWidth(Int_t patch)
1254{
1255 if(patch < 0 || patch > fNPatches)
1256 {
1257 LOG(AliL3Log::kError,"AliL3Transform::GetPadPitchWidth","patct")
1258 <<AliL3Log::kDec<<"Wrong patch "<<patch<<ENDLOG;
1259 return -1;
1260 }
1261 return patch < 2 ? fPadPitchWidthLow : fPadPitchWidthUp;
1262}
1263
1264Double_t AliL3Transform::GetParSigmaY2(Int_t padrow,Float_t z,Float_t angle)
1265{
1266 //Calculate the expected transverse cluster width as a function of
1267 //drift distance and crossing angle.
1268 //z = local z-coordinate of cluster
1269 //angle = track crossing angle with normal to padrow plane
1270 //return value = sigma^2 (cartesian coordinates)
1271
1272 Double_t drift;
1273 if(z > 0)
1274 drift = fZLength - z;
1275 else
1276 drift = fZLength + z;
1277
1278 Double_t t1 = GetPRFSigma(padrow)*GetPRFSigma(padrow);
1279 Double_t t2 = fDiffT*fDiffT*drift;
1280 Double_t t3 = GetPadLength(padrow)*GetPadLength(padrow)*tan(angle)*tan(angle)/12;
1281 Double_t t4 = fAnodeWireSpacing*fAnodeWireSpacing*(tan(angle) - fOmegaTau)*(tan(angle) - fOmegaTau)/12;
1282
1283 return (t1 + t2 + t3 + t4);
1284}
1285
1286Double_t AliL3Transform::GetParSigmaZ2(Int_t padrow,Float_t z,Float_t tgl)
1287{
1288 //Calculate the expected longitudinal cluster width as a function of
1289 //drift distance and track crossing angle.
1290 //z = local z-coordinate of cluster
1291 //tgl = tan(dipangle)
1292 //return value = sigma^2 (cartesian coordinates)
1293
1294 Double_t drift;
1295 if(z > 0)
1296 drift = AliL3Transform::GetZLength() - z;
1297 else
1298 drift = AliL3Transform::GetZLength() + z;
1299
1300 Double_t t1 = fZSigma*fZSigma;
1301 Double_t t2 = fDiffL*fDiffL*drift;
1302 Double_t t3 = GetPadLength(padrow)*GetPadLength(padrow)*tgl*tgl/12;
1303
1304 return (t1 + t2 + t3);
5923e698 1305}
1306
5e0f9911 1307Double_t AliL3Transform::GetPRFSigma(Int_t padrow)
5923e698 1308{
3e87ef69 1309 if(padrow >= fNRow){
1310 LOG(AliL3Log::kError,"AliL3Transform::GetPRFSigma","Padrow")
1311 <<AliL3Log::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
5923e698 1312 return 0;
3e87ef69 1313 }
5923e698 1314 if(padrow < fNRowLow)
1315 return fInnerPRFSigma;
1316 if(padrow >= fNRowLow && padrow < fNRowLow + fNRowUp1 - 1)
1317 return fOuter1PRFSigma;
1318 if(padrow >= fNRowLow + fNRowUp1 - 1)
1319 return fOuter2PRFSigma;
5e0f9911 1320
3e87ef69 1321 //should never happen
1322 LOG(AliL3Log::kError,"AliL3Transform::GetPRFSigma","Padrow")
1323 <<AliL3Log::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1324 return -1.;
a4e75a99 1325}
1326
108615fc 1327Double_t AliL3Transform::GetEta(Float_t *xyz)
1328{
1329 Double_t r3 = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
1330 Double_t eta = 0.5 * log((r3+xyz[2])/(r3-xyz[2]));
1331 return eta;
1332}
1333
740da2a6 1334void AliL3Transform::XYZtoRPhiEta(Float_t *rpe, Float_t *xyz)
1335{
1336 rpe[0] = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
1337 rpe[1] = atan2(xyz[1],xyz[0]);
1338 rpe[2] = 0.5 * log((rpe[0]+xyz[2])/(rpe[0]-xyz[2]));
1339}
1340
3ac82106 1341Double_t AliL3Transform::GetEta(Int_t slice,Int_t padrow,Int_t pad,Int_t time)
bd7e82e0 1342{
1343 Float_t xyz[3];
3a1c3849 1344 Int_t sector,row;
3ac82106 1345 Slice2Sector(slice,padrow,sector,row);
3a1c3849 1346 Raw2Local(xyz,sector,row,pad,time);
bd7e82e0 1347
1348 return GetEta(xyz);
1349}
1350
108615fc 1351Double_t AliL3Transform::GetPhi(Float_t *xyz)
1352{
108615fc 1353 Double_t phi = atan2(xyz[1],xyz[0]);
108615fc 1354 return phi;
1355}
1356
494fad94 1357Bool_t AliL3Transform::Slice2Sector(Int_t slice, Int_t slicerow, Int_t & sector, Int_t &row)
1358{
3e87ef69 1359 if(slicerow<0&&slicerow>=fNRow){
1360 LOG(AliL3Log::kError,"AliL3Transform::Slice2Sector","Slicerow")
1361 <<AliL3Log::kDec<<"Wrong slicerow "<<slicerow<<ENDLOG;
1362 return kFALSE;
1363 }
1364 if(slice<0||slice>=fNSlice){
1365 LOG(AliL3Log::kError,"AliL3Transform::Slice2Sector","Slice")
1366 <<AliL3Log::kDec<<"Wrong slice "<<slice<<ENDLOG;
1367 return kFALSE;
1368 }
108615fc 1369
1370 if(slicerow<fNRowLow){
3e87ef69 1371 sector = fSlice2Sector[slice][0];
108615fc 1372 row = slicerow;
1373 }
1374 else {
3e87ef69 1375 sector = fSlice2Sector[slice][1];
108615fc 1376 row = slicerow-fNRowLow;
1377 }
3e87ef69 1378
108615fc 1379 return kTRUE;
1380}
1381
494fad94 1382Bool_t AliL3Transform::Sector2Slice(Int_t & slice, Int_t sector)
1383{
3e87ef69 1384 if(sector<0||sector>=fNSector){
1385 LOG(AliL3Log::kError,"AliL3Transform::Sector2Slice","Sector")
1386 <<AliL3Log::kDec<<"Wrong sector "<<sector<<ENDLOG;
1387 return kFALSE;
1388 }
1389
1390 slice=fSector2Slice[sector];
1391
108615fc 1392 return kTRUE;
1393}
1394
3e87ef69 1395Bool_t AliL3Transform::Sector2Slice(Int_t & slice, Int_t & slicerow, Int_t sector, Int_t row)
494fad94 1396{
3e87ef69 1397 if(sector<0 || sector>=fNSector){
1398 LOG(AliL3Log::kError,"AliL3Transform::Sector2Slice","Sector")
1399 <<AliL3Log::kDec<<"Wrong sector "<<sector<<ENDLOG;
1400 return kFALSE;
1401 }
1402 if(row<0){
1403 LOG(AliL3Log::kError,"AliL3Transform::Sector2Slice","Row")
1404 <<AliL3Log::kDec<<"Wrong row "<<row<<ENDLOG;
1405 return kFALSE;
1406 }
1407
1408 if(fSectorLow[sector]){
1409 if(row>=fNRowLow){
1410 LOG(AliL3Log::kError,"AliL3Transform::Sector2Slice","Row")
1411 <<AliL3Log::kDec<<"Wrong row "<<row<<ENDLOG;
1412 return kFALSE;
1413 }
1414 slice = fSector2Slice[sector];
108615fc 1415 slicerow = row;
1416 }
1417 else{
3e87ef69 1418 if(row>=fNRowUp){
1419 LOG(AliL3Log::kError,"AliL3Transform::Sector2Slice","Row")
1420 <<AliL3Log::kDec<<"Wrong row "<<row<<ENDLOG;
1421 return kFALSE;
1422 }
1423 slice = fSector2Slice[sector];
108615fc 1424 slicerow = row + fNRowLow;
1425 }
3e87ef69 1426
108615fc 1427 return kTRUE;
1428}
1429
1430Double_t AliL3Transform::Row2X(Int_t slicerow){
3e87ef69 1431 if(slicerow<0||slicerow>=fNRow){
1432 LOG(AliL3Log::kError,"AliL3Transform::Row2X","Slicerow")
1433 <<AliL3Log::kDec<<"Wrong slicerow "<<slicerow<<ENDLOG;
1434 return 0;
1435 }
108615fc 1436 return fX[slicerow];
1437}
1438
1439void AliL3Transform::Local2Global(Float_t *xyz,Int_t slice)
1440{
1441 //Transformation to global coordinate system
1442 Float_t x0 = xyz[0];
1443 Float_t y0 = xyz[1];
3e87ef69 1444
1445 xyz[0]=x0*fCos[slice]-y0*fSin[slice];
1446 xyz[1]=x0*fSin[slice]+y0*fCos[slice];
108615fc 1447 xyz[2]=xyz[2];//global z=local z
1448}
1449
1450void AliL3Transform::Local2GlobalAngle(Float_t *angle,Int_t slice){
740da2a6 1451 angle[0] = fmod(angle[0]+(slice+fNRotShift)*(2*fPi/18),2*fPi);
108615fc 1452}
1453
1454void AliL3Transform::Global2LocalAngle(Float_t *angle,Int_t slice){
740da2a6 1455 angle[0] = angle[0]-(slice+fNRotShift)*(2*fPi/18);
108615fc 1456 if(angle[0]<0) angle[0]+=2*fPi;
1457}
1458
1459void AliL3Transform::Raw2Local(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
1460{
1461 //Transformation from rawdata to local coordinate system
1462
1463 Int_t slice,slicerow;
1464 Sector2Slice(slice, slicerow, sector, row);
1465
740da2a6 1466 //X-Value
108615fc 1467 xyz[0]=Row2X(slicerow);
740da2a6 1468
1469 //Y-Value
108615fc 1470 Int_t npads= fNPads[slicerow];
3e87ef69 1471
1472 if(fSectorLow[sector])
108615fc 1473 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthLow;
1474 else
1475 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthUp;
740da2a6 1476
1477 //Z-Value (remember PULSA Delay)
1478 //xyz[2]=fZWidth*time-3.*fZSigma;
1479 xyz[2]=fZWidth*time-fZOffset;
0e0b1e59 1480 if(slice < 18)
740da2a6 1481 xyz[2]=fZLength-xyz[2];
0e0b1e59 1482 else
740da2a6 1483 xyz[2]=xyz[2]-fZLength;
108615fc 1484}
1485
1486void AliL3Transform::Local2Global(Float_t *xyz,Int_t sector,Int_t row)
1487{
1488 //Transformation to global coordinate system
1489 Int_t slice,slicerow;
1490 Sector2Slice(slice, slicerow, sector, row);
3e87ef69 1491 Float_t r=Row2X(slicerow); //have to get x value first
1492
1493 xyz[0]=r*fCos[slice]-xyz[1]*fSin[slice];
1494 xyz[1]=r*fSin[slice]+xyz[1]*fCos[slice];
108615fc 1495 xyz[2]=xyz[2];//global z=local z
1496}
1497
1498Double_t AliL3Transform::GetMaxY(Int_t slicerow)
1499{
494fad94 1500
108615fc 1501 if(slicerow < fNRowLow)
1502 return fPadPitchWidthLow*fNPads[slicerow]/2;
1503
1504 else
1505 return fPadPitchWidthUp*fNPads[slicerow]/2;
494fad94 1506
108615fc 1507}
1508
2342214c 1509void AliL3Transform::Global2Local(Float_t *xyz,Int_t sector,Bool_t isSlice)
108615fc 1510{
1511 Int_t slice;
2342214c 1512 if(!isSlice)
1513 Sector2Slice(slice, sector);
1514 else
1515 slice = sector;
3e87ef69 1516
1517 Float_t x1 = xyz[0]*fCos[slice] + xyz[1]*fSin[slice];
1518 Float_t y1 = -xyz[0]*fSin[slice] + xyz[1]*fCos[slice];
108615fc 1519 xyz[0] = x1;
1520 xyz[1] = y1;
1521}
1522
1523void AliL3Transform::Raw2Global(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
1524{
1525 //Transformation from raw to global coordinates
1526
1527 Raw2Local(xyz,sector,row,pad,time);
1528 Local2Global(xyz,sector,row);
1529}
1530
1531void AliL3Transform::Local2Raw(Float_t *xyz,Int_t sector,Int_t row)
1532{
1533 //Transformation from local coordinates to raw
494fad94 1534
108615fc 1535 Int_t slice,slicerow;
1536 Sector2Slice(slice, slicerow, sector, row);
1537
3e87ef69 1538 xyz[0]=slicerow;
1539 //xyz[0]=GetPadRow(xyz[0]);
1540
1541 if(fSectorLow[sector])
108615fc 1542 xyz[1]=xyz[1]/fPadPitchWidthLow+0.5*(fNPads[slicerow]-1);
1543 else
1544 xyz[1]=xyz[1]/fPadPitchWidthUp+0.5*(fNPads[slicerow]-1);
3e87ef69 1545
108615fc 1546 Int_t sign=-1;
0f377556 1547 if(slice < 18) sign = 1;
1727f1c9 1548 xyz[2]=fZLength-sign*xyz[2];
1549 xyz[2]=(xyz[2]+fZOffset)/fZWidth;
108615fc 1550}
1551
1552void AliL3Transform::Global2Raw(Float_t *xyz,Int_t sector,Int_t row)
1553{
1554 //Transformation from global coordinates to raw.
1555
1556 Global2Local(xyz,sector);
1557 Local2Raw(xyz,sector,row);
3e87ef69 1558}
1559
1560void AliL3Transform::PrintCompileOptions()
1561{
1562 cout << "Compiler (g++) version used: " << GCCVERSION << endl;
1563
1564#ifdef no_root
1565 cout << "STANDALONE version: -Dno_root was given." << endl;
1566#else
1567 const Char_t *roottest="$ROOTSYS/bin/root -n -b -q | grep Version | cut -b 17-25 | cut -d\" \" -f1";
1568#ifdef use_aliroot
1569#ifdef use_cvs
1570 const Char_t *aliroottest="if test -n \"`cd $ALICE_ROOT/STEER/ && cvs stat AliRun.cxx | grep \"Sticky Tag\" | grep none`\"; then echo HEAD; else cd $ALICE_ROOT/STEER/ && cvs stat AliRun.cxx | grep \"Sticky Tag\" | cut -b 18- | cut -d\" \" -f1; fi";
1571#else
1572 const Char_t *aliroottest="Unknown";
1573#endif
1574 cout << "ALIROOT version: -Duse_aliroot and -Duse_root was given." << endl;
1575 cout << "Root Version: " << ROOTVERSION << " found " << flush;
1576 gSystem->Exec(roottest);
1577
1578 cout << "AliRoot Version: " << ALIROOTVERSION << " found " << flush;
1579 gSystem->Exec(aliroottest);
1580#else
1581 cout << "ROOT version: -Duse_root was given." << endl;
1582 cout << "Root Version: " << ROOTVERSION << " found " << flush;
1583 gSystem->Exec(roottest);
1584#endif
1585#endif
1586
1587#ifdef do_mc
1588 cout << "Using Monte Carlo Info: -Ddo_mc was given." << endl;
1589#else
1590 cout << "NOT using Monte Carlo Info: -Ddo_mc was not given." << endl;
1591#endif
108615fc 1592
3e87ef69 1593#ifdef use_logging
1594 cout << "Using logging classes (MLUC): -Duse_logging was given." << endl;
1595#else
1596 cout << "NOT using logging classes (MLUC): -Duse_logging not was given." << endl;
1597#endif
108615fc 1598}