X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliTPCRF1D.cxx;h=ad579b8f7c6cfb52a0f55e2e7a2319c949f685b0;hb=88dee377a06d92de569aeae9645f9b01d45a0e47;hp=9b284e8862f1206aed5049ea6a9dc049d76908ce;hpb=8c555625e22abeb7895465bc7df749d09c617aee;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliTPCRF1D.cxx b/TPC/AliTPCRF1D.cxx index 9b284e8862f..ad579b8f7c6 100644 --- a/TPC/AliTPCRF1D.cxx +++ b/TPC/AliTPCRF1D.cxx @@ -1,5 +1,23 @@ +/************************************************************************** + * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * + * * + * Author: The ALICE Off-line Project. * + * Contributors are mentioned in the code where appropriate. * + * * + * Permission to use, copy, modify and distribute this software and its * + * documentation strictly for non-commercial purposes is hereby granted * + * without fee, provided that the above copyright notice appears in all * + * copies and that both the copyright notice and this permission notice * + * appear in the supporting documentation. The authors make no claims * + * about the suitability of this software for any purpose. It is * + * provided "as is" without express or implied warranty. * + **************************************************************************/ + +/* $Id$ */ + + //----------------------------------------------------------------------------- -// $Header$ +// // // // Origin: Marian Ivanov, Uni. of Bratislava, ivanov@fmph.uniba.sk @@ -7,79 +25,138 @@ // 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]; - fDSTEPM1=1./step; - fSigma = 0; - gRF1D = this; - fGRF = 0; - fkNorm = 0.5; - fpadWidth = 3.5; - forigsigma=0.; - fOffset = 0.; + 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]; + 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); @@ -92,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 @@ -102,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; @@ -116,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(); @@ -203,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); @@ -245,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); } }