3 // Original: AliHLTTransform.cxx,v 1.53 2005/06/14 10:55:21 cvetan
5 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>, Uli Frankenfeld <mailto:franken@fi.uib.no>, Constantin Loizides <mailto:loizides@ikf.uni-frankfurt.de>
6 //*-- Copyright © ALICE HLT Group
14 #include <AliTPCParamSR.h>
15 #include <AliTPCPRF2D.h>
16 #include <AliTPCRF1D.h>
21 #include <TGeoGlobalMagField.h>
22 #include <TTimeStamp.h>
23 #include <TUnixSystem.h>
26 #include "AliHLTTPCLogging.h"
27 #include "AliHLTTPCTransform.h"
29 #if defined(__GNUC__) && __GNUC__ >= 3
33 /** \class AliHLTTPCTransform
35 //_____________________________________________________________
38 // Transformation class for ALICE TPC.
40 // Class which contains all detector specific parameters for the TPC,
41 // and different useful functions for coordinate transforms.
43 // The class is completely static, which means that no object needs
44 // to be instantiated. Function calls should then be done like, e.g.:
46 // Double_t eta = AliHLTTPCTransform::GetEta(xyz);
48 // IMPORTANT: If used as is, default detector parameters will be used,
49 // and you really have to make sure that these correspond to
50 // the AliROOT version you are currently working on!!
51 // You should therefore always initialize the parameters by
53 // AliHLTTPCTransform::Init(path);
55 // where path is a char*, giving the path to where file containing
56 // the detector parameter is located. This file should be called
57 // "l3transform.config", and can be created with the function MakeInitFile.
59 // You can also force reading the parameters from a AliTPCParam object
60 // by setting the flag;
62 // AliHLTTPCTransform::Init(path,kTRUE);
64 // where path is a char*
65 // either providing the rootfile name containing the geometry or
66 // the path to the rootfile which should then be called alirunfile.root.
67 // Note that for both of these cases you have to
68 // compile with USEPACKAGE=ALIROOT set (see level3code/Makefile.conf).
70 // Currently, there are 4 versions of the Transformer:
71 // fVersion==kValiroot: ALIROOT-head compatible
72 // fVersion==kVcosmics: Cosmics data run (2003) compatible
73 // fVersion==kVdefault: means no config file has been loaded
74 // fVersion==kVdeprecated: dont use old (before July 2003) style of transformer
80 ClassImp(AliHLTTPCTransform)
82 AliHLTTPCTransform::AliHLTTPCTransform()
86 const Double_t AliHLTTPCTransform::fgkAnodeWireSpacing = 0.25; //Taken from the TDR
87 const Double_t AliHLTTPCTransform::fgkBFACT = 0.0029980; //Conversion Factor
88 const Double_t AliHLTTPCTransform::fgkPi = 3.141592653589793;
89 const Double_t AliHLTTPCTransform::fgk2Pi = 2*3.141592653589793;
90 const Double_t AliHLTTPCTransform::fgkPi2 = 0.5*3.141592653589793;
91 const Double_t AliHLTTPCTransform::fgkToDeg = 180/3.141592653589793;
93 //Defined by HLT and GSI
94 Int_t AliHLTTPCTransform::fgNPatches = 6;
96 // Old format, corresponding to IntegrTest-5 code and data
97 Int_t AliHLTTPCTransform::fgRows[6][2] = {{0,29},{30,62},{63,90},{91,116},{117,139},{140,158}};
98 Int_t AliHLTTPCTransform::fgNRows[6] = {30,33,28,26,23,19};
100 // New data corresponding to simulated raw data 2004-08-20, provided by Thomas Kuhr
101 Int_t AliHLTTPCTransform::fgRows[6][2] = {{0,30},{30,62},{63,90},{90,116},{117,139},{139,158}};
102 Int_t AliHLTTPCTransform::fgNRows[6] = {31,33,28,27,23,20};
105 // The following definition is generated by MakeInitFile function
106 Double_t AliHLTTPCTransform::fgBField = 0.5;
107 Double_t AliHLTTPCTransform::fgSolenoidBField = 5;
108 Double_t AliHLTTPCTransform::fgBFieldFactor = 1;
109 Int_t AliHLTTPCTransform::fgVersion = kVdefault;
110 Int_t AliHLTTPCTransform::fgNTimeBins = 1024; // = 1024; //446
111 Int_t AliHLTTPCTransform::fgNRowLow = 63;
112 Int_t AliHLTTPCTransform::fgNRowUp = 96;
113 Int_t AliHLTTPCTransform::fgNRowUp1 = 64;
114 Int_t AliHLTTPCTransform::fgNRowUp2 = 32;
115 Int_t AliHLTTPCTransform::fgNSectorLow = 36;
116 Int_t AliHLTTPCTransform::fgNSectorUp = 36;
117 Int_t AliHLTTPCTransform::fgNSector = 72;
118 Double_t AliHLTTPCTransform::fgPadPitchWidthLow = 0.4;
119 Double_t AliHLTTPCTransform::fgPadPitchWidthUp = 0.6;
120 Double_t AliHLTTPCTransform::fgZSigma = 0.2288;
121 Double_t AliHLTTPCTransform::fgZLength = 250.0000;
122 Double_t AliHLTTPCTransform::fgZWidth = AliHLTTPCTransform::fgZLength / (Double_t)AliHLTTPCTransform::fgNTimeBins ;//0.5660; // 0.2435; // 0.5660 // Width of time bins
123 Double_t AliHLTTPCTransform::fgZOffset = 0.6864;
124 Double_t AliHLTTPCTransform::fgDiffT = 0.0220;
125 Double_t AliHLTTPCTransform::fgDiffL = 0.0220;
126 Double_t AliHLTTPCTransform::fgOmegaTau = 0.1450;
127 Double_t AliHLTTPCTransform::fgInnerPadLength = 0.75;
128 Double_t AliHLTTPCTransform::fgOuter1PadLength = 1.00;
129 Double_t AliHLTTPCTransform::fgOuter2PadLength = 1.50;
130 Double_t AliHLTTPCTransform::fgInnerPRFSigma = 0.203811;
131 Double_t AliHLTTPCTransform::fgOuter1PRFSigma = 0.299325;
132 Double_t AliHLTTPCTransform::fgOuter2PRFSigma = 0.299323;
133 Double_t AliHLTTPCTransform::fgTimeSigma = 0.228809;
134 Int_t AliHLTTPCTransform::fgADCSat = 1024;
135 Int_t AliHLTTPCTransform::fgZeroSup = 0;
136 Int_t AliHLTTPCTransform::fgNSlice = 36;
137 Int_t AliHLTTPCTransform::fgNRow = 159;
138 Double_t AliHLTTPCTransform::fgNRotShift = 0.5;
139 Int_t AliHLTTPCTransform::fgSlice2Sector[36][2] = { { 0, 36},
177 Int_t AliHLTTPCTransform::fgSector2Slice[72] = { 0,
251 Int_t AliHLTTPCTransform::fgSectorLow[72] = { 1,
325 Double_t AliHLTTPCTransform::fgX[159] = { 85.195,
487 // New number of pads changed 2006-04-15 Jochen Thaeder
488 // changed according to formula in AliTPCROC.cxx
489 // according to real Pad Distribution on build TPC
490 Int_t AliHLTTPCTransform::fgNPads[159] = {68,
652 // OLD number of pads changed 2006-04-15 Jochen Thaeder
653 Int_t AliHLTTPCTransform::fgNPads[159] = {67,
815 Double_t AliHLTTPCTransform::fgCos[36] = { 0.9848077297,
853 Double_t AliHLTTPCTransform::fgSin[36] = { 0.1736481786,
892 Bool_t AliHLTTPCTransform::Init(AliRunLoader *runLoader)
894 //init with runloader
896 LOG(AliHLTTPCLog::kFatal,"AliHLTTPCTransform::Init","RunLoader")
897 <<" Missing RunLoader! 0x0"<<ENDLOG;
901 if(fgVersion != kVdefault)
902 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCTransform::Init","Init values")
903 <<AliHLTTPCLog::kDec<<"You are initializing the parameters more than once; check your code please! "<<fgVersion<<ENDLOG;
905 TDirectory* savedir1 = gDirectory;
906 runLoader->CdGAFile();
907 AliTPCParamSR *param=(AliTPCParamSR*)gDirectory->Get(GetParamName());
911 LOG(AliHLTTPCLog::kFatal,"AliHLTTPCTransform::Init","File")
912 <<"No TPC parameters found!"<<ENDLOG;
916 AliTPCPRF2D * prfinner = new AliTPCPRF2D;
917 AliTPCPRF2D * prfouter1 = new AliTPCPRF2D;
918 AliTPCPRF2D * prfouter2 = new AliTPCPRF2D;
919 AliTPCRF1D * rf = new AliTPCRF1D(kTRUE);
920 rf->SetGauss(param->GetZSigma(),param->GetZWidth(),1.);
921 rf->SetOffset(3*param->GetZSigma());
924 TDirectory *savedir2=gDirectory;
925 TFile *prf_file = TFile::Open("$ALICE_ROOT/TPC/AliTPCprf2d.root");
926 if (!prf_file->IsOpen())
928 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Init","File")
929 <<"Can't open $ALICE_ROOT/TPC/AliTPCprf2d.root !"<<ENDLOG;
932 prfinner ->Read("prf_07504_Gati_056068_d02");
933 prfouter1->Read("prf_10006_Gati_047051_d03");
934 prfouter2->Read("prf_15006_Gati_047051_d03");
938 param->SetInnerPRF(prfinner);
939 param->SetOuter1PRF(prfouter1);
940 param->SetOuter2PRF(prfouter2);
941 param->SetTimeRF(rf);
943 fgNTimeBins = param->GetMaxTBin()+1;
944 fgNRowLow = param->GetNRowLow();
945 fgNRowUp = param->GetNRowUp();
946 fgNRowUp1 = param->GetNRowUp1();
947 fgNRowUp2 = param->GetNRowUp2();
948 fgNRow= fgNRowLow + fgNRowUp;
950 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Init","fNRow")
951 <<"Number of rows have changed in ALIROOT"<<ENDLOG;
955 fgNSectorLow = param->GetNInnerSector();
956 fgNSectorUp = param->GetNOuterSector();
957 fgNSector = fgNSectorLow + fgNSectorUp;
959 //test whether they were changes to the rotation shift
961 Float_t irotshift = param->GetInnerAngleShift(); //shift angle
962 Float_t orotshift = param->GetOuterAngleShift(); //shift angle
963 const Float_t kDegtoRad = 0.01745329251994;
964 Int_t shift1=TMath::Nint(irotshift/kDegtoRad);
965 Int_t shift2=TMath::Nint(orotshift/kDegtoRad+0.1);
966 if((shift1!=shift2) || (shift1!=10)){
967 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Init","Rotshiftangle")
968 <<"Rotation shift angle has changed in ALIROOT"<<ENDLOG;
971 fgNRotShift=0.5; //our version of the shift angle
975 AliMagF* mag = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
976 double fc = mag ? mag->GetFactorSol() : 0;
977 double bz = mag ? -mag->SolenoidField() : 0;
979 SetBFieldFactor( fc );
980 SetSolenoidBField( bz );
981 fgPadPitchWidthLow=param->GetInnerPadPitchWidth();
982 fgPadPitchWidthUp=param->GetOuterPadPitchWidth();
983 fgZWidth=param->GetZWidth();
984 fgZSigma=param->GetZSigma();
985 // Matthias 24.04.2007 a default parameter has been added to GetZLength
986 // reverting some of Mareks changes
987 // TODO: we have to use the method correctly and put the slice no into it
988 //fgZLength=param->GetZLength(0)+0.275;
989 fgZLength=param->GetZLength()+0.275;
990 fgZOffset=param->GetZOffset();
991 fgDiffT=param->GetDiffT();
992 fgDiffL=param->GetDiffL();
993 fgOmegaTau=param->GetOmegaTau();
994 fgInnerPadLength=param->GetInnerPadLength();
995 fgOuter1PadLength=param->GetOuter1PadLength();
996 fgOuter2PadLength=param->GetOuter2PadLength();
997 fgInnerPRFSigma=param->GetInnerPRF()->GetSigmaX();
998 fgOuter1PRFSigma=param->GetOuter1PRF()->GetSigmaX();
999 fgOuter2PRFSigma=param->GetOuter2PRF()->GetSigmaX();
1000 fgTimeSigma=param->GetTimeRF()->GetSigma();
1001 fgADCSat=param->GetADCSat();
1002 fgZeroSup=param->GetZeroSup();
1003 fgNSlice=fgNSectorLow;
1006 for(Int_t i=0;i<fgNRow;i++){
1008 if( i < fgNRowLow){sec =0;row =i;}
1009 else{sec = fgNSectorLow;row =i-fgNRowLow;}
1010 fgX[i]=param->GetPadRowRadii(sec,row);
1012 for(Int_t i=0;i<fgNRow;i++){
1014 if( i < fgNRowLow){sec =0;row =i;}
1015 else{sec = fgNSectorLow;row =i-fgNRowLow;}
1016 fgNPads[i]=param->GetNPads(sec,row);
1018 for(Int_t i=0;i<fgNSector;i++){
1019 if(i<fgNSectorLow) fgSectorLow[i]=1;
1020 else fgSectorLow[i]=0;
1027 Char_t tmpfile[1024];
1028 sprintf(tmpfile,"./l3transform.config-%d",(Int_t)time.GetSec());
1030 return SaveInitFile(tmpfile);
1035 Bool_t AliHLTTPCTransform::Init(Char_t* path,Bool_t UseAliTPCParam)
1037 //Overwrite the parameters with values stored in file "l3transform.config" in path.
1038 //If file does not exist, old default values will be used.
1039 //If flag UseAliTPCParam is set, the parameters will be read from the the rootfile
1040 //which then has to be called path/digitfile.root
1042 if(fgVersion != kVdefault)
1043 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCTransform::Init","Init values")
1044 <<AliHLTTPCLog::kDec<<"You are initializing the parameters more than once; check your code please! "<<fgVersion<<ENDLOG;
1046 if(UseAliTPCParam) //use rootfile to generate temporary init file
1047 return ReadInit(path);
1050 Char_t pathname[1024];
1051 strcpy(pathname,path);
1053 //test whether provided path is the file itself
1055 DIR *testdir=opendir(pathname);
1061 if(isdir) strcat(pathname,"/l3transform.config");
1063 return ReadInitFile(pathname);
1066 Bool_t AliHLTTPCTransform::ReadInitFile(Char_t* pathname)
1068 //read transformer settings from pathname
1069 FILE *fptr=fopen(pathname,"r");
1071 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCTransform::ReadInitFile","File Open")
1072 <<"Pointer to Config File \""<<pathname<<"\" 0x0!"<<ENDLOG;
1076 Char_t d1[250], d2[100], d3[100];
1078 Double_t ddummy=0.0;
1080 while(!feof(fptr)) {
1081 fscanf(fptr,"%s",d1);
1082 if(strcmp(d1,"fVersion")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgVersion=dummy;}
1083 else if(strcmp(d1,"fBFieldFactor")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgBFieldFactor=(Double_t)ddummy;}
1084 else if(strcmp(d1,"fSolenoidBField")==0)
1086 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);
1087 fgSolenoidBField=(Double_t)ddummy;
1089 else if(strcmp(d1,"fNTimeBins")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNTimeBins=(Int_t)dummy;}
1090 else if(strcmp(d1,"fNRowLow")==0)
1092 fscanf(fptr,"%s %d %s",d2,&dummy,d3);
1093 fgNRowLow=(Int_t)dummy;
1095 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::ReadInitFile","Overflow")
1096 <<"Number of inner PadRows should be 63! Check and fgrep the code for 63 to see the consequences of this major change!"<<ENDLOG;
1098 else if(strcmp(d1,"fNRowUp")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNRowUp=(Int_t)dummy;}
1099 else if(strcmp(d1,"fNRowUp1")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNRowUp1=(Int_t)dummy;}
1100 else if(strcmp(d1,"fNRowUp2")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNRowUp2=(Int_t)dummy;}
1101 else if(strcmp(d1,"fNSectorLow")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNSectorLow=(Int_t)dummy;}
1102 else if(strcmp(d1,"fNSectorUp")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNSectorUp=(Int_t)dummy;}
1103 else if(strcmp(d1,"fNSector")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNSector=(Int_t)dummy;}
1104 else if(strcmp(d1,"fPadPitchWidthLow")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgPadPitchWidthLow=(Double_t)ddummy;}
1105 else if(strcmp(d1,"fPadPitchWidthUp")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgPadPitchWidthUp=(Double_t)ddummy;}
1106 else if(strcmp(d1,"fZWidth")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgZWidth=(Double_t)ddummy;}
1107 else if(strcmp(d1,"fZSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgZSigma=(Double_t)ddummy;}
1108 else if(strcmp(d1,"fZLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgZLength=(Double_t)ddummy;}
1109 else if(strcmp(d1,"fZOffset")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgZOffset=(Double_t)ddummy;}
1110 else if(strcmp(d1,"fNSlice")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNSlice=(Int_t)dummy;}
1111 else if(strcmp(d1,"fDiffT")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgDiffT=(Double_t)ddummy;}
1112 else if(strcmp(d1,"fDiffL")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgDiffL=(Double_t)ddummy;}
1113 else if(strcmp(d1,"fOmegaTau")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgOmegaTau=(Double_t)ddummy;}
1114 else if(strcmp(d1,"fInnerPadLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgInnerPadLength=(Double_t)ddummy;}
1115 else if(strcmp(d1,"fOuter1PadLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgOuter1PadLength=(Double_t)ddummy;}
1116 else if(strcmp(d1,"fOuter2PadLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgOuter2PadLength=(Double_t)ddummy;}
1117 else if(strcmp(d1,"fInnerPRFSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgInnerPRFSigma=(Double_t)ddummy;}
1118 else if(strcmp(d1,"fOuter1PRFSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgOuter1PRFSigma=(Double_t)ddummy;}
1119 else if(strcmp(d1,"fOuter2PRFSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgOuter2PRFSigma=(Double_t)ddummy;}
1120 else if(strcmp(d1,"fTimeSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgTimeSigma=(Double_t)ddummy;}
1121 else if(strcmp(d1,"fADCSat")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgADCSat=(Int_t)dummy;}
1122 else if(strcmp(d1,"fZeroSup")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgZeroSup=(Int_t)dummy;}
1123 else if(strcmp(d1,"fNRow")==0){
1124 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNRow=(Int_t)dummy;
1126 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::ReadInitFile","Overflow")<<"Number of PadRows should be 159! Check and fgrep the code for 159 to see the consequences of this major change!"<<ENDLOG;
1129 else if(strcmp(d1,"fNRotShift")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgNRotShift=(Double_t)ddummy;}
1130 else if(strcmp(d1,"fX[0]")==0){
1131 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgX[0]=(Double_t)ddummy;
1132 for(Int_t i=1;i<fgNRow;i++){fscanf(fptr,"%s %s %lf %s",d1,d2,&ddummy,d3);fgX[i]=(Double_t)ddummy;}
1134 else if(strcmp(d1,"fNPads[0]")==0){
1135 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNPads[0]=(Int_t)dummy;
1136 for(Int_t i=1;i<fgNRow;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgNPads[i]=(Int_t)dummy;}
1138 else if(strcmp(d1,"fNRows[0]")==0){
1139 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgNRows[0]=(Int_t)dummy;
1140 for(Int_t i=1;i<fgNPatches;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgNRows[i]=(Int_t)dummy;}
1142 else if(strcmp(d1,"fRows[0][0]")==0){
1143 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgRows[0][0]=(Int_t)dummy;
1144 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgRows[0][1]=(Int_t)dummy;
1145 for(Int_t i=1;i<fgNPatches;i++){
1146 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgRows[i][0]=(Int_t)dummy;
1147 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgRows[i][1]=(Int_t)dummy;
1150 else if(strcmp(d1,"fSlice2Sector[0][0]")==0){
1151 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgSlice2Sector[0][0]=(Int_t)dummy;
1152 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgSlice2Sector[0][1]=(Int_t)dummy;
1153 for(Int_t i=1;i<fgNSlice;i++){
1154 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgSlice2Sector[i][0]=(Int_t)dummy;
1155 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgSlice2Sector[i][1]=(Int_t)dummy;
1158 else if(strcmp(d1,"fSector2Slice[0]")==0){
1159 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgSector2Slice[0]=(Int_t)dummy;
1160 for(Int_t i=1;i<fgNSector;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgSector2Slice[i]=(Int_t)dummy;}
1162 else if(strcmp(d1,"fSectorLow[0]")==0){
1163 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fgSectorLow[0]=(Int_t)dummy;
1164 for(Int_t i=1;i<fgNSector;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fgSectorLow[i]=(Int_t)dummy;}
1166 else if(strcmp(d1,"fCos[0]")==0){
1167 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgCos[0]=(Double_t)ddummy;
1168 for(Int_t i=1;i<fgNSlice;i++){fscanf(fptr,"%s %s %lf %s",d1,d2,&ddummy,d3);fgCos[i]=(Double_t)ddummy;}
1170 else if(strcmp(d1,"fSin[0]")==0){
1171 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fgSin[0]=(Double_t)ddummy;
1172 for(Int_t i=1;i<fgNSlice;i++){fscanf(fptr,"%s %s %lf %s",d1,d2,&ddummy,d3);fgSin[i]=(Double_t)ddummy;}
1177 //The first multiplier gives the scale factor used to modify the field map
1178 //defined by the second multiplier.
1179 fgBField=fgBFieldFactor*fgSolenoidBField*0.1;
1181 //Test if new config file has been used.
1182 if(fgVersion==kVdeprecated){
1183 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::ReadInitFile","Version")
1184 <<"Version is deprecated, you have to create a new config file."<<ENDLOG;
1188 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCTransform::ReadInitFile","Config")
1189 <<"Successfully loaded values from config file \""<<pathname<<"\""<<ENDLOG;
1194 Bool_t AliHLTTPCTransform::ReadInit(Char_t *path)
1196 //Read all the parameters from a aliroot file, and store it in a temporary
1197 //file which is read by Init. Use this if you want to read the parameters from
1198 //the rootfile "every" time.
1201 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::ReadInit","Version")
1202 <<"You have to compile with use_aliroot flag in order to read from AliROOT file"<<ENDLOG;
1205 Char_t filename[1024];
1206 //first test whether provided path is the rootfile itself
1207 Int_t saveErrIgLevel=gErrorIgnoreLevel;
1208 gErrorIgnoreLevel=kFatal; //dont report errors
1209 TFile *rootfile = TFile::Open(path);
1210 if(!rootfile || rootfile->IsZombie())
1211 { //ok assume its path to alirunfile file
1212 sprintf(filename,"%s/alirunfile.root",path); //create rootfile name
1213 } else { //path contains itself the rootfile name
1215 sprintf(filename,"%s",path);
1217 gErrorIgnoreLevel=saveErrIgLevel;
1219 //finally make dummy init file /tmp/$USER/l3transform.config-`date`
1220 Char_t tmppath[1024];
1221 sprintf(tmppath,"/tmp/%s",gSystem->Getenv("USER"));
1222 gSystem->mkdir(tmppath);
1224 Char_t tmpfile[1024];
1225 sprintf(tmpfile,"%s/l3transform.config-%d",tmppath,(Int_t)time.GetSec());
1226 return MakeInitFile(filename,tmpfile);
1230 Bool_t AliHLTTPCTransform::MakeInitFile(Char_t *rootfilename,Char_t *filename)
1232 //Get the parameters from rootfile, and store it on the file "l3transform.config"
1233 //which is being read by Init. fVersion will be kV_aliroot!
1236 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::MakeInitFile","Version")
1237 <<"You have to compile with use_aliroot flag in order to use this function"<<ENDLOG;
1240 TFile *rootfile = TFile::Open(rootfilename);
1243 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::MakeInitFile","File")
1244 <<"Could not open file: "<<rootfilename<<ENDLOG;
1247 AliRun *lgAlice = (AliRun*)rootfile->Get("gAlice");
1250 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::MakeInitFile","File")
1251 <<"No lgAlice in file: "<<rootfilename<<ENDLOG;
1254 AliTPCParamSR *param=(AliTPCParamSR*)rootfile->Get(GetParamName());
1257 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCTransform::MakeInitFile","File")
1258 <<"No TPC parameters found in \""<<rootfilename
1259 <<"\", creating standard parameters "
1260 <<"which might not be what you want!"<<ENDLOG;
1261 param=new AliTPCParamSR;
1264 AliTPCPRF2D * prfinner = new AliTPCPRF2D;
1265 AliTPCPRF2D * prfouter1 = new AliTPCPRF2D;
1266 AliTPCPRF2D * prfouter2 = new AliTPCPRF2D;
1267 AliTPCRF1D * rf = new AliTPCRF1D(kTRUE);
1268 rf->SetGauss(param->GetZSigma(),param->GetZWidth(),1.);
1269 rf->SetOffset(3*param->GetZSigma());
1272 TDirectory *savedir=gDirectory;
1273 TFile *prf_file = TFile::Open("$ALICE_ROOT/TPC/AliTPCprf2d.root");
1274 if (!prf_file->IsOpen())
1276 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::MakeInitFile","File")
1277 <<"Can't open $ALICE_ROOT/TPC/AliTPCprf2d.root !"<<ENDLOG;
1280 prfinner ->Read("prf_07504_Gati_056068_d02");
1281 prfouter1->Read("prf_10006_Gati_047051_d03");
1282 prfouter2->Read("prf_15006_Gati_047051_d03");
1286 param->SetInnerPRF(prfinner);
1287 param->SetOuter1PRF(prfouter1);
1288 param->SetOuter2PRF(prfouter2);
1289 param->SetTimeRF(rf);
1291 fgNTimeBins = param->GetMaxTBin()+1;
1292 fgNRowLow = param->GetNRowLow();
1293 fgNRowUp = param->GetNRowUp();
1294 fgNRowUp1 = param->GetNRowUp1();
1295 fgNRowUp2 = param->GetNRowUp2();
1296 fgNRow= fgNRowLow + fgNRowUp;
1298 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::MakeInitFile","fNRow")
1299 <<"Number of rows have changed in ALIROOT"<<ENDLOG;
1303 fgNSectorLow = param->GetNInnerSector();
1304 fgNSectorUp = param->GetNOuterSector();
1305 fgNSector = fgNSectorLow + fgNSectorUp;
1307 //test whether they were changes to the rotation shift
1309 Float_t irotshift = param->GetInnerAngleShift(); //shift angle
1310 Float_t orotshift = param->GetOuterAngleShift(); //shift angle
1311 const Float_t kDegtoRad = 0.01745329251994;
1312 Int_t shift1=TMath::Nint(irotshift/kDegtoRad);
1313 Int_t shift2=TMath::Nint(orotshift/kDegtoRad+0.1);
1314 if((shift1!=shift2) || (shift1!=10)){
1315 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::MakeInitFile","Rotshiftangle")
1316 <<"Rotation shift angle has changed in ALIROOT"<<ENDLOG;
1319 fgNRotShift=0.5; //our version of the shift angle
1322 fgVersion=kValiroot;
1323 AliMagF* mag = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
1324 double fc = mag ? mag->GetFactorSol() : 0;
1325 double bz = mag ? -mag->SolenoidField() : 0;
1327 SetBFieldFactor( fc );
1328 SetSolenoidBField( bz );
1330 // SetBFieldFactor((Double_t)l((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Factor());
1331 // SetSolenoidBField(-
1332 // (Double_t)l((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->SolenoidField()/
1333 // (Double_t)l((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Factor()
1335 fgPadPitchWidthLow=param->GetInnerPadPitchWidth();
1336 fgPadPitchWidthUp=param->GetOuterPadPitchWidth();
1337 fgZWidth=param->GetZWidth();
1338 fgZSigma=param->GetZSigma();
1339 // Matthias 24.04.2007 a default parameter has been added to GetZLength
1340 // reverting some of Mareks changes
1341 // TODO: we have to use the method correctly and put the slice no into it
1342 //fgZLength=param->GetZLength(0)+0.275;
1343 fgZLength=param->GetZLength()+0.275;
1344 fgZOffset=param->GetZOffset();
1345 fgDiffT=param->GetDiffT();
1346 fgDiffL=param->GetDiffL();
1347 fgOmegaTau=param->GetOmegaTau();
1348 fgInnerPadLength=param->GetInnerPadLength();
1349 fgOuter1PadLength=param->GetOuter1PadLength();
1350 fgOuter2PadLength=param->GetOuter2PadLength();
1351 fgInnerPRFSigma=param->GetInnerPRF()->GetSigmaX();
1352 fgOuter1PRFSigma=param->GetOuter1PRF()->GetSigmaX();
1353 fgOuter2PRFSigma=param->GetOuter2PRF()->GetSigmaX();
1354 fgTimeSigma=param->GetTimeRF()->GetSigma();
1355 fgADCSat=param->GetADCSat();
1356 fgZeroSup=param->GetZeroSup();
1357 fgNSlice=fgNSectorLow;
1360 for(Int_t i=0;i<fgNRow;i++){
1362 if( i < fgNRowLow){sec =0;row =i;}
1363 else{sec = fgNSectorLow;row =i-fgNRowLow;}
1364 fgX[i]=param->GetPadRowRadii(sec,row);
1366 for(Int_t i=0;i<fgNRow;i++){
1368 if( i < fgNRowLow){sec =0;row =i;}
1369 else{sec = fgNSectorLow;row =i-fgNRowLow;}
1370 fgNPads[i]=param->GetNPads(sec,row);
1372 for(Int_t i=0;i<fgNSector;i++){
1373 if(i<fgNSectorLow) fgSectorLow[i]=1;
1374 else fgSectorLow[i]=0;
1381 return SaveInitFile(filename);
1385 Bool_t AliHLTTPCTransform::SaveInitFile(Char_t *filenamepath)
1387 //store the parameters in the file "filenamepath"
1389 FILE *f = fopen(filenamepath,"w");
1391 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::SaveInitFile","File")
1392 <<"Could not open file: "<<filenamepath<<ENDLOG;
1396 fprintf(f,"void AliHLTTPCTransform::Init(){\n");
1397 fprintf(f," fVersion = %d;\n", fgVersion);
1398 fprintf(f," fBFieldFactor = %.3f;\n",fgBFieldFactor);
1399 fprintf(f," fSolenoidBField = %.3f;\n",fgSolenoidBField);
1400 fprintf(f," fNTimeBins = %d;\n",fgNTimeBins);
1401 fprintf(f," fNRowLow = %d;\n",fgNRowLow);
1402 fprintf(f," fNRowUp = %d;\n",fgNRowUp);
1403 fprintf(f," fNRowUp1 = %d;\n",fgNRowUp1);
1404 fprintf(f," fNRowUp2 = %d;\n",fgNRowUp2);
1405 fprintf(f," fNSectorLow = %d;\n",fgNSectorLow);
1406 fprintf(f," fNSectorUp = %d;\n",fgNSectorUp);
1407 fprintf(f," fNSector = %d;\n",fgNSector);
1408 fprintf(f," fPadPitchWidthLow = %.3f;\n",fgPadPitchWidthLow);
1409 fprintf(f," fPadPitchWidthUp = %.3f;\n",fgPadPitchWidthUp);
1410 fprintf(f," fZWidth = %.4f;\n",fgZWidth);
1411 fprintf(f," fZSigma = %.4f;\n",fgZSigma);
1412 fprintf(f," fZLength = %.4f;\n",fgZLength);
1413 fprintf(f," fZOffset = %.4f;\n",fgZOffset);
1414 fprintf(f," fDiffT = %.4f;\n",fgDiffT);
1415 fprintf(f," fDiffL = %.4f;\n",fgDiffL);
1416 fprintf(f," fOmegaTau = %.4f;\n",fgOmegaTau);
1417 fprintf(f," fInnerPadLength = %.3f;\n",fgInnerPadLength);
1418 fprintf(f," fOuter1PadLength = %.3f;\n",fgOuter1PadLength);
1419 fprintf(f," fOuter2PadLength = %.3f;\n",fgOuter2PadLength);
1420 fprintf(f," fInnerPRFSigma = %.6f;\n",fgInnerPRFSigma);
1421 fprintf(f," fOuter1PRFSigma = %.6f;\n",fgOuter1PRFSigma);
1422 fprintf(f," fOuter2PRFSigma = %.6f;\n",fgOuter2PRFSigma);
1423 fprintf(f," fTimeSigma = %.6f;\n",fgTimeSigma);
1424 fprintf(f," fADCSat = %d;\n",fgADCSat);
1425 fprintf(f," fZeroSup = %d;\n",fgZeroSup);
1426 fprintf(f," fNSlice = %d;\n",fgNSlice);
1427 fprintf(f," fNRow = %d;\n",fgNRow);
1428 fprintf(f," fNRotShift = %.2f;\n",fgNRotShift);
1430 for(Int_t i=0;i<fgNRow;i++){
1431 fprintf(f," fX[%d] = %3.2f;\n",i,fgX[i]);
1433 for(Int_t i=0;i<fgNRow;i++){
1434 fprintf(f," fNPads[%d] = %d;\n",i,fgNPads[i]);
1437 //Slice/Sector dont belong to aliroot, but we want to be flexible
1438 for(Int_t i=0;i<fgNSlice;i++){
1439 fprintf(f," fSlice2Sector[%d][0] = %d;\n",i,fgSlice2Sector[i][0]);
1440 fprintf(f," fSlice2Sector[%d][1] = %d;\n",i,fgSlice2Sector[i][1]);
1442 for(Int_t i=0;i<fgNSector;i++){
1443 fprintf(f," fSector2Slice[%d] = %d;\n",i,fgSector2Slice[i]);
1445 for(Int_t i=0;i<fgNSector;i++){
1446 fprintf(f," fSectorLow[%d] = %d;\n",i,fgSectorLow[i]);
1449 //Patches also dont really belong to the aliroot settings (but nevermind)
1450 for(Int_t i=0;i<fgNPatches;i++){
1451 fprintf(f," fNRows[%d] = %d;\n",i,fgNRows[i]);
1453 for(Int_t i=0;i<fgNPatches;i++){
1454 fprintf(f," fRows[%d][0] = %d;\n",i,fgRows[i][0]);
1455 fprintf(f," fRows[%d][1] = %d;\n",i,fgRows[i][1]);
1458 //Rotation shift is an addon, too
1459 for(Int_t i=0;i<fgNSlice;i++){
1460 Float_t cs = cos( (2*fgkPi/18) * (i+fgNRotShift) );
1461 fprintf(f," fCos[%d] = %.10f;\n",i,cs);
1463 for(Int_t i=0;i<fgNSlice;i++){
1464 Float_t sn = sin( (2*fgkPi/18) * (i+fgNRotShift) );
1465 fprintf(f," fSin[%d] = %.10f;\n",i,sn);
1471 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCTransform::SaveInitFile","File created")
1472 <<"Init file \""<<filenamepath<<"\" created"<<ENDLOG;
1477 Int_t AliHLTTPCTransform::GetNPads(Int_t row)
1479 //get number of pads per row
1480 if(row < 0 || row >= fgNRow)
1482 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetNPads","Row")
1483 <<AliHLTTPCLog::kDec<<"Wrong row "<<row<<ENDLOG;
1487 return fgNPads[row];
1490 Int_t AliHLTTPCTransform::GetNumberOfPatches() {
1494 Int_t AliHLTTPCTransform::GetFirstRow(Int_t patch)
1496 //get first row per patch
1500 else if(patch < -1 || patch >= 6)
1502 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetFirstRow","Patch")
1503 <<AliHLTTPCLog::kDec<<"Wrong patch "<<patch<<ENDLOG;
1507 return fgRows[patch][0];
1510 Int_t AliHLTTPCTransform::GetLastRow(Int_t patch)
1512 //get last row per patch
1514 return fgRows[5][1];
1515 else if(patch < -1 || patch >= 6)
1517 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetLastRow","Patch")
1518 <<AliHLTTPCLog::kDec<<"Wrong patch "<<patch<<ENDLOG;
1522 return fgRows[patch][1];
1525 Int_t AliHLTTPCTransform::GetFirstRowOnDDL(Int_t patch)
1527 //get first row per patch
1531 else if(patch < -1 || patch >= 6)
1533 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetFirstRow","Patch")
1534 <<AliHLTTPCLog::kDec<<"Wrong patch "<<patch<<ENDLOG;
1539 if(patch==1) return fgRows[patch][0]+1;
1540 return fgRows[patch][0];
1544 Int_t AliHLTTPCTransform::GetLastRowOnDDL(Int_t patch)
1546 //get last row per patch
1548 return fgRows[5][1];
1549 else if(patch < -1 || patch >= 6)
1551 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetLastRow","Patch")
1552 <<AliHLTTPCLog::kDec<<"Wrong patch "<<patch<<ENDLOG;
1557 if(patch==2 || patch==4) return fgRows[patch][1]-1;
1558 return fgRows[patch][1];
1562 Int_t AliHLTTPCTransform::GetNRows(Int_t patch)
1564 //get number of rows per patch
1567 else if(patch < -1 || patch >= 6)
1569 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetNRows","Patch")
1570 <<AliHLTTPCLog::kDec<<"Wrong patch "<<patch<<ENDLOG;
1574 return fgNRows[patch];
1577 Int_t AliHLTTPCTransform::GetPadRow(Float_t xvalue)
1579 //Find the padrow number corresponding to cartesian _local_ x value
1580 if(xvalue < 0 || xvalue > 250)
1582 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetPadRow","X-value")
1583 <<AliHLTTPCLog::kDec<<"Suspicious x-value, make sure it is in local coordinate! "
1588 Int_t x = (Int_t)rint(xvalue*10);
1589 if(x < (Int_t)rint(fgX[1]*10))
1591 else if(x > (Int_t)rint(fgX[fgNRow-2]*10))
1595 Int_t padrow=1; //Of course, a more clever algorithm could help here
1596 while(padrow < fgNRow-2)
1598 if(x > (Int_t)rint(fgX[padrow-1]*10) && x < (Int_t)rint(fgX[padrow+1]*10))
1606 Int_t AliHLTTPCTransform::GetPatch(Int_t padrow)
1608 //get patch for padrow
1609 if(padrow < 0 || padrow >= fgNRow)
1611 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetPatch","Padrow")
1612 <<AliHLTTPCLog::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1616 while(patch < fgNPatches)
1618 if(padrow >= fgRows[patch][0] && padrow <= fgRows[patch][1])
1625 Double_t AliHLTTPCTransform::GetPadLength(Int_t padrow)
1627 //get pad length for padrow
1628 if(padrow >= fgNRow){
1629 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetPadLength","Padrow")
1630 <<AliHLTTPCLog::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1634 if(padrow < fgNRowLow)
1635 return fgInnerPadLength;
1636 if(padrow >= fgNRowLow && padrow < fgNRowLow + fgNRowUp1 - 1)
1637 return fgOuter1PadLength;
1638 if(padrow >= fgNRowLow + fgNRowUp1 - 1)
1639 return fgOuter2PadLength;
1641 //should never happen
1642 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetPadLength","Padrow")
1643 <<AliHLTTPCLog::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1647 Double_t AliHLTTPCTransform::GetPadPitchWidth(Int_t patch)
1649 //get pad patch width for patch
1650 if(patch < 0 || patch > fgNPatches)
1652 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetPadPitchWidth","patct")
1653 <<AliHLTTPCLog::kDec<<"Wrong patch "<<patch<<ENDLOG;
1656 return patch < 2 ? fgPadPitchWidthLow : fgPadPitchWidthUp;
1659 Double_t AliHLTTPCTransform::GetParSigmaY2(Int_t padrow,Float_t z,Float_t angle)
1661 //Calculate the expected transverse cluster width as a function of
1662 //drift distance and crossing angle.
1663 //z = local z-coordinate of cluster
1664 //angle = track crossing angle with normal to padrow plane
1665 //return value = sigma^2 (cartesian coordinates)
1669 drift = fgZLength - z;
1671 drift = fgZLength + z;
1673 Double_t t1 = GetPRFSigma(padrow)*GetPRFSigma(padrow);
1674 Double_t t2 = fgDiffT*fgDiffT*drift;
1675 Double_t t3 = GetPadLength(padrow)*GetPadLength(padrow)*tan(angle)*tan(angle)/12;
1676 Double_t t4 = fgkAnodeWireSpacing*fgkAnodeWireSpacing*(tan(angle) - fgOmegaTau)*(tan(angle) - fgOmegaTau)/12;
1678 return (t1 + t2 + t3 + t4);
1681 Double_t AliHLTTPCTransform::GetParSigmaZ2(Int_t padrow,Float_t z,Float_t tgl)
1683 //Calculate the expected longitudinal cluster width as a function of
1684 //drift distance and track crossing angle.
1685 //z = local z-coordinate of cluster
1686 //tgl = tan(dipangle)
1687 //return value = sigma^2 (cartesian coordinates)
1691 drift = AliHLTTPCTransform::GetZLength()-0.275 - z;
1693 drift = AliHLTTPCTransform::GetZLength()-0.302 + z;
1695 Double_t t1 = fgZSigma*fgZSigma;
1696 Double_t t2 = fgDiffL*fgDiffL*drift;
1697 Double_t t3 = GetPadLength(padrow)*GetPadLength(padrow)*tgl*tgl/12;
1699 return (t1 + t2 + t3);
1702 Double_t AliHLTTPCTransform::GetPRFSigma(Int_t padrow)
1704 //get sigma of pad response function for padrow
1706 if(padrow >= fgNRow){
1707 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetPRFSigma","Padrow")
1708 <<AliHLTTPCLog::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1711 if(padrow < fgNRowLow)
1712 return fgInnerPRFSigma;
1713 if(padrow >= fgNRowLow && padrow < fgNRowLow + fgNRowUp1 - 1)
1714 return fgOuter1PRFSigma;
1715 if(padrow >= fgNRowLow + fgNRowUp1 - 1)
1716 return fgOuter2PRFSigma;
1718 //should never happen
1719 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetPRFSigma","Padrow")
1720 <<AliHLTTPCLog::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1724 Double_t AliHLTTPCTransform::GetEta(Float_t *xyz)
1727 Double_t r3 = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
1728 Double_t eta = 0.5 * log((r3+xyz[2])/(r3-xyz[2]));
1732 void AliHLTTPCTransform::XYZtoRPhiEta(Float_t *rpe, Float_t *xyz)
1734 //transform xyz into rpe
1735 rpe[0] = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
1736 rpe[1] = atan2(xyz[1],xyz[0]);
1737 rpe[2] = 0.5 * log((rpe[0]+xyz[2])/(rpe[0]-xyz[2]));
1740 Double_t AliHLTTPCTransform::GetEta(Int_t slice,Int_t padrow,Int_t pad,Int_t time)
1745 Slice2Sector(slice,padrow,sector,row);
1746 Raw2Local(xyz,sector,row,pad,time);
1751 Double_t AliHLTTPCTransform::GetPhi(Float_t *xyz)
1754 Double_t phi = atan2(xyz[1],xyz[0]);
1758 Bool_t AliHLTTPCTransform::Slice2Sector(Int_t slice, Int_t slicerow, Int_t & sector, Int_t &row)
1760 //slice no to sector number
1761 //row no to local sector row no
1762 if(slicerow<0&&slicerow>=fgNRow){
1763 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Slice2Sector","Slicerow")
1764 <<AliHLTTPCLog::kDec<<"Wrong slicerow "<<slicerow<<ENDLOG;
1767 if(slice<0||slice>=fgNSlice){
1768 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Slice2Sector","Slice")
1769 <<AliHLTTPCLog::kDec<<"Wrong slice "<<slice<<ENDLOG;
1773 if(slicerow<fgNRowLow){
1774 sector = fgSlice2Sector[slice][0];
1778 sector = fgSlice2Sector[slice][1];
1779 row = slicerow-fgNRowLow;
1785 Bool_t AliHLTTPCTransform::Sector2Slice(Int_t & slice, Int_t sector)
1788 if(sector<0||sector>=fgNSector){
1789 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Sector2Slice","Sector")
1790 <<AliHLTTPCLog::kDec<<"Wrong sector "<<sector<<ENDLOG;
1794 slice=fgSector2Slice[sector];
1799 Bool_t AliHLTTPCTransform::Sector2Slice(Int_t & slice, Int_t & slicerow, Int_t sector, Int_t row)
1802 if(sector<0 || sector>=fgNSector){
1803 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Sector2Slice","Sector")
1804 <<AliHLTTPCLog::kDec<<"Wrong sector "<<sector<<ENDLOG;
1808 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Sector2Slice","Row")
1809 <<AliHLTTPCLog::kDec<<"Wrong row "<<row<<ENDLOG;
1813 if(fgSectorLow[sector]){
1815 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Sector2Slice","Row")
1816 <<AliHLTTPCLog::kDec<<"Wrong row "<<row<<ENDLOG;
1819 slice = fgSector2Slice[sector];
1824 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Sector2Slice","Row")
1825 <<AliHLTTPCLog::kDec<<"Wrong row "<<row<<ENDLOG;
1828 slice = fgSector2Slice[sector];
1829 slicerow = row + fgNRowLow;
1835 Double_t AliHLTTPCTransform::GetMaxY(Int_t slicerow)
1837 //get maximum y value (for slice 0)
1838 if (slicerow>=fgNRow) {
1839 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetMaxY","Slicerow")
1840 <<AliHLTTPCLog::kDec<<"slicerow out of range"<<slicerow<<ENDLOG;
1842 if(slicerow < fgNRowLow)
1843 return fgPadPitchWidthLow*fgNPads[slicerow]/2;
1846 return fgPadPitchWidthUp*fgNPads[slicerow]/2;
1850 Double_t AliHLTTPCTransform::Row2X(Int_t slicerow)
1852 //slicerow to X value (slice 0)
1853 if(slicerow<0||slicerow>=fgNRow){
1854 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Row2X","Slicerow")
1855 <<AliHLTTPCLog::kDec<<"Wrong slicerow "<<slicerow<<ENDLOG;
1858 return fgX[slicerow];
1861 Double_t AliHLTTPCTransform::GetZFast(Int_t slice, Int_t time, Float_t vertex)
1864 Double_t z=fgZWidth*time-fgZOffset;
1866 z=fgZLength-z-vertex;
1868 z=z-fgZLength-vertex;
1872 void AliHLTTPCTransform::Local2Global(Float_t *xyz,Int_t slice)
1874 //Transformation to global coordinate system
1875 Float_t x0 = xyz[0];
1876 Float_t y0 = xyz[1];
1878 xyz[0]=x0*fgCos[slice]-y0*fgSin[slice];
1879 xyz[1]=x0*fgSin[slice]+y0*fgCos[slice];
1880 xyz[2]=xyz[2];//global z=local z
1883 void AliHLTTPCTransform::Local2GlobalAngle(Float_t *angle,Int_t slice)
1886 angle[0] = fmod(angle[0]+(slice+fgNRotShift)*(2*fgkPi/18),2*fgkPi);
1889 void AliHLTTPCTransform::Global2LocalAngle(Float_t *angle,Int_t slice)
1892 angle[0] = angle[0]-(slice+fgNRotShift)*(2*fgkPi/18);
1893 if(angle[0]<0) angle[0]+=2*fgkPi;
1896 void AliHLTTPCTransform::Raw2Local(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
1898 //Transformation from rawdata to local coordinate system
1900 Int_t slice,slicerow;
1901 if (Sector2Slice(slice, slicerow, sector, row)==kFALSE) return;
1904 xyz[0]=Row2X(slicerow);
1907 if (slicerow>=fgNRow) {
1908 LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetMaxY","Slicerow")
1909 <<AliHLTTPCLog::kDec<<"slicerow out of range"<<slicerow<<ENDLOG;
1912 Int_t npads= fgNPads[slicerow];
1914 if(fgSectorLow[sector])
1915 xyz[1]=(pad-0.5*(npads-1))*fgPadPitchWidthLow;
1917 xyz[1]=(pad-0.5*(npads-1))*fgPadPitchWidthUp;
1919 //Z-Value (remember PULSA Delay)
1921 xyz[2]=GetZLength()-GetZWidth()*time+GetZOffset();
1923 xyz[2]=GetZWidth()*time-GetZOffset()-GetZLength();
1926 void AliHLTTPCTransform::Raw2Local(Float_t *xyz,Int_t sector,Int_t row,Int_t pad,Int_t time)
1928 //Transformation from rawdata to local coordinate system
1930 Int_t slice,slicerow;
1931 Sector2Slice(slice, slicerow, sector, row);
1934 xyz[0]=Row2X(slicerow);
1937 Int_t npads= fgNPads[slicerow];
1939 if(fgSectorLow[sector])
1940 xyz[1]=(pad-0.5*(npads-1))*fgPadPitchWidthLow;
1942 xyz[1]=(pad-0.5*(npads-1))*fgPadPitchWidthUp;
1944 //Z-Value (remember PULSA Delay)
1946 xyz[2]=GetZLength()-GetZWidth()*time+GetZOffset();
1948 xyz[2]=GetZWidth()*time-GetZOffset()-GetZLength();
1951 void AliHLTTPCTransform::RawHLT2Local(Float_t *xyz,Int_t slice,
1952 Int_t slicerow,Float_t pad,Float_t time)
1954 //Transformation from HLT rawdata to local coordinate system
1957 xyz[0]=Row2X(slicerow);
1960 Int_t npads= fgNPads[slicerow];
1961 if(slicerow<fgNRowLow)
1962 xyz[1]=(pad-0.5*(npads-1))*fgPadPitchWidthLow;
1964 xyz[1]=(pad-0.5*(npads-1))*fgPadPitchWidthUp;
1968 xyz[2]=GetZLength()-GetZWidth()*time+GetZOffset();
1970 xyz[2]=GetZWidth()*time-GetZOffset()-GetZLength();
1973 void AliHLTTPCTransform::RawHLT2Local(Float_t *xyz,Int_t slice,
1974 Int_t slicerow,Int_t pad,Int_t time)
1976 //Transformation from HLT rawdata to local coordinate system
1979 xyz[0]=Row2X(slicerow);
1982 Int_t npads= fgNPads[slicerow];
1983 if(slicerow<fgNRowLow)
1984 xyz[1]=(pad-0.5*(npads-1))*fgPadPitchWidthLow;
1986 xyz[1]=(pad-0.5*(npads-1))*fgPadPitchWidthUp;
1990 xyz[2]=GetZLength()-GetZWidth()*time+GetZOffset();
1992 xyz[2]=GetZWidth()*time-GetZOffset()-GetZLength();
1995 void AliHLTTPCTransform::Local2Global(Float_t *xyz,Int_t sector,Int_t row)
1997 //Transformation to global coordinate system
1998 Int_t slice,slicerow;
1999 Sector2Slice(slice, slicerow, sector, row);
2000 Float_t r=Row2X(slicerow); //have to get x value first
2002 xyz[0]=r*fgCos[slice]-xyz[1]*fgSin[slice];
2003 xyz[1]=r*fgSin[slice]+xyz[1]*fgCos[slice];
2004 xyz[2]=xyz[2];//global z=local z
2007 void AliHLTTPCTransform::LocHLT2Global(Float_t *xyz,Int_t slice,Int_t slicerow)
2009 //Transformation from HLT to global coordinate system
2010 Float_t r=Row2X(slicerow); //have to get x value first
2012 xyz[0]=r*fgCos[slice]-xyz[1]*fgSin[slice];
2013 xyz[1]=r*fgSin[slice]+xyz[1]*fgCos[slice];
2014 xyz[2]=xyz[2];//global z=local z
2017 void AliHLTTPCTransform::Global2Local(Float_t *xyz,Int_t sector)
2020 Sector2Slice(slice, sector);
2022 Float_t x1 = xyz[0]*fgCos[slice] + xyz[1]*fgSin[slice];
2023 Float_t y1 = -xyz[0]*fgSin[slice] + xyz[1]*fgCos[slice];
2028 void AliHLTTPCTransform::Global2LocHLT(Float_t *xyz,Int_t slice)
2030 Float_t x1 = xyz[0]*fgCos[slice] + xyz[1]*fgSin[slice];
2031 Float_t y1 = -xyz[0]*fgSin[slice] + xyz[1]*fgCos[slice];
2036 void AliHLTTPCTransform::Raw2Global(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
2038 //Transformation from raw to global coordinates
2040 Raw2Local(xyz,sector,row,pad,time);
2041 Local2Global(xyz,sector,row);
2044 void AliHLTTPCTransform::Raw2Global(Float_t *xyz,Int_t sector,Int_t row,Int_t pad,Int_t time)
2046 //Transformation from raw to global coordinates
2048 Raw2Local(xyz,sector,row,pad,time);
2049 Local2Global(xyz,sector,row);
2052 void AliHLTTPCTransform::RawHLT2Global(Float_t *xyz,Int_t slice,
2053 Int_t slicerow,Float_t pad,Float_t time)
2055 //Transformation from raw to global coordinates
2057 RawHLT2Local(xyz,slice,slicerow,pad,time);
2058 LocHLT2Global(xyz,slice,slicerow);
2061 void AliHLTTPCTransform::RawHLT2Global(Float_t *xyz,Int_t slice,
2062 Int_t slicerow,Int_t pad,Int_t time)
2064 //Transformation from raw to global coordinates
2066 RawHLT2Local(xyz,slice,slicerow,pad,time);
2067 LocHLT2Global(xyz,slice,slicerow);
2070 void AliHLTTPCTransform::Local2Raw(Float_t *xyz,Int_t sector,Int_t row)
2072 //Transformation from local coordinates to raw
2074 Int_t slice,slicerow;
2075 Sector2Slice(slice, slicerow, sector, row);
2079 if(fgSectorLow[sector])
2080 xyz[1]=xyz[1]/fgPadPitchWidthLow+0.5*(fgNPads[slicerow]-1);
2082 xyz[1]=xyz[1]/fgPadPitchWidthUp+0.5*(fgNPads[slicerow]-1);
2085 xyz[2]=(GetZLength()-xyz[2]+GetZOffset())/GetZWidth();
2087 xyz[2]=(GetZLength()+xyz[2]+GetZOffset())/GetZWidth();
2090 void AliHLTTPCTransform::LocHLT2Raw(Float_t *xyz,Int_t slice,Int_t slicerow)
2092 //Transformation from local coordinates to raw
2096 if(slicerow<fgNRowLow)
2097 xyz[1]=xyz[1]/fgPadPitchWidthLow+0.5*(fgNPads[slicerow]-1);
2099 xyz[1]=xyz[1]/fgPadPitchWidthUp+0.5*(fgNPads[slicerow]-1);
2102 xyz[2]=(GetZLength()-xyz[2]+GetZOffset())/GetZWidth();
2104 xyz[2]=(GetZLength()+xyz[2]+GetZOffset())/GetZWidth();
2107 void AliHLTTPCTransform::Global2Raw(Float_t *xyz,Int_t sector,Int_t row)
2109 //Transformation from global coordinates to raw.
2111 Global2Local(xyz,sector);
2112 Local2Raw(xyz,sector,row);
2115 void AliHLTTPCTransform::Global2HLT(Float_t *xyz,Int_t slice,Int_t slicerow)
2117 //Transformation from global coordinates to raw.
2119 Global2LocHLT(xyz,slice);
2120 LocHLT2Raw(xyz,slice,slicerow);
2123 void AliHLTTPCTransform::PrintCompileOptions()
2125 //print compile options
2126 #if defined(__GNUC__)
2127 cout << "Compiler (g++) version used: " << __GNUC__ << endl;
2131 cout << "STANDALONE version: -Dno_root was given." << endl;
2133 const Char_t *roottest="$ROOTSYS/bin/root -n -b -q | grep Version | cut -b 17-25 | cut -d\" \" -f1";
2136 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";
2138 const Char_t *aliroottest="Unknown";
2140 cout << "ALIROOT version: -Duse_aliroot and -Duse_root was given." << endl;
2141 cout << "Root Version: " << ROOTVERSION << " found " << flush;
2142 gSystem->Exec(roottest);
2144 cout << "AliRoot Version: " << ALIROOTVERSION << " found " << flush;
2145 gSystem->Exec(aliroottest);
2147 cout << "ROOT version: -Duse_root was given." << endl;
2148 cout << "Root Version: " << ROOTVERSION << " found " << flush;
2149 gSystem->Exec(roottest);
2154 cout << "Using Monte Carlo Info: -Ddo_mc was given." << endl;
2156 cout << "NOT using Monte Carlo Info: -Ddo_mc was not given." << endl;
2159 #ifdef INCLUDE_TPC_HOUGH
2160 cout << "Including support for TPC Hough transformations." << endl;
2161 #ifdef ROWHOUGHPARAMS
2162 cout << "Using extended AliHLTTPCTrackSegmentData: -DROWHOUGHPARAMS was given." << endl;
2164 cout << "NOT using extended AliHLTTPCTrackSegmentData: -DROWHOUGHPARAMS was not given." << endl;
2167 cout << "NOT including any support for TPC Hough transformations." << endl;
2168 #endif // INCLUDE_TPC_HOUGH