X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliTPCRF1D.cxx;h=ad579b8f7c6cfb52a0f55e2e7a2319c949f685b0;hb=aafecd8bbd1e13379dcd25cfba57e8b30c006765;hp=d043444d57c898e9f6a07d7fcc8caa505d485c95;hpb=4c03906077acc435bf9790b980186e0015ea0b89;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliTPCRF1D.cxx b/TPC/AliTPCRF1D.cxx index d043444d57c..ad579b8f7c6 100644 --- a/TPC/AliTPCRF1D.cxx +++ b/TPC/AliTPCRF1D.cxx @@ -13,12 +13,11 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* -$Log$ -*/ +/* $Id$ */ + //----------------------------------------------------------------------------- -// $Header$ +// // // // Origin: Marian Ivanov, Uni. of Bratislava, ivanov@fmph.uniba.sk @@ -26,79 +25,138 @@ $Log$ // Declaration of class AliTPCRF1D // //----------------------------------------------------------------------------- -#include "TMath.h" + +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include "AliTPCRF1D.h" -#include "TF2.h" -#include -#include "TCanvas.h" -#include "TPad.h" -#include "TStyle.h" -#include "TH1.h" -extern TStyle * gStyle; +extern TStyle * gStyle; + +Int_t AliTPCRF1D::fgNRF=100; //default number of interpolation points +Float_t AliTPCRF1D::fgRFDSTEP=0.01; //default step in cm static Double_t funGauss(Double_t *x, Double_t * par) { + //Gauss function -needde by the generic function object return TMath::Exp(-(x[0]*x[0])/(2*par[0]*par[0])); } static Double_t funCosh(Double_t *x, Double_t * par) { + //Cosh function -needde by the generic function object return 1/TMath::CosH(3.14159*x[0]/(2*par[0])); } static Double_t funGati(Double_t *x, Double_t * par) { - //par[1] = is equal to k3 - //par[0] is equal to pad wire distance - Float_t K3=par[1]; - Float_t K3R=TMath::Sqrt(K3); - Float_t K2=(TMath::Pi()/2)*(1-K3R/2.); - Float_t K1=K2*K3R/(4*TMath::ATan(K3R)); + //Gati function -needde by the generic function object + Float_t k3=par[1]; + Float_t k3R=TMath::Sqrt(k3); + Float_t k2=(TMath::Pi()/2)*(1-k3R/2.); + Float_t k1=k2*k3R/(4*TMath::ATan(k3R)); Float_t l=x[0]/par[0]; - Float_t tan2=TMath::TanH(K2*l); + Float_t tan2=TMath::TanH(k2*l); tan2*=tan2; - Float_t res = K1*(1-tan2)/(1+K3*tan2); + Float_t res = k1*(1-tan2)/(1+k3*tan2); return res; } - - - -/////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// -AliTPCRF1D * gRF1D; ClassImp(AliTPCRF1D) AliTPCRF1D::AliTPCRF1D(Bool_t direct,Int_t np,Float_t step) + :TObject(), + fNRF(0), + fDSTEPM1(0.), + fcharge(0), + forigsigma(0.), + fpadWidth(3.5), + fkNorm(0.5), + fInteg(0.), + fGRF(0), + fSigma(0.), + fOffset(0.), + fDirect(kFALSE), + fPadDistance(0.) { + //default constructor for response function object fDirect=direct; - fNRF = np; + if (np!=0)fNRF = np; + else (fNRF=fgNRF); + fcharge = new Float_t[fNRF]; + if (step>0) fDSTEPM1=1./step; + else fDSTEPM1 = 1./fgRFDSTEP; +} + +AliTPCRF1D::AliTPCRF1D(const AliTPCRF1D &prf) + :TObject(prf), + fNRF(0), + fDSTEPM1(0.), + fcharge(0), + forigsigma(0.), + fpadWidth(3.5), + fkNorm(0.5), + fInteg(0.), + fGRF(0), + fSigma(0.), + fOffset(0.), + fDirect(kFALSE), + fPadDistance(0.) +{ + + // + memcpy(this, &prf, sizeof(prf)); fcharge = new Float_t[fNRF]; - fDSTEPM1=1./step; - fSigma = 0; - gRF1D = this; - fGRF = 0; - fkNorm = 0.5; - fpadWidth = 3.5; - forigsigma=0.; - fOffset = 0.; + memcpy(fcharge,prf.fcharge, fNRF); + fGRF = new TF1(*(prf.fGRF)); + //PH Change the name (add 0 to the end) + TString s(fGRF->GetName()); + s+="0"; + fGRF->SetName(s.Data()); } +AliTPCRF1D & AliTPCRF1D::operator = (const AliTPCRF1D &prf) +{ + // + if (fcharge) delete fcharge; + if (fGRF) delete fGRF; + memcpy(this, &prf, sizeof(prf)); + fcharge = new Float_t[fNRF]; + memcpy(fcharge,prf.fcharge, fNRF); + fGRF = new TF1(*(prf.fGRF)); + //PH Change the name (add 0 to the end) + TString s(fGRF->GetName()); + s+="0"; + fGRF->SetName(s.Data()); + return (*this); +} + + AliTPCRF1D::~AliTPCRF1D() { - if (fcharge!=0) delete fcharge; + // + if (fcharge!=0) delete [] fcharge; if (fGRF !=0 ) fGRF->Delete(); } Float_t AliTPCRF1D::GetRF(Float_t xin) { - //x xin DSTEP unit + //function which return response + //for the charge in distance xin //return linear aproximation of RF Float_t x = TMath::Abs((xin-fOffset)*fDSTEPM1)+fNRF/2; Int_t i1=Int_t(x); @@ -111,6 +169,8 @@ Float_t AliTPCRF1D::GetRF(Float_t xin) Float_t AliTPCRF1D::GetGRF(Float_t xin) { + //function which returnoriginal charge distribution + //this function is just normalised for fKnorm if (fGRF != 0 ) return fkNorm*fGRF->Eval(xin)/fInteg; else @@ -121,6 +181,8 @@ Float_t AliTPCRF1D::GetGRF(Float_t xin) void AliTPCRF1D::SetParam( TF1 * GRF,Float_t padwidth, Float_t kNorm, Float_t sigma) { + //adjust parameters of the original charge distribution + //and pad size parameters fpadWidth = padwidth; fGRF = GRF; fkNorm = kNorm; @@ -135,57 +197,63 @@ void AliTPCRF1D::SetParam( TF1 * GRF,Float_t padwidth, void AliTPCRF1D::SetGauss(Float_t sigma, Float_t padWidth, Float_t kNorm) { - // char s[120]; + // + // set parameters for Gauss generic charge distribution + // fpadWidth = padWidth; fkNorm = kNorm; if (fGRF !=0 ) fGRF->Delete(); - fGRF = new TF1("fun",funGauss,-5,5,2); + fGRF = new TF1("funGauss",funGauss,-5,5,1); funParam[0]=sigma; forigsigma=sigma; fGRF->SetParameters(funParam); fDSTEPM1 = 10./TMath::Sqrt(sigma*sigma+fpadWidth*fpadWidth/12); - //by default I set the step as one tenth of sigma - // Update(); + //by default I set the step as one tenth of sigma sprintf(fType,"Gauss"); } void AliTPCRF1D::SetCosh(Float_t sigma, Float_t padWidth, Float_t kNorm) { - // char s[120]; + // + // set parameters for Cosh generic charge distribution + // fpadWidth = padWidth; fkNorm = kNorm; if (fGRF !=0 ) fGRF->Delete(); - fGRF = new TF1("fun", funCosh, -5.,5.,2); + fGRF = new TF1("funCosh", funCosh, -5.,5.,2); funParam[0]=sigma; fGRF->SetParameters(funParam); forigsigma=sigma; fDSTEPM1 = 10./TMath::Sqrt(sigma*sigma+fpadWidth*fpadWidth/12); //by default I set the step as one tenth of sigma - // Update(); sprintf(fType,"Cosh"); } void AliTPCRF1D::SetGati(Float_t K3, Float_t padDistance, Float_t padWidth, Float_t kNorm) { - // char s[120]; + // + // set parameters for Gati generic charge distribution + // fpadWidth = padWidth; fkNorm = kNorm; if (fGRF !=0 ) fGRF->Delete(); - fGRF = new TF1("fun", funGati, -5.,5.,2); + fGRF = new TF1("funGati", funGati, -5.,5.,2); funParam[0]=padDistance; funParam[1]=K3; fGRF->SetParameters(funParam); forigsigma=padDistance; fDSTEPM1 = 10./TMath::Sqrt(padDistance*padDistance+fpadWidth*fpadWidth/12); //by default I set the step as one tenth of sigma - // Update(); sprintf(fType,"Gati"); } -void AliTPCRF1D::Draw(Float_t x1,Float_t x2,Int_t N) +void AliTPCRF1D::DrawRF(Float_t x1,Float_t x2,Int_t N) { + // + //Draw prf in selected region with nuber of diviision = n + // char s[100]; TCanvas * c1 = new TCanvas("canRF","Pad response function",700,900); c1->cd(); @@ -222,7 +290,11 @@ void AliTPCRF1D::Draw(Float_t x1,Float_t x2,Int_t N) void AliTPCRF1D::Update() { - //initialize to 0 + // + //update fields with interpolated values for + //PRF calculation + + //at the begining initialize to 0 for (Int_t i =0; iIntegral(-5*forigsigma,5*forigsigma,funParam,0.00001); @@ -264,73 +336,18 @@ void AliTPCRF1D::Update() void AliTPCRF1D::Streamer(TBuffer &R__b) { - // Stream an object of class AliTPC. - + // Stream an object of class AliTPCRF1D. if (R__b.IsReading()) { - Version_t R__v = R__b.ReadVersion(); if (R__v) { } - TObject::Streamer(R__b); - //read pad parameters - R__b >> fpadWidth; - //read charge parameters - R__b >> fType[0]; - R__b >> fType[1]; - R__b >> fType[2]; - R__b >> fType[3]; - R__b >> fType[4]; - R__b >> forigsigma; - R__b >> fkNorm; - R__b >> fK3X; - R__b >> fPadDistance; - R__b >> fInteg; - R__b >> fOffset; + AliTPCRF1D::Class()->ReadBuffer(R__b, this); //read functions - if (fGRF!=0) { - delete fGRF; - fGRF=0; - } - if (strncmp(fType,"User",3)==0){ - fGRF= new TF1; - R__b>>fGRF; - } - if (strncmp(fType,"Gauss",3)==0) - fGRF = new TF1("fun",funGauss,-5.,5.,4); - if (strncmp(fType,"Cosh",3)==0) - fGRF = new TF1("fun",funCosh,-5.,5.,4); - if (strncmp(fType,"Gati",3)==0) - fGRF = new TF1("fun",funGati,-5.,5.,4); - R__b >>fDSTEPM1; - R__b >>fNRF; - R__b.ReadFastArray(fcharge,fNRF); - R__b.ReadFastArray(funParam,5); - if (fGRF!=0) fGRF->SetParameters(funParam); + if (strncmp(fType,"Gauss",3)==0) {delete fGRF; fGRF = new TF1("funGauss",funGauss,-5.,5.,4);} + if (strncmp(fType,"Cosh",3)==0) {delete fGRF; fGRF = new TF1("funCosh",funCosh,-5.,5.,4);} + if (strncmp(fType,"Gati",3)==0) {delete fGRF; fGRF = new TF1("funGati",funGati,-5.,5.,4);} + if (fGRF) fGRF->SetParameters(funParam); } else { - R__b.WriteVersion(AliTPCRF1D::IsA()); - TObject::Streamer(R__b); - //write pad width - R__b << fpadWidth; - //write charge parameters - R__b << fType[0]; - R__b << fType[1]; - R__b << fType[2]; - R__b << fType[3]; - R__b << fType[4]; - R__b << forigsigma; - R__b << fkNorm; - R__b << fK3X; - R__b << fPadDistance; - R__b << fInteg; - R__b << fOffset; - //write interpolation parameters - if (strncmp(fType,"User",3)==0) R__b <WriteBuffer(R__b, this); } }