// @(#) $Id$ // Author: Anders Vestbo , Uli Frankenfeld , Constantin Loizides //*-- Copyright © ALICE HLT Group #include "AliHLTTPCStandardIncludes.h" #include "dirent.h" #ifdef use_aliroot #include #include #include #include #include #endif #ifdef use_root #include #include #include #include #endif #include "AliHLTTPCLogging.h" #include "AliHLTTPCTransform.h" #if defined(__GNUC__) && __GNUC__ >= 3 using namespace std; #endif /** \class AliHLTTPCTransform
//_____________________________________________________________
// AliHLTTPCTransform
//
// Transformation class for ALICE TPC.
//
// Class which contains all detector specific parameters for the TPC,
// and different useful functions for coordinate transforms.
//
// The class is completely static, which means that no object needs
// to be instantiated. Function calls should then be done like, e.g.:
//
// Double_t eta = AliHLTTPCTransform::GetEta(xyz);
//
// IMPORTANT: If used as is, default detector parameters will be used,
//            and you really have to make sure that these correspond to
//            the AliROOT version you are currently working on!!
//            You should therefore always initialize the parameters by
//
//            AliHLTTPCTransform::Init(path);
// 
//            where path is a char*, giving the path to where file containing
//            the detector parameter is located. This file should be called
//            "l3transform.config", and can be created with the function MakeInitFile.
//            
//            You can also force reading the parameters from a AliTPCParam object
//            by setting the flag;
//
//            AliHLTTPCTransform::Init(path,kTRUE);
//
//            where path is a char* 
//            either providing the rootfile name containing the geometry or 
//            the path to the rootfile which should then be called alirunfile.root. 
//            Note that for both of these cases you have to
//            compile with USEPACKAGE=ALIROOT set (see level3code/Makefile.conf).
//
//            Currently, there are 4 versions of the Transformer:
//             fVersion==kValiroot: ALIROOT-head compatible
//             fVersion==kVcosmics: Cosmics data run (2003) compatible
//             fVersion==kVdefault: means no config file has been loaded
//             fVersion==kVdeprecated: dont use old (before July 2003) style of transformer
//
*/ ClassImp(AliHLTTPCTransform) const Double_t AliHLTTPCTransform::fgkAnodeWireSpacing = 0.25; //Taken from the TDR const Double_t AliHLTTPCTransform::fgkBFACT = 0.0029980; //Conversion Factor const Double_t AliHLTTPCTransform::fgkPi = 3.141592653589793; const Double_t AliHLTTPCTransform::fgk2Pi = 2*3.141592653589793; const Double_t AliHLTTPCTransform::fgkPi2 = 0.5*3.141592653589793; const Double_t AliHLTTPCTransform::fgkToDeg = 180/3.141592653589793; //Defined by HLT and GSI Int_t AliHLTTPCTransform::fgNPatches = 6; #if 0 // Old format, corresponding to IntegrTest-5 code and data Int_t AliHLTTPCTransform::fgRows[6][2] = {{0,29},{30,62},{63,90},{91,116},{117,139},{140,158}}; Int_t AliHLTTPCTransform::fgNRows[6] = {30,33,28,26,23,19}; #else // New data corresponding to simulated raw data 2004-08-20, provided by Thomas Kuhr Int_t AliHLTTPCTransform::fgRows[6][2] = {{0,30},{30,62},{63,90},{90,116},{117,139},{139,158}}; Int_t AliHLTTPCTransform::fgNRows[6] = {31,33,28,27,23,20}; #endif // The following definition is generated by MakeInitFile function Double_t AliHLTTPCTransform::fgBField = 0.2; Double_t AliHLTTPCTransform::fgSolenoidBField = 2; Double_t AliHLTTPCTransform::fgBFieldFactor = 1; Int_t AliHLTTPCTransform::fgVersion = kVdefault; Int_t AliHLTTPCTransform::fgNTimeBins = 446; Int_t AliHLTTPCTransform::fgNRowLow = 63; Int_t AliHLTTPCTransform::fgNRowUp = 96; Int_t AliHLTTPCTransform::fgNRowUp1 = 64; Int_t AliHLTTPCTransform::fgNRowUp2 = 32; Int_t AliHLTTPCTransform::fgNSectorLow = 36; Int_t AliHLTTPCTransform::fgNSectorUp = 36; Int_t AliHLTTPCTransform::fgNSector = 72; Double_t AliHLTTPCTransform::fgPadPitchWidthLow = 0.4; Double_t AliHLTTPCTransform::fgPadPitchWidthUp = 0.6; Double_t AliHLTTPCTransform::fgZWidth = 0.5660; Double_t AliHLTTPCTransform::fgZSigma = 0.2288; Double_t AliHLTTPCTransform::fgZLength = 250.0000; Double_t AliHLTTPCTransform::fgZOffset = 0.6864; Double_t AliHLTTPCTransform::fgDiffT = 0.0220; Double_t AliHLTTPCTransform::fgDiffL = 0.0220; Double_t AliHLTTPCTransform::fgOmegaTau = 0.1450; Double_t AliHLTTPCTransform::fgInnerPadLength = 0.75; Double_t AliHLTTPCTransform::fgOuter1PadLength = 1.00; Double_t AliHLTTPCTransform::fgOuter2PadLength = 1.50; Double_t AliHLTTPCTransform::fgInnerPRFSigma = 0.203811; Double_t AliHLTTPCTransform::fgOuter1PRFSigma = 0.299325; Double_t AliHLTTPCTransform::fgOuter2PRFSigma = 0.299323; Double_t AliHLTTPCTransform::fgTimeSigma = 0.228809; Int_t AliHLTTPCTransform::fgADCSat = 1024; Int_t AliHLTTPCTransform::fgZeroSup = 0; Int_t AliHLTTPCTransform::fgNSlice = 36; Int_t AliHLTTPCTransform::fgNRow = 159; Double_t AliHLTTPCTransform::fgNRotShift = 0.5; Int_t AliHLTTPCTransform::fgSlice2Sector[36][2] = { { 0, 36}, { 1, 37}, { 2, 38}, { 3, 39}, { 4, 40}, { 5, 41}, { 6, 42}, { 7, 43}, { 8, 44}, { 9, 45}, {10, 46}, {11, 47}, {12, 48}, {13, 49}, {14, 50}, {15, 51}, {16, 52}, {17, 53}, {18, 54}, {19, 55}, {20, 56}, {21, 57}, {22, 58}, {23, 59}, {24, 60}, {25, 61}, {26, 62}, {27, 63}, {28, 64}, {29, 65}, {30, 66}, {31, 67}, {32, 68}, {33, 69}, {34, 70}, {35, 71} }; Int_t AliHLTTPCTransform::fgSector2Slice[72] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 }; Int_t AliHLTTPCTransform::fgSectorLow[72] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; Double_t AliHLTTPCTransform::fgX[159] = { 85.195, 85.945, 86.695, 87.445, 88.195, 88.945, 89.695, 90.445, 91.195, 91.945, 92.695, 93.445, 94.195, 94.945, 95.695, 96.445, 97.195, 97.945, 98.695, 99.445, 100.195, 100.945, 101.695, 102.445, 103.195, 103.945, 104.695, 105.445, 106.195, 106.945, 107.695, 108.445, 109.195, 109.945, 110.695, 111.445, 112.195, 112.945, 113.695, 114.445, 115.195, 115.945, 116.695, 117.445, 118.195, 118.945, 119.695, 120.445, 121.195, 121.945, 122.695, 123.445, 124.195, 124.945, 125.695, 126.445, 127.195, 127.945, 128.695, 129.445, 130.195, 130.945, 131.695, 135.180, 136.180, 137.180, 138.180, 139.180, 140.180, 141.180, 142.180, 143.180, 144.180, 145.180, 146.180, 147.180, 148.180, 149.180, 150.180, 151.180, 152.180, 153.180, 154.180, 155.180, 156.180, 157.180, 158.180, 159.180, 160.180, 161.180, 162.180, 163.180, 164.180, 165.180, 166.180, 167.180, 168.180, 169.180, 170.180, 171.180, 172.180, 173.180, 174.180, 175.180, 176.180, 177.180, 178.180, 179.180, 180.180, 181.180, 182.180, 183.180, 184.180, 185.180, 186.180, 187.180, 188.180, 189.180, 190.180, 191.180, 192.180, 193.180, 194.180, 195.180, 196.180, 197.180, 198.180, 199.430, 200.930, 202.430, 203.930, 205.430, 206.930, 208.430, 209.930, 211.430, 212.930, 214.430, 215.930, 217.430, 218.930, 220.430, 221.930, 223.430, 224.930, 226.430, 227.930, 229.430, 230.930, 232.430, 233.930, 235.430, 236.930, 238.430, 239.930, 241.430, 242.930, 244.430, 245.930 }; Int_t AliHLTTPCTransform::fgNPads[159] = {67, 67, 69, 69, 69, 71, 71, 71, 73, 73, 73, 75, 75, 75, 77, 77, 77, 79, 79, 79, 81, 81, 81, 83, 83, 83, 85, 85, 85, 87, 87, 87, 89, 89, 89, 91, 91, 91, 93, 93, 93, 95, 95, 95, 97, 97, 97, 99, 99, 99, 99, 101, 101, 101, 103, 103, 103, 105, 105, 105, 107, 107, 107, 73, 75, 75, 75, 75, 77, 77, 77, 79, 79, 79, 81, 81, 81, 81, 83, 83, 83, 85, 85, 85, 85, 87, 87, 87, 89, 89, 89, 91, 91, 91, 91, 93, 93, 93, 95, 95, 95, 95, 97, 97, 97, 99, 99, 99, 101, 101, 101, 101, 103, 103, 103, 105, 105, 105, 105, 107, 107, 107, 109, 109, 109, 111, 111, 111, 113, 113, 113, 115, 115, 117, 117, 119, 119, 121, 121, 121, 123, 123, 125, 125, 127, 127, 127, 129, 129, 131, 131, 133, 133, 135, 135, 135, 137, 137, 139 }; Double_t AliHLTTPCTransform::fgCos[36] = { 0.9848077297, 0.8660253882, 0.6427876353, 0.3420201540, 0.0000000000, -0.3420201540, -0.6427876353, -0.8660253882, -0.9848077297, -0.9848077297, -0.8660253882, -0.6427876353, -0.3420201540, -0.0000000000, 0.3420201540, 0.6427876353, 0.8660253882, 0.9848077297, 0.9848077297, 0.8660253882, 0.6427876353, 0.3420201540, 0.0000000000, -0.3420201540, -0.6427876353, -0.8660253882, -0.9848077297, -0.9848077297, -0.8660253882, -0.6427876353, -0.3420201540, -0.0000000000, 0.3420201540, 0.6427876353, 0.8660253882, 0.9848077297 }; Double_t AliHLTTPCTransform::fgSin[36] = { 0.1736481786, 0.5000000000, 0.7660444379, 0.9396926165, 1.0000000000, 0.9396926165, 0.7660444379, 0.5000000000, 0.1736481786, -0.1736481786, -0.5000000000, -0.7660444379, -0.9396926165, -1.0000000000, -0.9396926165, -0.7660444379, -0.5000000000, -0.1736481786, 0.1736481786, 0.5000000000, 0.7660444379, 0.9396926165, 1.0000000000, 0.9396926165, 0.7660444379, 0.5000000000, 0.1736481786, -0.1736481786, -0.5000000000, -0.7660444379, -0.9396926165, -1.0000000000, -0.9396926165, -0.7660444379, -0.5000000000, -0.1736481786 }; #ifdef use_aliroot Bool_t AliHLTTPCTransform::Init(AliRunLoader *runLoader) { //init with runloader if(!runLoader) { LOG(AliHLTTPCLog::kFatal,"AliHLTTPCTransform::Init","RunLoader") <<" Missing RunLoader! 0x0"<CdGAFile(); AliTPCParamSR *param=(AliTPCParamSR*)gDirectory->Get(GetParamName()); savedir1->cd(); if(!param) { LOG(AliHLTTPCLog::kFatal,"AliHLTTPCTransform::Init","File") <<"No TPC parameters found!"<SetGauss(param->GetZSigma(),param->GetZWidth(),1.); rf->SetOffset(3*param->GetZSigma()); rf->Update(); TDirectory *savedir2=gDirectory; TFile *prf_file = TFile::Open("$ALICE_ROOT/TPC/AliTPCprf2d.root"); if (!prf_file->IsOpen()) { LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Init","File") <<"Can't open $ALICE_ROOT/TPC/AliTPCprf2d.root !"<Read("prf_07504_Gati_056068_d02"); prfouter1->Read("prf_10006_Gati_047051_d03"); prfouter2->Read("prf_15006_Gati_047051_d03"); prf_file->Close(); savedir2->cd(); param->SetInnerPRF(prfinner); param->SetOuter1PRF(prfouter1); param->SetOuter2PRF(prfouter2); param->SetTimeRF(rf); fgNTimeBins = param->GetMaxTBin()+1; fgNRowLow = param->GetNRowLow(); fgNRowUp = param->GetNRowUp(); fgNRowUp1 = param->GetNRowUp1(); fgNRowUp2 = param->GetNRowUp2(); fgNRow= fgNRowLow + fgNRowUp; if(fgNRow!=159){ LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Init","fNRow") <<"Number of rows have changed in ALIROOT"<GetNInnerSector(); fgNSectorUp = param->GetNOuterSector(); fgNSector = fgNSectorLow + fgNSectorUp; //test whether they were changes to the rotation shift fgNRotShift=0; Float_t irotshift = param->GetInnerAngleShift(); //shift angle Float_t orotshift = param->GetOuterAngleShift(); //shift angle const Float_t kDegtoRad = 0.01745329251994; Int_t shift1=TMath::Nint(irotshift/kDegtoRad); Int_t shift2=TMath::Nint(orotshift/kDegtoRad+0.1); if((shift1!=shift2) || (shift1!=10)){ LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Init","Rotshiftangle") <<"Rotation shift angle has changed in ALIROOT"<GetAliRun()->Field()->Factor()); SetSolenoidBField((Double_t)runLoader->GetAliRun()->Field()->SolenoidField()); fgPadPitchWidthLow=param->GetInnerPadPitchWidth(); fgPadPitchWidthUp=param->GetOuterPadPitchWidth(); fgZWidth=param->GetZWidth(); fgZSigma=param->GetZSigma(); fgZLength=param->GetZLength(); fgZOffset=param->GetZOffset(); fgDiffT=param->GetDiffT(); fgDiffL=param->GetDiffL(); fgOmegaTau=param->GetOmegaTau(); fgInnerPadLength=param->GetInnerPadLength(); fgOuter1PadLength=param->GetOuter1PadLength(); fgOuter2PadLength=param->GetOuter2PadLength(); fgInnerPRFSigma=param->GetInnerPRF()->GetSigmaX(); fgOuter1PRFSigma=param->GetOuter1PRF()->GetSigmaX(); fgOuter2PRFSigma=param->GetOuter2PRF()->GetSigmaX(); fgTimeSigma=param->GetTimeRF()->GetSigma(); fgADCSat=param->GetADCSat(); fgZeroSup=param->GetZeroSup(); fgNSlice=fgNSectorLow; //now do the arrays for(Int_t i=0;iGetPadRowRadii(sec,row); } for(Int_t i=0;iGetNPads(sec,row); } for(Int_t i=0;iIsZombie()) { //ok assume its path to alirunfile file sprintf(filename,"%s/alirunfile.root",path); //create rootfile name } else { //path contains itself the rootfile name rootfile->Close(); sprintf(filename,"%s",path); } gErrorIgnoreLevel=saveErrIgLevel; //finally make dummy init file /tmp/$USER/l3transform.config-`date` Char_t tmppath[1024]; sprintf(tmppath,"/tmp/%s",gSystem->Getenv("USER")); gSystem->mkdir(tmppath); TTimeStamp time; Char_t tmpfile[1024]; sprintf(tmpfile,"%s/l3transform.config-%d",tmppath,(Int_t)time.GetSec()); return MakeInitFile(filename,tmpfile); #endif } Bool_t AliHLTTPCTransform::MakeInitFile(Char_t *rootfilename,Char_t *filename) { //Get the parameters from rootfile, and store it on the file "l3transform.config" //which is being read by Init. fVersion will be kV_aliroot! #ifndef use_aliroot LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::MakeInitFile","Version") <<"You have to compile with use_aliroot flag in order to use this function"<Get("gAlice"); if(!gAlice) { LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::MakeInitFile","File") <<"No gAlice in file: "<Get(GetParamName()); if(!param) { LOG(AliHLTTPCLog::kWarning,"AliHLTTPCTransform::MakeInitFile","File") <<"No TPC parameters found in \""<SetGauss(param->GetZSigma(),param->GetZWidth(),1.); rf->SetOffset(3*param->GetZSigma()); rf->Update(); TDirectory *savedir=gDirectory; TFile *prf_file = TFile::Open("$ALICE_ROOT/TPC/AliTPCprf2d.root"); if (!prf_file->IsOpen()) { LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::MakeInitFile","File") <<"Can't open $ALICE_ROOT/TPC/AliTPCprf2d.root !"<Read("prf_07504_Gati_056068_d02"); prfouter1->Read("prf_10006_Gati_047051_d03"); prfouter2->Read("prf_15006_Gati_047051_d03"); prf_file->Close(); savedir->cd(); param->SetInnerPRF(prfinner); param->SetOuter1PRF(prfouter1); param->SetOuter2PRF(prfouter2); param->SetTimeRF(rf); fgNTimeBins = param->GetMaxTBin()+1; fgNRowLow = param->GetNRowLow(); fgNRowUp = param->GetNRowUp(); fgNRowUp1 = param->GetNRowUp1(); fgNRowUp2 = param->GetNRowUp2(); fgNRow= fgNRowLow + fgNRowUp; if(fgNRow!=159){ LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::MakeInitFile","fNRow") <<"Number of rows have changed in ALIROOT"<GetNInnerSector(); fgNSectorUp = param->GetNOuterSector(); fgNSector = fgNSectorLow + fgNSectorUp; //test whether they were changes to the rotation shift fgNRotShift=0; Float_t irotshift = param->GetInnerAngleShift(); //shift angle Float_t orotshift = param->GetOuterAngleShift(); //shift angle const Float_t kDegtoRad = 0.01745329251994; Int_t shift1=TMath::Nint(irotshift/kDegtoRad); Int_t shift2=TMath::Nint(orotshift/kDegtoRad+0.1); if((shift1!=shift2) || (shift1!=10)){ LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::MakeInitFile","Rotshiftangle") <<"Rotation shift angle has changed in ALIROOT"<Field()->Factor()); SetSolenoidBField((Double_t)gAlice->Field()->SolenoidField()); fgPadPitchWidthLow=param->GetInnerPadPitchWidth(); fgPadPitchWidthUp=param->GetOuterPadPitchWidth(); fgZWidth=param->GetZWidth(); fgZSigma=param->GetZSigma(); fgZLength=param->GetZLength(); fgZOffset=param->GetZOffset(); fgDiffT=param->GetDiffT(); fgDiffL=param->GetDiffL(); fgOmegaTau=param->GetOmegaTau(); fgInnerPadLength=param->GetInnerPadLength(); fgOuter1PadLength=param->GetOuter1PadLength(); fgOuter2PadLength=param->GetOuter2PadLength(); fgInnerPRFSigma=param->GetInnerPRF()->GetSigmaX(); fgOuter1PRFSigma=param->GetOuter1PRF()->GetSigmaX(); fgOuter2PRFSigma=param->GetOuter2PRF()->GetSigmaX(); fgTimeSigma=param->GetTimeRF()->GetSigma(); fgADCSat=param->GetADCSat(); fgZeroSup=param->GetZeroSup(); fgNSlice=fgNSectorLow; //now do the arrays for(Int_t i=0;iGetPadRowRadii(sec,row); } for(Int_t i=0;iGetNPads(sec,row); } for(Int_t i=0;iClose(); delete rootfile; return SaveInitFile(filename); #endif } Bool_t AliHLTTPCTransform::SaveInitFile(Char_t *filenamepath) { //store the parameters in the file "filenamepath" FILE *f = fopen(filenamepath,"w"); if(!f){ LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::SaveInitFile","File") <<"Could not open file: "<= fgNRow) { LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetNPads","Row") <= 6) { LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetFirstRow","Patch") <= 6) { LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetLastRow","Patch") <= 6) { LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetFirstRow","Patch") <= 6) { LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetLastRow","Patch") <= 6) { LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetNRows","Patch") < 250) { LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetPadRow","X-value") < (Int_t)rint(fgX[fgNRow-2]*10)) return fgNRow-1; else { Int_t padrow=1; //Of course, a more clever algorithm could help here while(padrow < fgNRow-2) { if(x > (Int_t)rint(fgX[padrow-1]*10) && x < (Int_t)rint(fgX[padrow+1]*10)) break; padrow++; } return padrow; } } Int_t AliHLTTPCTransform::GetPatch(Int_t padrow) { //get patch for padrow if(padrow < 0 || padrow >= fgNRow) { LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetPatch","Padrow") <= fgRows[patch][0] && padrow <= fgRows[patch][1]) break; patch++; } return patch; } Double_t AliHLTTPCTransform::GetPadLength(Int_t padrow) { //get pad length for padrow if(padrow >= fgNRow){ LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetPadLength","Padrow") <= fgNRowLow && padrow < fgNRowLow + fgNRowUp1 - 1) return fgOuter1PadLength; if(padrow >= fgNRowLow + fgNRowUp1 - 1) return fgOuter2PadLength; //should never happen LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetPadLength","Padrow") < fgNPatches) { LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetPadPitchWidth","patct") < 0) drift = fgZLength - z; else drift = fgZLength + z; Double_t t1 = GetPRFSigma(padrow)*GetPRFSigma(padrow); Double_t t2 = fgDiffT*fgDiffT*drift; Double_t t3 = GetPadLength(padrow)*GetPadLength(padrow)*tan(angle)*tan(angle)/12; Double_t t4 = fgkAnodeWireSpacing*fgkAnodeWireSpacing*(tan(angle) - fgOmegaTau)*(tan(angle) - fgOmegaTau)/12; return (t1 + t2 + t3 + t4); } Double_t AliHLTTPCTransform::GetParSigmaZ2(Int_t padrow,Float_t z,Float_t tgl) { //Calculate the expected longitudinal cluster width as a function of //drift distance and track crossing angle. //z = local z-coordinate of cluster //tgl = tan(dipangle) //return value = sigma^2 (cartesian coordinates) Double_t drift; if(z > 0) drift = AliHLTTPCTransform::GetZLength() - z; else drift = AliHLTTPCTransform::GetZLength() + z; Double_t t1 = fgZSigma*fgZSigma; Double_t t2 = fgDiffL*fgDiffL*drift; Double_t t3 = GetPadLength(padrow)*GetPadLength(padrow)*tgl*tgl/12; return (t1 + t2 + t3); } Double_t AliHLTTPCTransform::GetPRFSigma(Int_t padrow) { //get sigma of pad response function for padrow if(padrow >= fgNRow){ LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetPRFSigma","Padrow") <= fgNRowLow && padrow < fgNRowLow + fgNRowUp1 - 1) return fgOuter1PRFSigma; if(padrow >= fgNRowLow + fgNRowUp1 - 1) return fgOuter2PRFSigma; //should never happen LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::GetPRFSigma","Padrow") <=fgNRow){ LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Slice2Sector","Slicerow") <=fgNSlice){ LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Slice2Sector","Slice") <=fgNSector){ LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Sector2Slice","Sector") <=fgNSector){ LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Sector2Slice","Sector") <=fgNRowLow){ LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Sector2Slice","Row") <=fgNRowUp){ LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Sector2Slice","Row") <=fgNRow){ LOG(AliHLTTPCLog::kError,"AliHLTTPCTransform::Row2X","Slicerow") <Exec(roottest); cout << "AliRoot Version: " << ALIROOTVERSION << " found " << flush; gSystem->Exec(aliroottest); #else cout << "ROOT version: -Duse_root was given." << endl; cout << "Root Version: " << ROOTVERSION << " found " << flush; gSystem->Exec(roottest); #endif #endif #ifdef do_mc cout << "Using Monte Carlo Info: -Ddo_mc was given." << endl; #else cout << "NOT using Monte Carlo Info: -Ddo_mc was not given." << endl; #endif #ifdef INCLUDE_TPC_HOUGH cout << "Including support for TPC Hough transformations." << endl; #ifdef ROWHOUGHPARAMS cout << "Using extended AliHLTTPCTrackSegmentData: -DROWHOUGHPARAMS was given." << endl; #else cout << "NOT using extended AliHLTTPCTrackSegmentData: -DROWHOUGHPARAMS was not given." << endl; #endif #else cout << "NOT including any support for TPC Hough transformations." << endl; #endif // INCLUDE_TPC_HOUGH #ifdef use_newio cout << "Using NEWIO version: -Duse_newio was given." << endl; #else cout << "NOT using NEWIO version: -Duse_newio was not given." << endl; #endif #ifdef use_logging cout << "Using logging classes (MLUC): -Duse_logging was given." << endl; #else cout << "NOT using logging classes (MLUC): -Duse_logging not was given." << endl; #endif }