Exemplo n.º 1
0
void Config()
{

  cout << "==> Config.C..." << endl;
  
  // Set Random Number seed
  UInt_t at = (UInt_t) gSystem->Now() ;
  UInt_t seed = ((gSystem->GetPid()*111)%at)*137 ;
//  gRandom->SetSeed(seed);
  gRandom->SetSeed(12345);
  printf("MySeed: %d\n",seed) ;
  cout<<"Seed for random number generation= "<<gRandom->GetSeed()<<endl;

  
  
  // libraries required by fluka21

  Bool_t isFluka = kFALSE;
  if (isFluka) {
    gSystem->Load("libGeom");
    cout << "\t* Loading TFluka..." << endl;  
    gSystem->Load("libTFluka");    
    
    cout << "\t* Instantiating TFluka..." << endl;
    new  TFluka("C++ Interface to Fluka", 0/*verbositylevel*/);
  }
  else {
    cout << "\t* Loading Geant3..." << endl;  
    gSystem->Load("libgeant321");
    
    cout << "\t* Instantiating Geant3TGeo..." << endl;
    new     TGeant3TGeo("C++ Interface to Geant3");
  }
  
  IlcRunLoader* rl=0x0;
                                                                                
  cout<<"Config.C: Creating Run Loader ..."<<endl;
  rl = IlcRunLoader::Open("gilc.root",
			    IlcConfig::GetDefaultEventFolderName(),
			    "recreate");
  if (rl == 0x0)
    {
      gIlc->Fatal("Config.C","Can not instatiate the Run Loader");
      return;
    }
  rl->SetCompressionLevel(2);
  rl->SetNumberOfEventsPerFile(1000);
  gIlc->SetRunLoader(rl);
                                                                                
  //
  // Set External decayer
  IlcDecayer *decayer = new IlcDecayerPythia();
                                                                               
  decayer->SetForceDecay(kAll);
  decayer->Init();
  gMC->SetExternalDecayer(decayer);

  //
  //
  //
  // Physics process control

  gMC->SetProcess("DCAY",1);
  gMC->SetProcess("PAIR",1);
  gMC->SetProcess("COMP",1);
  gMC->SetProcess("PHOT",1);
  gMC->SetProcess("PFIS",0);
  gMC->SetProcess("DRAY",0); //AZ 1);
  gMC->SetProcess("ANNI",1);
  gMC->SetProcess("BREM",1);
  gMC->SetProcess("MUNU",1);
  gMC->SetProcess("CKOV",1); 
  gMC->SetProcess("HADR",1);
  gMC->SetProcess("LOSS",2);
  gMC->SetProcess("MULS",1);
  gMC->SetProcess("RAYL",1);
                                                                                
  Float_t cut = 1.e-3;        // 1MeV cut by default
  Float_t tofmax = 1.e10;
                                                                                
  gMC->SetCut("CUTGAM", cut);
  gMC->SetCut("CUTELE", cut);
  gMC->SetCut("CUTNEU", cut);
  gMC->SetCut("CUTHAD", cut);
  gMC->SetCut("CUTMUO", cut);
  gMC->SetCut("BCUTE",  cut);
  gMC->SetCut("BCUTM",  cut);
  gMC->SetCut("DCUTE",  cut);
  gMC->SetCut("DCUTM",  cut);
  gMC->SetCut("PPCUTM", cut);
  gMC->SetCut("TOFMAX", tofmax);

  ((IlcMC*)gMC)->SetTransPar("./gilc.cuts") ;
  //
  //=======================================================================
  // ************* STEERING parameters FOR ILC SIMULATION **************
  // --- Specify event type to be tracked through the ILC setup
  // --- All positions are in cm, angles in degrees, and P and E in GeV
 
    IlcGenBox *gener = new IlcGenBox(5);
    gener->SetMomentumRange(0.5, 5.);
    gener->SetPhiRange(260., 280.);
    gener->SetThetaRange(82.,98.);
    gener->SetPart(kGamma);

    gener->SetOrigin(0, 0, 0);  //vertex position
    gener->SetSigma(0, 0, 0);   //Sigma in (X,Y,Z) (cm) on IP position
    gener->Init() ;
 
  // 
  // Activate this line if you want the vertex smearing to happen
  // track by track
  //
  //  gener->SetVertexSmear(kPerEvent) ;
 


    if (smag == IlcMagF::k2kG) {
        comment = comment.Append(" | L3 field 0.2 T");
    } else if (smag == IlcMagF::k5kG) {
        comment = comment.Append(" | L3 field 0.5 T");
    }
                                                                                
                                                                                
    if (srad == kGluonRadiation)
    {
        comment = comment.Append(" | Gluon Radiation On");
                                                                                
    } else {
        comment = comment.Append(" | Gluon Radiation Off");
    }
                                                                                
    if (sgeo == kHoles)
    {
        comment = comment.Append(" | Holes for PVBAR/RICH");
                                                                                
    } else {
        comment = comment.Append(" | No holes for PVBAR/RICH");
    }
                                                                                
    printf("\n \n Comment: %s \n \n", comment.Data());
                                                                                
                                                                                
// Field (L3 0.4 T)
    //Zero magnetic field
    IlcMagF* field = new IlcMagF("Maps","Maps", 0., 0., IlcMagF::k5kGUniform);
    //    IlcMagF* field = new IlcMagF("Maps","Maps", 2, -1., -1., 10., smag);
    TGeoGlobalMagField::Instance()->SetField(field);

    rl->CdGAFile();
 
  Int_t   iABSO  = 0; 
  Int_t   iCRT   = 0; 
  Int_t   iDIPO  = 0; 
  Int_t   iFMD   = 0; 
  Int_t   iFRAME = 0; 
  Int_t   iHALL  = 0; 
  Int_t   iITS   = 0; 
  Int_t   iMAG   = 0; 
  Int_t   iMUON  = 0; 
  Int_t   iPVBAR  = 1; 
  Int_t   iPIPE  = 0; 
  Int_t   iPMD   = 0; 
  Int_t   iRICH  = 0; 
  Int_t   iSHIL  = 0; 
  Int_t   iSTART = 0; 
  Int_t   iTOF   = 0; 
  Int_t   iTPC   = 0;
  Int_t   iTRD   = 0; 
  Int_t   iZDC   = 0; 
  Int_t   iEMCAL = 0; 
  Int_t   iVZERO = 0;
 
  cout << "\t* Creating the detectors ..." << endl;
  //=================== Ilc BODY parameters =============================
    //=================== Ilc BODY parameters =============================
    IlcBODY *BODY = new IlcBODY("BODY", "Ilc envelop");
                                                                                
                                                                                
    if (iMAG)
    {
        //=================== MAG parameters ============================
        // --- Start with Magnet since detector layouts may be depending ---
        // --- on the selected Magnet dimensions ---
        IlcMAG *MAG = new IlcMAG("MAG", "Magnet");
    }
                                                                                
                                                                                
    if (iABSO)
    {
        //=================== ABSO parameters ============================
        IlcABSO *ABSO = new IlcABSOv0("ABSO", "Muon Absorber");
    }
                                                                                
    if (iDIPO)
    {
        //=================== DIPO parameters ============================
                                                                                
        IlcDIPO *DIPO = new IlcDIPOv2("DIPO", "Dipole version 2");
    }
                                                                                
    if (iHALL)
    {
        //=================== HALL parameters ============================
                                                                                
        IlcHALL *HALL = new IlcHALL("HALL", "Ilc Hall");
    }
                                                                                
                                                                                
    if (iFRAME)
    {
        //=================== FRAME parameters ============================
                                                                                
        IlcFRAMEv2 *FRAME = new IlcFRAMEv2("FRAME", "Space Frame");
        if (sgeo == kHoles) {
            FRAME->SetHoles(1);
        } else {
            FRAME->SetHoles(0);
        }
    }
                                                                                
    if (iSHIL)
    {
        //=================== SHIL parameters ============================
                                                                                
        IlcSHIL *SHIL = new IlcSHILv2("SHIL", "Shielding Version 2");
    }
                                                                                
                                                                                
    if (iPIPE)
    {
        //=================== PIPE parameters ============================
                                                                                
        IlcPIPE *PIPE = new IlcPIPEv0("PIPE", "Beam Pipe");
    }
                                                                                
    if(iITS) {
                                                                                
    //=================== ITS parameters ============================
    //
    // As the innermost detector in ILC, the Inner Tracking System "impacts" on
    // almost all other detectors. This involves the fact that the ITS geometry
    // still has several options to be followed in parallel in order to determine
    // the best set-up which minimizes the induced background. All the geometries
    // available to date are described in the following. Read carefully the comments
    // and use the default version (the only one uncommented) unless you are making
    // comparisons and you know what you are doing. In this case just uncomment the
    // ITS geometry you want to use and run Ilcroot.
    //
    // Detailed geometries:
    //
    //
    //IlcITS *ITS  = new IlcITSv5symm("ITS","Updated ITS TDR detailed version with symmetric services");
    //
    //IlcITS *ITS  = new IlcITSv5asymm("ITS","Updates ITS TDR detailed version with asymmetric services");
    //
        IlcITSvPPRasymmFMD *ITS  = new IlcITSvPPRasymmFMD("ITS","New ITS PPR detailed version with asymmetric services");
        ITS->SetMinorVersion(2);  // don't touch this parameter if you're not an ITS developer
        ITS->SetReadDet(kTRUE);   // don't touch this parameter if you're not an ITS developer
    //    ITS->SetWriteDet("$ILC_ROOT/ITS/ITSgeometry_vPPRasymm2.det");  // don't touch this parameter if you're not an ITS developer
        ITS->SetThicknessDet1(200.);   // detector thickness on layer 1 must be in the range [100,300]
        ITS->SetThicknessDet2(200.);   // detector thickness on layer 2 must be in the range [100,300]
        ITS->SetThicknessChip1(200.);  // chip thickness on layer 1 must be in the range [150,300]
        ITS->SetThicknessChip2(200.);  // chip thickness on layer 2 must be in the range [150,300]
        ITS->SetRails(0);            // 1 --> rails in ; 0 --> rails out
        ITS->SetCoolingFluid(1);   // 1 --> water ; 0 --> freon
                                                                                
    // Coarse geometries (warning: no hits are produced with these coarse geometries and they unuseful
    // for reconstruction !):
    //
    //
    //IlcITSvPPRcoarseasymm *ITS  = new IlcITSvPPRcoarseasymm("ITS","New ITS PPR coarse version with asymmetric services");
    //ITS->SetRails(0);                // 1 --> rails in ; 0 --> rails out
    //ITS->SetSupportMaterial(0);      // 0 --> Copper ; 1 --> Aluminum ; 2 --> Carbon
    //
    //IlcITS *ITS  = new IlcITSvPPRcoarsesymm("ITS","New ITS PPR coarse version with symmetric services");
    //ITS->SetRails(0);                // 1 --> rails in ; 0 --> rails out
    //ITS->SetSupportMaterial(0);      // 0 --> Copper ; 1 --> Aluminum ; 2 --> Carbon
    //
    //
    //
    // Geant3 <-> EUCLID conversion
    // ============================
    //
    // SetEUCLID is a flag to output (=1) or not to output (=0) both geometry and
    // media to two ASCII files (called by default ITSgeometry.euc and
    // ITSgeometry.tme) in a format understandable to the CAD system EUCLID.
    // The default (=0) means that you dont want to use this facility.
    //
        ITS->SetEUCLID(0);
    }
                                                                                
    if (iTPC)
    {
        //============================ TPC parameters ================================
//        IlcTPC *TPC = new IlcTPCv0("TPC", "Default");
        IlcTPC *TPC = new IlcTPCv2("TPC", "Default");
    }
                                                                                
                                                                                
    if (iTOF) {
        //=================== TOF parameters ============================
        IlcTOF *TOF = new IlcTOFv4T0("TOF", "normal TOF");
    }
                                                                                
                                                                                
    if (iRICH)
    {
        //=================== RICH parameters ===========================
        IlcRICH *RICH = new IlcRICHv1("RICH", "normal RICH");
                                                                                
    }
                                                                                
                                                                                
    if (iZDC)
    {
        //=================== ZDC parameters ============================
                                                                                
        IlcZDC *ZDC = new IlcZDCv2("ZDC", "normal ZDC");
    }
                                                                                
    if (iTRD)
    {
        //=================== TRD parameters ============================
                                                                                
        IlcTRD *TRD = new IlcTRDv1("TRD", "TRD slow simulator");
                                                                                
        // Select the gas mixture (0: 97% Xe + 3% isobutane, 1: 90% Xe + 10% CO2)
        TRD->SetGasMix(1);
        if (sgeo == kHoles) {
            // With hole in front of PVBAR
            TRD->SetPVBARhole();
            // With hole in front of RICH
            TRD->SetRICHhole();
        }
            // Switch on TR
            IlcTRDsim *TRDsim = TRD->CreateTR();
    }
                                                                                
    if (iFMD)
    {
        //=================== FMD parameters ============================
        IlcFMD *FMD = new IlcFMDv1("FMD", "normal FMD");
   }
                                                                                
    if (iMUON)
    {
        //=================== MUON parameters ===========================
                                                                                
        IlcMUON *MUON = new IlcMUONv1("MUON", "default");
    }
    //=================== PVBAR parameters ===========================
                                                                                
    if (iPVBAR)
    {
       IlcPVBAR *PVBAR = new IlcPVBARv1("PVBAR", "ORKA");
//         IlcPVBAR *PVBAR = new IlcPVBARv1("PVBAR", "noCPV");
    }
                                                                                
                                                                                
    if (iPMD)
    {
        //=================== PMD parameters ============================
        IlcPMD *PMD = new IlcPMDv1("PMD", "normal PMD");
    }
                                                                                
    if (iSTART)
    {
        //=================== START parameters ============================
        IlcSTART *START = new IlcSTARTv1("START", "START Detector");
    }
                                                                                
    if (iEMCAL)
    {
        //=================== EMCAL parameters ============================
        IlcEMCAL *EMCAL = new IlcEMCALv2("EMCAL", "EMCAL_COMPLETEV1");
    }
                                                                                
     if (iCRT)
    {
        //=================== CRT parameters ============================
        IlcCRT *CRT = new IlcCRTv0("CRT", "normal ACORDE");
    }
                                                                                
     if (iVZERO)
    {
        //=================== CRT parameters ============================
        IlcVZERO *VZERO = new IlcVZEROv3("VZERO", "normal VZERO");
    }
                                                                                
                                                                                
}
Exemplo n.º 2
0
IlcGenerator* genGunConfig()
{
  cout << "Running genGunConfig.C ... " << endl;

  //=======================================================================
  // Event generator
  //=======================================================================

  // The cocktail itself

  IlcGenCocktail *gener = new IlcGenCocktail();
  gener->SetPhiRange(0, 360);
  // Set pseudorapidity range from -8 to 8.
  Float_t thmin = EtaToTheta(8);   // theta min. <---> eta max
  Float_t thmax = EtaToTheta(-8);  // theta max. <---> eta min 
  gener->SetThetaRange(thmin,thmax);
  gener->SetOrigin(0, 0, 0);  //vertex position
  gener->SetSigma(0, 0, 0);   //Sigma in (X,Y,Z) (cm) on IP position


  // Particle guns for the barrel part (taken from RichConfig)

  IlcGenFixed *pG1=new IlcGenFixed(1);
  pG1->SetPart(kProton);
  pG1->SetMomentum(2.5);
  pG1->SetTheta(109.5-3);
  pG1->SetPhi(10);
  gener->AddGenerator(pG1,"g1",1);
  
  IlcGenFixed *pG2=new IlcGenFixed(1);
  pG2->SetPart(kPiPlus);
  pG2->SetMomentum(1.0);
  pG2->SetTheta( 90.0-3);
  pG2->SetPhi(10);
  gener->AddGenerator(pG2,"g2",1);

  IlcGenFixed *pG3=new IlcGenFixed(1);
  pG3->SetPart(kPiMinus);
  pG3->SetMomentum(1.5);
  pG3->SetTheta(109.5-3);
  pG3->SetPhi(30);
  gener->AddGenerator(pG3,"g3",1);
  
  IlcGenFixed *pG4=new IlcGenFixed(1);
  pG4->SetPart(kKPlus);
  pG4->SetMomentum(0.7);
  pG4->SetTheta( 90.0-3);
  pG4->SetPhi(30);
  gener->AddGenerator(pG4,"g4",1);
  
  IlcGenFixed *pG5=new IlcGenFixed(1);
  pG5->SetPart(kKMinus);
  pG5->SetMomentum(1.0);
  pG5->SetTheta( 70.0-3);
  pG5->SetPhi(30);
  gener->AddGenerator(pG5,"g5",1);
  
  IlcGenFixed *pG6=new IlcGenFixed(1);
  pG6->SetPart(kProtonBar);
  pG6->SetMomentum(2.5);
  pG6->SetTheta( 90.0-3);
  pG6->SetPhi(50);
  gener->AddGenerator(pG6,"g6",1);
  
  IlcGenFixed *pG7=new IlcGenFixed(1);
  pG7->SetPart(kPiMinus);
  pG7->SetMomentum(0.7);
  pG7->SetTheta( 70.0-3);
  pG7->SetPhi(50);
  gener->AddGenerator(pG7,"g7",1);

  // Electrons for TRD

  IlcGenFixed *pG8=new IlcGenFixed(1);
  pG8->SetPart(kElectron);
  pG8->SetMomentum(1.2);
  pG8->SetTheta( 95.0);
  pG8->SetPhi(190);
  gener->AddGenerator(pG8,"g8",1);

  IlcGenFixed *pG9=new IlcGenFixed(1);
  pG9->SetPart(kPositron);
  pG9->SetMomentum(1.2);
  pG9->SetTheta( 85.0);
  pG9->SetPhi(190);
  gener->AddGenerator(pG9,"g9",1);

  // PHOS

  IlcGenBox *gphos = new IlcGenBox(1);
  gphos->SetMomentumRange(10,11.);
  gphos->SetPhiRange(270.5,270.7);
  gphos->SetThetaRange(90.5,90.7);
  gphos->SetPart(kGamma);
  gener->AddGenerator(gphos,"GENBOX GAMMA for PHOS",1);

  // EMCAL

  IlcGenBox *gemcal = new IlcGenBox(1);
  gemcal->SetMomentumRange(10,11.);
  gemcal->SetPhiRange(90.5,199.5);
  gemcal->SetThetaRange(90.5,90.7);
  gemcal->SetPart(kGamma);
  gener->AddGenerator(gemcal,"GENBOX GAMMA for EMCAL",1);

  // MUON
  IlcGenBox * gmuon1 = new IlcGenBox(1);
  gmuon1->SetMomentumRange(20.,20.1);
  gmuon1->SetPhiRange(0., 360.);         
  gmuon1->SetThetaRange(171.000,178.001);
  gmuon1->SetPart(kMuonMinus);           // Muons
  gener->AddGenerator(gmuon1,"GENBOX MUON1",1);

  IlcGenBox * gmuon2 = new IlcGenBox(1);
  gmuon2->SetMomentumRange(20.,20.1);
  gmuon2->SetPhiRange(0., 360.);         
  gmuon2->SetThetaRange(171.000,178.001);
  gmuon2->SetPart(kMuonPlus);           // Muons
  gener->AddGenerator(gmuon2,"GENBOX MUON1",1);

  //TOF
  IlcGenFixed *gtof=new IlcGenFixed(1);
  gtof->SetPart(kProton);
  gtof->SetMomentum(2.5);
  gtof->SetTheta(95);
  gtof->SetPhi(340);
  gener->AddGenerator(gtof,"Proton for TOF",1);

  //FMD1
  IlcGenFixed *gfmd1=new IlcGenFixed(1);
  gfmd1->SetPart(kGamma);
  gfmd1->SetMomentum(25);
  gfmd1->SetTheta(1.8);
  gfmd1->SetPhi(10);
  gener->AddGenerator(gfmd1,"Gamma for FMD1",1);
  
  //FMD2i
  IlcGenFixed *gfmd2i=new IlcGenFixed(1);
  gfmd2i->SetPart(kPiPlus);
  gfmd2i->SetMomentum(1.5);
  gfmd2i->SetTheta(7.3);
  gfmd2i->SetPhi(20);
  gener->AddGenerator(gfmd2i,"Pi+ for FMD2i",1);
  
  //FMD2o
  IlcGenFixed *gfmd2o=new IlcGenFixed(1);
  gfmd2o->SetPart(kPiMinus);
  gfmd2o->SetMomentum(1.5);
  gfmd2o->SetTheta(16.1);
  gfmd2o->SetPhi(30);
  gener->AddGenerator(gfmd2o,"Pi- for FMD2o",1);
  
  //FMD3o
  IlcGenFixed *gfmd3o=new IlcGenFixed(1);
  gfmd3o->SetPart(kPiPlus);
  gfmd3o->SetMomentum(1.5);
  gfmd3o->SetTheta(163.9);
  gfmd3o->SetPhi(40);
  gener->AddGenerator(gfmd3o,"Pi+ for FMD3o",1);
  
  //FMD3i
  IlcGenFixed *gfmd3i=new IlcGenFixed(1);
  gfmd3i->SetPart(kPiMinus);
  gfmd3i->SetMomentum(1.5);
  gfmd3i->SetTheta(170.5);
  gfmd3i->SetPhi(50);
  gener->AddGenerator(gfmd3i,"Pi- for FMD3i",1);
  
  //VZERO C
  IlcGenFixed *gv0c=new IlcGenFixed(1);
  gv0c->SetPart(kPiPlus);
  gv0c->SetMomentum(1.5);
  gv0c->SetTheta(170);
  gv0c->SetPhi(50);
  gener->AddGenerator(gv0c,"Pi+ for V0C",1);
  
  //VZERO A
  IlcGenFixed *gv0a=new IlcGenFixed(1);
  gv0a->SetPart(kPiMinus);
  gv0a->SetMomentum(1.5);
  gv0a->SetTheta(1.5);
  gv0a->SetPhi(70);
  gener->AddGenerator(gv0a,"Pi- for V0A",1);


  //PMD
  IlcGenFixed *gpmd=new IlcGenFixed(1);
  gpmd->SetPart(kGamma);
  gpmd->SetMomentum(2);
  gpmd->SetTheta(12.6);
  gpmd->SetPhi(60);
  gener->AddGenerator(gpmd,"Gamma for PMD",1);

  //ZDC
  IlcGenFixed *gzdc1=new IlcGenFixed(1);
  gzdc1->SetPart(kProton);
  gzdc1->SetMomentum(700);
  gzdc1->SetTheta(0.6);
  gzdc1->SetPhi(60);
  gener->AddGenerator(gzdc1,"Proton for ZDC",1);

  IlcGenFixed *gzdc2=new IlcGenFixed(1);
  gzdc2->SetPart(kNeutron);
  gzdc2->SetMomentum(500);
  gzdc2->SetTheta(0.6);
  gzdc2->SetPhi(60);
  gener->AddGenerator(gzdc2,"Neutron for ZDC",1);

  //T0
  IlcGenFixed *gt0=new IlcGenFixed(1);
  gt0->SetPart(kPiPlus);
  gt0->SetMomentum(2);
  gt0->SetTheta(5.1);
  gt0->SetPhi(60);
  gener->AddGenerator(gt0,"Pi+ for T0",1);

  IlcGenFixed *gt01=new IlcGenFixed(1);
  gt01->SetPart(kPiMinus);
  gt01->SetMomentum(2);
  gt01->SetTheta(5.1);
  gt01->SetPhi(60);
  gener->AddGenerator(gt01,"Pi- for T0",1);


  //ACORDE
  IlcGenFixed *gacorde=new IlcGenFixed(1);
  gacorde->SetPart(kMuonPlus);
  gacorde->SetMomentum(20);
  gacorde->SetTheta(90.);
  gacorde->SetPhi(90);
  gener->AddGenerator(gacorde,"Muon+ for ACORDE",1);

  IlcGenFixed *gacorde1=new IlcGenFixed(1);
  gacorde1->SetPart(kMuonMinus);
  gacorde1->SetMomentum(20);
  gacorde1->SetTheta(90.);
  gacorde1->SetPhi(90);
  gener->AddGenerator(gacorde1,"Muon- for ACORDE",1);

  gener->Init();
  
  return gener;
  
  cout << "Running genGunConfig.C finished ... " << endl;
}
Exemplo n.º 3
0
void GeneratorFactory(PprRun_t srun) {
  
  IlcGenerator * gGener = 0x0;
  typedef enum { kNoSmear, kPerEvent, kPerTrack }  VertexSmear_t;
  
  comment = comment.Append("*** GENERATOR: ");
  
  switch (srun) {
    
    
      //Particle Type specified  by user  
      
      /****************************************************
       *     // Particles type
       *     //  PDG    Name
       *     //  22     // photon
       *     //  -11    // positron
       *     //  11     // electron
       *     //  12     // neutrino e
       *     //  -13    // muon +
       *     //  13     // muon -
       *     //  111    // pi0
       *     //  211    // pi+
       *     //  -211   // pi-
       *     //  130    // Kaon Long
       *     //  321    // Kaon +
       *     //  -321   // Kaon -
       *     //  2112   // Neutron
       *     //  2212   // Proton
       *     //  -2212  // Anti Proton
       *     //  310    // Kaon Short
       ****************************************************/
      
      
      case kGenFixed:
	//*******************************************************
	// Example of fixed particle gun                        *
	//*******************************************************
	
	//Fixed momentum, phi, theta and vertex position specified by the user:
	//SetMomentum(momentum)
	//SetPhi(phi)
	//SetTheta(theta)
	
	//Particle Type specified  by user:
	//SetPart(ipart)
	
	{
	  Int_t nParticles=1;
	  IlcGenFixed *gener = new IlcGenFixed(nParticles);
	  Int_t PDG=321;     //set the PDG code of particle
	  gener->SetPart(PDG);
	  Double_t pmom = 1.e-5;
	  gener->SetMomentum(pmom);
	  Double_t phi = 90.;
	  gener->SetPhi(phi);
	  Double_t theta = 2.;
	  gener->SetTheta(theta);
	  const TParticlePDG *ap = TDatabasePDG::Instance()->GetParticle(PDG);
	  char *name = ap->GetName();
	  
	  comment = comment.Append(Form ("IlcGenFixed for %d %s (%f GeV/c) with phi %f and theta %f\n", nParticles,name,pmom,phi,theta));
	  
	  gGener=gener;
	  
	  // gGener->SetOrigin(0., 0., -20.);    // vertex position
	  // gGener->SetSigma(0, 0, 2.);   // Sigma in (X,Y,Z) (cm) on IP position
	  // gGener->SetCutVertexZ(1.);     // Truncate at 1 sigma
	  // gGener->SetVertexSmear(kPerTrack); 
	  
	}
	break;  
	
	
    case kGenBox:
      //*******************************************************
      // Example moving  particle gun                        *
      //*******************************************************
      
      //Random generation of  momentum (transverse momentum), phi and theta in user specified range.
      //Gaussian smearing of vertex either per event or per track.
      {      
	Int_t nParticles=1;
	IlcGenBox *gener = new IlcGenBox(nParticles);
	Int_t PDG=321;     //set the PDG code of particle
	gener->SetPart(PDG);
	Double_t pmin = 0.;
	Double_t pmax = 1.e-7; 
	gener->SetMomentumRange(pmin,pmax);
	Double_t phimin = 0.0;
	Double_t phimax = 360.0; 
	gener->SetPhiRange(phimin,phimax);
	Float_t thmin = 0.;
	Float_t thmax = 3.;
	gener->SetThetaRange(thmin,thmax);
	const TParticlePDG *ap = TDatabasePDG::Instance()->GetParticle(PDG);
	char *name = ap->GetName();
	
	comment = comment.Append(Form ("IlcGenBox for %d %s (%f GeV/c-%f GeV/c) within phi %f-%f and theta %f-%f\n", nParticles,name,pmin,pmax,phimin,phimax,thmin,thmax));
	
	gGener=gener;

	// gGener->SetOrigin(0., 0., -10.);    // vertex position
	  // gGener->SetSigma(0, 0, 2.);   // Sigma in (X,Y,Z) (cm) on IP position
	  // gGener->SetCutVertexZ(1.);     // Truncate at 1 sigma
	  // gGener->SetVertexSmear(kPerTrack); 
	  
	}
	break;  
	
	
	
      case kCocktail:
	//*******************************************************
	// Example of Cocktail of particles                     *
	//*******************************************************      
	{
	  comment = comment.Append(": Cocktail of one muon and one pion from GenFixed generator\n");
	  
	  IlcGenCocktail *gener  = new IlcGenCocktail();
	  // gener->SetOrigin(0., 0., -10.);    // vertex position
	  // gener->SetSigma(0, 0, 1.);   // Sigma in (X,Y,Z) (cm) on IP position
	  // gener->SetCutVertexZ(1.);     // Truncate at 1 sigma
	  // gener->SetVertexSmear(kPerTrack); 
	  
	  IlcGenFixed *muon = new IlcGenFixed(1);
	  muon->SetPart(-13);
	  muon->SetMomentum(2.);
	  muon->SetPhi(90.);
	  muon->SetTheta(80.);
	  
	  IlcGenFixed *pion = new IlcGenFixed(1);
	  pion->SetPart(211);
	  pion->SetMomentum(2.);
	  pion->SetPhi(35.);
	  pion->SetTheta(85.);
	  
	  gener->AddGenerator(muon,"muon",1);
	  gener->AddGenerator(pion,"pion",1);
	  
	  
	  gGener=gener;
	  
	}
	break; 
	
      default: break;
  }
  
  gGener->Init();
  
}