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 Int_t AliL3Transform::fVersion = 0;
38 Int_t AliL3Transform::fNTimeBins = 446 ;
39 Int_t AliL3Transform::fNRowLow = 64 ;
40 Int_t AliL3Transform::fNRowUp = 112 ;
41 Int_t AliL3Transform::fNSectorLow = 36 ;
42 Int_t AliL3Transform::fNSectorUp = 36 ;
43 Int_t AliL3Transform::fNSector = 72 ;
44 Double_t AliL3Transform::fPadPitchWidthLow = 0.400000 ;
45 Double_t AliL3Transform::fPadPitchWidthUp = 0.600000 ;
46 Double_t AliL3Transform::fZWidth = 0.56599998474121093750 ;
47 Double_t AliL3Transform::fZSigma = 0.22880849748219134199 ;
48 Double_t AliL3Transform::fZOffset = 0.68642549244657402596;
49 Double_t AliL3Transform::fZLength = 250.;
50 Int_t AliL3Transform::fNSlice = 36 ;
51 Int_t AliL3Transform::fNRow = 176 ;
52 Double_t AliL3Transform::fNRotShift = 0.5 ;
53 Double_t AliL3Transform::fPi = 3.141592653589793 ;
54 Double_t AliL3Transform::fX[176] = {84.570007324218750,
232 Int_t AliL3Transform::fNPads[176] = {67,
412 void AliL3Transform::Init(const Char_t* path)
414 //Overwrite the parameters with values stored in file "l3transform.config" in path.
415 //If file does not exist, old default values will be used.
417 Char_t *pathname=new Char_t[1024];
418 strcpy(pathname,path);
419 strcat(pathname,"/l3transform.config");
421 FILE *fptr=fopen(pathname,"r");
423 LOG(AliL3Log::kWarning,"AliL3Transform::Init","File Open")
424 <<"Pointer to Config File \""<<pathname<<"\" 0x0!"<<ENDLOG;
428 Char_t d1[250], d2[100], d3[100];
433 fscanf(fptr,"%s",d1);
435 if(strcmp(d1,"fNTimeBins")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNTimeBins=(Int_t)dummy;}
436 else if(strcmp(d1,"fNRowLow")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRowLow=(Int_t)dummy;}
437 else if(strcmp(d1,"fNRowUp")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRowUp=(Int_t)dummy;}
438 else if(strcmp(d1,"fNSectorLow")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSectorLow=(Int_t)dummy;}
439 else if(strcmp(d1,"fNSectorUp")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSectorUp=(Int_t)dummy;}
440 else if(strcmp(d1,"fNSector")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSector=(Int_t)dummy;}
441 else if(strcmp(d1,"fPadPitchWidthLow")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fPadPitchWidthLow=(Double_t)ddummy;}
442 else if(strcmp(d1,"fPadPitchWidthUp")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fPadPitchWidthUp=(Double_t)ddummy;}
443 else if(strcmp(d1,"fZWidth")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZWidth=(Double_t)ddummy;}
444 else if(strcmp(d1,"fZSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZSigma=(Double_t)ddummy;}
445 else if(strcmp(d1,"fZLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZLength=(Double_t)ddummy;}
446 else if(strcmp(d1,"fZOffset")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZOffset=(Double_t)ddummy;}
447 else if(strcmp(d1,"fNSlice")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSlice=(Int_t)dummy;}
448 else if(strcmp(d1,"fNRow")==0){
449 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRow=(Int_t)dummy;
451 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;
454 else if(strcmp(d1,"fNRotShift")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fNRotShift=(Double_t)ddummy;}
455 else if(strcmp(d1,"fPi")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fPi=(Double_t)ddummy;}
456 else if(strcmp(d1,"fX[0]")==0){
457 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fX[0]=(Double_t)ddummy;
458 for(Int_t i=1;i<fNRow;i++){fscanf(fptr,"%s %s %lf %s",d1,d2,&ddummy,d3);fX[i]=(Double_t)ddummy;}
460 else if(strcmp(d1,"fNPads[0]")==0){
461 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNPads[0]=(Int_t)dummy;
462 for(Int_t i=1;i<fNRow;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fNPads[i]=(Int_t)dummy;}
468 fVersion=1; //new version
473 Double_t AliL3Transform::GetEta(Float_t *xyz)
475 Double_t r3 = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
476 Double_t eta = 0.5 * log((r3+xyz[2])/(r3-xyz[2]));
480 void AliL3Transform::XYZtoRPhiEta(Float_t *rpe, Float_t *xyz)
482 rpe[0] = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
483 rpe[1] = atan2(xyz[1],xyz[0]);
484 rpe[2] = 0.5 * log((rpe[0]+xyz[2])/(rpe[0]-xyz[2]));
487 Double_t AliL3Transform::GetEta(Int_t padrow,Int_t pad,Int_t time)
491 Slice2Sector(0,padrow,sector,row);
492 Raw2Local(xyz,sector,row,pad,time);
497 Double_t AliL3Transform::GetPhi(Float_t *xyz)
499 Double_t phi = atan2(xyz[1],xyz[0]);
500 //if(phi<0) phi=phi+2*TMath::Pi();
504 Bool_t AliL3Transform::Slice2Sector(Int_t slice, Int_t slicerow, Int_t & sector, Int_t &row)
506 if(slicerow<0&&slicerow>=fNRow) return kFALSE;
507 if(slice<0||slice>=fNSlice) return kFALSE;
509 if(slicerow<fNRowLow){
514 sector = slice+fNSlice;
515 row = slicerow-fNRowLow;
520 Bool_t AliL3Transform::Sector2Slice(Int_t & slice, Int_t sector)
522 if(sector<0||sector>=fNSector) return kFALSE;
523 if(sector<fNSectorLow) slice = sector;
524 else slice = sector - fNSectorLow;
528 Bool_t AliL3Transform::Sector2Slice(Int_t & slice, Int_t & slicerow,Int_t sector, Int_t row)
530 if(sector<0||sector>=fNSector||row<0) return kFALSE;
531 if(sector<fNSectorLow){
532 if(row>=fNRowLow) return kFALSE;
537 if(row>=fNRowUp) return kFALSE;
538 slice = sector - fNSectorLow;
539 slicerow = row + fNRowLow;
544 Double_t AliL3Transform::Row2X(Int_t slicerow){
545 if(slicerow<0||slicerow>=fNRow) return 0;
549 void AliL3Transform::Local2Global(Float_t *xyz,Int_t slice)
551 //Transformation to global coordinate system
555 cs = cos( (2*fPi/18) * (slice+fNRotShift) );
556 sn = sin( (2*fPi/18) * (slice+fNRotShift) );
559 xyz[2]=xyz[2];//global z=local z
562 void AliL3Transform::Local2GlobalAngle(Float_t *angle,Int_t slice){
563 angle[0] = fmod(angle[0]+(slice+fNRotShift)*(2*fPi/18),2*fPi);
566 void AliL3Transform::Global2LocalAngle(Float_t *angle,Int_t slice){
567 angle[0] = angle[0]-(slice+fNRotShift)*(2*fPi/18);
568 if(angle[0]<0) angle[0]+=2*fPi;
571 void AliL3Transform::Raw2Local(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
573 //Transformation from rawdata to local coordinate system
575 Int_t slice,slicerow;
576 Sector2Slice(slice, slicerow, sector, row);
579 xyz[0]=Row2X(slicerow);
582 Int_t npads= fNPads[slicerow];
583 if(sector<fNSectorLow)
584 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthLow;
586 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthUp;
588 //Z-Value (remember PULSA Delay)
589 //xyz[2]=fZWidth*time-3.*fZSigma;
590 xyz[2]=fZWidth*time-fZOffset;
592 xyz[2]=fZLength-xyz[2];
594 xyz[2]=xyz[2]-fZLength;
598 void AliL3Transform::Local2Global(Float_t *xyz,Int_t sector,Int_t row)
600 //Transformation to global coordinate system
601 Int_t slice,slicerow;
602 Sector2Slice(slice, slicerow, sector, row);
603 Float_t r=Row2X(slicerow);
604 Float_t cs = cos( (2*fPi/18) * (slice+fNRotShift) );
605 Float_t sn = sin( (2*fPi/18) * (slice+fNRotShift) );
607 xyz[0]=r*cs-xyz[1]*sn;
608 xyz[1]=r*sn+xyz[1]*cs;
609 xyz[2]=xyz[2];//global z=local z
612 Double_t AliL3Transform::GetMaxY(Int_t slicerow)
615 if(slicerow < fNRowLow)
616 return fPadPitchWidthLow*fNPads[slicerow]/2;
619 return fPadPitchWidthUp*fNPads[slicerow]/2;
623 void AliL3Transform::Global2Local(Float_t *xyz,Int_t sector,Bool_t isSlice)
628 Sector2Slice(slice, sector);
631 Float_t cs = cos( (2*fPi/18) * (slice+fNRotShift) );
632 Float_t sn = sin( (2*fPi/18) * (slice+fNRotShift) );
633 Float_t x1 = xyz[0]*cs + xyz[1]*sn;
634 Float_t y1 = -xyz[0]*sn + xyz[1]*cs;
639 void AliL3Transform::Raw2Global(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
641 //Transformation from raw to global coordinates
643 Raw2Local(xyz,sector,row,pad,time);
644 Local2Global(xyz,sector,row);
647 void AliL3Transform::Local2Raw(Float_t *xyz,Int_t sector,Int_t row)
649 //Transformation from local coordinates to raw
651 Int_t slice,slicerow;
652 Sector2Slice(slice, slicerow, sector, row);
654 if(sector<fNSectorLow)
655 xyz[1]=xyz[1]/fPadPitchWidthLow+0.5*(fNPads[slicerow]-1);
657 xyz[1]=xyz[1]/fPadPitchWidthUp+0.5*(fNPads[slicerow]-1);
659 Int_t nis=fNSectorLow;
660 Int_t nos=fNSectorUp;
662 if ((sector<nis/2) || ((sector-nis)<nos/2)) sign=1;
663 xyz[2]=fZLength-sign*xyz[2];
664 xyz[2]=(xyz[2]+fZOffset)/fZWidth;
668 void AliL3Transform::Global2Raw(Float_t *xyz,Int_t sector,Int_t row)
670 //Transformation from global coordinates to raw.
672 Global2Local(xyz,sector);
673 Local2Raw(xyz,sector,row);