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


// Generator for particles in a preset
// kinematic range (flat distribution)
// Note that for a given theta pt and p are not independent 
// Range for only one variable (pt or p) should be given.
// Comments and suggestions: andreas.morsch@cern.ch


#include "TPDGCode.h"

#include "AliConst.h"
#include "AliGenBox.h"
#include "AliRun.h"
#include "AliGenEventHeader.h"
#include "TDatabasePDG.h"
#include "AliPDG.h"

ClassImp(AliGenBox)

//_____________________________________________________________________________
AliGenBox::AliGenBox()
    :AliGenerator(), 
     fIpart(0),
     fEtaMin(0),
     fEtaMax(0)
{
  //
  // Default constructor
  //
}

//_____________________________________________________________________________
AliGenBox::AliGenBox(Int_t npart)
    :AliGenerator(npart),
     fIpart(kProton),
     fEtaMin(0),
     fEtaMax(0)
{
  //
  // Standard constructor
  //
  fName  = "Box";
  fTitle = "Box particle generator";
}

//_____________________________________________________________________________

void AliGenBox::Generate() {
  //
  // Generate one trigger (fNpart particles)
  //
  GenerateN(1);
}
 
//_____________________________________________________________________________
void AliGenBox::GenerateN(Int_t ntimes)
{
  //
  // Generate ntimes triggers
  //   total ntimes*fNpart particles
  //
  
    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;
    Double_t y, mt;
    //
    Float_t random[6];
  //
    for (j=0;j<3;j++) origin[j]=fOrigin[j];
    time = fTimeOrigin;
    if(fVertexSmear==kPerEvent) {
	Vertex();
	for (j=0;j<3;j++) origin[j]=fVertex[j];
	time = fTime;
    }

    Double_t m = TDatabasePDG::Instance()->GetParticle(fIpart)->Mass();

    Int_t mult = fNpart*ntimes;
    for(i=0;i<mult;i++) {
	Rndm(random,3);
	
	if (TestBit(kYRange)) {
	    y = fYMin+random[0]*(fYMax-fYMin);
	
	    if(TestBit(kMomentumRange)) {
	        pmom=fPMin+random[1]*(fPMax-fPMin);
	        mt = TMath::Sqrt(pmom*pmom+m*m)/TMath::CosH(y);
	        pt = TMath::Sqrt(mt*mt - m*m);
	    } else {
	        pt=fPtMin+random[1]*(fPtMax-fPtMin);
	        mt=TMath::Sqrt(pt*pt+m*m);
	    }

	    phi=fPhiMin+random[2]*(fPhiMax-fPhiMin);
	    p[0] = pt*TMath::Cos(phi);
	    p[1] = pt*TMath::Sin(phi);
	    p[2] = mt*TMath::SinH(y);
	} else {
	    if (TestBit(kThetaRange)) {
	        theta = fThetaMin+random[0]*(fThetaMax-fThetaMin);
	    } else {
	        Float_t eta = fEtaMin+random[0]*(fEtaMax-fEtaMin);
	        theta = 2. * TMath::ATan(TMath::Exp(-eta));
	    }
	
	    if(TestBit(kMomentumRange)) {
	        pmom=fPMin+random[1]*(fPMax-fPMin);
	        pt=pmom*TMath::Sin(theta);
	    } else {

	        pt=fPtMin+random[1]*(fPtMax-fPtMin);
	        pmom=pt/TMath::Sin(theta);
	    }

	    phi=fPhiMin+random[2]*(fPhiMax-fPhiMin);
	    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, 1., 1);
    }

    AliGenEventHeader* header = new AliGenEventHeader("BOX");
    header->SetPrimaryVertex(fVertex);
    header->SetNProduced(mult);
    header->SetInteractionTime(fTime);
    
 // Passes header either to the container or to gAlice
    if (fContainer) {
        header->SetName(fName);
	fContainer->AddHeader(header);
    } else {
	gAlice->SetGenEventHeader(header);	
    }
}

//_____________________________________________________________________________

void AliGenBox::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");
  if((TestBit(kYRange)&&TestBit(kThetaRange)) || (TestBit(kYRange)&&TestBit(kEtaRange)) || (TestBit(kEtaRange)&&TestBit(kThetaRange)) )
    Fatal("Init","You should only set the range of one of these variables: y, eta or theta\n");
  if((!TestBit(kYRange)) && (!TestBit(kEtaRange)) && (!TestBit(kThetaRange)) )
    Fatal("Init","You should set the range of one of these variables: y, eta or theta\n");
}

 AliGenBox.cxx:1
 AliGenBox.cxx:2
 AliGenBox.cxx:3
 AliGenBox.cxx:4
 AliGenBox.cxx:5
 AliGenBox.cxx:6
 AliGenBox.cxx:7
 AliGenBox.cxx:8
 AliGenBox.cxx:9
 AliGenBox.cxx:10
 AliGenBox.cxx:11
 AliGenBox.cxx:12
 AliGenBox.cxx:13
 AliGenBox.cxx:14
 AliGenBox.cxx:15
 AliGenBox.cxx:16
 AliGenBox.cxx:17
 AliGenBox.cxx:18
 AliGenBox.cxx:19
 AliGenBox.cxx:20
 AliGenBox.cxx:21
 AliGenBox.cxx:22
 AliGenBox.cxx:23
 AliGenBox.cxx:24
 AliGenBox.cxx:25
 AliGenBox.cxx:26
 AliGenBox.cxx:27
 AliGenBox.cxx:28
 AliGenBox.cxx:29
 AliGenBox.cxx:30
 AliGenBox.cxx:31
 AliGenBox.cxx:32
 AliGenBox.cxx:33
 AliGenBox.cxx:34
 AliGenBox.cxx:35
 AliGenBox.cxx:36
 AliGenBox.cxx:37
 AliGenBox.cxx:38
 AliGenBox.cxx:39
 AliGenBox.cxx:40
 AliGenBox.cxx:41
 AliGenBox.cxx:42
 AliGenBox.cxx:43
 AliGenBox.cxx:44
 AliGenBox.cxx:45
 AliGenBox.cxx:46
 AliGenBox.cxx:47
 AliGenBox.cxx:48
 AliGenBox.cxx:49
 AliGenBox.cxx:50
 AliGenBox.cxx:51
 AliGenBox.cxx:52
 AliGenBox.cxx:53
 AliGenBox.cxx:54
 AliGenBox.cxx:55
 AliGenBox.cxx:56
 AliGenBox.cxx:57
 AliGenBox.cxx:58
 AliGenBox.cxx:59
 AliGenBox.cxx:60
 AliGenBox.cxx:61
 AliGenBox.cxx:62
 AliGenBox.cxx:63
 AliGenBox.cxx:64
 AliGenBox.cxx:65
 AliGenBox.cxx:66
 AliGenBox.cxx:67
 AliGenBox.cxx:68
 AliGenBox.cxx:69
 AliGenBox.cxx:70
 AliGenBox.cxx:71
 AliGenBox.cxx:72
 AliGenBox.cxx:73
 AliGenBox.cxx:74
 AliGenBox.cxx:75
 AliGenBox.cxx:76
 AliGenBox.cxx:77
 AliGenBox.cxx:78
 AliGenBox.cxx:79
 AliGenBox.cxx:80
 AliGenBox.cxx:81
 AliGenBox.cxx:82
 AliGenBox.cxx:83
 AliGenBox.cxx:84
 AliGenBox.cxx:85
 AliGenBox.cxx:86
 AliGenBox.cxx:87
 AliGenBox.cxx:88
 AliGenBox.cxx:89
 AliGenBox.cxx:90
 AliGenBox.cxx:91
 AliGenBox.cxx:92
 AliGenBox.cxx:93
 AliGenBox.cxx:94
 AliGenBox.cxx:95
 AliGenBox.cxx:96
 AliGenBox.cxx:97
 AliGenBox.cxx:98
 AliGenBox.cxx:99
 AliGenBox.cxx:100
 AliGenBox.cxx:101
 AliGenBox.cxx:102
 AliGenBox.cxx:103
 AliGenBox.cxx:104
 AliGenBox.cxx:105
 AliGenBox.cxx:106
 AliGenBox.cxx:107
 AliGenBox.cxx:108
 AliGenBox.cxx:109
 AliGenBox.cxx:110
 AliGenBox.cxx:111
 AliGenBox.cxx:112
 AliGenBox.cxx:113
 AliGenBox.cxx:114
 AliGenBox.cxx:115
 AliGenBox.cxx:116
 AliGenBox.cxx:117
 AliGenBox.cxx:118
 AliGenBox.cxx:119
 AliGenBox.cxx:120
 AliGenBox.cxx:121
 AliGenBox.cxx:122
 AliGenBox.cxx:123
 AliGenBox.cxx:124
 AliGenBox.cxx:125
 AliGenBox.cxx:126
 AliGenBox.cxx:127
 AliGenBox.cxx:128
 AliGenBox.cxx:129
 AliGenBox.cxx:130
 AliGenBox.cxx:131
 AliGenBox.cxx:132
 AliGenBox.cxx:133
 AliGenBox.cxx:134
 AliGenBox.cxx:135
 AliGenBox.cxx:136
 AliGenBox.cxx:137
 AliGenBox.cxx:138
 AliGenBox.cxx:139
 AliGenBox.cxx:140
 AliGenBox.cxx:141
 AliGenBox.cxx:142
 AliGenBox.cxx:143
 AliGenBox.cxx:144
 AliGenBox.cxx:145
 AliGenBox.cxx:146
 AliGenBox.cxx:147
 AliGenBox.cxx:148
 AliGenBox.cxx:149
 AliGenBox.cxx:150
 AliGenBox.cxx:151
 AliGenBox.cxx:152
 AliGenBox.cxx:153
 AliGenBox.cxx:154
 AliGenBox.cxx:155
 AliGenBox.cxx:156
 AliGenBox.cxx:157
 AliGenBox.cxx:158
 AliGenBox.cxx:159
 AliGenBox.cxx:160
 AliGenBox.cxx:161
 AliGenBox.cxx:162
 AliGenBox.cxx:163
 AliGenBox.cxx:164
 AliGenBox.cxx:165
 AliGenBox.cxx:166
 AliGenBox.cxx:167
 AliGenBox.cxx:168
 AliGenBox.cxx:169
 AliGenBox.cxx:170
 AliGenBox.cxx:171
 AliGenBox.cxx:172
 AliGenBox.cxx:173
 AliGenBox.cxx:174
 AliGenBox.cxx:175
 AliGenBox.cxx:176
 AliGenBox.cxx:177
 AliGenBox.cxx:178
 AliGenBox.cxx:179
 AliGenBox.cxx:180
 AliGenBox.cxx:181
 AliGenBox.cxx:182
 AliGenBox.cxx:183
 AliGenBox.cxx:184
 AliGenBox.cxx:185
 AliGenBox.cxx:186
 AliGenBox.cxx:187