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::fVersion = 0;
39 Int_t AliL3Transform::fNTimeBins = 446 ;
40 Int_t AliL3Transform::fNRowLow = 64 ;
41 Int_t AliL3Transform::fNRowUp = 112 ;
42 Int_t AliL3Transform::fNSectorLow = 36 ;
43 Int_t AliL3Transform::fNSectorUp = 36 ;
44 Int_t AliL3Transform::fNSector = 72 ;
45 Double_t AliL3Transform::fPadPitchWidthLow = 0.400000 ;
46 Double_t AliL3Transform::fPadPitchWidthUp = 0.600000 ;
47 Double_t AliL3Transform::fZWidth = 0.56599998474121093750 ;
48 Double_t AliL3Transform::fZSigma = 0.22880849748219134199 ;
49 Double_t AliL3Transform::fZOffset = 0.68642549244657402596;
50 Double_t AliL3Transform::fZLength = 250.;
51 Int_t AliL3Transform::fNSlice = 36 ;
52 Int_t AliL3Transform::fNRow = 176 ;
53 Double_t AliL3Transform::fNRotShift = 0.5 ;
54 Double_t AliL3Transform::fPi = 3.141592653589793 ;
55 Int_t AliL3Transform::fNPatches = 6;
56 Int_t AliL3Transform::fRows[6][2] = {{0,31},{32,63},{64,91},{92,119},{120,143},{144,175}};
57 Int_t AliL3Transform::fNRows[6] = {32,32,28,28,24,32};
58 Double_t AliL3Transform::fX[176] = {84.570007324218750,
236 Int_t AliL3Transform::fNPads[176] = {67,
416 void AliL3Transform::Init(const Char_t* path)
418 //Overwrite the parameters with values stored in file "l3transform.config" in path.
419 //If file does not exist, old default values will be used.
421 Char_t *pathname=new Char_t[1024];
422 strcpy(pathname,path);
423 strcat(pathname,"/l3transform.config");
425 FILE *fptr=fopen(pathname,"r");
427 LOG(AliL3Log::kWarning,"AliL3Transform::Init","File Open")
428 <<"Pointer to Config File \""<<pathname<<"\" 0x0!"<<ENDLOG;
432 Char_t d1[250], d2[100], d3[100];
437 fscanf(fptr,"%s",d1);
439 if(strcmp(d1,"fNTimeBins")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNTimeBins=(Int_t)dummy;}
440 else if(strcmp(d1,"fNRowLow")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRowLow=(Int_t)dummy;}
441 else if(strcmp(d1,"fNRowUp")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRowUp=(Int_t)dummy;}
442 else if(strcmp(d1,"fNSectorLow")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSectorLow=(Int_t)dummy;}
443 else if(strcmp(d1,"fNSectorUp")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSectorUp=(Int_t)dummy;}
444 else if(strcmp(d1,"fNSector")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSector=(Int_t)dummy;}
445 else if(strcmp(d1,"fPadPitchWidthLow")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fPadPitchWidthLow=(Double_t)ddummy;}
446 else if(strcmp(d1,"fPadPitchWidthUp")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fPadPitchWidthUp=(Double_t)ddummy;}
447 else if(strcmp(d1,"fZWidth")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZWidth=(Double_t)ddummy;}
448 else if(strcmp(d1,"fZSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZSigma=(Double_t)ddummy;}
449 else if(strcmp(d1,"fZLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZLength=(Double_t)ddummy;}
450 else if(strcmp(d1,"fZOffset")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZOffset=(Double_t)ddummy;}
451 else if(strcmp(d1,"fNSlice")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSlice=(Int_t)dummy;}
452 else if(strcmp(d1,"fNRow")==0){
453 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRow=(Int_t)dummy;
455 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;
458 else if(strcmp(d1,"fNRotShift")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fNRotShift=(Double_t)ddummy;}
459 else if(strcmp(d1,"fPi")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fPi=(Double_t)ddummy;}
460 else if(strcmp(d1,"fX[0]")==0){
461 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fX[0]=(Double_t)ddummy;
462 for(Int_t i=1;i<fNRow;i++){fscanf(fptr,"%s %s %lf %s",d1,d2,&ddummy,d3);fX[i]=(Double_t)ddummy;}
464 else if(strcmp(d1,"fNPads[0]")==0){
465 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNPads[0]=(Int_t)dummy;
466 for(Int_t i=1;i<fNRow;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fNPads[i]=(Int_t)dummy;}
472 fVersion=1; //new version
477 Double_t AliL3Transform::GetEta(Float_t *xyz)
479 Double_t r3 = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
480 Double_t eta = 0.5 * log((r3+xyz[2])/(r3-xyz[2]));
484 void AliL3Transform::XYZtoRPhiEta(Float_t *rpe, Float_t *xyz)
486 rpe[0] = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
487 rpe[1] = atan2(xyz[1],xyz[0]);
488 rpe[2] = 0.5 * log((rpe[0]+xyz[2])/(rpe[0]-xyz[2]));
491 Double_t AliL3Transform::GetEta(Int_t padrow,Int_t pad,Int_t time)
495 Slice2Sector(0,padrow,sector,row);
496 Raw2Local(xyz,sector,row,pad,time);
501 Double_t AliL3Transform::GetPhi(Float_t *xyz)
503 Double_t phi = atan2(xyz[1],xyz[0]);
504 //if(phi<0) phi=phi+2*TMath::Pi();
508 Bool_t AliL3Transform::Slice2Sector(Int_t slice, Int_t slicerow, Int_t & sector, Int_t &row)
510 if(slicerow<0&&slicerow>=fNRow) return kFALSE;
511 if(slice<0||slice>=fNSlice) return kFALSE;
513 if(slicerow<fNRowLow){
518 sector = slice+fNSlice;
519 row = slicerow-fNRowLow;
524 Bool_t AliL3Transform::Sector2Slice(Int_t & slice, Int_t sector)
526 if(sector<0||sector>=fNSector) return kFALSE;
527 if(sector<fNSectorLow) slice = sector;
528 else slice = sector - fNSectorLow;
532 Bool_t AliL3Transform::Sector2Slice(Int_t & slice, Int_t & slicerow,Int_t sector, Int_t row)
534 if(sector<0||sector>=fNSector||row<0) return kFALSE;
535 if(sector<fNSectorLow){
536 if(row>=fNRowLow) return kFALSE;
541 if(row>=fNRowUp) return kFALSE;
542 slice = sector - fNSectorLow;
543 slicerow = row + fNRowLow;
548 Double_t AliL3Transform::Row2X(Int_t slicerow){
549 if(slicerow<0||slicerow>=fNRow) return 0;
553 void AliL3Transform::Local2Global(Float_t *xyz,Int_t slice)
555 //Transformation to global coordinate system
559 cs = cos( (2*fPi/18) * (slice+fNRotShift) );
560 sn = sin( (2*fPi/18) * (slice+fNRotShift) );
563 xyz[2]=xyz[2];//global z=local z
566 void AliL3Transform::Local2GlobalAngle(Float_t *angle,Int_t slice){
567 angle[0] = fmod(angle[0]+(slice+fNRotShift)*(2*fPi/18),2*fPi);
570 void AliL3Transform::Global2LocalAngle(Float_t *angle,Int_t slice){
571 angle[0] = angle[0]-(slice+fNRotShift)*(2*fPi/18);
572 if(angle[0]<0) angle[0]+=2*fPi;
575 void AliL3Transform::Raw2Local(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
577 //Transformation from rawdata to local coordinate system
579 Int_t slice,slicerow;
580 Sector2Slice(slice, slicerow, sector, row);
583 xyz[0]=Row2X(slicerow);
586 Int_t npads= fNPads[slicerow];
587 if(sector<fNSectorLow)
588 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthLow;
590 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthUp;
592 //Z-Value (remember PULSA Delay)
593 //xyz[2]=fZWidth*time-3.*fZSigma;
594 xyz[2]=fZWidth*time-fZOffset;
596 xyz[2]=fZLength-xyz[2];
598 xyz[2]=xyz[2]-fZLength;
602 void AliL3Transform::Local2Global(Float_t *xyz,Int_t sector,Int_t row)
604 //Transformation to global coordinate system
605 Int_t slice,slicerow;
606 Sector2Slice(slice, slicerow, sector, row);
607 Float_t r=Row2X(slicerow);
608 Float_t cs = cos( (2*fPi/18) * (slice+fNRotShift) );
609 Float_t sn = sin( (2*fPi/18) * (slice+fNRotShift) );
611 xyz[0]=r*cs-xyz[1]*sn;
612 xyz[1]=r*sn+xyz[1]*cs;
613 xyz[2]=xyz[2];//global z=local z
616 Double_t AliL3Transform::GetMaxY(Int_t slicerow)
619 if(slicerow < fNRowLow)
620 return fPadPitchWidthLow*fNPads[slicerow]/2;
623 return fPadPitchWidthUp*fNPads[slicerow]/2;
627 void AliL3Transform::Global2Local(Float_t *xyz,Int_t sector,Bool_t isSlice)
632 Sector2Slice(slice, sector);
635 Float_t cs = cos( (2*fPi/18) * (slice+fNRotShift) );
636 Float_t sn = sin( (2*fPi/18) * (slice+fNRotShift) );
637 Float_t x1 = xyz[0]*cs + xyz[1]*sn;
638 Float_t y1 = -xyz[0]*sn + xyz[1]*cs;
643 void AliL3Transform::Raw2Global(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
645 //Transformation from raw to global coordinates
647 Raw2Local(xyz,sector,row,pad,time);
648 Local2Global(xyz,sector,row);
651 void AliL3Transform::Local2Raw(Float_t *xyz,Int_t sector,Int_t row)
653 //Transformation from local coordinates to raw
655 Int_t slice,slicerow;
656 Sector2Slice(slice, slicerow, sector, row);
658 if(sector<fNSectorLow)
659 xyz[1]=xyz[1]/fPadPitchWidthLow+0.5*(fNPads[slicerow]-1);
661 xyz[1]=xyz[1]/fPadPitchWidthUp+0.5*(fNPads[slicerow]-1);
663 Int_t nis=fNSectorLow;
664 Int_t nos=fNSectorUp;
666 if ((sector<nis/2) || ((sector-nis)<nos/2)) sign=1;
667 xyz[2]=fZLength-sign*xyz[2];
668 xyz[2]=(xyz[2]+fZOffset)/fZWidth;
672 void AliL3Transform::Global2Raw(Float_t *xyz,Int_t sector,Int_t row)
674 //Transformation from global coordinates to raw.
676 Global2Local(xyz,sector);
677 Local2Raw(xyz,sector,row);