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==fV_aliroot: ALIROOT-head compatible
70 // fVersion==fV_cosmics: Cosmics data run (2003) compatible
71 // fVersion==fV_default: means no config file has been loaded
72 // fVersion==fV_deprecated: dont use old (before July 2003) style of transformer
77 ClassImp(AliL3Transform)
79 const Double_t AliL3Transform::fAnodeWireSpacing = 0.25; //Taken from the TDR
80 const Double_t AliL3Transform::fBFACT = 0.0029980; //Conversion Factor
81 const Double_t AliL3Transform::fPi = 3.141592653589793;
82 const Double_t AliL3Transform::f2Pi = 2*3.141592653589793;
83 const Double_t AliL3Transform::fPi2 = 0.5*3.141592653589793;
84 const Double_t AliL3Transform::fToDeg = 180/3.141592653589793;
86 //Defined by HLT and GSI
87 Int_t AliL3Transform::fNPatches = 6;
88 Int_t AliL3Transform::fRows[6][2] = {{0,29},{30,62},{63,90},{91,116},{117,139},{140,158}};
89 Int_t AliL3Transform::fNRows[6] = {30,33,28,26,23,19};
91 // The following definition is generated by MakeInitFile function
92 Double_t AliL3Transform::fBField = 0.2;
93 Double_t AliL3Transform::fSolenoidBField = 2;
94 Double_t AliL3Transform::fBFieldFactor = 1;
95 Int_t AliL3Transform::fVersion = fV_default;
96 Int_t AliL3Transform::fNTimeBins = 446;
97 Int_t AliL3Transform::fNRowLow = 63;
98 Int_t AliL3Transform::fNRowUp = 96;
99 Int_t AliL3Transform::fNRowUp1 = 64;
100 Int_t AliL3Transform::fNRowUp2 = 32;
101 Int_t AliL3Transform::fNSectorLow = 36;
102 Int_t AliL3Transform::fNSectorUp = 36;
103 Int_t AliL3Transform::fNSector = 72;
104 Double_t AliL3Transform::fPadPitchWidthLow = 0.4;
105 Double_t AliL3Transform::fPadPitchWidthUp = 0.6;
106 Double_t AliL3Transform::fZWidth = 0.5660;
107 Double_t AliL3Transform::fZSigma = 0.2288;
108 Double_t AliL3Transform::fZLength = 250.0000;
109 Double_t AliL3Transform::fZOffset = 0.6864;
110 Double_t AliL3Transform::fDiffT = 0.0220;
111 Double_t AliL3Transform::fDiffL = 0.0220;
112 Double_t AliL3Transform::fOmegaTau = 0.1450;
113 Double_t AliL3Transform::fInnerPadLength = 0.75;
114 Double_t AliL3Transform::fOuter1PadLength = 1.00;
115 Double_t AliL3Transform::fOuter2PadLength = 1.50;
116 Double_t AliL3Transform::fInnerPRFSigma = 0.203811;
117 Double_t AliL3Transform::fOuter1PRFSigma = 0.299325;
118 Double_t AliL3Transform::fOuter2PRFSigma = 0.299323;
119 Double_t AliL3Transform::fTimeSigma = 0.228809;
120 Int_t AliL3Transform::fADCSat = 1024;
121 Int_t AliL3Transform::fZeroSup = 0;
122 Int_t AliL3Transform::fNSlice = 36;
123 Int_t AliL3Transform::fNRow = 159;
124 Double_t AliL3Transform::fNRotShift = 0.5;
125 Int_t AliL3Transform::fSlice2Sector[36][2] = { { 0, 36},
163 Int_t AliL3Transform::fSector2Slice[72] = { 0,
237 Int_t AliL3Transform::fSectorLow[72] = { 1,
311 Double_t AliL3Transform::fX[159] = { 85.195,
472 Int_t AliL3Transform::fNPads[159] = {67,
633 Double_t AliL3Transform::fCos[36] = { 0.9848077297,
671 Double_t AliL3Transform::fSin[36] = { 0.1736481786,
709 Bool_t AliL3Transform::Init(Char_t* path,Bool_t UseAliTPCParam)
711 //Overwrite the parameters with values stored in file "l3transform.config" in path.
712 //If file does not exist, old default values will be used.
713 //If flag UseAliTPCParam is set, the parameters will be read from the the rootfile
714 //which then has to be called path/digitfile.root
716 if(fVersion != fV_default)
717 LOG(AliL3Log::kWarning,"AliL3Transform::Init","Init values")
718 <<AliL3Log::kDec<<"You are initializing the parameters more than once; check your code please! "<<fVersion<<ENDLOG;
720 if(UseAliTPCParam) //use rootfile to generate temporary init file
721 return ReadInit(path);
724 Char_t pathname[1024];
725 strcpy(pathname,path);
727 //test whether provided path is the file itself
729 DIR *testdir=opendir(pathname);
735 if(isdir) strcat(pathname,"/l3transform.config");
737 return ReadInitFile(pathname);
740 Bool_t AliL3Transform::ReadInitFile(Char_t* pathname)
742 //read transformer settings from pathname
744 FILE *fptr=fopen(pathname,"r");
746 LOG(AliL3Log::kWarning,"AliL3Transform::ReadInitFile","File Open")
747 <<"Pointer to Config File \""<<pathname<<"\" 0x0!"<<ENDLOG;
751 Char_t d1[250], d2[100], d3[100];
756 fscanf(fptr,"%s",d1);
757 if(strcmp(d1,"fVersion")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fVersion=dummy;}
758 else if(strcmp(d1,"fBFieldFactor")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fBFieldFactor=(Double_t)ddummy;}
759 else if(strcmp(d1,"fSolenoidBField")==0)
761 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);
762 fSolenoidBField=(Double_t)ddummy;
764 else if(strcmp(d1,"fNTimeBins")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNTimeBins=(Int_t)dummy;}
765 else if(strcmp(d1,"fNRowLow")==0)
767 fscanf(fptr,"%s %d %s",d2,&dummy,d3);
768 fNRowLow=(Int_t)dummy;
770 LOG(AliL3Log::kError,"AliL3Transform::ReadInitFile","Overflow")
771 <<"Number of inner PadRows should be 63! Check and fgrep the code for 63 to see the consequences of this major change!"<<ENDLOG;
773 else if(strcmp(d1,"fNRowUp")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRowUp=(Int_t)dummy;}
774 else if(strcmp(d1,"fNRowUp1")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRowUp1=(Int_t)dummy;}
775 else if(strcmp(d1,"fNRowUp2")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRowUp2=(Int_t)dummy;}
776 else if(strcmp(d1,"fNSectorLow")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSectorLow=(Int_t)dummy;}
777 else if(strcmp(d1,"fNSectorUp")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSectorUp=(Int_t)dummy;}
778 else if(strcmp(d1,"fNSector")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSector=(Int_t)dummy;}
779 else if(strcmp(d1,"fPadPitchWidthLow")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fPadPitchWidthLow=(Double_t)ddummy;}
780 else if(strcmp(d1,"fPadPitchWidthUp")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fPadPitchWidthUp=(Double_t)ddummy;}
781 else if(strcmp(d1,"fZWidth")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZWidth=(Double_t)ddummy;}
782 else if(strcmp(d1,"fZSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZSigma=(Double_t)ddummy;}
783 else if(strcmp(d1,"fZLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZLength=(Double_t)ddummy;}
784 else if(strcmp(d1,"fZOffset")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fZOffset=(Double_t)ddummy;}
785 else if(strcmp(d1,"fNSlice")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNSlice=(Int_t)dummy;}
786 else if(strcmp(d1,"fDiffT")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fDiffT=(Double_t)ddummy;}
787 else if(strcmp(d1,"fDiffL")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fDiffL=(Double_t)ddummy;}
788 else if(strcmp(d1,"fOmegaTau")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fOmegaTau=(Double_t)ddummy;}
789 else if(strcmp(d1,"fInnerPadLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fInnerPadLength=(Double_t)ddummy;}
790 else if(strcmp(d1,"fOuter1PadLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fOuter1PadLength=(Double_t)ddummy;}
791 else if(strcmp(d1,"fOuter2PadLength")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fOuter2PadLength=(Double_t)ddummy;}
792 else if(strcmp(d1,"fInnerPRFSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fInnerPRFSigma=(Double_t)ddummy;}
793 else if(strcmp(d1,"fOuter1PRFSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fOuter1PRFSigma=(Double_t)ddummy;}
794 else if(strcmp(d1,"fOuter2PRFSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fOuter2PRFSigma=(Double_t)ddummy;}
795 else if(strcmp(d1,"fTimeSigma")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fTimeSigma=(Double_t)ddummy;}
796 else if(strcmp(d1,"fADCSat")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fADCSat=(Int_t)dummy;}
797 else if(strcmp(d1,"fZeroSup")==0){fscanf(fptr,"%s %d %s",d2,&dummy,d3);fZeroSup=(Int_t)dummy;}
798 else if(strcmp(d1,"fNRow")==0){
799 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRow=(Int_t)dummy;
801 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;
804 else if(strcmp(d1,"fNRotShift")==0){fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fNRotShift=(Double_t)ddummy;}
805 else if(strcmp(d1,"fX[0]")==0){
806 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fX[0]=(Double_t)ddummy;
807 for(Int_t i=1;i<fNRow;i++){fscanf(fptr,"%s %s %lf %s",d1,d2,&ddummy,d3);fX[i]=(Double_t)ddummy;}
809 else if(strcmp(d1,"fNPads[0]")==0){
810 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNPads[0]=(Int_t)dummy;
811 for(Int_t i=1;i<fNRow;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fNPads[i]=(Int_t)dummy;}
813 else if(strcmp(d1,"fNRows[0]")==0){
814 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fNRows[0]=(Int_t)dummy;
815 for(Int_t i=1;i<fNPatches;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fNRows[i]=(Int_t)dummy;}
817 else if(strcmp(d1,"fRows[0][0]")==0){
818 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fRows[0][0]=(Int_t)dummy;
819 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fRows[0][1]=(Int_t)dummy;
820 for(Int_t i=1;i<fNPatches;i++){
821 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fRows[i][0]=(Int_t)dummy;
822 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fRows[i][1]=(Int_t)dummy;
825 else if(strcmp(d1,"fSlice2Sector[0][0]")==0){
826 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fSlice2Sector[0][0]=(Int_t)dummy;
827 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fSlice2Sector[0][1]=(Int_t)dummy;
828 for(Int_t i=1;i<fNSlice;i++){
829 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fSlice2Sector[i][0]=(Int_t)dummy;
830 fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fSlice2Sector[i][1]=(Int_t)dummy;
833 else if(strcmp(d1,"fSector2Slice[0]")==0){
834 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fSector2Slice[0]=(Int_t)dummy;
835 for(Int_t i=1;i<fNSector;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fSector2Slice[i]=(Int_t)dummy;}
837 else if(strcmp(d1,"fSectorLow[0]")==0){
838 fscanf(fptr,"%s %d %s",d2,&dummy,d3);fSectorLow[0]=(Int_t)dummy;
839 for(Int_t i=1;i<fNSector;i++){fscanf(fptr,"%s %s %d %s",d1,d2,&dummy,d3);fSectorLow[i]=(Int_t)dummy;}
841 else if(strcmp(d1,"fCos[0]")==0){
842 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fCos[0]=(Double_t)ddummy;
843 for(Int_t i=1;i<fNSlice;i++){fscanf(fptr,"%s %s %lf %s",d1,d2,&ddummy,d3);fCos[i]=(Double_t)ddummy;}
845 else if(strcmp(d1,"fSin[0]")==0){
846 fscanf(fptr,"%s %lf %s",d2,&ddummy,d3);fSin[0]=(Double_t)ddummy;
847 for(Int_t i=1;i<fNSlice;i++){fscanf(fptr,"%s %s %lf %s",d1,d2,&ddummy,d3);fSin[i]=(Double_t)ddummy;}
852 //The first multiplier gives the scale factor used to modify the field map
853 //defined by the second multiplier.
854 fBField=fBFieldFactor*fSolenoidBField*0.1;
856 //Test if new config file has been used.
857 if(fVersion==fV_deprecated){
858 LOG(AliL3Log::kError,"AliL3Transform::ReadInitFile","Version")
859 <<"Version is deprecated, you have to create a new config file."<<ENDLOG;
863 LOG(AliL3Log::kInformational,"AliL3Transform::ReadInitFile","Config")
864 <<"Successfully loaded values from config file \""<<pathname<<"\""<<ENDLOG;
869 Bool_t AliL3Transform::ReadInit(Char_t *path)
871 //Read all the parameters from a aliroot file, and store it in a temporary
872 //file which is read by Init. Use this if you want to read the parameters from
873 //the rootfile "every" time.
876 LOG(AliL3Log::kError,"AliL3Transform::ReadInit","Version")
877 <<"You have to compile with use_aliroot flag in order to read from AliROOT file"<<ENDLOG;
880 Char_t filename[1024];
881 //first test whether provided path is the rootfile itself
882 Int_t saveErrIgLevel=gErrorIgnoreLevel;
883 gErrorIgnoreLevel=kFatal; //dont report errors
884 TFile *rootfile = TFile::Open(path);
885 if(!rootfile || rootfile->IsZombie())
886 { //ok assume its path to alirunfile file
887 sprintf(filename,"%s/alirunfile.root",path); //create rootfile name
888 } else { //path contains itself the rootfile name
890 sprintf(filename,"%s",path);
892 gErrorIgnoreLevel=saveErrIgLevel;
894 //finally make dummy init file /tmp/$USER/l3transform.config-`date`
895 Char_t tmppath[1024];
896 sprintf(tmppath,"/tmp/%s",gSystem->Getenv("USER"));
897 gSystem->mkdir(tmppath);
899 Char_t tmpfile[1024];
900 sprintf(tmpfile,"%s/l3transform.config-%d",tmppath,(Int_t)time.GetSec());
901 return MakeInitFile(filename,tmpfile);
905 Bool_t AliL3Transform::MakeInitFile(Char_t *rootfilename,Char_t *filename)
907 //Get the parameters from rootfile, and store it on the file "l3transform.config"
908 //which is being read by Init. fVersion will be fV_aliroot!
911 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","Version")
912 <<"You have to compile with use_aliroot flag in order to use this function"<<ENDLOG;
915 TFile *rootfile = TFile::Open(rootfilename);
918 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","File")
919 <<"Could not open file: "<<rootfilename<<ENDLOG;
922 AliRun *gAlice = (AliRun*)rootfile->Get("gAlice");
925 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","File")
926 <<"No gAlice in file: "<<rootfilename<<ENDLOG;
929 AliTPCParamSR *param=(AliTPCParamSR*)rootfile->Get(GetParamName());
932 LOG(AliL3Log::kWarning,"AliL3Transform::MakeInitFile","File")
933 <<"No TPC parameters found in \""<<rootfilename
934 <<"\", creating standard parameters "
935 <<"which might not be what you want!"<<ENDLOG;
936 param=new AliTPCParamSR;
939 AliTPCPRF2D * prfinner = new AliTPCPRF2D;
940 AliTPCPRF2D * prfouter1 = new AliTPCPRF2D;
941 AliTPCPRF2D * prfouter2 = new AliTPCPRF2D;
942 AliTPCRF1D * rf = new AliTPCRF1D(kTRUE);
943 rf->SetGauss(param->GetZSigma(),param->GetZWidth(),1.);
944 rf->SetOffset(3*param->GetZSigma());
947 TDirectory *savedir=gDirectory;
948 TFile *prf_file = TFile::Open("$ALICE_ROOT/TPC/AliTPCprf2d.root");
949 if (!prf_file->IsOpen())
951 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","File")
952 <<"Can't open $ALICE_ROOT/TPC/AliTPCprf2d.root !"<<ENDLOG;
955 prfinner ->Read("prf_07504_Gati_056068_d02");
956 prfouter1->Read("prf_10006_Gati_047051_d03");
957 prfouter2->Read("prf_15006_Gati_047051_d03");
961 param->SetInnerPRF(prfinner);
962 param->SetOuter1PRF(prfouter1);
963 param->SetOuter2PRF(prfouter2);
964 param->SetTimeRF(rf);
966 fNTimeBins = param->GetMaxTBin()+1;
967 fNRowLow = param->GetNRowLow();
968 fNRowUp = param->GetNRowUp();
969 fNRowUp1 = param->GetNRowUp1();
970 fNRowUp2 = param->GetNRowUp2();
971 fNRow= fNRowLow + fNRowUp;
973 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","fNRow")
974 <<"Number of rows have changed in ALIROOT"<<ENDLOG;
978 fNSectorLow = param->GetNInnerSector();
979 fNSectorUp = param->GetNOuterSector();
980 fNSector = fNSectorLow + fNSectorUp;
982 //test whether they were changes to the rotation shift
984 Float_t irotshift = param->GetInnerAngleShift(); //shift angle
985 Float_t orotshift = param->GetOuterAngleShift(); //shift angle
986 const Float_t kDegtoRad = 0.01745329251994;
987 Int_t shift1=TMath::Nint(irotshift/kDegtoRad);
988 Int_t shift2=TMath::Nint(orotshift/kDegtoRad+0.1);
989 if((shift1!=shift2) || (shift1!=10)){
990 LOG(AliL3Log::kError,"AliL3Transform::MakeInitFile","Rotshiftangle")
991 <<"Rotation shift angle has changed in ALIROOT"<<ENDLOG;
994 fNRotShift=0.5; //our version of the shift angle
998 SetBFieldFactor((Double_t)gAlice->Field()->Factor());
999 SetSolenoidBField((Double_t)gAlice->Field()->SolenoidField());
1000 fPadPitchWidthLow=param->GetInnerPadPitchWidth();
1001 fPadPitchWidthUp=param->GetOuterPadPitchWidth();
1002 fZWidth=param->GetZWidth();
1003 fZSigma=param->GetZSigma();
1004 fZLength=param->GetZLength();
1005 fZOffset=param->GetZOffset();
1006 fDiffT=param->GetDiffT();
1007 fDiffL=param->GetDiffL();
1008 fOmegaTau=param->GetOmegaTau();
1009 fInnerPadLength=param->GetInnerPadLength();
1010 fOuter1PadLength=param->GetOuter1PadLength();
1011 fOuter2PadLength=param->GetOuter2PadLength();
1012 fInnerPRFSigma=param->GetInnerPRF()->GetSigmaX();
1013 fOuter1PRFSigma=param->GetOuter1PRF()->GetSigmaX();
1014 fOuter2PRFSigma=param->GetOuter2PRF()->GetSigmaX();
1015 fTimeSigma=param->GetTimeRF()->GetSigma();
1016 fADCSat=param->GetADCSat();
1017 fZeroSup=param->GetZeroSup();
1018 fNSlice=fNSectorLow;
1021 for(Int_t i=0;i<fNRow;i++){
1023 if( i < fNRowLow){sec =0;row =i;}
1024 else{sec = fNSectorLow;row =i-fNRowLow;}
1025 fX[i]=param->GetPadRowRadii(sec,row);
1027 for(Int_t i=0;i<fNRow;i++){
1029 if( i < fNRowLow){sec =0;row =i;}
1030 else{sec = fNSectorLow;row =i-fNRowLow;}
1031 fNPads[i]=param->GetNPads(sec,row);
1033 for(Int_t i=0;i<fNSector;i++){
1034 if(i<fNSectorLow) fSectorLow[i]=1;
1035 else fSectorLow[i]=0;
1037 return SaveInitFile(filename);
1041 Bool_t AliL3Transform::SaveInitFile(Char_t *filenamepath)
1043 //store the parameters in the file "filenamepath"
1045 FILE *f = fopen(filenamepath,"w");
1047 LOG(AliL3Log::kError,"AliL3Transform::SaveInitFile","File")
1048 <<"Could not open file: "<<filenamepath<<ENDLOG;
1052 fprintf(f,"void AliL3Transform::Init(){\n");
1053 fprintf(f," fVersion = %d;\n", fVersion);
1054 fprintf(f," fBFieldFactor = %.3f;\n",fBFieldFactor);
1055 fprintf(f," fSolenoidBField = %.3f;\n",fSolenoidBField);
1056 fprintf(f," fNTimeBins = %d;\n",fNTimeBins);
1057 fprintf(f," fNRowLow = %d;\n",fNRowLow);
1058 fprintf(f," fNRowUp = %d;\n",fNRowUp);
1059 fprintf(f," fNRowUp1 = %d;\n",fNRowUp1);
1060 fprintf(f," fNRowUp2 = %d;\n",fNRowUp2);
1061 fprintf(f," fNSectorLow = %d;\n",fNSectorLow);
1062 fprintf(f," fNSectorUp = %d;\n",fNSectorUp);
1063 fprintf(f," fNSector = %d;\n",fNSector);
1064 fprintf(f," fPadPitchWidthLow = %.3f;\n",fPadPitchWidthLow);
1065 fprintf(f," fPadPitchWidthUp = %.3f;\n",fPadPitchWidthUp);
1066 fprintf(f," fZWidth = %.4f;\n",fZWidth);
1067 fprintf(f," fZSigma = %.4f;\n",fZSigma);
1068 fprintf(f," fZLength = %.4f;\n",fZLength);
1069 fprintf(f," fZOffset = %.4f;\n",fZOffset);
1070 fprintf(f," fDiffT = %.4f;\n",fDiffT);
1071 fprintf(f," fDiffL = %.4f;\n",fDiffL);
1072 fprintf(f," fOmegaTau = %.4f;\n",fOmegaTau);
1073 fprintf(f," fInnerPadLength = %.3f;\n",fInnerPadLength);
1074 fprintf(f," fOuter1PadLength = %.3f;\n",fOuter1PadLength);
1075 fprintf(f," fOuter2PadLength = %.3f;\n",fOuter2PadLength);
1076 fprintf(f," fInnerPRFSigma = %.6f;\n",fInnerPRFSigma);
1077 fprintf(f," fOuter1PRFSigma = %.6f;\n",fOuter1PRFSigma);
1078 fprintf(f," fOuter2PRFSigma = %.6f;\n",fOuter2PRFSigma);
1079 fprintf(f," fTimeSigma = %.6f;\n",fTimeSigma);
1080 fprintf(f," fADCSat = %d;\n",fADCSat);
1081 fprintf(f," fZeroSup = %d;\n",fZeroSup);
1082 fprintf(f," fNSlice = %d;\n",fNSlice);
1083 fprintf(f," fNRow = %d;\n",fNRow);
1084 fprintf(f," fNRotShift = %.2f;\n",fNRotShift);
1086 for(Int_t i=0;i<fNRow;i++){
1087 fprintf(f," fX[%d] = %3.2f;\n",i,fX[i]);
1089 for(Int_t i=0;i<fNRow;i++){
1090 fprintf(f," fNPads[%d] = %d;\n",i,fNPads[i]);
1093 //Slice/Sector dont belong to aliroot, but we want to be flexible
1094 for(Int_t i=0;i<fNSlice;i++){
1095 fprintf(f," fSlice2Sector[%d][0] = %d;\n",i,fSlice2Sector[i][0]);
1096 fprintf(f," fSlice2Sector[%d][1] = %d;\n",i,fSlice2Sector[i][1]);
1098 for(Int_t i=0;i<fNSector;i++){
1099 fprintf(f," fSector2Slice[%d] = %d;\n",i,fSector2Slice[i]);
1101 for(Int_t i=0;i<fNSector;i++){
1102 fprintf(f," fSectorLow[%d] = %d;\n",i,fSectorLow[i]);
1105 //Patches also dont really belong to the aliroot settings (but nevermind)
1106 for(Int_t i=0;i<fNPatches;i++){
1107 fprintf(f," fNRows[%d] = %d;\n",i,fNRows[i]);
1109 for(Int_t i=0;i<fNPatches;i++){
1110 fprintf(f," fRows[%d][0] = %d;\n",i,fRows[i][0]);
1111 fprintf(f," fRows[%d][1] = %d;\n",i,fRows[i][1]);
1114 //Rotation shift is an addon, too
1115 for(Int_t i=0;i<fNSlice;i++){
1116 Float_t cs = cos( (2*fPi/18) * (i+fNRotShift) );
1117 fprintf(f," fCos[%d] = %.10f;\n",i,cs);
1119 for(Int_t i=0;i<fNSlice;i++){
1120 Float_t sn = sin( (2*fPi/18) * (i+fNRotShift) );
1121 fprintf(f," fSin[%d] = %.10f;\n",i,sn);
1127 LOG(AliL3Log::kInformational,"AliL3Transform::SaveInitFile","File created")
1128 <<"Init file \""<<filenamepath<<"\" created"<<ENDLOG;
1133 Int_t AliL3Transform::GetNPads(Int_t row)
1135 if(row < 0 || row >= fNRow)
1137 LOG(AliL3Log::kError,"AliL3Transform::GetNPads","Row")
1138 <<AliL3Log::kDec<<"Wrong row "<<row<<ENDLOG;
1145 Int_t AliL3Transform::GetFirstRow(Int_t patch)
1149 else if(patch < -1 || patch >= 6)
1151 LOG(AliL3Log::kError,"AliL3Transform::GetFirstRow","Patch")
1152 <<AliL3Log::kDec<<"Wrong patch "<<patch<<ENDLOG;
1156 return fRows[patch][0];
1159 Int_t AliL3Transform::GetLastRow(Int_t patch)
1163 else if(patch < -1 || patch >= 6)
1165 LOG(AliL3Log::kError,"AliL3Transform::GetLastRow","Patch")
1166 <<AliL3Log::kDec<<"Wrong patch "<<patch<<ENDLOG;
1170 return fRows[patch][1];
1173 Int_t AliL3Transform::GetNRows(Int_t patch)
1177 else if(patch < -1 || patch >= 6)
1179 LOG(AliL3Log::kError,"AliL3Transform::GetNRows","Patch")
1180 <<AliL3Log::kDec<<"Wrong patch "<<patch<<ENDLOG;
1184 return fNRows[patch];
1187 Int_t AliL3Transform::GetPadRow(Float_t xvalue)
1189 //Find the padrow number corresponding to cartesian _local_ x value
1191 if(xvalue < 0 || xvalue > 250)
1193 LOG(AliL3Log::kError,"AliL3Transform::GetPadRow","X-value")
1194 <<AliL3Log::kDec<<"Suspicious x-value, make sure it is in local coordinate! "
1199 Int_t x = (Int_t)rint(xvalue*10);
1200 if(x < (Int_t)rint(fX[1]*10))
1202 else if(x > (Int_t)rint(fX[fNRow-2]*10))
1206 Int_t padrow=1; //Of course, a more clever algorithm could help here
1207 while(padrow < fNRow-2)
1209 if(x > (Int_t)rint(fX[padrow-1]*10) && x < (Int_t)rint(fX[padrow+1]*10))
1217 Int_t AliL3Transform::GetPatch(Int_t padrow)
1219 if(padrow < 0 || padrow >= fNRow)
1221 LOG(AliL3Log::kError,"AliL3Transform::GetPatch","Padrow")
1222 <<AliL3Log::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1226 while(patch < fNPatches)
1228 if(padrow >= fRows[patch][0] && padrow <= fRows[patch][1])
1235 Double_t AliL3Transform::GetPadLength(Int_t padrow)
1237 if(padrow >= fNRow){
1238 LOG(AliL3Log::kError,"AliL3Transform::GetPadLength","Padrow")
1239 <<AliL3Log::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1243 if(padrow < fNRowLow)
1244 return fInnerPadLength;
1245 if(padrow >= fNRowLow && padrow < fNRowLow + fNRowUp1 - 1)
1246 return fOuter1PadLength;
1247 if(padrow >= fNRowLow + fNRowUp1 - 1)
1248 return fOuter2PadLength;
1250 //should never happen
1251 LOG(AliL3Log::kError,"AliL3Transform::GetPadLength","Padrow")
1252 <<AliL3Log::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1256 Double_t AliL3Transform::GetPadPitchWidth(Int_t patch)
1258 if(patch < 0 || patch > fNPatches)
1260 LOG(AliL3Log::kError,"AliL3Transform::GetPadPitchWidth","patct")
1261 <<AliL3Log::kDec<<"Wrong patch "<<patch<<ENDLOG;
1264 return patch < 2 ? fPadPitchWidthLow : fPadPitchWidthUp;
1267 Double_t AliL3Transform::GetParSigmaY2(Int_t padrow,Float_t z,Float_t angle)
1269 //Calculate the expected transverse cluster width as a function of
1270 //drift distance and crossing angle.
1271 //z = local z-coordinate of cluster
1272 //angle = track crossing angle with normal to padrow plane
1273 //return value = sigma^2 (cartesian coordinates)
1277 drift = fZLength - z;
1279 drift = fZLength + z;
1281 Double_t t1 = GetPRFSigma(padrow)*GetPRFSigma(padrow);
1282 Double_t t2 = fDiffT*fDiffT*drift;
1283 Double_t t3 = GetPadLength(padrow)*GetPadLength(padrow)*tan(angle)*tan(angle)/12;
1284 Double_t t4 = fAnodeWireSpacing*fAnodeWireSpacing*(tan(angle) - fOmegaTau)*(tan(angle) - fOmegaTau)/12;
1286 return (t1 + t2 + t3 + t4);
1289 Double_t AliL3Transform::GetParSigmaZ2(Int_t padrow,Float_t z,Float_t tgl)
1291 //Calculate the expected longitudinal cluster width as a function of
1292 //drift distance and track crossing angle.
1293 //z = local z-coordinate of cluster
1294 //tgl = tan(dipangle)
1295 //return value = sigma^2 (cartesian coordinates)
1299 drift = AliL3Transform::GetZLength() - z;
1301 drift = AliL3Transform::GetZLength() + z;
1303 Double_t t1 = fZSigma*fZSigma;
1304 Double_t t2 = fDiffL*fDiffL*drift;
1305 Double_t t3 = GetPadLength(padrow)*GetPadLength(padrow)*tgl*tgl/12;
1307 return (t1 + t2 + t3);
1310 Double_t AliL3Transform::GetPRFSigma(Int_t padrow)
1312 if(padrow >= fNRow){
1313 LOG(AliL3Log::kError,"AliL3Transform::GetPRFSigma","Padrow")
1314 <<AliL3Log::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1317 if(padrow < fNRowLow)
1318 return fInnerPRFSigma;
1319 if(padrow >= fNRowLow && padrow < fNRowLow + fNRowUp1 - 1)
1320 return fOuter1PRFSigma;
1321 if(padrow >= fNRowLow + fNRowUp1 - 1)
1322 return fOuter2PRFSigma;
1324 //should never happen
1325 LOG(AliL3Log::kError,"AliL3Transform::GetPRFSigma","Padrow")
1326 <<AliL3Log::kDec<<"Wrong padrow "<<padrow<<ENDLOG;
1330 Double_t AliL3Transform::GetEta(Float_t *xyz)
1332 Double_t r3 = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
1333 Double_t eta = 0.5 * log((r3+xyz[2])/(r3-xyz[2]));
1337 void AliL3Transform::XYZtoRPhiEta(Float_t *rpe, Float_t *xyz)
1339 rpe[0] = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
1340 rpe[1] = atan2(xyz[1],xyz[0]);
1341 rpe[2] = 0.5 * log((rpe[0]+xyz[2])/(rpe[0]-xyz[2]));
1344 Double_t AliL3Transform::GetEta(Int_t slice,Int_t padrow,Int_t pad,Int_t time)
1348 Slice2Sector(slice,padrow,sector,row);
1349 Raw2Local(xyz,sector,row,pad,time);
1354 Double_t AliL3Transform::GetPhi(Float_t *xyz)
1356 Double_t phi = atan2(xyz[1],xyz[0]);
1360 Bool_t AliL3Transform::Slice2Sector(Int_t slice, Int_t slicerow, Int_t & sector, Int_t &row)
1362 if(slicerow<0&&slicerow>=fNRow){
1363 LOG(AliL3Log::kError,"AliL3Transform::Slice2Sector","Slicerow")
1364 <<AliL3Log::kDec<<"Wrong slicerow "<<slicerow<<ENDLOG;
1367 if(slice<0||slice>=fNSlice){
1368 LOG(AliL3Log::kError,"AliL3Transform::Slice2Sector","Slice")
1369 <<AliL3Log::kDec<<"Wrong slice "<<slice<<ENDLOG;
1373 if(slicerow<fNRowLow){
1374 sector = fSlice2Sector[slice][0];
1378 sector = fSlice2Sector[slice][1];
1379 row = slicerow-fNRowLow;
1385 Bool_t AliL3Transform::Sector2Slice(Int_t & slice, Int_t sector)
1387 if(sector<0||sector>=fNSector){
1388 LOG(AliL3Log::kError,"AliL3Transform::Sector2Slice","Sector")
1389 <<AliL3Log::kDec<<"Wrong sector "<<sector<<ENDLOG;
1393 slice=fSector2Slice[sector];
1398 Bool_t AliL3Transform::Sector2Slice(Int_t & slice, Int_t & slicerow, Int_t sector, Int_t row)
1400 if(sector<0 || sector>=fNSector){
1401 LOG(AliL3Log::kError,"AliL3Transform::Sector2Slice","Sector")
1402 <<AliL3Log::kDec<<"Wrong sector "<<sector<<ENDLOG;
1406 LOG(AliL3Log::kError,"AliL3Transform::Sector2Slice","Row")
1407 <<AliL3Log::kDec<<"Wrong row "<<row<<ENDLOG;
1411 if(fSectorLow[sector]){
1413 LOG(AliL3Log::kError,"AliL3Transform::Sector2Slice","Row")
1414 <<AliL3Log::kDec<<"Wrong row "<<row<<ENDLOG;
1417 slice = fSector2Slice[sector];
1422 LOG(AliL3Log::kError,"AliL3Transform::Sector2Slice","Row")
1423 <<AliL3Log::kDec<<"Wrong row "<<row<<ENDLOG;
1426 slice = fSector2Slice[sector];
1427 slicerow = row + fNRowLow;
1433 Double_t AliL3Transform::GetMaxY(Int_t slicerow)
1435 if(slicerow < fNRowLow)
1436 return fPadPitchWidthLow*fNPads[slicerow]/2;
1439 return fPadPitchWidthUp*fNPads[slicerow]/2;
1443 Double_t AliL3Transform::Row2X(Int_t slicerow){
1444 if(slicerow<0||slicerow>=fNRow){
1445 LOG(AliL3Log::kError,"AliL3Transform::Row2X","Slicerow")
1446 <<AliL3Log::kDec<<"Wrong slicerow "<<slicerow<<ENDLOG;
1449 return fX[slicerow];
1452 Double_t AliL3Transform::GetZFast(Int_t slice, Int_t time, Float_t vertex)
1454 Double_t z=fZWidth*time-fZOffset;
1456 z=fZLength-z-vertex;
1458 z=z-fZLength-vertex;
1462 void AliL3Transform::Local2Global(Float_t *xyz,Int_t slice)
1464 //Transformation to global coordinate system
1465 Float_t x0 = xyz[0];
1466 Float_t y0 = xyz[1];
1468 xyz[0]=x0*fCos[slice]-y0*fSin[slice];
1469 xyz[1]=x0*fSin[slice]+y0*fCos[slice];
1470 xyz[2]=xyz[2];//global z=local z
1473 void AliL3Transform::Local2GlobalAngle(Float_t *angle,Int_t slice){
1474 angle[0] = fmod(angle[0]+(slice+fNRotShift)*(2*fPi/18),2*fPi);
1477 void AliL3Transform::Global2LocalAngle(Float_t *angle,Int_t slice){
1478 angle[0] = angle[0]-(slice+fNRotShift)*(2*fPi/18);
1479 if(angle[0]<0) angle[0]+=2*fPi;
1482 void AliL3Transform::Raw2Local(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
1484 //Transformation from rawdata to local coordinate system
1486 Int_t slice,slicerow;
1487 Sector2Slice(slice, slicerow, sector, row);
1490 xyz[0]=Row2X(slicerow);
1493 Int_t npads= fNPads[slicerow];
1495 if(fSectorLow[sector])
1496 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthLow;
1498 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthUp;
1500 //Z-Value (remember PULSA Delay)
1502 xyz[2]=fZLength-fZWidth*time+fZOffset;
1504 xyz[2]=fZWidth*time-fZOffset-fZLength;
1507 void AliL3Transform::Raw2Local(Float_t *xyz,Int_t sector,Int_t row,Int_t pad,Int_t time)
1509 //Transformation from rawdata to local coordinate system
1511 Int_t slice,slicerow;
1512 Sector2Slice(slice, slicerow, sector, row);
1515 xyz[0]=Row2X(slicerow);
1518 Int_t npads= fNPads[slicerow];
1520 if(fSectorLow[sector])
1521 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthLow;
1523 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthUp;
1525 //Z-Value (remember PULSA Delay)
1527 xyz[2]=fZLength-fZWidth*time+fZOffset;
1529 xyz[2]=fZWidth*time-fZOffset-fZLength;
1532 void AliL3Transform::RawHLT2Local(Float_t *xyz,Int_t slice,
1533 Int_t slicerow,Float_t pad,Float_t time)
1535 //Transformation from HLT rawdata to local coordinate system
1538 xyz[0]=Row2X(slicerow);
1541 Int_t npads= fNPads[slicerow];
1542 if(slicerow<fNRowLow)
1543 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthLow;
1545 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthUp;
1549 xyz[2]=fZLength-fZWidth*time+fZOffset;
1551 xyz[2]=fZWidth*time-fZOffset-fZLength;
1554 void AliL3Transform::RawHLT2Local(Float_t *xyz,Int_t slice,
1555 Int_t slicerow,Int_t pad,Int_t time)
1557 //Transformation from HLT rawdata to local coordinate system
1560 xyz[0]=Row2X(slicerow);
1563 Int_t npads= fNPads[slicerow];
1564 if(slicerow<fNRowLow)
1565 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthLow;
1567 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthUp;
1571 xyz[2]=fZLength-fZWidth*time+fZOffset;
1573 xyz[2]=fZWidth*time-fZOffset-fZLength;
1576 void AliL3Transform::Local2Global(Float_t *xyz,Int_t sector,Int_t row)
1578 //Transformation to global coordinate system
1579 Int_t slice,slicerow;
1580 Sector2Slice(slice, slicerow, sector, row);
1581 Float_t r=Row2X(slicerow); //have to get x value first
1583 xyz[0]=r*fCos[slice]-xyz[1]*fSin[slice];
1584 xyz[1]=r*fSin[slice]+xyz[1]*fCos[slice];
1585 xyz[2]=xyz[2];//global z=local z
1588 void AliL3Transform::LocHLT2Global(Float_t *xyz,Int_t slice,Int_t slicerow)
1590 //Transformation from HLT to global coordinate system
1591 Float_t r=Row2X(slicerow); //have to get x value first
1593 xyz[0]=r*fCos[slice]-xyz[1]*fSin[slice];
1594 xyz[1]=r*fSin[slice]+xyz[1]*fCos[slice];
1595 xyz[2]=xyz[2];//global z=local z
1598 void AliL3Transform::Global2Local(Float_t *xyz,Int_t sector)
1602 Sector2Slice(slice, sector);
1606 Float_t x1 = xyz[0]*fCos[slice] + xyz[1]*fSin[slice];
1607 Float_t y1 = -xyz[0]*fSin[slice] + xyz[1]*fCos[slice];
1612 void AliL3Transform::Global2LocHLT(Float_t *xyz,Int_t slice)
1614 Float_t x1 = xyz[0]*fCos[slice] + xyz[1]*fSin[slice];
1615 Float_t y1 = -xyz[0]*fSin[slice] + xyz[1]*fCos[slice];
1620 void AliL3Transform::Raw2Global(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
1622 //Transformation from raw to global coordinates
1624 Raw2Local(xyz,sector,row,pad,time);
1625 Local2Global(xyz,sector,row);
1628 void AliL3Transform::Raw2Global(Float_t *xyz,Int_t sector,Int_t row,Int_t pad,Int_t time)
1630 //Transformation from raw to global coordinates
1632 Raw2Local(xyz,sector,row,pad,time);
1633 Local2Global(xyz,sector,row);
1636 void AliL3Transform::RawHLT2Global(Float_t *xyz,Int_t slice,
1637 Int_t slicerow,Float_t pad,Float_t time)
1639 //Transformation from raw to global coordinates
1641 RawHLT2Local(xyz,slice,slicerow,pad,time);
1642 LocHLT2Global(xyz,slice,slicerow);
1645 void AliL3Transform::RawHLT2Global(Float_t *xyz,Int_t slice,
1646 Int_t slicerow,Int_t pad,Int_t time)
1648 //Transformation from raw to global coordinates
1650 RawHLT2Local(xyz,slice,slicerow,pad,time);
1651 LocHLT2Global(xyz,slice,slicerow);
1654 void AliL3Transform::Local2Raw(Float_t *xyz,Int_t sector,Int_t row)
1656 //Transformation from local coordinates to raw
1658 Int_t slice,slicerow;
1659 Sector2Slice(slice, slicerow, sector, row);
1663 if(fSectorLow[sector])
1664 xyz[1]=xyz[1]/fPadPitchWidthLow+0.5*(fNPads[slicerow]-1);
1666 xyz[1]=xyz[1]/fPadPitchWidthUp+0.5*(fNPads[slicerow]-1);
1669 xyz[2]=(fZLength-xyz[2]+fZOffset)/fZWidth;
1671 xyz[2]=(fZLength+xyz[2]+fZOffset)/fZWidth;
1674 void AliL3Transform::LocHLT2Raw(Float_t *xyz,Int_t slice,Int_t slicerow)
1676 //Transformation from local coordinates to raw
1680 if(slicerow<fNRowLow)
1681 xyz[1]=xyz[1]/fPadPitchWidthLow+0.5*(fNPads[slicerow]-1);
1683 xyz[1]=xyz[1]/fPadPitchWidthUp+0.5*(fNPads[slicerow]-1);
1686 xyz[2]=(fZLength-xyz[2]+fZOffset)/fZWidth;
1688 xyz[2]=(fZLength+xyz[2]+fZOffset)/fZWidth;
1691 void AliL3Transform::Global2Raw(Float_t *xyz,Int_t sector,Int_t row)
1693 //Transformation from global coordinates to raw.
1695 Global2Local(xyz,sector);
1696 Local2Raw(xyz,sector,row);
1699 void AliL3Transform::Global2HLT(Float_t *xyz,Int_t slice,Int_t slicerow)
1701 //Transformation from global coordinates to raw.
1703 Global2LocHLT(xyz,slice);
1704 LocHLT2Raw(xyz,slice,slicerow);
1707 void AliL3Transform::PrintCompileOptions()
1709 #if defined(__GNUC__)
1710 cout << "Compiler (g++) version used: " << __GNUC__ << endl;
1714 cout << "STANDALONE version: -Dno_root was given." << endl;
1716 const Char_t *roottest="$ROOTSYS/bin/root -n -b -q | grep Version | cut -b 17-25 | cut -d\" \" -f1";
1719 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";
1721 const Char_t *aliroottest="Unknown";
1723 cout << "ALIROOT version: -Duse_aliroot and -Duse_root was given." << endl;
1724 cout << "Root Version: " << ROOTVERSION << " found " << flush;
1725 gSystem->Exec(roottest);
1727 cout << "AliRoot Version: " << ALIROOTVERSION << " found " << flush;
1728 gSystem->Exec(aliroottest);
1730 cout << "ROOT version: -Duse_root was given." << endl;
1731 cout << "Root Version: " << ROOTVERSION << " found " << flush;
1732 gSystem->Exec(roottest);
1737 cout << "Using Monte Carlo Info: -Ddo_mc was given." << endl;
1739 cout << "NOT using Monte Carlo Info: -Ddo_mc was not given." << endl;
1742 #ifdef ROWHOUGHPARAMS
1743 cout << "Using extended AliL3TrackSegmentData: -DROWHOUGHPARAMS was given." << endl;
1745 cout << "NOT using extended AliL3TrackSegmentData: -DROWHOUGHPARAMS was not given." << endl;
1749 cout << "Using NEWIO version: -Duse_newio was given." << endl;
1751 cout << "NOT using NEWIO version: -Duse_newio was not given." << endl;
1755 cout << "Using logging classes (MLUC): -Duse_logging was given." << endl;
1757 cout << "NOT using logging classes (MLUC): -Duse_logging not was given." << endl;