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


// Generator for particle pairs in a preset
// kinematic range 
// ranges can be set for invariant mass, pair pT, pair rapidity
// and pair azimuth

//
// Comments and suggestions: markus.konrad.kohler@cern.ch
//

#include "TPDGCode.h"
#include <TDatabasePDG.h>
#include "AliGenEventHeader.h"
#include "TF1.h"

#include "AliGenPairFlat.h"

ClassImp(AliGenPairFlat)

//_____________________________________________________________________________
AliGenPairFlat::AliGenPairFlat()
    :AliGenerator(), 
     fPairNpart(10),
     fPairYMin(-10.),
     fPairYMax(10.),
     fPairPhiMin(0.),
     fPairPhiMax(TMath::TwoPi()),
     fPairPtMin(0.001),
     fPairPtMax(50.),
     fPairMassMin(0.),
     fPairMassMax(10.),
     fLegPdg1(11),
     fLegPdg2(-11),
     fAlpha(0.),
     fDebug(0),
     fPol(0)
{
  //
  // Default constructor
  //
}


//_____________________________________________________________________________
AliGenPairFlat::~AliGenPairFlat()
{
  //
  // Destructor
  //
    delete fPol; 

}

//_____________________________________________________________________________
void AliGenPairFlat::Generate()
{
  //
  // Generate a random pair of 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 phi, y, mass, mt, e, pt;
    Float_t weight = 1.;
    Double_t  pt1, pt2;

    TLorentzVector mother, dau1, dau2;
    Float_t random[6];

    fPol = new TF1("fPol","1.+[0]*x*x",-1.,1.);
    fPol->SetParameter(0, fAlpha);


    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;
     }

	if(fDebug == 2){
	printf("\n\n------------------GENERATOR SETTINGS------------------\n\n");
	printf("You choosed for the mother the Mass range %f - %f     \n",fPairMassMin,fPairMassMax);
	printf("You choosed for the mother the transverse Momentum range %f - %f \n",fPairPtMin,fPairPtMax);
	printf("You choosed for the mother the Phi range %f - %f \n",fPairPhiMin,fPairPhiMax);
	printf("The Particle will decay in (pdg) %i and %i\n \n",fLegPdg1, fLegPdg2);
	printf("The rest Mass of first daughter (%s) is %f \n",
	TDatabasePDG::Instance()->GetParticle(TMath::Abs(fLegPdg1))->GetTitle(),
	TDatabasePDG::Instance()->GetParticle(TMath::Abs(fLegPdg1))->Mass());
	printf("The rest Mass of second daughter (%s) is %f \n",
	TDatabasePDG::Instance()->GetParticle(TMath::Abs(fLegPdg2))->GetTitle(),
	TDatabasePDG::Instance()->GetParticle(TMath::Abs(fLegPdg2))->Mass());
	printf("polarization factor is alpha == %lf \n",fAlpha);
	printf("vertex is at x == %f || y == %f || z == %f   \n",origin[0],origin[1],origin[2]);
	printf("\n----------------------------------------------------------\n");
	}

    for(i=0;i<fPairNpart;i++) {

	// mother properties
	Rndm(random,4);
	mass  	= fPairMassMin+random[0]*(fPairMassMax-fPairMassMin);
	pt	= fPairPtMin+random[1]*(fPairPtMax-fPairPtMin);
	y	= fPairYMin+random[2]*(fPairYMax-fPairYMin);
	phi	= fPairPhiMin+random[3]*(fPairPhiMax-fPairPhiMin);

        mt 	= TMath::Sqrt(pt*pt + mass*mass);
	p[0] 	= pt*TMath::Cos(phi);
	p[1] 	= pt*TMath::Sin(phi);
	p[2] 	= mt*TMath::SinH(y);
	e 	= mt*TMath::CosH(y);

	mother.SetPxPyPzE(p[0],p[1],p[2],e); 
	

         if (fDebug == 2)    printf("p = (%+11.4e,%+11.4e,%+11.4e) GeV || pt = %+11.4e || y =  %+11.4e || weight=%+11.4e || E= %+11.4e\n",p[0],p[1],p[2],pt, y,weight,e);

	//decay procedure
	if(!Decay(mother,dau1,dau2,fPol))continue;

	pt1 = dau1.Pt();
	pt2 = dau2.Pt();
	//	y1 = dau1.Rapidity();
	//      y2 = dau2.Rapidity();

	//first daughter
	p[0] = dau1.Px();
	p[1] = dau1.Py();
	p[2] = dau1.Pz();
	e = dau1.E();

	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,fLegPdg1,p,origin,polar,time,kPPrimary,nt, weight);
	if (fDebug == 2) printf("dau1-->id=%+3d, p = (%+11.4e,%+11.4e,%+11.4e) GeV || pt = %+11.4e || weight=%+11.4e || E= %+11.4e\n",fLegPdg1,p[0],p[1],p[2],pt1,weight,e);

	//second daughter
	p[0] = dau2.Px();
	p[1] = dau2.Py();
	p[2] = dau2.Pz();
	e = dau2.E();

	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,fLegPdg2,p,origin,polar,time,kPPrimary,nt,weight);
      if (fDebug == 2) printf("dau2-->id=%+3d, p = (%+11.4e,%+11.4e,%+11.4e) GeV || pt = %+11.4e || weight=%+11.4e || E= %+11.4e\n",fLegPdg2,p[0],p[1],p[2],pt2, weight,e);

    }//particle loop

}

//_____________________________________________________________________________
void AliGenPairFlat::Init()
{
	//
	// Init
	//

	printf("AliGenPairFlat::Init() not implemented!!!\n");

}


//_____________________________________________________________________________
Bool_t AliGenPairFlat::Decay(const TLorentzVector& mother, TLorentzVector &dau1, TLorentzVector &dau2, TF1* polfactor)
{
	//
	// decay procedure
	//

	Double_t mp, md1, md2, ed1, ed2, pd1;
	Double_t costheta, sintheta, phi;

	mp = mother.M();
	md1 = TDatabasePDG::Instance()->GetParticle(TMath::Abs(fLegPdg1))->Mass();
	md2 = TDatabasePDG::Instance()->GetParticle(TMath::Abs(fLegPdg2))->Mass();

	if(mp < md1+md2){
	printf("Daughters are heavier than Mother!! Check Kinematics!! \n");
	return 0;
	}

  ed1 = (mp*mp + md1*md1 - md2*md2)/(2.*mp);
  ed2 = mp-ed1;
  pd1 = TMath::Sqrt((ed1+md1)*(ed1-md1));
  //  pd2 = TMath::Sqrt((mp*mp-(md1+md2)*(md1+md2))*(mp*mp -(md1-md2)*(md1-md2)))/(2.*mp);

  costheta = polfactor->GetRandom(); //polarization
  sintheta = TMath::Sqrt((1.+costheta)*(1.-costheta));
  phi      = 2.0*TMath::Pi()*gRandom->Rndm();

	dau1.SetPxPyPzE(pd1*sintheta*TMath::Cos(phi), 
		        pd1*sintheta*TMath::Sin(phi), 
		        pd1*costheta,
			ed1); 

	dau2.SetPxPyPzE((-1.)*pd1*sintheta*TMath::Cos(phi),
			(-1.)*pd1*sintheta*TMath::Sin(phi), 
			(-1.)*pd1*costheta,
			ed2);

  	TVector3 boost = mother.BoostVector();

  	dau1.Boost(boost);
  	dau2.Boost(boost);

  return 1;

}



 AliGenPairFlat.cxx:1
 AliGenPairFlat.cxx:2
 AliGenPairFlat.cxx:3
 AliGenPairFlat.cxx:4
 AliGenPairFlat.cxx:5
 AliGenPairFlat.cxx:6
 AliGenPairFlat.cxx:7
 AliGenPairFlat.cxx:8
 AliGenPairFlat.cxx:9
 AliGenPairFlat.cxx:10
 AliGenPairFlat.cxx:11
 AliGenPairFlat.cxx:12
 AliGenPairFlat.cxx:13
 AliGenPairFlat.cxx:14
 AliGenPairFlat.cxx:15
 AliGenPairFlat.cxx:16
 AliGenPairFlat.cxx:17
 AliGenPairFlat.cxx:18
 AliGenPairFlat.cxx:19
 AliGenPairFlat.cxx:20
 AliGenPairFlat.cxx:21
 AliGenPairFlat.cxx:22
 AliGenPairFlat.cxx:23
 AliGenPairFlat.cxx:24
 AliGenPairFlat.cxx:25
 AliGenPairFlat.cxx:26
 AliGenPairFlat.cxx:27
 AliGenPairFlat.cxx:28
 AliGenPairFlat.cxx:29
 AliGenPairFlat.cxx:30
 AliGenPairFlat.cxx:31
 AliGenPairFlat.cxx:32
 AliGenPairFlat.cxx:33
 AliGenPairFlat.cxx:34
 AliGenPairFlat.cxx:35
 AliGenPairFlat.cxx:36
 AliGenPairFlat.cxx:37
 AliGenPairFlat.cxx:38
 AliGenPairFlat.cxx:39
 AliGenPairFlat.cxx:40
 AliGenPairFlat.cxx:41
 AliGenPairFlat.cxx:42
 AliGenPairFlat.cxx:43
 AliGenPairFlat.cxx:44
 AliGenPairFlat.cxx:45
 AliGenPairFlat.cxx:46
 AliGenPairFlat.cxx:47
 AliGenPairFlat.cxx:48
 AliGenPairFlat.cxx:49
 AliGenPairFlat.cxx:50
 AliGenPairFlat.cxx:51
 AliGenPairFlat.cxx:52
 AliGenPairFlat.cxx:53
 AliGenPairFlat.cxx:54
 AliGenPairFlat.cxx:55
 AliGenPairFlat.cxx:56
 AliGenPairFlat.cxx:57
 AliGenPairFlat.cxx:58
 AliGenPairFlat.cxx:59
 AliGenPairFlat.cxx:60
 AliGenPairFlat.cxx:61
 AliGenPairFlat.cxx:62
 AliGenPairFlat.cxx:63
 AliGenPairFlat.cxx:64
 AliGenPairFlat.cxx:65
 AliGenPairFlat.cxx:66
 AliGenPairFlat.cxx:67
 AliGenPairFlat.cxx:68
 AliGenPairFlat.cxx:69
 AliGenPairFlat.cxx:70
 AliGenPairFlat.cxx:71
 AliGenPairFlat.cxx:72
 AliGenPairFlat.cxx:73
 AliGenPairFlat.cxx:74
 AliGenPairFlat.cxx:75
 AliGenPairFlat.cxx:76
 AliGenPairFlat.cxx:77
 AliGenPairFlat.cxx:78
 AliGenPairFlat.cxx:79
 AliGenPairFlat.cxx:80
 AliGenPairFlat.cxx:81
 AliGenPairFlat.cxx:82
 AliGenPairFlat.cxx:83
 AliGenPairFlat.cxx:84
 AliGenPairFlat.cxx:85
 AliGenPairFlat.cxx:86
 AliGenPairFlat.cxx:87
 AliGenPairFlat.cxx:88
 AliGenPairFlat.cxx:89
 AliGenPairFlat.cxx:90
 AliGenPairFlat.cxx:91
 AliGenPairFlat.cxx:92
 AliGenPairFlat.cxx:93
 AliGenPairFlat.cxx:94
 AliGenPairFlat.cxx:95
 AliGenPairFlat.cxx:96
 AliGenPairFlat.cxx:97
 AliGenPairFlat.cxx:98
 AliGenPairFlat.cxx:99
 AliGenPairFlat.cxx:100
 AliGenPairFlat.cxx:101
 AliGenPairFlat.cxx:102
 AliGenPairFlat.cxx:103
 AliGenPairFlat.cxx:104
 AliGenPairFlat.cxx:105
 AliGenPairFlat.cxx:106
 AliGenPairFlat.cxx:107
 AliGenPairFlat.cxx:108
 AliGenPairFlat.cxx:109
 AliGenPairFlat.cxx:110
 AliGenPairFlat.cxx:111
 AliGenPairFlat.cxx:112
 AliGenPairFlat.cxx:113
 AliGenPairFlat.cxx:114
 AliGenPairFlat.cxx:115
 AliGenPairFlat.cxx:116
 AliGenPairFlat.cxx:117
 AliGenPairFlat.cxx:118
 AliGenPairFlat.cxx:119
 AliGenPairFlat.cxx:120
 AliGenPairFlat.cxx:121
 AliGenPairFlat.cxx:122
 AliGenPairFlat.cxx:123
 AliGenPairFlat.cxx:124
 AliGenPairFlat.cxx:125
 AliGenPairFlat.cxx:126
 AliGenPairFlat.cxx:127
 AliGenPairFlat.cxx:128
 AliGenPairFlat.cxx:129
 AliGenPairFlat.cxx:130
 AliGenPairFlat.cxx:131
 AliGenPairFlat.cxx:132
 AliGenPairFlat.cxx:133
 AliGenPairFlat.cxx:134
 AliGenPairFlat.cxx:135
 AliGenPairFlat.cxx:136
 AliGenPairFlat.cxx:137
 AliGenPairFlat.cxx:138
 AliGenPairFlat.cxx:139
 AliGenPairFlat.cxx:140
 AliGenPairFlat.cxx:141
 AliGenPairFlat.cxx:142
 AliGenPairFlat.cxx:143
 AliGenPairFlat.cxx:144
 AliGenPairFlat.cxx:145
 AliGenPairFlat.cxx:146
 AliGenPairFlat.cxx:147
 AliGenPairFlat.cxx:148
 AliGenPairFlat.cxx:149
 AliGenPairFlat.cxx:150
 AliGenPairFlat.cxx:151
 AliGenPairFlat.cxx:152
 AliGenPairFlat.cxx:153
 AliGenPairFlat.cxx:154
 AliGenPairFlat.cxx:155
 AliGenPairFlat.cxx:156
 AliGenPairFlat.cxx:157
 AliGenPairFlat.cxx:158
 AliGenPairFlat.cxx:159
 AliGenPairFlat.cxx:160
 AliGenPairFlat.cxx:161
 AliGenPairFlat.cxx:162
 AliGenPairFlat.cxx:163
 AliGenPairFlat.cxx:164
 AliGenPairFlat.cxx:165
 AliGenPairFlat.cxx:166
 AliGenPairFlat.cxx:167
 AliGenPairFlat.cxx:168
 AliGenPairFlat.cxx:169
 AliGenPairFlat.cxx:170
 AliGenPairFlat.cxx:171
 AliGenPairFlat.cxx:172
 AliGenPairFlat.cxx:173
 AliGenPairFlat.cxx:174
 AliGenPairFlat.cxx:175
 AliGenPairFlat.cxx:176
 AliGenPairFlat.cxx:177
 AliGenPairFlat.cxx:178
 AliGenPairFlat.cxx:179
 AliGenPairFlat.cxx:180
 AliGenPairFlat.cxx:181
 AliGenPairFlat.cxx:182
 AliGenPairFlat.cxx:183
 AliGenPairFlat.cxx:184
 AliGenPairFlat.cxx:185
 AliGenPairFlat.cxx:186
 AliGenPairFlat.cxx:187
 AliGenPairFlat.cxx:188
 AliGenPairFlat.cxx:189
 AliGenPairFlat.cxx:190
 AliGenPairFlat.cxx:191
 AliGenPairFlat.cxx:192
 AliGenPairFlat.cxx:193
 AliGenPairFlat.cxx:194
 AliGenPairFlat.cxx:195
 AliGenPairFlat.cxx:196
 AliGenPairFlat.cxx:197
 AliGenPairFlat.cxx:198
 AliGenPairFlat.cxx:199
 AliGenPairFlat.cxx:200
 AliGenPairFlat.cxx:201
 AliGenPairFlat.cxx:202
 AliGenPairFlat.cxx:203
 AliGenPairFlat.cxx:204
 AliGenPairFlat.cxx:205
 AliGenPairFlat.cxx:206
 AliGenPairFlat.cxx:207
 AliGenPairFlat.cxx:208
 AliGenPairFlat.cxx:209
 AliGenPairFlat.cxx:210
 AliGenPairFlat.cxx:211
 AliGenPairFlat.cxx:212
 AliGenPairFlat.cxx:213
 AliGenPairFlat.cxx:214
 AliGenPairFlat.cxx:215
 AliGenPairFlat.cxx:216
 AliGenPairFlat.cxx:217
 AliGenPairFlat.cxx:218
 AliGenPairFlat.cxx:219
 AliGenPairFlat.cxx:220
 AliGenPairFlat.cxx:221
 AliGenPairFlat.cxx:222
 AliGenPairFlat.cxx:223
 AliGenPairFlat.cxx:224
 AliGenPairFlat.cxx:225
 AliGenPairFlat.cxx:226
 AliGenPairFlat.cxx:227
 AliGenPairFlat.cxx:228
 AliGenPairFlat.cxx:229
 AliGenPairFlat.cxx:230
 AliGenPairFlat.cxx:231
 AliGenPairFlat.cxx:232
 AliGenPairFlat.cxx:233
 AliGenPairFlat.cxx:234
 AliGenPairFlat.cxx:235
 AliGenPairFlat.cxx:236
 AliGenPairFlat.cxx:237
 AliGenPairFlat.cxx:238
 AliGenPairFlat.cxx:239
 AliGenPairFlat.cxx:240
 AliGenPairFlat.cxx:241
 AliGenPairFlat.cxx:242
 AliGenPairFlat.cxx:243
 AliGenPairFlat.cxx:244
 AliGenPairFlat.cxx:245
 AliGenPairFlat.cxx:246
 AliGenPairFlat.cxx:247
 AliGenPairFlat.cxx:248
 AliGenPairFlat.cxx:249
 AliGenPairFlat.cxx:250
 AliGenPairFlat.cxx:251
 AliGenPairFlat.cxx:252
 AliGenPairFlat.cxx:253
 AliGenPairFlat.cxx:254