]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCRF1D.cxx
Analysis code updated
[u/mrichter/AliRoot.git] / TPC / AliTPCRF1D.cxx
index 45a4cfe53b885c656eca74d3fc74040597c9e923..91828b17c80fbfe41906d92f2994591f7fa92811 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-/*
-$Log$
-Revision 1.5.4.3  2000/06/26 07:39:42  kowal2
-Changes to obey the coding rules
+/* $Id$ */
 
-Revision 1.5.4.2  2000/06/25 08:38:41  kowal2
-Splitted from AliTPCtracking
-
-Revision 1.5.4.1  2000/06/14 16:48:24  kowal2
-Parameter setting improved. Removed compiler warnings
-
-Revision 1.5  2000/04/17 09:37:33  kowal2
-removed obsolete AliTPCDigitsDisplay.C
-
-Revision 1.4.8.2  2000/04/10 08:53:09  kowal2
-
-Updates by M. Ivanov
-
-
-Revision 1.4  1999/09/29 09:24:34  fca
-Introduction of the Copyright and cvs Log
-
-*/
 
 //-----------------------------------------------------------------------------
 //
@@ -49,14 +28,17 @@ Introduction of the Copyright and cvs Log
 
 //
 
-#include "TMath.h"
+#include <Riostream.h>
+#include <TCanvas.h>
+#include <TClass.h>
+#include <TF2.h>
+#include <TH1.h>
+#include <TMath.h>
+#include <TPad.h>
+#include <TString.h>
+#include <TStyle.h>
+
 #include "AliTPCRF1D.h"
-#include "TF2.h"
-#include <iostream.h>
-#include "TCanvas.h"
-#include "TPad.h"
-#include "TStyle.h"
-#include "TH1.h"
 
 extern TStyle * gStyle; 
 
@@ -96,6 +78,19 @@ 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;
@@ -104,33 +99,68 @@ AliTPCRF1D::AliTPCRF1D(Bool_t direct,Int_t np,Float_t step)
   fcharge = new Float_t[fNRF];
   if (step>0) fDSTEPM1=1./step;
   else fDSTEPM1 = 1./fgRFDSTEP;
-  fSigma = 0;
-  fGRF = 0;
-  fkNorm = 0.5;
-  fpadWidth = 3.5;
-  forigsigma=0.;
-  fOffset = 0.;
+  for(Int_t i=0;i<5;i++) {
+    funParam[i]=0.;
+    fType[i]=0;
+  }
+  
 }
 
 AliTPCRF1D::AliTPCRF1D(const AliTPCRF1D &prf)
+           :TObject(prf),
+           fNRF(prf.fNRF),
+            fDSTEPM1(prf.fDSTEPM1),
+            fcharge(0),
+            forigsigma(prf.forigsigma),
+            fpadWidth(prf.fpadWidth),
+            fkNorm(prf.fkNorm),
+            fInteg(prf.fInteg),
+            fGRF(new TF1(*(prf.fGRF))),
+            fSigma(prf.fSigma),
+            fOffset(prf.fOffset),
+            fDirect(prf.fDirect),
+            fPadDistance(prf.fPadDistance)
 {
   //
-  memcpy(this, &prf, sizeof(prf)); 
+  //
+  for(Int_t i=0;i<5;i++) {
+    funParam[i]=0.;
+    fType[i]=0;
+  }
   fcharge = new Float_t[fNRF];
-  memcpy(fcharge,prf.fcharge, fNRF);
-  fGRF = new TF1(*(prf.fGRF)); 
+  memcpy(fcharge,prf.fcharge, fNRF*sizeof(Float_t));
+
+  //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));
-  return (*this);
+  if(this!=&prf) {
+    TObject::operator=(prf);
+    fNRF=prf.fNRF;
+    fDSTEPM1=prf.fDSTEPM1;
+    delete [] fcharge;
+    fcharge = new Float_t[fNRF];
+    memcpy(fcharge,prf.fcharge, fNRF*sizeof(Float_t));
+    forigsigma=prf.forigsigma;
+    fpadWidth=prf.fpadWidth;
+    fkNorm=prf.fkNorm;
+    fInteg=prf.fInteg;
+    delete fGRF;
+    fGRF=new TF1(*(prf.fGRF));
+   //PH Change the name (add 0 to the end)
+    TString s(fGRF->GetName());
+    s+="0";
+    fGRF->SetName(s.Data());
+    fSigma=prf.fSigma;
+    fOffset=prf.fOffset;
+    fDirect=prf.fDirect;
+    fPadDistance=prf.fPadDistance;
+  }
+  return *this;
 }
 
 
@@ -138,8 +168,8 @@ AliTPCRF1D & AliTPCRF1D::operator = (const AliTPCRF1D &prf)
 AliTPCRF1D::~AliTPCRF1D()
 {
   //
-  if (fcharge!=0) delete [] fcharge;
-  if (fGRF !=0 ) fGRF->Delete();
+  delete [] fcharge;
+  delete fGRF;
 }
 
 Float_t AliTPCRF1D::GetRF(Float_t xin)
@@ -147,11 +177,11 @@ Float_t AliTPCRF1D::GetRF(Float_t xin)
   //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;
+  Float_t x = (xin-fOffset)*fDSTEPM1+fNRF/2;
   Int_t i1=Int_t(x);
   if (x<0) i1-=1;
   Float_t res=0;
-  if (i1+1<fNRF)
+  if (i1+1<fNRF &&i1>0)
     res = fcharge[i1]*(Float_t(i1+1)-x)+fcharge[i1+1]*(x-Float_t(i1));    
   return res;
 }
@@ -178,7 +208,8 @@ void AliTPCRF1D::SetParam( TF1 * GRF,Float_t padwidth,
    if (sigma==0) sigma= fpadWidth/TMath::Sqrt(12.);
    forigsigma=sigma;
    fDSTEPM1 = 10/TMath::Sqrt(sigma*sigma+fpadWidth*fpadWidth/12); 
-   sprintf(fType,"User");
+   //sprintf(fType,"User");
+   snprintf(fType,5,"User");
    //   Update();   
 }
   
@@ -192,13 +223,14 @@ void AliTPCRF1D::SetGauss(Float_t sigma, Float_t padWidth,
   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  
-  sprintf(fType,"Gauss");
+  //sprintf(fType,"Gauss");
+   snprintf(fType,5,"Gauss");
 }
 
 void AliTPCRF1D::SetCosh(Float_t sigma, Float_t padWidth,
@@ -210,13 +242,14 @@ void AliTPCRF1D::SetCosh(Float_t sigma, Float_t padWidth,
   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
-  sprintf(fType,"Cosh");
+  //sprintf(fType,"Cosh");
+  snprintf(fType,5,"Cosh");
 }
 
 void AliTPCRF1D::SetGati(Float_t K3, Float_t padDistance, Float_t padWidth,
@@ -228,16 +261,19 @@ void AliTPCRF1D::SetGati(Float_t K3, Float_t padDistance, Float_t padWidth,
   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
-  sprintf(fType,"Gati");
+  //sprintf(fType,"Gati");
+  snprintf(fType,5,"Gati");
 }
 
+
+
 void AliTPCRF1D::DrawRF(Float_t x1,Float_t x2,Int_t N)
 { 
   //
@@ -251,8 +287,9 @@ void AliTPCRF1D::DrawRF(Float_t x1,Float_t x2,Int_t N)
   TPad * pad2 = new TPad("pad2RF","",0.05,0.05,0.95,0.45,21);
   pad2->Draw();
 
-  sprintf(s,"RF response function for %1.2f cm pad width",
-         fpadWidth);  
+  //sprintf(s,"RF response function for %1.2f cm pad width",
+  //     fpadWidth); 
+  snprintf(s,60,"RF response function for %1.2f cm pad width",fpadWidth); 
   pad1->cd();
   TH1F * hRFo = new TH1F("hRFo","Original charge distribution",N+1,x1,x2);
   pad2->cd();
@@ -326,69 +363,28 @@ void AliTPCRF1D::Update()
 void AliTPCRF1D::Streamer(TBuffer &R__b)
 {
    // Stream an object of class AliTPCRF1D.
-  Float_t dummy;
    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 >> dummy;  //dummuy instead fK3X in previous
-      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 << dummy;  //dummuy instead fK3X in previouis
-      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);
    }
 }
+
+
+Double_t  AliTPCRF1D::Gamma4(Double_t x, Double_t p0, Double_t p1){
+  //
+  // Gamma 4 Time response function of ALTRO
+  //
+  if (x<0) return 0;
+  Double_t g1 = TMath::Exp(-4.*x/p1);
+  Double_t g2 = TMath::Power(x/p1,4);
+  return p0*g1*g2;
+}