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

//------------------------------------------------------------------------
//        Generic Lego generator code
//    Uses geantino rays to check the material distributions and detector's
//    geometry
//    Author: A.Morsch
//------------------------------------------------------------------------

#include "AliLegoGenerator.h"
#include "AliRun.h"
#include "AliMC.h"
#include "AliLog.h"

ClassImp(AliLegoGenerator)

//_______________________________________________________________________
AliLegoGenerator::AliLegoGenerator():
  fRadMin(0),
  fRadMax(0),
  fZMax(0),
  fNCoor1(0),
  fNCoor2(0),
  fCoor1Min(0),
  fCoor1Max(0),
  fCoor2Min(0),
  fCoor2Max(0),
  fCoor1Bin(-1),
  fCoor2Bin(-1),
  fCurCoor1(0),
  fCurCoor2(0)
{
  //
  // Default Constructor
  //
  SetName("Lego");
}

//_______________________________________________________________________
AliLegoGenerator::AliLegoGenerator(Int_t nc1, Float_t c1min,
                                   Float_t c1max, Int_t nc2, 
                                   Float_t c2min, Float_t c2max,
                                   Float_t rmin, Float_t rmax, Float_t zmax):
  AliGenerator(0), 
  fRadMin(rmin),
  fRadMax(rmax),
  fZMax(zmax),
  fNCoor1(nc1),
  fNCoor2(nc2),
  fCoor1Min(0),
  fCoor1Max(0),
  fCoor2Min(0),
  fCoor2Max(0),
  fCoor1Bin(nc1),
  fCoor2Bin(-1),
  fCurCoor1(0),
  fCurCoor2(0)
{
  //
  // Standard generator for Lego rays
  //
  SetName("Lego");
  SetCoor1Range(nc1, c1min, c1max);
  SetCoor2Range(nc2, c2min, c2max);
}

//_______________________________________________________________________
void AliLegoGenerator::Generate()
{
  // Create a geantino with kinematics corresponding to the current bins
  // Here: Coor1 =  theta 
  //       Coor2 =  phi.
  
  //
  // Rootinos are 0
   const Int_t kMpart = 0;
   Float_t orig[3], pmom[3];
   Float_t t, cost, sint, cosp, sinp;
   if (fCoor1Bin==-1) fCoor1Bin=fNCoor1;
   // Prepare for next step
   if(fCoor1Bin>=fNCoor1-1)
     if(fCoor2Bin>=fNCoor2-1) {
       AliWarning("End of Lego Generation");
       return;
     } else { 
       fCoor2Bin++;
       AliDebug(1, Form("Generating rays in phi bin:%d",fCoor2Bin));
       fCoor1Bin=0;
     } else fCoor1Bin++;

   fCurCoor1 = (fCoor1Min+(fCoor1Bin+0.5)*(fCoor1Max-fCoor1Min)/fNCoor1);
   fCurCoor2 = (fCoor2Min+(fCoor2Bin+0.5)*(fCoor2Max-fCoor2Min)/fNCoor2);
   cost      = TMath::Cos(fCurCoor1 * TMath::Pi()/180.);
   sint      = TMath::Sin(fCurCoor1 * TMath::Pi()/180.);
   cosp      = TMath::Cos(fCurCoor2 * TMath::Pi()/180.);
   sinp      = TMath::Sin(fCurCoor2 * TMath::Pi()/180.);
   
   pmom[0] = cosp*sint;
   pmom[1] = sinp*sint;
   pmom[2] = cost;
   
   // --- Where to start
   orig[0] = orig[1] = orig[2] = 0;
   Float_t dalicz = 3000;
   if (fRadMin > 0) {
       t = PropagateCylinder(orig,pmom,fRadMin,dalicz);
       orig[0] = pmom[0]*t;
       orig[1] = pmom[1]*t;
       orig[2] = pmom[2]*t;
       if (TMath::Abs(orig[2]) > fZMax) return;
   }
   
   Float_t polar[3]={0.,0.,0.};
   Int_t ntr;
   gAlice->GetMCApp()->PushTrack(1, -1, kMpart, pmom, orig, polar, 0, kPPrimary, ntr);
   
}

//_______________________________________________________________________
Float_t AliLegoGenerator::PropagateCylinder(Float_t *x, Float_t *v, Float_t r, 
                                            Float_t z)
{
  //
  // Propagate to cylinder from inside
  //
   Double_t hnorm, sz, t, t1, t2, t3, sr;
   Double_t d[3];
   const Float_t kSmall  = 1e-8;
   const Float_t kSmall2 = kSmall*kSmall;

// ---> Find intesection with Z planes
   d[0]  = v[0];
   d[1]  = v[1];
   d[2]  = v[2];
   hnorm = TMath::Sqrt(1/(d[0]*d[0]+d[1]*d[1]+d[2]*d[2]));
   d[0] *= hnorm;
   d[1] *= hnorm;
   d[2] *= hnorm;
   if (d[2] > kSmall)       sz = (z-x[2])/d[2];
   else if (d[2] < -kSmall) sz = -(z+x[2])/d[2];
   else                     sz = 1.e10;  // ---> Direction parallel to X-Y, no intersection

// ---> Intersection with cylinders
//      Intersection point (x,y,z)
//      (x,y,z) is on track :    x=X(1)+t*D(1)
//                               y=X(2)+t*D(2)
//                               z=X(3)+t*D(3)
//      (x,y,z) is on cylinder : x**2 + y**2 = R**2
//
//      (D(1)**2+D(2)**2)*t**2
//      +2.*(X(1)*D(1)+X(2)*D(2))*t
//      +X(1)**2+X(2)**2-R**2=0
// ---> Solve second degree equation
   t1 = d[0]*d[0] + d[1]*d[1];
   if (t1 <= kSmall2) {
      t = sz;  // ---> Track parallel to the z-axis, take distance to planes
   } else {
      t2 = x[0]*d[0] + x[1]*d[1];
      t3 = x[0]*x[0] + x[1]*x[1];
      // ---> It should be positive, but there may be numerical problems
      sr = (-t2 +TMath::Sqrt(TMath::Max(t2*t2-(t3-r*r)*t1,0.)))/t1;
      // ---> Find minimum distance between planes and cylinder
      t  = TMath::Min(sz,sr);
   }
   return t;
}


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