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 © ALICE HLT Group
7 #include "AliL3StandardIncludes.h"
13 #include <AliTPCParamSR.h>
14 #include <AliTPCPRF2D.h>
15 #include <AliTPCRF1D.h>
19 #include <TUnixSystem.h>
20 #include <TTimeStamp.h>
24 #include "AliL3Logging.h"
25 #include "AliL3Transform.h"
27 #if defined(__GNUC__) && __GNUC__ == 3
31 /** \class AliL3Transform
33 //_____________________________________________________________
36 // Transformation class for ALICE TPC.
38 // Class which contains all detector specific parameters for the TPC,
39 // and different useful functions for coordinate transforms.
41 // The class is completely static, which means that no object needs
42 // to be instantiated. Function calls should then be done like, e.g.:
44 // Double_t eta = AliL3Transform::GetEta(xyz);
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
51 // AliL3Transform::Init(path);
53 // where path is a char*, giving the path to where file containing
54 // the detector parameter is located. This file should be called
55 // "l3transform.config", and can be created with the function MakeInitFile.
57 // You can also force reading the parameters from a AliTPCParam object
58 // by setting the flag;
60 // AliL3Transform::Init(path,kTRUE);
62 // where path is a char*
63 // either providing the rootfile name containing the geometry or
64 // the path to the rootfile which should then be called alirunfile.root.
65 // Note that for both of these cases you have to
66 // compile with USEPACKAGE=ALIROOT set (see level3code/Makefile.conf).
68 // Currently, there are 4 versions of the Transformer:
69 // fVersion==kValiroot: ALIROOT-head compatible
70 // fVersion==kVcosmics: Cosmics data run (2003) compatible
71 // fVersion==kVdefault: means no config file has been loaded
72 // fVersion==kVdeprecated: dont use old (before July 2003) style of transformer
77 ClassImp(AliL3Transform)
79 const Double_t AliL3Transform::fgkAnodeWireSpacing = 0.25; //Taken from the TDR
80 const Double_t AliL3Transform::fgkBFACT = 0.0029980; //Conversion Factor
81 const Double_t AliL3Transform::fgkPi = 3.141592653589793;
82 const Double_t AliL3Transform::fgk2Pi = 2*3.141592653589793;
83 const Double_t AliL3Transform::fgkPi2 = 0.5*3.141592653589793;
84 const Double_t AliL3Transform::fgkToDeg = 180/3.141592653589793;
86 //Defined by HLT and GSI
87 Int_t AliL3Transform::fgNPatches = 6;
88 Int_t AliL3Transform::fgRows[6][2] = {{0,29},{30,62},{63,90},{91,116},{117,139},{140,158}};
89 Int_t AliL3Transform::fgNRows[6] = {30,33,28,26,23,19};
91 // The following definition is generated by MakeInitFile function
92 Double_t AliL3Transform::fgBField = 0.2;
93 Double_t AliL3Transform::fgSolenoidBField = 2;
94 Double_t AliL3Transform::fgBFieldFactor = 1;
95 Int_t AliL3Transform::fgVersion = kVdefault;
96 Int_t AliL3Transform::fgNTimeBins = 446;
97 Int_t AliL3Transform::fgNRowLow = 63;
98 Int_t AliL3Transform::fgNRowUp = 96;
99 Int_t AliL3Transform::fgNRowUp1 = 64;
100 Int_t AliL3Transform::fgNRowUp2 = 32;
101 Int_t AliL3Transform::fgNSectorLow = 36;
102 Int_t AliL3Transform::fgNSectorUp = 36;
103 Int_t AliL3Transform::fgNSector = 72;
104 Double_t AliL3Transform::fgPadPitchWidthLow = 0.4;
105 Double_t AliL3Transform::fgPadPitchWidthUp = 0.6;
106 Double_t AliL3Transform::fgZWidth = 0.5660;
107 Double_t AliL3Transform::fgZSigma = 0.2288;
108 Double_t AliL3Transform::fgZLength = 250.0000;
109 Double_t AliL3Transform::fgZOffset = 0.6864;
110 Double_t AliL3Transform::fgDiffT = 0.0220;
111 Double_t AliL3Transform::fgDiffL = 0.0220;
112 Double_t AliL3Transform::fgOmegaTau = 0.1450;
113 Double_t AliL3Transform::fgInnerPadLength = 0.75;
114 Double_t AliL3Transform::fgOuter1PadLength = 1.00;
115 Double_t AliL3Transform::fgOuter2PadLength = 1.50;
116 Double_t AliL3Transform::fgInnerPRFSigma = 0.203811;
117 Double_t AliL3Transform::fgOuter1PRFSigma = 0.299325;
118 Double_t AliL3Transform::fgOuter2PRFSigma = 0.299323;
119 Double_t AliL3Transform::fgTimeSigma = 0.228809;
120 Int_t AliL3Transform::fgADCSat = 1024;
121 Int_t AliL3Transform::fgZeroSup = 0;
122 Int_t AliL3Transform::fgNSlice = 36;
123 Int_t AliL3Transform::fgNRow = 159;
124 Double_t AliL3Transform::fgNRotShift = 0.5;
125 Int_t AliL3Transform::fgSlice2Sector[36][2] = { { 0, 36},
163 Int_t AliL3Transform::fgSector2Slice[72] = { 0,
237 Int_t AliL3Transform::fgSectorLow[72] = { 1,
311 Double_t AliL3Transform::fgX[159] = { 85.195,
472 Int_t AliL3Transform::fgNPads[159] = {67,
633 Double_t AliL3Transform::fgCos[36] = { 0.9848077297,
671 Double_t AliL3Transform::fgSin[36] = { 0.1736481786,
710 Bool_t AliL3Transform::Init(AliRunLoader *runLoader)
712 //init with runloader
714 LOG(AliL3Log::kFatal,"AliL3Transform::Init","RunLoader")
715 <<" Missing RunLoader! 0x0"<<ENDLOG;
719 if(fgVersion != kVdefault)
720 LOG(AliL3Log::kWarning,"AliL3Transform::Init","Init values")
721 <<AliL3Log::kDec<<"You are initializing the parameters more than once; check your code please! "<<fgVersion<<ENDLOG;
723 TDirectory* savedir1 = gDirectory;
724 runLoader->CdGAFile();
725 AliTPCParamSR *param=(AliTPCParamSR*)gDirectory->Get(GetParamName());
729 LOG(AliL3Log::kFatal,"AliL3Transform::Init","File")
730 <<"No TPC parameters found!"<<ENDLOG;
734 AliTPCPRF2D * prfinner = new AliTPCPRF2D;
735 AliTPCPRF2D * prfouter1 = new AliTPCPRF2D;
736 AliTPCPRF2D * prfouter2 = new AliTPCPRF2D;
737 AliTPCRF1D * rf = new AliTPCRF1D(kTRUE);
738 rf->SetGauss(param->GetZSigma(),param->GetZWidth(),1.);
739 rf->SetOffset(3*param->GetZSigma());
742 TDirectory *savedir2=gDirectory;
743 TFile *prf_file = TFile::Open("$ALICE_ROOT/TPC/AliTPCprf2d.root");
744 if (!prf_file->IsOpen())
746 LOG(AliL3Log::kError,"AliL3Transform::Init","File")
747 <<"Can't open $ALICE_ROOT/TPC/AliTPCprf2d.root !"<<ENDLOG;
750 prfinner ->Read("prf_07504_Gati_056068_d02");
751 prfouter1->Read("prf_10006_Gati_047051_d03");
752 prfouter2->Read("prf_15006_Gati_047051_d03");
756 param->SetInnerPRF(prfinner);
757 param->SetOuter1PRF(prfouter1);
758 param->SetOuter2PRF(prfouter2);
759 param->SetTimeRF(rf);
761 fgNTimeBins = param->GetMaxTBin()+1;
762 fgNRowLow = param->GetNRowLow();
763 fgNRowUp = param->GetNRowUp();
764 fgNRowUp1 = param->GetNRowUp1();
765 fgNRowUp2 = param->GetNRowUp2();
766 fgNRow= fgNRowLow + fgNRowUp;
768 LOG(AliL3Log::kError,"AliL3Transform::Init","fNRow")
769 <<"Number of rows have changed in ALIROOT"<<ENDLOG;
773 fgNSectorLow = param->GetNInnerSector();
774 fgNSectorUp = param->GetNOuterSector();
775 fgNSector = fgNSectorLow + fgNSectorUp;
777 //test whether they were changes to the rotation shift
779 Float_t irotshift = param->GetInnerAngleShift(); //shift angle
780 Float_t orotshift = param->GetOuterAngleShift(); //shift angle
781 const Float_t kDegtoRad = 0.01745329251994;
782 Int_t shift1=TMath::Nint(irotshift/kDegtoRad);
783 Int_t shift2=TMath::Nint(orotshift/kDegtoRad+0.1);
784 if((shift1!=shift2) || (shift1!=10)){
785 LOG(AliL3Log::kError,"AliL3Transform::Init","Rotshiftangle")
786 <<"Rotation shift angle has changed in ALIROOT"<<ENDLOG;
789 fgNRotShift=0.5; //our version of the shift angle
793 SetBFieldFactor((Double_t)runLoader->GetAliRun()->Field()->Factor());
794 SetSolenoidBField((Double_t)runLoader->GetAliRun()->Field()->SolenoidField());
795 fgPadPitchWidthLow=param->GetInnerPadPitchWidth();
796 fgPadPitchWidthUp=param->GetOuterPadPitchWidth();
797 fgZWidth=param->GetZWidth();
798 fgZSigma=param->GetZSigma();
799 fgZLength=param->GetZLength();
800 fgZOffset=param->GetZOffset();
801 fgDiffT=param->GetDiffT();
802 fgDiffL=param->GetDiffL();
803 fgOmegaTau=param->GetOmegaTau();
804 fgInnerPadLength=param->GetInnerPadLength();
805 fgOuter1PadLength=param->GetOuter1PadLength();
806 fgOuter2PadLength=param->GetOuter2PadLength();
807 fgInnerPRFSigma=param->GetInnerPRF()->GetSigmaX();
808 fgOuter1PRFSigma=param->GetOuter1PRF()->GetSigmaX();
809 fgOuter2PRFSigma=param->GetOuter2PRF()->GetSigmaX();
810 fgTimeSigma=param->GetTimeRF()->GetSigma();
811 fgADCSat=param->GetADCSat();
812 fgZeroSup=param->GetZeroSup();
813 fgNSlice=fgNSectorLow;
816 for(Int_t i=0;i<fgNRow;i++){
818 if( i < fgNRowLow){sec =0;row =i;}
819 else{sec = fgNSectorLow;row =i-fgNRowLow;}
820 fgX[i]=param->GetPadRowRadii(sec,row);
822 for(Int_t i=0;i<fgNRow;i++){
824 if( i < fgNRowLow){sec =0;row =i;}
825 else{sec = fgNSectorLow;row =i-fgNRowLow;}
826 fgNPads[i]=param->GetNPads(sec,row);
828 for(Int_t i=0;i<fgNSector;i++){
829 if(i<fgNSectorLow) fgSectorLow[i]=1;
830 else fgSectorLow[i]=0;
837 Char_t tmpfile[1024];
838 sprintf(tmpfile,"./l3transform.config-%d",(Int_t)time.GetSec());
840 return SaveInitFile(tmpfile);
845 Bool_t AliL3Transform::Init(Char_t* path,Bool_t UseAliTPCParam)
847 //Overwrite the parameters with values stored in file "l3transform.config" in path.
848 //If file does not exist, old default values will be used.
849 //If flag UseAliTPCParam is set, the parameters will be read from the the rootfile
850 //which then has to be called path/digitfile.root
852 if(fgVersion != kVdefault)
853 LOG(AliL3Log::kWarning,"AliL3Transform::Init","Init values")
854 <<AliL3Log::kDec<<"You are initializing the parameters more than once; check your code please! "<<fgVersion<<ENDLOG;
856 if(UseAliTPCParam) //use rootfile to generate temporary init file
857 return ReadInit(path);
860 Char_t pathname[1024];
861 strcpy(pathname,path);
863 //test whether provided path is the file itself
865 DIR *testdir=opendir(pathname);
871 if(isdir) strcat(pathname,"/l3transform.config");
873 return ReadInitFile(pathname);
876 Bool_t AliL3Transform::ReadInitFile(Char_t* pathname)
878 //read transformer settings from pathname
879 FILE *fptr=fopen(pathname,"r");
881 LOG(AliL3Log::kWarning,"AliL3Transform::ReadInitFile","File Open")
882 <<"Pointer to Config File \""<<pathname<<"\" 0x0!"<<ENDLOG;
886 Char_t d1[250], d2[100], d3[100];
891 fscanf(fptr,"%s",d1);
892 if(strcmp(d1,"fVersion")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgVersion=dummy;}
893 else if(strcmp(d1,"fBFieldFactor")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgBFieldFactor=(Double_t)ddummy;}
894 else if(strcmp(d1,"fSolenoidBField")==0)
896 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);
897 fgSolenoidBField=(Double_t)ddummy;
899 else if(strcmp(d1,"fNTimeBins")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNTimeBins=(Int_t)dummy;}
900 else if(strcmp(d1,"fNRowLow")==0)
902 fscanf(fptr,"%s %d %s",d2,&dummy,d3);
903 fgNRowLow=(Int_t)dummy;
905 LOG(AliL3Log::kError,"AliL3Transform::ReadInitFile","Overflow")
906 <<"Number of inner PadRows should be 63! Check and fgrep the code for 63 to see the consequences of this major change!"<<ENDLOG;
908 else if(strcmp(d1,"fNRowUp")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNRowUp=(Int_t)dummy;}
909 else if(strcmp(d1,"fNRowUp1")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNRowUp1=(Int_t)dummy;}
910 else if(strcmp(d1,"fNRowUp2")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNRowUp2=(Int_t)dummy;}
911 else if(strcmp(d1,"fNSectorLow")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNSectorLow=(Int_t)dummy;}
912 else if(strcmp(d1,"fNSectorUp")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNSectorUp=(Int_t)dummy;}
913 else if(strcmp(d1,"fNSector")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNSector=(Int_t)dummy;}
914 else if(strcmp(d1,"fPadPitchWidthLow")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgPadPitchWidthLow=(Double_t)ddummy;}
915 else if(strcmp(d1,"fPadPitchWidthUp")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgPadPitchWidthUp=(Double_t)ddummy;}
916 else if(strcmp(d1,"fZWidth")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgZWidth=(Double_t)ddummy;}
917 else if(strcmp(d1,"fZSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgZSigma=(Double_t)ddummy;}
918 else if(strcmp(d1,"fZLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgZLength=(Double_t)ddummy;}
919 else if(strcmp(d1,"fZOffset")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgZOffset=(Double_t)ddummy;}
920 else if(strcmp(d1,"fNSlice")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNSlice=(Int_t)dummy;}
921 else if(strcmp(d1,"fDiffT")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgDiffT=(Double_t)ddummy;}
922 else if(strcmp(d1,"fDiffL")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgDiffL=(Double_t)ddummy;}
923 else if(strcmp(d1,"fOmegaTau")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgOmegaTau=(Double_t)ddummy;}
924 else if(strcmp(d1,"fInnerPadLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgInnerPadLength=(Double_t)ddummy;}
925 else if(strcmp(d1,"fOuter1PadLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgOuter1PadLength=(Double_t)ddummy;}
926 else if(strcmp(d1,"fOuter2PadLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgOuter2PadLength=(Double_t)ddummy;}
927 else if(strcmp(d1,"fInnerPRFSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgInnerPRFSigma=(Double_t)ddummy;}
928 else if(strcmp(d1,"fOuter1PRFSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgOuter1PRFSigma=(Double_t)ddummy;}
929 else if(strcmp(d1,"fOuter2PRFSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgOuter2PRFSigma=(Double_t)ddummy;}
930 else if(strcmp(d1,"fTimeSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgTimeSigma=(Double_t)ddummy;}
931 else if(strcmp(d1,"fADCSat")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgADCSat=(Int_t)dummy;}
932 else if(strcmp(d1,"fZeroSup")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgZeroSup=(Int_t)dummy;}
933 else if(strcmp(d1,"fNRow")==0){
934 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNRow=(Int_t)dummy;
936 LOG(AliL3Log::kError,"AliL3Transform::ReadInitFile","Overflow")<<"Number of PadRows should be 159! Check and fgrep the code for 159 to see the consequences of this major change!"<<ENDLOG;
939 else if(strcmp(d1,"fNRotShift")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgNRotShift=(Double_t)ddummy;}
940 else if(strcmp(d1,"fX[0]")==0){
941 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgX[0]=(Double_t)ddummy;
942 for(Int_t i=1;i<fgNRow;i++){fscanf(fptr,"%s %s %lf %s",d1,d2,&ddummy,d3);fgX[i]=(Double_t)ddummy;}
944 else if(strcmp(d1,"fNPads[0]")==0){
945 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNPads[0]=(Int_t)dummy;
946 for(Int_t i=1;i<fgNRow;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgNPads[i]=(Int_t)dummy;}
948 else if(strcmp(d1,"fNRows[0]")==0){
949 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNRows[0]=(Int_t)dummy;
950 for(Int_t i=1;i<fgNPatches;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgNRows[i]=(Int_t)dummy;}
952 else if(strcmp(d1,"fRows[0][0]")==0){
953 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgRows[0][0]=(Int_t)dummy;
954 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgRows[0][1]=(Int_t)dummy;
955 for(Int_t i=1;i<fgNPatches;i++){
956 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgRows[i][0]=(Int_t)dummy;
957 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgRows[i][1]=(Int_t)dummy;
960 else if(strcmp(d1,"fSlice2Sector[0][0]")==0){
961 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgSlice2Sector[0][0]=(Int_t)dummy;
962 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgSlice2Sector[0][1]=(Int_t)dummy;
963 for(Int_t i=1;i<fgNSlice;i++){
964 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgSlice2Sector[i][0]=(Int_t)dummy;
965 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgSlice2Sector[i][1]=(Int_t)dummy;
968 else if(strcmp(d1,"fSector2Slice[0]")==0){
969 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgSector2Slice[0]=(Int_t)dummy;
970 for(Int_t i=1;i<fgNSector;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgSector2Slice[i]=(Int_t)dummy;}
972 else if(strcmp(d1,"fSectorLow[0]")==0){
973 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgSectorLow[0]=(Int_t)dummy;
974 for(Int_t i=1;i<fgNSector;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgSectorLow[i]=(Int_t)dummy;}
976 else if(strcmp(d1,"fCos[0]")==0){
977 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgCos[0]=(Double_t)ddummy;
978 for(Int_t i=1;i<fgNSlice;i++){fscanf(fptr,"%s %s %lf %s",d1,d2,&ddummy,d3);fgCos[i]=(Double_t)ddummy;}
980 else if(strcmp(d1,"fSin[0]")==0){
981 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgSin[0]=(Double_t)ddummy;
982 for(Int_t i=1;i<fgNSlice;i++){fscanf(fptr,"%s %s %lf %s",d1,d2,&ddummy,d3);fgSin[i]=(Double_t)ddummy;}
987 //The first multiplier gives the scale factor used to modify the field map
988 //defined by the second multiplier.
989 fgBField=fgBFieldFactor*fgSolenoidBField*0.1;
991 //Test if new config file has been used.
992 if(fgVersion==kVdeprecated){
993 LOG(AliL3Log::kError,"AliL3Transform::ReadInitFile","Version")
994 <<"Version is deprecated, you have to create a new config file."<<ENDLOG;
998 LOG(AliL3Log::kInformational,"AliL3Transform::ReadInitFile","Config")
999 <<"Successfully loaded values from config file \""<<pathname<<"\""<<ENDLOG;
1004 Bool_t AliL3Transform::ReadInit(Char_t *path)
1006 //Read all the parameters from a aliroot file, and store it in a temporary
1007 //file which is read by Init. Use this if you want to read the parameters from
1008 //the rootfile "every" time.
1011 LOG(AliL3Log::kError,"AliL3Transform::ReadInit","Version")
1012 <<"You have to compile with use_aliroot flag in order to read from AliROOT file"<<ENDLOG;
1015 Char_t filename[1024];
1016 //first test whether provided path is the rootfile itself
1017 Int_t saveErrIgLevel=gErrorIgnoreLevel;
1018 gErrorIgnoreLevel=kFatal; //dont report errors
1019 TFile *rootfile = TFile::Open(path);
1020 if(!rootfile || rootfile->IsZombie())
1021 { //ok assume its path to alirunfile file
1022 sprintf(filename,"%s/alirunfile.root",path); //create rootfile name
1023 } else { //path contains itself the rootfile name
1025 sprintf(filename,"%s",path);
1027 gErrorIgnoreLevel=saveErrIgLevel;
1029 //finally make dummy init file /tmp/$USER/l3transform.config-`date`
1030 Char_t tmppath[1024];
1031 sprintf(tmppath,"/tmp/%s",gSystem->Getenv("USER"));
1032 gSystem->mkdir(tmppath);
1034 Char_t tmpfile[1024];
1035 sprintf(tmpfile,"%s/l3transform.config-%d",tmppath,(Int_t)time.GetSec());
1036 return MakeInitFile(filename,tmpfile);
1040 Bool_t AliL3Transform::MakeInitFile(Char_t *rootfilename,Char_t *filename)
1042 //Get the parameters from rootfile, and store it on the file "l3transform.config"
1043 //which is being read by Init. fVersion will be kV_aliroot!
1046 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","Version")
1047 <<"You have to compile with use_aliroot flag in order to use this function"<<ENDLOG;
1050 TFile *rootfile = TFile::Open(rootfilename);
1053 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","File")
1054 <<"Could not open file: "<<rootfilename<<ENDLOG;
1057 AliRun *gAlice = (AliRun*)rootfile->Get("gAlice");
1060 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","File")
1061 <<"No gAlice in file: "<<rootfilename<<ENDLOG;
1064 AliTPCParamSR *param=(AliTPCParamSR*)rootfile->Get(GetParamName());
1067 LOG(AliL3Log::kWarning,"AliL3Transform::MakeInitFile","File")
1068 <<"No TPC parameters found in \""<<rootfilename
1069 <<"\", creating standard parameters "
1070 <<"which might not be what you want!"<<ENDLOG;
1071 param=new AliTPCParamSR;
1074 AliTPCPRF2D * prfinner = new AliTPCPRF2D;
1075 AliTPCPRF2D * prfouter1 = new AliTPCPRF2D;
1076 AliTPCPRF2D * prfouter2 = new AliTPCPRF2D;
1077 AliTPCRF1D * rf = new AliTPCRF1D(kTRUE);
1078 rf->SetGauss(param->GetZSigma(),param->GetZWidth(),1.);
1079 rf->SetOffset(3*param->GetZSigma());
1082 TDirectory *savedir=gDirectory;
1083 TFile *prf_file = TFile::Open("$ALICE_ROOT/TPC/AliTPCprf2d.root");
1084 if (!prf_file->IsOpen())
1086 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","File")
1087 <<"Can't open $ALICE_ROOT/TPC/AliTPCprf2d.root !"<<ENDLOG;
1090 prfinner ->Read("prf_07504_Gati_056068_d02");
1091 prfouter1->Read("prf_10006_Gati_047051_d03");
1092 prfouter2->Read("prf_15006_Gati_047051_d03");
1096 param->SetInnerPRF(prfinner);
1097 param->SetOuter1PRF(prfouter1);
1098 param->SetOuter2PRF(prfouter2);
1099 param->SetTimeRF(rf);
1101 fgNTimeBins = param->GetMaxTBin()+1;
1102 fgNRowLow = param->GetNRowLow();
1103 fgNRowUp = param->GetNRowUp();
1104 fgNRowUp1 = param->GetNRowUp1();
1105 fgNRowUp2 = param->GetNRowUp2();
1106 fgNRow= fgNRowLow + fgNRowUp;
1108 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","fNRow")
1109 <<"Number of rows have changed in ALIROOT"<<ENDLOG;
1113 fgNSectorLow = param->GetNInnerSector();
1114 fgNSectorUp = param->GetNOuterSector();
1115 fgNSector = fgNSectorLow + fgNSectorUp;
1117 //test whether they were changes to the rotation shift
1119 Float_t irotshift = param->GetInnerAngleShift(); //shift angle
1120 Float_t orotshift = param->GetOuterAngleShift(); //shift angle
1121 const Float_t kDegtoRad = 0.01745329251994;
1122 Int_t shift1=TMath::Nint(irotshift/kDegtoRad);
1123 Int_t shift2=TMath::Nint(orotshift/kDegtoRad+0.1);
1124 if((shift1!=shift2) || (shift1!=10)){
1125 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","Rotshiftangle")
1126 <<"Rotation shift angle has changed in ALIROOT"<<ENDLOG;
1129 fgNRotShift=0.5; //our version of the shift angle
1132 fgVersion=kValiroot;
1133 SetBFieldFactor((Double_t)gAlice->Field()->Factor());
1134 SetSolenoidBField((Double_t)gAlice->Field()->SolenoidField());
1135 fgPadPitchWidthLow=param->GetInnerPadPitchWidth();
1136 fgPadPitchWidthUp=param->GetOuterPadPitchWidth();
1137 fgZWidth=param->GetZWidth();
1138 fgZSigma=param->GetZSigma();
1139 fgZLength=param->GetZLength();
1140 fgZOffset=param->GetZOffset();
1141 fgDiffT=param->GetDiffT();
1142 fgDiffL=param->GetDiffL();
1143 fgOmegaTau=param->GetOmegaTau();
1144 fgInnerPadLength=param->GetInnerPadLength();
1145 fgOuter1PadLength=param->GetOuter1PadLength();
1146 fgOuter2PadLength=param->GetOuter2PadLength();
1147 fgInnerPRFSigma=param->GetInnerPRF()->GetSigmaX();
1148 fgOuter1PRFSigma=param->GetOuter1PRF()->GetSigmaX();
1149 fgOuter2PRFSigma=param->GetOuter2PRF()->GetSigmaX();
1150 fgTimeSigma=param->GetTimeRF()->GetSigma();
1151 fgADCSat=param->GetADCSat();
1152 fgZeroSup=param->GetZeroSup();
1153 fgNSlice=fgNSectorLow;
1156 for(Int_t i=0;i<fgNRow;i++){
1158 if( i < fgNRowLow){sec =0;row =i;}
1159 else{sec = fgNSectorLow;row =i-fgNRowLow;}
1160 fgX[i]=param->GetPadRowRadii(sec,row);
1162 for(Int_t i=0;i<fgNRow;i++){
1164 if( i < fgNRowLow){sec =0;row =i;}
1165 else{sec = fgNSectorLow;row =i-fgNRowLow;}
1166 fgNPads[i]=param->GetNPads(sec,row);
1168 for(Int_t i=0;i<fgNSector;i++){
1169 if(i<fgNSectorLow) fgSectorLow[i]=1;
1170 else fgSectorLow[i]=0;
1177 return SaveInitFile(filename);
1181 Bool_t AliL3Transform::SaveInitFile(Char_t *filenamepath)
1183 //store the parameters in the file "filenamepath"
1185 FILE *f = fopen(filenamepath,"w");
1187 LOG(AliL3Log::kError,"AliL3Transform::SaveInitFile","File")
1188 <<"Could not open file: "<<filenamepath<<ENDLOG;
1192 fprintf(f,"void AliL3Transform::Init(){\n");
1193 fprintf(f," fVersion = %d;\n", fgVersion);
1194 fprintf(f," fBFieldFactor = %.3f;\n",fgBFieldFactor);
1195 fprintf(f," fSolenoidBField = %.3f;\n",fgSolenoidBField);
1196 fprintf(f," fNTimeBins = %d;\n",fgNTimeBins);
1197 fprintf(f," fNRowLow = %d;\n",fgNRowLow);
1198 fprintf(f," fNRowUp = %d;\n",fgNRowUp);
1199 fprintf(f," fNRowUp1 = %d;\n",fgNRowUp1);
1200 fprintf(f," fNRowUp2 = %d;\n",fgNRowUp2);
1201 fprintf(f," fNSectorLow = %d;\n",fgNSectorLow);
1202 fprintf(f," fNSectorUp = %d;\n",fgNSectorUp);
1203 fprintf(f," fNSector = %d;\n",fgNSector);
1204 fprintf(f," fPadPitchWidthLow = %.3f;\n",fgPadPitchWidthLow);
1205 fprintf(f," fPadPitchWidthUp = %.3f;\n",fgPadPitchWidthUp);
1206 fprintf(f," fZWidth = %.4f;\n",fgZWidth);
1207 fprintf(f," fZSigma = %.4f;\n",fgZSigma);
1208 fprintf(f," fZLength = %.4f;\n",fgZLength);
1209 fprintf(f," fZOffset = %.4f;\n",fgZOffset);
1210 fprintf(f," fDiffT = %.4f;\n",fgDiffT);
1211 fprintf(f," fDiffL = %.4f;\n",fgDiffL);
1212 fprintf(f," fOmegaTau = %.4f;\n",fgOmegaTau);
1213 fprintf(f," fInnerPadLength = %.3f;\n",fgInnerPadLength);
1214 fprintf(f," fOuter1PadLength = %.3f;\n",fgOuter1PadLength);
1215 fprintf(f," fOuter2PadLength = %.3f;\n",fgOuter2PadLength);
1216 fprintf(f," fInnerPRFSigma = %.6f;\n",fgInnerPRFSigma);
1217 fprintf(f," fOuter1PRFSigma = %.6f;\n",fgOuter1PRFSigma);
1218 fprintf(f," fOuter2PRFSigma = %.6f;\n",fgOuter2PRFSigma);
1219 fprintf(f," fTimeSigma = %.6f;\n",fgTimeSigma);
1220 fprintf(f," fADCSat = %d;\n",fgADCSat);
1221 fprintf(f," fZeroSup = %d;\n",fgZeroSup);
1222 fprintf(f," fNSlice = %d;\n",fgNSlice);
1223 fprintf(f," fNRow = %d;\n",fgNRow);
1224 fprintf(f," fNRotShift = %.2f;\n",fgNRotShift);
1226 for(Int_t i=0;i<fgNRow;i++){
1227 fprintf(f," fX[%d] = %3.2f;\n",i,fgX[i]);
1229 for(Int_t i=0;i<fgNRow;i++){
1230 fprintf(f," fNPads[%d] = %d;\n",i,fgNPads[i]);
1233 //Slice/Sector dont belong to aliroot, but we want to be flexible
1234 for(Int_t i=0;i<fgNSlice;i++){
1235 fprintf(f," fSlice2Sector[%d][0] = %d;\n",i,fgSlice2Sector[i][0]);
1236 fprintf(f," fSlice2Sector[%d][1] = %d;\n",i,fgSlice2Sector[i][1]);
1238 for(Int_t i=0;i<fgNSector;i++){
1239 fprintf(f," fSector2Slice[%d] = %d;\n",i,fgSector2Slice[i]);
1241 for(Int_t i=0;i<fgNSector;i++){
1242 fprintf(f," fSectorLow[%d] = %d;\n",i,fgSectorLow[i]);
1245 //Patches also dont really belong to the aliroot settings (but nevermind)
1246 for(Int_t i=0;i<fgNPatches;i++){
1247 fprintf(f," fNRows[%d] = %d;\n",i,fgNRows[i]);
1249 for(Int_t i=0;i<fgNPatches;i++){
1250 fprintf(f," fRows[%d][0] = %d;\n",i,fgRows[i][0]);
1251 fprintf(f," fRows[%d][1] = %d;\n",i,fgRows[i][1]);
1254 //Rotation shift is an addon, too
1255 for(Int_t i=0;i<fgNSlice;i++){
1256 Float_t cs = cos( (2*fgkPi/18) * (i+fgNRotShift) );
1257 fprintf(f," fCos[%d] = %.10f;\n",i,cs);
1259 for(Int_t i=0;i<fgNSlice;i++){
1260 Float_t sn = sin( (2*fgkPi/18) * (i+fgNRotShift) );
1261 fprintf(f," fSin[%d] = %.10f;\n",i,sn);
1267 LOG(AliL3Log::kInformational,"AliL3Transform::SaveInitFile","File created")
1268 <<"Init file \""<<filenamepath<<"\" created"<<ENDLOG;
1273 Int_t AliL3Transform::GetNPads(Int_t row)
1275 //get number of pads per row
1276 if(row < 0 || row >= fgNRow)
1278 LOG(AliL3Log::kError,"AliL3Transform::GetNPads","Row")
1279 <<AliL3Log::kDec<<"Wrong row "<<row<<ENDLOG;
1283 return fgNPads[row];
1286 Int_t AliL3Transform::GetFirstRow(Int_t patch)
1288 //get first row per patch
1292 else if(patch < -1 || patch >= 6)
1294 LOG(AliL3Log::kError,"AliL3Transform::GetFirstRow","Patch")
1295 <<AliL3Log::kDec<<"Wrong patch "<<patch<<ENDLOG;
1299 return fgRows[patch][0];
1302 Int_t AliL3Transform::GetLastRow(Int_t patch)
1304 //get last row per patch
1306 return fgRows[5][1];
1307 else if(patch < -1 || patch >= 6)
1309 LOG(AliL3Log::kError,"AliL3Transform::GetLastRow","Patch")
1310 <<AliL3Log::kDec<<"Wrong patch "<<patch<<ENDLOG;
1314 return fgRows[patch][1];
1317 Int_t AliL3Transform::GetNRows(Int_t patch)
1319 //get number of rows per patch
1322 else if(patch < -1 || patch >= 6)
1324 LOG(AliL3Log::kError,"AliL3Transform::GetNRows","Patch")
1325 <<AliL3Log::kDec<<"Wrong patch "<<patch<<ENDLOG;
1329 return fgNRows[patch];
1332 Int_t AliL3Transform::GetPadRow(Float_t xvalue)
1334 //Find the padrow number corresponding to cartesian _local_ x value
1335 if(xvalue < 0 || xvalue > 250)
1337 LOG(AliL3Log::kError,"AliL3Transform::GetPadRow","X-value")
1338 <<AliL3Log::kDec<<"Suspicious x-value, make sure it is in local coordinate! "
1343 Int_t x = (Int_t)rint(xvalue*10);
1344 if(x < (Int_t)rint(fgX[1]*10))
1346 else if(x > (Int_t)rint(fgX[fgNRow-2]*10))
1350 Int_t padrow=1; //Of course, a more clever algorithm could help here
1351 while(padrow < fgNRow-2)
1353 if(x > (Int_t)rint(fgX[padrow-1]*10) && x < (Int_t)rint(fgX[padrow+1]*10))
1361 Int_t AliL3Transform::GetPatch(Int_t padrow)
1363 //get patch for padrow
1364 if(padrow < 0 || padrow >= fgNRow)
1366 LOG(AliL3Log::kError,"AliL3Transform::GetPatch","Padrow")
1367 <<AliL3Log::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1371 while(patch < fgNPatches)
1373 if(padrow >= fgRows[patch][0] && padrow <= fgRows[patch][1])
1380 Double_t AliL3Transform::GetPadLength(Int_t padrow)
1382 //get pad length for padrow
1383 if(padrow >= fgNRow){
1384 LOG(AliL3Log::kError,"AliL3Transform::GetPadLength","Padrow")
1385 <<AliL3Log::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1389 if(padrow < fgNRowLow)
1390 return fgInnerPadLength;
1391 if(padrow >= fgNRowLow && padrow < fgNRowLow + fgNRowUp1 - 1)
1392 return fgOuter1PadLength;
1393 if(padrow >= fgNRowLow + fgNRowUp1 - 1)
1394 return fgOuter2PadLength;
1396 //should never happen
1397 LOG(AliL3Log::kError,"AliL3Transform::GetPadLength","Padrow")
1398 <<AliL3Log::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1402 Double_t AliL3Transform::GetPadPitchWidth(Int_t patch)
1404 //get pad patch width for patch
1405 if(patch < 0 || patch > fgNPatches)
1407 LOG(AliL3Log::kError,"AliL3Transform::GetPadPitchWidth","patct")
1408 <<AliL3Log::kDec<<"Wrong patch "<<patch<<ENDLOG;
1411 return patch < 2 ? fgPadPitchWidthLow : fgPadPitchWidthUp;
1414 Double_t AliL3Transform::GetParSigmaY2(Int_t padrow,Float_t z,Float_t angle)
1416 //Calculate the expected transverse cluster width as a function of
1417 //drift distance and crossing angle.
1418 //z = local z-coordinate of cluster
1419 //angle = track crossing angle with normal to padrow plane
1420 //return value = sigma^2 (cartesian coordinates)
1424 drift = fgZLength - z;
1426 drift = fgZLength + z;
1428 Double_t t1 = GetPRFSigma(padrow)*GetPRFSigma(padrow);
1429 Double_t t2 = fgDiffT*fgDiffT*drift;
1430 Double_t t3 = GetPadLength(padrow)*GetPadLength(padrow)*tan(angle)*tan(angle)/12;
1431 Double_t t4 = fgkAnodeWireSpacing*fgkAnodeWireSpacing*(tan(angle) - fgOmegaTau)*(tan(angle) - fgOmegaTau)/12;
1433 return (t1 + t2 + t3 + t4);
1436 Double_t AliL3Transform::GetParSigmaZ2(Int_t padrow,Float_t z,Float_t tgl)
1438 //Calculate the expected longitudinal cluster width as a function of
1439 //drift distance and track crossing angle.
1440 //z = local z-coordinate of cluster
1441 //tgl = tan(dipangle)
1442 //return value = sigma^2 (cartesian coordinates)
1446 drift = AliL3Transform::GetZLength() - z;
1448 drift = AliL3Transform::GetZLength() + z;
1450 Double_t t1 = fgZSigma*fgZSigma;
1451 Double_t t2 = fgDiffL*fgDiffL*drift;
1452 Double_t t3 = GetPadLength(padrow)*GetPadLength(padrow)*tgl*tgl/12;
1454 return (t1 + t2 + t3);
1457 Double_t AliL3Transform::GetPRFSigma(Int_t padrow)
1459 //get sigma of pad response function for padrow
1461 if(padrow >= fgNRow){
1462 LOG(AliL3Log::kError,"AliL3Transform::GetPRFSigma","Padrow")
1463 <<AliL3Log::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1466 if(padrow < fgNRowLow)
1467 return fgInnerPRFSigma;
1468 if(padrow >= fgNRowLow && padrow < fgNRowLow + fgNRowUp1 - 1)
1469 return fgOuter1PRFSigma;
1470 if(padrow >= fgNRowLow + fgNRowUp1 - 1)
1471 return fgOuter2PRFSigma;
1473 //should never happen
1474 LOG(AliL3Log::kError,"AliL3Transform::GetPRFSigma","Padrow")
1475 <<AliL3Log::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1479 Double_t AliL3Transform::GetEta(Float_t *xyz)
1482 Double_t r3 = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
1483 Double_t eta = 0.5 * log((r3+xyz[2])/(r3-xyz[2]));
1487 void AliL3Transform::XYZtoRPhiEta(Float_t *rpe, Float_t *xyz)
1489 //transform xyz into rpe
1490 rpe[0] = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
1491 rpe[1] = atan2(xyz[1],xyz[0]);
1492 rpe[2] = 0.5 * log((rpe[0]+xyz[2])/(rpe[0]-xyz[2]));
1495 Double_t AliL3Transform::GetEta(Int_t slice,Int_t padrow,Int_t pad,Int_t time)
1500 Slice2Sector(slice,padrow,sector,row);
1501 Raw2Local(xyz,sector,row,pad,time);
1506 Double_t AliL3Transform::GetPhi(Float_t *xyz)
1509 Double_t phi = atan2(xyz[1],xyz[0]);
1513 Bool_t AliL3Transform::Slice2Sector(Int_t slice, Int_t slicerow, Int_t & sector, Int_t &row)
1515 //slice to sector number
1516 if(slicerow<0&&slicerow>=fgNRow){
1517 LOG(AliL3Log::kError,"AliL3Transform::Slice2Sector","Slicerow")
1518 <<AliL3Log::kDec<<"Wrong slicerow "<<slicerow<<ENDLOG;
1521 if(slice<0||slice>=fgNSlice){
1522 LOG(AliL3Log::kError,"AliL3Transform::Slice2Sector","Slice")
1523 <<AliL3Log::kDec<<"Wrong slice "<<slice<<ENDLOG;
1527 if(slicerow<fgNRowLow){
1528 sector = fgSlice2Sector[slice][0];
1532 sector = fgSlice2Sector[slice][1];
1533 row = slicerow-fgNRowLow;
1539 Bool_t AliL3Transform::Sector2Slice(Int_t & slice, Int_t sector)
1542 if(sector<0||sector>=fgNSector){
1543 LOG(AliL3Log::kError,"AliL3Transform::Sector2Slice","Sector")
1544 <<AliL3Log::kDec<<"Wrong sector "<<sector<<ENDLOG;
1548 slice=fgSector2Slice[sector];
1553 Bool_t AliL3Transform::Sector2Slice(Int_t & slice, Int_t & slicerow, Int_t sector, Int_t row)
1556 if(sector<0 || sector>=fgNSector){
1557 LOG(AliL3Log::kError,"AliL3Transform::Sector2Slice","Sector")
1558 <<AliL3Log::kDec<<"Wrong sector "<<sector<<ENDLOG;
1562 LOG(AliL3Log::kError,"AliL3Transform::Sector2Slice","Row")
1563 <<AliL3Log::kDec<<"Wrong row "<<row<<ENDLOG;
1567 if(fgSectorLow[sector]){
1569 LOG(AliL3Log::kError,"AliL3Transform::Sector2Slice","Row")
1570 <<AliL3Log::kDec<<"Wrong row "<<row<<ENDLOG;
1573 slice = fgSector2Slice[sector];
1578 LOG(AliL3Log::kError,"AliL3Transform::Sector2Slice","Row")
1579 <<AliL3Log::kDec<<"Wrong row "<<row<<ENDLOG;
1582 slice = fgSector2Slice[sector];
1583 slicerow = row + fgNRowLow;
1589 Double_t AliL3Transform::GetMaxY(Int_t slicerow)
1591 //get maximum y value (for slice 0)
1592 if(slicerow < fgNRowLow)
1593 return fgPadPitchWidthLow*fgNPads[slicerow]/2;
1596 return fgPadPitchWidthUp*fgNPads[slicerow]/2;
1600 Double_t AliL3Transform::Row2X(Int_t slicerow)
1602 //slicerow to X value (slice 0)
1603 if(slicerow<0||slicerow>=fgNRow){
1604 LOG(AliL3Log::kError,"AliL3Transform::Row2X","Slicerow")
1605 <<AliL3Log::kDec<<"Wrong slicerow "<<slicerow<<ENDLOG;
1608 return fgX[slicerow];
1611 Double_t AliL3Transform::GetZFast(Int_t slice, Int_t time, Float_t vertex)
1614 Double_t z=fgZWidth*time-fgZOffset;
1616 z=fgZLength-z-vertex;
1618 z=z-fgZLength-vertex;
1622 void AliL3Transform::Local2Global(Float_t *xyz,Int_t slice)
1624 //Transformation to global coordinate system
1625 Float_t x0 = xyz[0];
1626 Float_t y0 = xyz[1];
1628 xyz[0]=x0*fgCos[slice]-y0*fgSin[slice];
1629 xyz[1]=x0*fgSin[slice]+y0*fgCos[slice];
1630 xyz[2]=xyz[2];//global z=local z
1633 void AliL3Transform::Local2GlobalAngle(Float_t *angle,Int_t slice)
1636 angle[0] = fmod(angle[0]+(slice+fgNRotShift)*(2*fgkPi/18),2*fgkPi);
1639 void AliL3Transform::Global2LocalAngle(Float_t *angle,Int_t slice)
1642 angle[0] = angle[0]-(slice+fgNRotShift)*(2*fgkPi/18);
1643 if(angle[0]<0) angle[0]+=2*fgkPi;
1646 void AliL3Transform::Raw2Local(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
1648 //Transformation from rawdata to local coordinate system
1650 Int_t slice,slicerow;
1651 Sector2Slice(slice, slicerow, sector, row);
1654 xyz[0]=Row2X(slicerow);
1657 Int_t npads= fgNPads[slicerow];
1659 if(fgSectorLow[sector])
1660 xyz[1]=(pad-0.5*(npads-1))*fgPadPitchWidthLow;
1662 xyz[1]=(pad-0.5*(npads-1))*fgPadPitchWidthUp;
1664 //Z-Value (remember PULSA Delay)
1666 xyz[2]=fgZLength-fgZWidth*time+fgZOffset;
1668 xyz[2]=fgZWidth*time-fgZOffset-fgZLength;
1671 void AliL3Transform::Raw2Local(Float_t *xyz,Int_t sector,Int_t row,Int_t pad,Int_t time)
1673 //Transformation from rawdata to local coordinate system
1675 Int_t slice,slicerow;
1676 Sector2Slice(slice, slicerow, sector, row);
1679 xyz[0]=Row2X(slicerow);
1682 Int_t npads= fgNPads[slicerow];
1684 if(fgSectorLow[sector])
1685 xyz[1]=(pad-0.5*(npads-1))*fgPadPitchWidthLow;
1687 xyz[1]=(pad-0.5*(npads-1))*fgPadPitchWidthUp;
1689 //Z-Value (remember PULSA Delay)
1691 xyz[2]=fgZLength-fgZWidth*time+fgZOffset;
1693 xyz[2]=fgZWidth*time-fgZOffset-fgZLength;
1696 void AliL3Transform::RawHLT2Local(Float_t *xyz,Int_t slice,
1697 Int_t slicerow,Float_t pad,Float_t time)
1699 //Transformation from HLT rawdata to local coordinate system
1702 xyz[0]=Row2X(slicerow);
1705 Int_t npads= fgNPads[slicerow];
1706 if(slicerow<fgNRowLow)
1707 xyz[1]=(pad-0.5*(npads-1))*fgPadPitchWidthLow;
1709 xyz[1]=(pad-0.5*(npads-1))*fgPadPitchWidthUp;
1713 xyz[2]=fgZLength-fgZWidth*time+fgZOffset;
1715 xyz[2]=fgZWidth*time-fgZOffset-fgZLength;
1718 void AliL3Transform::RawHLT2Local(Float_t *xyz,Int_t slice,
1719 Int_t slicerow,Int_t pad,Int_t time)
1721 //Transformation from HLT rawdata to local coordinate system
1724 xyz[0]=Row2X(slicerow);
1727 Int_t npads= fgNPads[slicerow];
1728 if(slicerow<fgNRowLow)
1729 xyz[1]=(pad-0.5*(npads-1))*fgPadPitchWidthLow;
1731 xyz[1]=(pad-0.5*(npads-1))*fgPadPitchWidthUp;
1735 xyz[2]=fgZLength-fgZWidth*time+fgZOffset;
1737 xyz[2]=fgZWidth*time-fgZOffset-fgZLength;
1740 void AliL3Transform::Local2Global(Float_t *xyz,Int_t sector,Int_t row)
1742 //Transformation to global coordinate system
1743 Int_t slice,slicerow;
1744 Sector2Slice(slice, slicerow, sector, row);
1745 Float_t r=Row2X(slicerow); //have to get x value first
1747 xyz[0]=r*fgCos[slice]-xyz[1]*fgSin[slice];
1748 xyz[1]=r*fgSin[slice]+xyz[1]*fgCos[slice];
1749 xyz[2]=xyz[2];//global z=local z
1752 void AliL3Transform::LocHLT2Global(Float_t *xyz,Int_t slice,Int_t slicerow)
1754 //Transformation from HLT to global coordinate system
1755 Float_t r=Row2X(slicerow); //have to get x value first
1757 xyz[0]=r*fgCos[slice]-xyz[1]*fgSin[slice];
1758 xyz[1]=r*fgSin[slice]+xyz[1]*fgCos[slice];
1759 xyz[2]=xyz[2];//global z=local z
1762 void AliL3Transform::Global2Local(Float_t *xyz,Int_t sector)
1765 Sector2Slice(slice, sector);
1767 Float_t x1 = xyz[0]*fgCos[slice] + xyz[1]*fgSin[slice];
1768 Float_t y1 = -xyz[0]*fgSin[slice] + xyz[1]*fgCos[slice];
1773 void AliL3Transform::Global2LocHLT(Float_t *xyz,Int_t slice)
1775 Float_t x1 = xyz[0]*fgCos[slice] + xyz[1]*fgSin[slice];
1776 Float_t y1 = -xyz[0]*fgSin[slice] + xyz[1]*fgCos[slice];
1781 void AliL3Transform::Raw2Global(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
1783 //Transformation from raw to global coordinates
1785 Raw2Local(xyz,sector,row,pad,time);
1786 Local2Global(xyz,sector,row);
1789 void AliL3Transform::Raw2Global(Float_t *xyz,Int_t sector,Int_t row,Int_t pad,Int_t time)
1791 //Transformation from raw to global coordinates
1793 Raw2Local(xyz,sector,row,pad,time);
1794 Local2Global(xyz,sector,row);
1797 void AliL3Transform::RawHLT2Global(Float_t *xyz,Int_t slice,
1798 Int_t slicerow,Float_t pad,Float_t time)
1800 //Transformation from raw to global coordinates
1802 RawHLT2Local(xyz,slice,slicerow,pad,time);
1803 LocHLT2Global(xyz,slice,slicerow);
1806 void AliL3Transform::RawHLT2Global(Float_t *xyz,Int_t slice,
1807 Int_t slicerow,Int_t pad,Int_t time)
1809 //Transformation from raw to global coordinates
1811 RawHLT2Local(xyz,slice,slicerow,pad,time);
1812 LocHLT2Global(xyz,slice,slicerow);
1815 void AliL3Transform::Local2Raw(Float_t *xyz,Int_t sector,Int_t row)
1817 //Transformation from local coordinates to raw
1819 Int_t slice,slicerow;
1820 Sector2Slice(slice, slicerow, sector, row);
1824 if(fgSectorLow[sector])
1825 xyz[1]=xyz[1]/fgPadPitchWidthLow+0.5*(fgNPads[slicerow]-1);
1827 xyz[1]=xyz[1]/fgPadPitchWidthUp+0.5*(fgNPads[slicerow]-1);
1830 xyz[2]=(fgZLength-xyz[2]+fgZOffset)/fgZWidth;
1832 xyz[2]=(fgZLength+xyz[2]+fgZOffset)/fgZWidth;
1835 void AliL3Transform::LocHLT2Raw(Float_t *xyz,Int_t slice,Int_t slicerow)
1837 //Transformation from local coordinates to raw
1841 if(slicerow<fgNRowLow)
1842 xyz[1]=xyz[1]/fgPadPitchWidthLow+0.5*(fgNPads[slicerow]-1);
1844 xyz[1]=xyz[1]/fgPadPitchWidthUp+0.5*(fgNPads[slicerow]-1);
1847 xyz[2]=(fgZLength-xyz[2]+fgZOffset)/fgZWidth;
1849 xyz[2]=(fgZLength+xyz[2]+fgZOffset)/fgZWidth;
1852 void AliL3Transform::Global2Raw(Float_t *xyz,Int_t sector,Int_t row)
1854 //Transformation from global coordinates to raw.
1856 Global2Local(xyz,sector);
1857 Local2Raw(xyz,sector,row);
1860 void AliL3Transform::Global2HLT(Float_t *xyz,Int_t slice,Int_t slicerow)
1862 //Transformation from global coordinates to raw.
1864 Global2LocHLT(xyz,slice);
1865 LocHLT2Raw(xyz,slice,slicerow);
1868 void AliL3Transform::PrintCompileOptions()
1870 //print compile options
1871 #if defined(__GNUC__)
1872 cout << "Compiler (g++) version used: " << __GNUC__ << endl;
1876 cout << "STANDALONE version: -Dno_root was given." << endl;
1878 const Char_t *roottest="$ROOTSYS/bin/root -n -b -q | grep Version | cut -b 17-25 | cut -d\" \" -f1";
1881 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";
1883 const Char_t *aliroottest="Unknown";
1885 cout << "ALIROOT version: -Duse_aliroot and -Duse_root was given." << endl;
1886 cout << "Root Version: " << ROOTVERSION << " found " << flush;
1887 gSystem->Exec(roottest);
1889 cout << "AliRoot Version: " << ALIROOTVERSION << " found " << flush;
1890 gSystem->Exec(aliroottest);
1892 cout << "ROOT version: -Duse_root was given." << endl;
1893 cout << "Root Version: " << ROOTVERSION << " found " << flush;
1894 gSystem->Exec(roottest);
1899 cout << "Using Monte Carlo Info: -Ddo_mc was given." << endl;
1901 cout << "NOT using Monte Carlo Info: -Ddo_mc was not given." << endl;
1904 #ifdef ROWHOUGHPARAMS
1905 cout << "Using extended AliL3TrackSegmentData: -DROWHOUGHPARAMS was given." << endl;
1907 cout << "NOT using extended AliL3TrackSegmentData: -DROWHOUGHPARAMS was not given." << endl;
1911 cout << "Using NEWIO version: -Duse_newio was given." << endl;
1913 cout << "NOT using NEWIO version: -Duse_newio was not given." << endl;
1917 cout << "Using logging classes (MLUC): -Duse_logging was given." << endl;
1919 cout << "NOT using logging classes (MLUC): -Duse_logging not was given." << endl;