2 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>, Uli Frankenfeld <mailto:franken@fi.uib.no>
3 //*-- Copyright © ASV
4 // changes done by Constantin Loizides <mailto:loizides@ikf.physik.uni-frankfurt.de>
7 #include "AliL3Logging.h"
8 #include "AliL3Transform.h"
11 //_____________________________________________________________
14 // Transformation class for ALICE TPC.
16 // Class which contains all detector specific parameters for the TPC,
17 // and different useful functions for coordinate transforms.
19 // The class is completely static, which means that no object needs
20 // to be instantiated. Function calls should then be done like:
22 // AliL3Transform::GetEta(xyz);
24 // IMPORTANT: If used as is, default detector parameters will be used,
25 // and you really have to make sure that these correspond to
26 // the AliROOT version you are currently working on!!
27 // You should therefore always initialize the parameters by
29 // AliL3Transform::Init(path);
31 // where path is a char*, giving the path to where file containing
32 // the detector parameter is located. This file should be called
33 // "l3transform.config", and can be created with macro exa/Make_Init.C.
35 ClassImp(AliL3Transform)
37 Double_t AliL3Transform::fBField = 0.2;
38 Int_t AliL3Transform::fBFieldFactor = 1;
39 Int_t AliL3Transform::fVersion = 0;
40 Int_t AliL3Transform::fNTimeBins = 446 ;
41 Int_t AliL3Transform::fNRowLow = 64 ;
42 Int_t AliL3Transform::fNRowUp = 112 ;
43 Int_t AliL3Transform::fNSectorLow = 36 ;
44 Int_t AliL3Transform::fNSectorUp = 36 ;
45 Int_t AliL3Transform::fNSector = 72 ;
46 Double_t AliL3Transform::fPadPitchWidthLow = 0.400000 ;
47 Double_t AliL3Transform::fPadPitchWidthUp = 0.600000 ;
48 Double_t AliL3Transform::fZWidth = 0.56599998474121093750 ;
49 Double_t AliL3Transform::fZSigma = 0.22880849748219134199 ;
50 Double_t AliL3Transform::fZOffset = 0.68642549244657402596;
51 Double_t AliL3Transform::fDiffT = 0.0219999998807907104;
52 Double_t AliL3Transform::fDiffL = 0.0219999998807907104;
53 Double_t AliL3Transform::fAnodeWireSpacing = 0.25;
54 Double_t AliL3Transform::fInnerPadLength = 0.75;
55 Double_t AliL3Transform::fOuterPadLength = 1.;
56 Double_t AliL3Transform::fInnerPRFSigma = 0.203811079263687134;
57 Double_t AliL3Transform::fOuterPRFSigma = 0.299324512481689453;
58 Double_t AliL3Transform::fTimeSigma = 0.228808626532554626;
59 Double_t AliL3Transform::fZLength = 250.;
60 Int_t AliL3Transform::fNSlice = 36 ;
61 Int_t AliL3Transform::fNRow = 176 ;
62 Double_t AliL3Transform::fNRotShift = 0.5 ;
63 Double_t AliL3Transform::fPi = 3.141592653589793 ;
64 Int_t AliL3Transform::fNPatches = 6;
65 Int_t AliL3Transform::fRows[6][2] = {{0,31},{32,63},{64,91},{92,119},{120,143},{144,175}};
66 Int_t AliL3Transform::fNRows[6] = {32,32,28,28,24,32};
67 Double_t AliL3Transform::fX[176] = {84.570007324218750,
245 Int_t AliL3Transform::fNPads[176] = {67,
425 void AliL3Transform::Init(const Char_t* path)
427 //Overwrite the parameters with values stored in file "l3transform.config" in path.
428 //If file does not exist, old default values will be used.
430 Char_t *pathname=new Char_t[1024];
431 strcpy(pathname,path);
432 strcat(pathname,"/l3transform.config");
434 FILE *fptr=fopen(pathname,"r");
436 LOG(AliL3Log::kWarning,"AliL3Transform::Init","File Open")
437 <<"Pointer to Config File \""<<pathname<<"\" 0x0!"<<ENDLOG;
441 Char_t d1[250], d2[100], d3[100];
446 fscanf(fptr,"%s",d1);
448 if(strcmp(d1,"fBFieldFactor")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fBFieldFactor=(Int_t)dummy;fBField=fBFieldFactor*0.2;}
449 else if(strcmp(d1,"fNTimeBins")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNTimeBins=(Int_t)dummy;}
450 else if(strcmp(d1,"fNRowLow")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRowLow=(Int_t)dummy;}
452 LOG(AliL3Log::kError,"AliL3Transform::Init","Overflow")
453 <<"Number of inner PadRows should be 64! Check and fgrep the code for 64 to see the consequences of this major change!"<<ENDLOG;
454 else if(strcmp(d1,"fNRowUp")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRowUp=(Int_t)dummy;}
455 else if(strcmp(d1,"fNSectorLow")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSectorLow=(Int_t)dummy;}
456 else if(strcmp(d1,"fNSectorUp")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSectorUp=(Int_t)dummy;}
457 else if(strcmp(d1,"fNSector")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSector=(Int_t)dummy;}
458 else if(strcmp(d1,"fPadPitchWidthLow")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fPadPitchWidthLow=(Double_t)ddummy;}
459 else if(strcmp(d1,"fPadPitchWidthUp")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fPadPitchWidthUp=(Double_t)ddummy;}
460 else if(strcmp(d1,"fZWidth")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZWidth=(Double_t)ddummy;}
461 else if(strcmp(d1,"fZSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZSigma=(Double_t)ddummy;}
462 else if(strcmp(d1,"fZLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZLength=(Double_t)ddummy;}
463 else if(strcmp(d1,"fZOffset")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZOffset=(Double_t)ddummy;}
464 else if(strcmp(d1,"fNSlice")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSlice=(Int_t)dummy;}
465 else if(strcmp(d1,"fDiffT")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fDiffT=(Double_t)ddummy;}
466 else if(strcmp(d1,"fDiffL")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fDiffL=(Double_t)ddummy;}
467 else if(strcmp(d1,"fInnerPadLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fInnerPadLength=(Double_t)ddummy;}
468 else if(strcmp(d1,"fOuterPadLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fOuterPadLength=(Double_t)ddummy;}
469 else if(strcmp(d1,"fInnerPRFSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fInnerPRFSigma=(Double_t)ddummy;}
470 else if(strcmp(d1,"fOuterPRFSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fOuterPRFSigma=(Double_t)ddummy;}
471 else if(strcmp(d1,"fTimeSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fTimeSigma=(Double_t)ddummy;}
472 else if(strcmp(d1,"fNRow")==0){
473 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRow=(Int_t)dummy;
475 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;
478 else if(strcmp(d1,"fNRotShift")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fNRotShift=(Double_t)ddummy;}
479 else if(strcmp(d1,"fPi")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fPi=(Double_t)ddummy;}
480 else if(strcmp(d1,"fX[0]")==0){
481 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fX[0]=(Double_t)ddummy;
482 for(Int_t i=1;i<fNRow;i++){fscanf(fptr,"%s %s %lf %s",d1,d2,&ddummy,d3);fX[i]=(Double_t)ddummy;}
484 else if(strcmp(d1,"fNPads[0]")==0){
485 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNPads[0]=(Int_t)dummy;
486 for(Int_t i=1;i<fNRow;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fNPads[i]=(Int_t)dummy;}
492 fVersion=1; //new version
496 Double_t AliL3Transform::GetEta(Float_t *xyz)
498 Double_t r3 = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
499 Double_t eta = 0.5 * log((r3+xyz[2])/(r3-xyz[2]));
503 void AliL3Transform::XYZtoRPhiEta(Float_t *rpe, Float_t *xyz)
505 rpe[0] = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
506 rpe[1] = atan2(xyz[1],xyz[0]);
507 rpe[2] = 0.5 * log((rpe[0]+xyz[2])/(rpe[0]-xyz[2]));
510 Double_t AliL3Transform::GetEta(Int_t padrow,Int_t pad,Int_t time)
514 Slice2Sector(0,padrow,sector,row);
515 Raw2Local(xyz,sector,row,pad,time);
520 Double_t AliL3Transform::GetPhi(Float_t *xyz)
522 Double_t phi = atan2(xyz[1],xyz[0]);
523 //if(phi<0) phi=phi+2*TMath::Pi();
527 Bool_t AliL3Transform::Slice2Sector(Int_t slice, Int_t slicerow, Int_t & sector, Int_t &row)
529 if(slicerow<0&&slicerow>=fNRow) return kFALSE;
530 if(slice<0||slice>=fNSlice) return kFALSE;
532 if(slicerow<fNRowLow){
537 sector = slice+fNSlice;
538 row = slicerow-fNRowLow;
543 Bool_t AliL3Transform::Sector2Slice(Int_t & slice, Int_t sector)
545 if(sector<0||sector>=fNSector) return kFALSE;
546 if(sector<fNSectorLow) slice = sector;
547 else slice = sector - fNSectorLow;
551 Bool_t AliL3Transform::Sector2Slice(Int_t & slice, Int_t & slicerow,Int_t sector, Int_t row)
553 if(sector<0||sector>=fNSector||row<0) return kFALSE;
554 if(sector<fNSectorLow){
555 if(row>=fNRowLow) return kFALSE;
560 if(row>=fNRowUp) return kFALSE;
561 slice = sector - fNSectorLow;
562 slicerow = row + fNRowLow;
567 Double_t AliL3Transform::Row2X(Int_t slicerow){
568 if(slicerow<0||slicerow>=fNRow) return 0;
572 void AliL3Transform::Local2Global(Float_t *xyz,Int_t slice)
574 //Transformation to global coordinate system
578 cs = cos( (2*fPi/18) * (slice+fNRotShift) );
579 sn = sin( (2*fPi/18) * (slice+fNRotShift) );
582 xyz[2]=xyz[2];//global z=local z
585 void AliL3Transform::Local2GlobalAngle(Float_t *angle,Int_t slice){
586 angle[0] = fmod(angle[0]+(slice+fNRotShift)*(2*fPi/18),2*fPi);
589 void AliL3Transform::Global2LocalAngle(Float_t *angle,Int_t slice){
590 angle[0] = angle[0]-(slice+fNRotShift)*(2*fPi/18);
591 if(angle[0]<0) angle[0]+=2*fPi;
594 void AliL3Transform::Raw2Local(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
596 //Transformation from rawdata to local coordinate system
598 Int_t slice,slicerow;
599 Sector2Slice(slice, slicerow, sector, row);
602 xyz[0]=Row2X(slicerow);
605 Int_t npads= fNPads[slicerow];
606 if(sector<fNSectorLow)
607 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthLow;
609 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthUp;
611 //Z-Value (remember PULSA Delay)
612 //xyz[2]=fZWidth*time-3.*fZSigma;
613 xyz[2]=fZWidth*time-fZOffset;
615 xyz[2]=fZLength-xyz[2];
617 xyz[2]=xyz[2]-fZLength;
621 void AliL3Transform::Local2Global(Float_t *xyz,Int_t sector,Int_t row)
623 //Transformation to global coordinate system
624 Int_t slice,slicerow;
625 Sector2Slice(slice, slicerow, sector, row);
626 Float_t r=Row2X(slicerow);
627 Float_t cs = cos( (2*fPi/18) * (slice+fNRotShift) );
628 Float_t sn = sin( (2*fPi/18) * (slice+fNRotShift) );
630 xyz[0]=r*cs-xyz[1]*sn;
631 xyz[1]=r*sn+xyz[1]*cs;
632 xyz[2]=xyz[2];//global z=local z
635 Double_t AliL3Transform::GetMaxY(Int_t slicerow)
638 if(slicerow < fNRowLow)
639 return fPadPitchWidthLow*fNPads[slicerow]/2;
642 return fPadPitchWidthUp*fNPads[slicerow]/2;
646 void AliL3Transform::Global2Local(Float_t *xyz,Int_t sector,Bool_t isSlice)
651 Sector2Slice(slice, sector);
654 Float_t cs = cos( (2*fPi/18) * (slice+fNRotShift) );
655 Float_t sn = sin( (2*fPi/18) * (slice+fNRotShift) );
656 Float_t x1 = xyz[0]*cs + xyz[1]*sn;
657 Float_t y1 = -xyz[0]*sn + xyz[1]*cs;
662 void AliL3Transform::Raw2Global(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
664 //Transformation from raw to global coordinates
666 Raw2Local(xyz,sector,row,pad,time);
667 Local2Global(xyz,sector,row);
670 void AliL3Transform::Local2Raw(Float_t *xyz,Int_t sector,Int_t row)
672 //Transformation from local coordinates to raw
674 Int_t slice,slicerow;
675 Sector2Slice(slice, slicerow, sector, row);
677 if(sector<fNSectorLow)
678 xyz[1]=xyz[1]/fPadPitchWidthLow+0.5*(fNPads[slicerow]-1);
680 xyz[1]=xyz[1]/fPadPitchWidthUp+0.5*(fNPads[slicerow]-1);
682 Int_t nis=fNSectorLow;
683 Int_t nos=fNSectorUp;
685 if ((sector<nis/2) || ((sector-nis)<nos/2)) sign=1;
686 xyz[2]=fZLength-sign*xyz[2];
687 xyz[2]=(xyz[2]+fZOffset)/fZWidth;
691 void AliL3Transform::Global2Raw(Float_t *xyz,Int_t sector,Int_t row)
693 //Transformation from global coordinates to raw.
695 Global2Local(xyz,sector);
696 Local2Raw(xyz,sector,row);