]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCRF1D.cxx
Check on curvature not position
[u/mrichter/AliRoot.git] / TPC / AliTPCRF1D.cxx
index 9b284e8862f1206aed5049ea6a9dc049d76908ce..dd1c4c249eecd291af063fe94325caabcd647967 100644 (file)
@@ -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
 //  Declaration of class AliTPCRF1D
 //
 //-----------------------------------------------------------------------------
+
+//
+
 #include "TMath.h"
 #include "AliTPCRF1D.h"
 #include "TF2.h"
-#include <iostream.h>
+#include <Riostream.h>
 #include "TCanvas.h"
 #include "TPad.h"
 #include "TStyle.h"
 #include "TH1.h"
+#include <TString.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)
 {
+  //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;
+  if (step>0) fDSTEPM1=1./step;
+  else fDSTEPM1 = 1./fgRFDSTEP;
   fSigma = 0;
-  gRF1D = this;
   fGRF = 0;
   fkNorm = 0.5;
   fpadWidth = 3.5;
@@ -70,16 +92,49 @@ AliTPCRF1D::AliTPCRF1D(Bool_t direct,Int_t np,Float_t step)
   fOffset = 0.;
 }
 
+AliTPCRF1D::AliTPCRF1D(const AliTPCRF1D &prf):TObject(prf)
+{
+  
+  //
+  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 +147,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 +159,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 +175,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 <x1,x2> with nuber of diviision = n
+  //
   char s[100];
   TCanvas  * c1 = new TCanvas("canRF","Pad response function",700,900);
   c1->cd();
@@ -203,7 +268,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; i<fNRF;i++)  fcharge[i] = 0;
   if ( fGRF == 0 ) return;
   fInteg  = fGRF->Integral(-5*forigsigma,5*forigsigma,funParam,0.00001);
@@ -245,73 +314,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 <<fGRF;   
-      R__b <<fDSTEPM1;
-      R__b <<fNRF;    
-      R__b.WriteFastArray(fcharge,fNRF); 
-      R__b.WriteFastArray(funParam,5); 
-       
-      
-
+      AliTPCRF1D::Class()->WriteBuffer(R__b, this);
    }
 }