3 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>, Uli Frankenfeld <mailto:franken@fi.uib.no>
4 //*-- Copyright © ASV
5 // changes done by Constantin Loizides <mailto:loizides@ikf.physik.uni-frankfurt.de>
7 #include "AliL3Logging.h"
8 #include "AliL3Transform.h"
13 /** \class AliL3Transform
15 //_____________________________________________________________
18 // Transformation class for ALICE TPC.
20 // Class which contains all detector specific parameters for the TPC,
21 // and different useful functions for coordinate transforms.
23 // The class is completely static, which means that no object needs
24 // to be instantiated. Function calls should then be done like:
26 // AliL3Transform::GetEta(xyz);
28 // IMPORTANT: If used as is, default detector parameters will be used,
29 // and you really have to make sure that these correspond to
30 // the AliROOT version you are currently working on!!
31 // You should therefore always initialize the parameters by
33 // AliL3Transform::Init(path);
35 // where path is a char*, giving the path to where file containing
36 // the detector parameter is located. This file should be called
37 // "l3transform.config", and can be created with macro exa/Make_Init.C.
41 ClassImp(AliL3Transform)
43 const Double_t AliL3Transform::fBFACT = 0.0029980;
44 Double_t AliL3Transform::fBField = 0.2;
45 Int_t AliL3Transform::fBFieldFactor = 1;
46 Int_t AliL3Transform::fVersion = 0;
47 Int_t AliL3Transform::fNTimeBins = 446 ;
48 Int_t AliL3Transform::fNRowLow = 64 ;
49 Int_t AliL3Transform::fNRowUp = 112 ;
50 Int_t AliL3Transform::fNSectorLow = 36 ;
51 Int_t AliL3Transform::fNSectorUp = 36 ;
52 Int_t AliL3Transform::fNSector = 72 ;
53 Double_t AliL3Transform::fPadPitchWidthLow = 0.400000 ;
54 Double_t AliL3Transform::fPadPitchWidthUp = 0.600000 ;
55 Double_t AliL3Transform::fZWidth = 0.56599998474121093750 ;
56 Double_t AliL3Transform::fZSigma = 0.22880849748219134199 ;
57 Double_t AliL3Transform::fZOffset = 0.68642549244657402596;
58 Double_t AliL3Transform::fDiffT = 0.0219999998807907104;
59 Double_t AliL3Transform::fDiffL = 0.0219999998807907104;
60 Double_t AliL3Transform::fAnodeWireSpacing = 0.25;
61 Double_t AliL3Transform::fInnerPadLength = 0.75;
62 Double_t AliL3Transform::fOuterPadLength = 1.;
63 Double_t AliL3Transform::fInnerPRFSigma = 0.203811079263687134;
64 Double_t AliL3Transform::fOuterPRFSigma = 0.299324512481689453;
65 Double_t AliL3Transform::fTimeSigma = 0.228808626532554626;
66 Double_t AliL3Transform::fZLength = 250.;
67 Int_t AliL3Transform::fNSlice = 36 ;
68 Int_t AliL3Transform::fNRow = 176 ;
69 Double_t AliL3Transform::fNRotShift = 0.5 ;
70 Double_t AliL3Transform::fPi = 3.141592653589793 ;
71 Int_t AliL3Transform::fNPatches = 6;
72 Int_t AliL3Transform::fRows[6][2] = {{0,31},{32,63},{64,91},{92,119},{120,143},{144,175}};
73 Int_t AliL3Transform::fNRows[6] = {32,32,28,28,24,32};
74 Double_t AliL3Transform::fX[176] = {84.570007324218750,
252 Int_t AliL3Transform::fNPads[176] = {67,
432 void AliL3Transform::Init(const Char_t* path)
434 //Overwrite the parameters with values stored in file "l3transform.config" in path.
435 //If file does not exist, old default values will be used.
437 Char_t *pathname=new Char_t[1024];
438 strcpy(pathname,path);
439 strcat(pathname,"/l3transform.config");
441 FILE *fptr=fopen(pathname,"r");
443 LOG(AliL3Log::kWarning,"AliL3Transform::Init","File Open")
444 <<"Pointer to Config File \""<<pathname<<"\" 0x0!"<<ENDLOG;
448 Char_t d1[250], d2[100], d3[100];
453 fscanf(fptr,"%s",d1);
455 if(strcmp(d1,"fBFieldFactor")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fBFieldFactor=(Int_t)dummy;fBField=fBFieldFactor*0.2;}
456 else if(strcmp(d1,"fNTimeBins")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNTimeBins=(Int_t)dummy;}
457 else if(strcmp(d1,"fNRowLow")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRowLow=(Int_t)dummy;}
459 LOG(AliL3Log::kError,"AliL3Transform::Init","Overflow")
460 <<"Number of inner PadRows should be 64! Check and fgrep the code for 64 to see the consequences of this major change!"<<ENDLOG;
461 else if(strcmp(d1,"fNRowUp")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRowUp=(Int_t)dummy;}
462 else if(strcmp(d1,"fNSectorLow")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSectorLow=(Int_t)dummy;}
463 else if(strcmp(d1,"fNSectorUp")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSectorUp=(Int_t)dummy;}
464 else if(strcmp(d1,"fNSector")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSector=(Int_t)dummy;}
465 else if(strcmp(d1,"fPadPitchWidthLow")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fPadPitchWidthLow=(Double_t)ddummy;}
466 else if(strcmp(d1,"fPadPitchWidthUp")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fPadPitchWidthUp=(Double_t)ddummy;}
467 else if(strcmp(d1,"fZWidth")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZWidth=(Double_t)ddummy;}
468 else if(strcmp(d1,"fZSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZSigma=(Double_t)ddummy;}
469 else if(strcmp(d1,"fZLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZLength=(Double_t)ddummy;}
470 else if(strcmp(d1,"fZOffset")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZOffset=(Double_t)ddummy;}
471 else if(strcmp(d1,"fNSlice")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSlice=(Int_t)dummy;}
472 else if(strcmp(d1,"fDiffT")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fDiffT=(Double_t)ddummy;}
473 else if(strcmp(d1,"fDiffL")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fDiffL=(Double_t)ddummy;}
474 else if(strcmp(d1,"fInnerPadLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fInnerPadLength=(Double_t)ddummy;}
475 else if(strcmp(d1,"fOuterPadLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fOuterPadLength=(Double_t)ddummy;}
476 else if(strcmp(d1,"fInnerPRFSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fInnerPRFSigma=(Double_t)ddummy;}
477 else if(strcmp(d1,"fOuterPRFSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fOuterPRFSigma=(Double_t)ddummy;}
478 else if(strcmp(d1,"fTimeSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fTimeSigma=(Double_t)ddummy;}
479 else if(strcmp(d1,"fNRow")==0){
480 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRow=(Int_t)dummy;
482 LOG(AliL3Log::kError,"AliL3Transform::Init","Overflow")<<"Number of PadRows should be 176! Check and fgrep the code for 176 to see the consequences of this major change!"<<ENDLOG;
485 else if(strcmp(d1,"fNRotShift")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fNRotShift=(Double_t)ddummy;}
486 else if(strcmp(d1,"fPi")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fPi=(Double_t)ddummy;}
487 else if(strcmp(d1,"fX[0]")==0){
488 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fX[0]=(Double_t)ddummy;
489 for(Int_t i=1;i<fNRow;i++){fscanf(fptr,"%s %s %lf %s",d1,d2,&ddummy,d3);fX[i]=(Double_t)ddummy;}
491 else if(strcmp(d1,"fNPads[0]")==0){
492 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNPads[0]=(Int_t)dummy;
493 for(Int_t i=1;i<fNRow;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fNPads[i]=(Int_t)dummy;}
499 fVersion=1; //new version
503 Double_t AliL3Transform::GetEta(Float_t *xyz)
505 Double_t r3 = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
506 Double_t eta = 0.5 * log((r3+xyz[2])/(r3-xyz[2]));
510 void AliL3Transform::XYZtoRPhiEta(Float_t *rpe, Float_t *xyz)
512 rpe[0] = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
513 rpe[1] = atan2(xyz[1],xyz[0]);
514 rpe[2] = 0.5 * log((rpe[0]+xyz[2])/(rpe[0]-xyz[2]));
517 Double_t AliL3Transform::GetEta(Int_t padrow,Int_t pad,Int_t time)
521 Slice2Sector(0,padrow,sector,row);
522 Raw2Local(xyz,sector,row,pad,time);
527 Double_t AliL3Transform::GetPhi(Float_t *xyz)
529 Double_t phi = atan2(xyz[1],xyz[0]);
530 //if(phi<0) phi=phi+2*TMath::Pi();
534 Bool_t AliL3Transform::Slice2Sector(Int_t slice, Int_t slicerow, Int_t & sector, Int_t &row)
536 if(slicerow<0&&slicerow>=fNRow) return kFALSE;
537 if(slice<0||slice>=fNSlice) return kFALSE;
539 if(slicerow<fNRowLow){
544 sector = slice+fNSlice;
545 row = slicerow-fNRowLow;
550 Bool_t AliL3Transform::Sector2Slice(Int_t & slice, Int_t sector)
552 if(sector<0||sector>=fNSector) return kFALSE;
553 if(sector<fNSectorLow) slice = sector;
554 else slice = sector - fNSectorLow;
558 Bool_t AliL3Transform::Sector2Slice(Int_t & slice, Int_t & slicerow,Int_t sector, Int_t row)
560 if(sector<0||sector>=fNSector||row<0) return kFALSE;
561 if(sector<fNSectorLow){
562 if(row>=fNRowLow) return kFALSE;
567 if(row>=fNRowUp) return kFALSE;
568 slice = sector - fNSectorLow;
569 slicerow = row + fNRowLow;
574 Double_t AliL3Transform::Row2X(Int_t slicerow){
575 if(slicerow<0||slicerow>=fNRow) return 0;
579 void AliL3Transform::Local2Global(Float_t *xyz,Int_t slice)
581 //Transformation to global coordinate system
585 cs = cos( (2*fPi/18) * (slice+fNRotShift) );
586 sn = sin( (2*fPi/18) * (slice+fNRotShift) );
589 xyz[2]=xyz[2];//global z=local z
592 void AliL3Transform::Local2GlobalAngle(Float_t *angle,Int_t slice){
593 angle[0] = fmod(angle[0]+(slice+fNRotShift)*(2*fPi/18),2*fPi);
596 void AliL3Transform::Global2LocalAngle(Float_t *angle,Int_t slice){
597 angle[0] = angle[0]-(slice+fNRotShift)*(2*fPi/18);
598 if(angle[0]<0) angle[0]+=2*fPi;
601 void AliL3Transform::Raw2Local(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
603 //Transformation from rawdata to local coordinate system
605 Int_t slice,slicerow;
606 Sector2Slice(slice, slicerow, sector, row);
609 xyz[0]=Row2X(slicerow);
612 Int_t npads= fNPads[slicerow];
613 if(sector<fNSectorLow)
614 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthLow;
616 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthUp;
618 //Z-Value (remember PULSA Delay)
619 //xyz[2]=fZWidth*time-3.*fZSigma;
620 xyz[2]=fZWidth*time-fZOffset;
622 xyz[2]=fZLength-xyz[2];
624 xyz[2]=xyz[2]-fZLength;
628 void AliL3Transform::Local2Global(Float_t *xyz,Int_t sector,Int_t row)
630 //Transformation to global coordinate system
631 Int_t slice,slicerow;
632 Sector2Slice(slice, slicerow, sector, row);
633 Float_t r=Row2X(slicerow);
634 Float_t cs = cos( (2*fPi/18) * (slice+fNRotShift) );
635 Float_t sn = sin( (2*fPi/18) * (slice+fNRotShift) );
637 xyz[0]=r*cs-xyz[1]*sn;
638 xyz[1]=r*sn+xyz[1]*cs;
639 xyz[2]=xyz[2];//global z=local z
642 Double_t AliL3Transform::GetMaxY(Int_t slicerow)
645 if(slicerow < fNRowLow)
646 return fPadPitchWidthLow*fNPads[slicerow]/2;
649 return fPadPitchWidthUp*fNPads[slicerow]/2;
653 void AliL3Transform::Global2Local(Float_t *xyz,Int_t sector,Bool_t isSlice)
658 Sector2Slice(slice, sector);
661 Float_t cs = cos( (2*fPi/18) * (slice+fNRotShift) );
662 Float_t sn = sin( (2*fPi/18) * (slice+fNRotShift) );
663 Float_t x1 = xyz[0]*cs + xyz[1]*sn;
664 Float_t y1 = -xyz[0]*sn + xyz[1]*cs;
669 void AliL3Transform::Raw2Global(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
671 //Transformation from raw to global coordinates
673 Raw2Local(xyz,sector,row,pad,time);
674 Local2Global(xyz,sector,row);
677 void AliL3Transform::Local2Raw(Float_t *xyz,Int_t sector,Int_t row)
679 //Transformation from local coordinates to raw
681 Int_t slice,slicerow;
682 Sector2Slice(slice, slicerow, sector, row);
684 if(sector<fNSectorLow)
685 xyz[1]=xyz[1]/fPadPitchWidthLow+0.5*(fNPads[slicerow]-1);
687 xyz[1]=xyz[1]/fPadPitchWidthUp+0.5*(fNPads[slicerow]-1);
689 Int_t nis=fNSectorLow;
690 Int_t nos=fNSectorUp;
692 if ((sector<nis/2) || ((sector-nis)<nos/2)) sign=1;
693 xyz[2]=fZLength-sign*xyz[2];
694 xyz[2]=(xyz[2]+fZOffset)/fZWidth;
698 void AliL3Transform::Global2Raw(Float_t *xyz,Int_t sector,Int_t row)
700 //Transformation from global coordinates to raw.
702 Global2Local(xyz,sector);
703 Local2Raw(xyz,sector,row);