AliGenerator(),
fParamMI(kFALSE),
fParamACORDE(kFALSE),
+fParamDataTPC(kTRUE),
fYOrigin(600.),
fMaxAngleWRTVertical(-99.),
fBkG(0.),
fSSDinner(kFALSE),
fSSDouter(kFALSE),
fACORDE(kFALSE),
-fACORDE4ITS(kFALSE)
+fACORDE4ITS(kFALSE),
+fBottomScintillator(kFALSE)
{
//
// Default constructor
ptot = (Double_t)dNdpACORDE->GetRandom();
delete dNdpACORDE;
dNdpACORDE = 0;
+ } else if(fParamDataTPC) { // extracted from cosmics in TPC (Summer 08)
+ // sample total momentum only once (to speed up)
+ TF1 *dNdpTPC = new TF1("dNdpTPC","x/(1.+(x/3.)*(x/3.))^1.",fPMin,fPMax);
+ ptot = (Double_t)dNdpTPC->GetRandom();
+ delete dNdpTPC;
+ dNdpTPC = 0;
}
while(1) {
}
ptot=TMath::Sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]);
pt=TMath::Sqrt(p[0]*p[0]+p[1]*p[1]);
- } else if(fParamACORDE) { // extracted from AliGenACORDE events
+ } else if(fParamACORDE || fParamDataTPC) {
Float_t theta,phi;
while(1) {
theta = gRandom->Gaus(0.5*TMath::Pi(),0.42);
p[1] = pt*TMath::Sin(phi);
p[2] = ptot*TMath::Cos(theta);
} else {
- AliFatal("Parametrization not set: use SetParamMI or SetParamACORDE");
+ AliFatal("Parametrization not set: use SetParamDataTPC, SetParamMI, or SetParamACORDE");
}
// acceptance trigger
if(IntersectCylinder(rtrigger,ztrigger,ipart,origin,p)) {
- if(!fACORDE) {
- break;
- } else {
+ if(fACORDE && !fBottomScintillator) {
if(IntersectACORDE(ipart,origin,p)) break;
+ } else if(!fACORDE && fBottomScintillator) {
+ if(IntersectBottomScintillator(ipart,origin,p)) break;
+ } else if(fACORDE && fBottomScintillator) {
+ if(IntersectACORDE(ipart,origin,p) &&
+ IntersectBottomScintillator(ipart,origin,p)) break;
+ } else { // !fACORDE && !fBottomScintillator
+ break;
}
}
//
//
if(TestBit(kPtRange))
AliFatal("You cannot set the pt range for this generator! Only momentum range");
- if(fPMin<8.) {
- fPMin=8.;
+ Double_t pmin=8.; // fParamACORDE
+ if(fParamDataTPC) pmin=0.5;
+ if(fPMin<pmin) {
+ fPMin=pmin;
if(TestBit(kMomentumRange))
- AliWarning("Minimum momentum cannot be < 8 GeV/c");
+ AliWarning(Form("Minimum momentum cannot be < %f GeV/c",pmin));
}
if(fMaxAngleWRTVertical<0.)
AliFatal("You must use SetMaxAngleWRTVertical() instead of SetThetaRange(), SetPhiRange()");
//
Float_t en = TMath::Sqrt(0.105*0.105+p[0]*p[0]+p[1]*p[1]+p[2]*p[2]);
- TParticle part(pdg,0,0,0,0,0,p[0],p[1],p[2],en,o[0],o[1],o[2],0);
+ TParticle part(pdg,0,0,0,0,0,-p[0],-p[1],-p[2],en,o[0],o[1],o[2],0);
AliESDtrack track(&part);
- Float_t rACORDE=800.0,xACORDE=750.0,zACORDE=500.0;
+ Float_t rACORDE=800.0,xACORDE=750.0/*250.0*/,zACORDE=500.0;
if(fACORDE4ITS) { xACORDE=100.0; zACORDE=100.0; }
- Double_t xyz[3];
- track.GetXYZAt(rACORDE,fBkG,xyz);
+ Double_t planepoint[3]={0.,rACORDE,0.};
+ Double_t planenorm[3]={0.,1.,0.};
+
+ if(!track.Intersect(planepoint,planenorm,fBkG)) return kFALSE;
+
+ Double_t xyz[3]={planepoint[0],planepoint[1],planepoint[2]};
+ //printf("XYZ = %f %f %f\n",xyz[0],xyz[1],xyz[2]);
// check global x
if(TMath::Abs(xyz[0]) > xACORDE) return kFALSE;
return kTRUE;
}
//-----------------------------------------------------------------------------
+Bool_t AliGenCosmicsParam::IntersectBottomScintillator(Int_t pdg,
+ Float_t o[3],Float_t p[3]) const
+{
+ //
+ // Intersection between muon and ACORDE (very rough)
+ //
+
+ Float_t en = TMath::Sqrt(0.105*0.105+p[0]*p[0]+p[1]*p[1]+p[2]*p[2]);
+ TParticle part(pdg,0,0,0,0,0,-p[0],-p[1],-p[2],en,o[0],o[1],o[2],0);
+ AliESDtrack track(&part);
+
+ Double_t xSc=40.,ySc=-350.,zSc=40.;
+
+ Double_t planepoint[3]={0.,ySc,0.};
+ Double_t planenorm[3]={0.,1.,0.};
+
+ if(!track.Intersect(planepoint,planenorm,fBkG)) return kFALSE;
+
+ Double_t xyz[3]={planepoint[0],planepoint[1],planepoint[2]};
+ //printf("XYZ = %f %f %f\n",xyz[0],xyz[1],xyz[2]);
+
+ // check global x
+ if(TMath::Abs(xyz[0]) > xSc) return kFALSE;
+ // check global z
+ if(TMath::Abs(xyz[2]) > zSc) return kFALSE;
+
+ return kTRUE;
+}
+//-----------------------------------------------------------------------------