ROOT logo
/**************************************************************************
 * 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$ */


// Generates n particles with in the same phi angle, varies theta
// in equidistant intervals
// This class is intended to use for studies of TPC response
// via merging with background event.
// Note that for a given theta pt and p are not independent 
// Range for only one variable (pt or p) should be given.
// Based on the AliGenBox class written by andreas.morsch@cern.ch
//
// Comments and suggestions: Jiri.Chudoba@cern.ch


#include <TPDGCode.h>

#include "AliConst.h"
#include "AliGenThetaSlice.h"
#include "AliRun.h"

ClassImp(AliGenThetaSlice)

//_____________________________________________________________________________
AliGenThetaSlice::AliGenThetaSlice()
    :AliGenerator(),
     fIpart(0)
{
  //
  // Default constructor
  //
}

//_____________________________________________________________________________
AliGenThetaSlice::AliGenThetaSlice(Int_t npart)
    :AliGenerator(npart),
     fIpart(kProton)
{
  //
  // Standard constructor
  //
  fName  = "ThetaSlice";
  fTitle = "Particle generator - const. phi, slices in theta";
}

//_____________________________________________________________________________

void AliGenThetaSlice::Generate()
{
  //
  // Generate one trigger
  //
  
    Float_t polar[3]= {0,0,0};
    Float_t origin[3];
    Float_t time;
    Float_t p[3];
    Int_t i, j, nt;
    Double_t pmom, theta, phi, pt;
    Float_t random[6];

    if (fNpart == 0) return;

    for (j=0;j<3;j++) origin[j]=fOrigin[j];
    time = fTimeOrigin;
    if(fVertexSmear==kPerEvent) {
	Rndm(random,6);
	for (j=0;j<3;j++) {
	    origin[j]+=fOsigma[j]*TMath::Cos(2*random[2*j]*TMath::Pi())*
		TMath::Sqrt(-2*TMath::Log(random[2*j+1]));
	}
	Rndm(random,2);
	time += fOsigma[2]/TMath::Ccgs()*
	  TMath::Cos(2*random[0]*TMath::Pi())*
	  TMath::Sqrt(-2*TMath::Log(random[1]));
    }
    Float_t thetaInterval = 0.;
    if (fNpart > 1) {
      thetaInterval = (fThetaMax-fThetaMin)/(fNpart-1);
    }
    Rndm(random,1);
    phi=fPhiMin+random[0]*(fPhiMax-fPhiMin);
    for(i=0;i<fNpart;i++) {
	Rndm(random,1);
	theta=fThetaMin+i*thetaInterval;
	if(TestBit(kMomentumRange)) {
	    pmom=fPMin+random[0]*(fPMax-fPMin);
	    pt=pmom*TMath::Sin(theta);
	} else {
	    pt=fPtMin+random[0]*(fPtMax-fPtMin);
	    pmom=pt/TMath::Sin(theta);
	}
	p[0] = pt*TMath::Cos(phi);
	p[1] = pt*TMath::Sin(phi);
	p[2] = pmom*TMath::Cos(theta);

	if(fVertexSmear==kPerTrack) {
	    Rndm(random,6);
	    for (j=0;j<3;j++) {
		origin[j]=fOrigin[j]+fOsigma[j]*TMath::Cos(2*random[2*j]*TMath::Pi())*
		    TMath::Sqrt(-2*TMath::Log(random[2*j+1]));
	    }
	    Rndm(random,2);
	    time = fTimeOrigin + fOsigma[2]/TMath::Ccgs()*
	      TMath::Cos(2*random[0]*TMath::Pi())*
	      TMath::Sqrt(-2*TMath::Log(random[1]));
	}
	PushTrack(fTrackIt,-1,fIpart,p,origin,polar,time,kPPrimary,nt);
    }
}

//_____________________________________________________________________________

void AliGenThetaSlice::Init()
{
// Initialisation, check consistency of selected ranges
  if(TestBit(kPtRange)&&TestBit(kMomentumRange)) 
    Fatal("Init","You should not set the momentum range and the pt range!\n");
  if((!TestBit(kPtRange))&&(!TestBit(kMomentumRange))) 
    Fatal("Init","You should set either the momentum or the pt range!\n");
}

 AliGenThetaSlice.cxx:1
 AliGenThetaSlice.cxx:2
 AliGenThetaSlice.cxx:3
 AliGenThetaSlice.cxx:4
 AliGenThetaSlice.cxx:5
 AliGenThetaSlice.cxx:6
 AliGenThetaSlice.cxx:7
 AliGenThetaSlice.cxx:8
 AliGenThetaSlice.cxx:9
 AliGenThetaSlice.cxx:10
 AliGenThetaSlice.cxx:11
 AliGenThetaSlice.cxx:12
 AliGenThetaSlice.cxx:13
 AliGenThetaSlice.cxx:14
 AliGenThetaSlice.cxx:15
 AliGenThetaSlice.cxx:16
 AliGenThetaSlice.cxx:17
 AliGenThetaSlice.cxx:18
 AliGenThetaSlice.cxx:19
 AliGenThetaSlice.cxx:20
 AliGenThetaSlice.cxx:21
 AliGenThetaSlice.cxx:22
 AliGenThetaSlice.cxx:23
 AliGenThetaSlice.cxx:24
 AliGenThetaSlice.cxx:25
 AliGenThetaSlice.cxx:26
 AliGenThetaSlice.cxx:27
 AliGenThetaSlice.cxx:28
 AliGenThetaSlice.cxx:29
 AliGenThetaSlice.cxx:30
 AliGenThetaSlice.cxx:31
 AliGenThetaSlice.cxx:32
 AliGenThetaSlice.cxx:33
 AliGenThetaSlice.cxx:34
 AliGenThetaSlice.cxx:35
 AliGenThetaSlice.cxx:36
 AliGenThetaSlice.cxx:37
 AliGenThetaSlice.cxx:38
 AliGenThetaSlice.cxx:39
 AliGenThetaSlice.cxx:40
 AliGenThetaSlice.cxx:41
 AliGenThetaSlice.cxx:42
 AliGenThetaSlice.cxx:43
 AliGenThetaSlice.cxx:44
 AliGenThetaSlice.cxx:45
 AliGenThetaSlice.cxx:46
 AliGenThetaSlice.cxx:47
 AliGenThetaSlice.cxx:48
 AliGenThetaSlice.cxx:49
 AliGenThetaSlice.cxx:50
 AliGenThetaSlice.cxx:51
 AliGenThetaSlice.cxx:52
 AliGenThetaSlice.cxx:53
 AliGenThetaSlice.cxx:54
 AliGenThetaSlice.cxx:55
 AliGenThetaSlice.cxx:56
 AliGenThetaSlice.cxx:57
 AliGenThetaSlice.cxx:58
 AliGenThetaSlice.cxx:59
 AliGenThetaSlice.cxx:60
 AliGenThetaSlice.cxx:61
 AliGenThetaSlice.cxx:62
 AliGenThetaSlice.cxx:63
 AliGenThetaSlice.cxx:64
 AliGenThetaSlice.cxx:65
 AliGenThetaSlice.cxx:66
 AliGenThetaSlice.cxx:67
 AliGenThetaSlice.cxx:68
 AliGenThetaSlice.cxx:69
 AliGenThetaSlice.cxx:70
 AliGenThetaSlice.cxx:71
 AliGenThetaSlice.cxx:72
 AliGenThetaSlice.cxx:73
 AliGenThetaSlice.cxx:74
 AliGenThetaSlice.cxx:75
 AliGenThetaSlice.cxx:76
 AliGenThetaSlice.cxx:77
 AliGenThetaSlice.cxx:78
 AliGenThetaSlice.cxx:79
 AliGenThetaSlice.cxx:80
 AliGenThetaSlice.cxx:81
 AliGenThetaSlice.cxx:82
 AliGenThetaSlice.cxx:83
 AliGenThetaSlice.cxx:84
 AliGenThetaSlice.cxx:85
 AliGenThetaSlice.cxx:86
 AliGenThetaSlice.cxx:87
 AliGenThetaSlice.cxx:88
 AliGenThetaSlice.cxx:89
 AliGenThetaSlice.cxx:90
 AliGenThetaSlice.cxx:91
 AliGenThetaSlice.cxx:92
 AliGenThetaSlice.cxx:93
 AliGenThetaSlice.cxx:94
 AliGenThetaSlice.cxx:95
 AliGenThetaSlice.cxx:96
 AliGenThetaSlice.cxx:97
 AliGenThetaSlice.cxx:98
 AliGenThetaSlice.cxx:99
 AliGenThetaSlice.cxx:100
 AliGenThetaSlice.cxx:101
 AliGenThetaSlice.cxx:102
 AliGenThetaSlice.cxx:103
 AliGenThetaSlice.cxx:104
 AliGenThetaSlice.cxx:105
 AliGenThetaSlice.cxx:106
 AliGenThetaSlice.cxx:107
 AliGenThetaSlice.cxx:108
 AliGenThetaSlice.cxx:109
 AliGenThetaSlice.cxx:110
 AliGenThetaSlice.cxx:111
 AliGenThetaSlice.cxx:112
 AliGenThetaSlice.cxx:113
 AliGenThetaSlice.cxx:114
 AliGenThetaSlice.cxx:115
 AliGenThetaSlice.cxx:116
 AliGenThetaSlice.cxx:117
 AliGenThetaSlice.cxx:118
 AliGenThetaSlice.cxx:119
 AliGenThetaSlice.cxx:120
 AliGenThetaSlice.cxx:121
 AliGenThetaSlice.cxx:122
 AliGenThetaSlice.cxx:123
 AliGenThetaSlice.cxx:124
 AliGenThetaSlice.cxx:125
 AliGenThetaSlice.cxx:126
 AliGenThetaSlice.cxx:127
 AliGenThetaSlice.cxx:128
 AliGenThetaSlice.cxx:129
 AliGenThetaSlice.cxx:130
 AliGenThetaSlice.cxx:131
 AliGenThetaSlice.cxx:132
 AliGenThetaSlice.cxx:133
 AliGenThetaSlice.cxx:134
 AliGenThetaSlice.cxx:135
 AliGenThetaSlice.cxx:136