This commit was generated by cvs2svn to compensate for changes in r15989,
authorhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 29 Nov 2006 17:46:34 +0000 (17:46 +0000)
committerhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 29 Nov 2006 17:46:34 +0000 (17:46 +0000)
which included commits to RCS files with non-trunk default branches.

21 files changed:
ACORDE/ACORDELinkDef.h [new file with mode: 0644]
ACORDE/AliACORDE.cxx [new file with mode: 0644]
ACORDE/AliACORDE.h [new file with mode: 0644]
ACORDE/AliACORDEConstants.cxx [new file with mode: 0644]
ACORDE/AliACORDEConstants.h [new file with mode: 0644]
ACORDE/AliACORDEModule.cxx [new file with mode: 0644]
ACORDE/AliACORDEModule.h [new file with mode: 0644]
ACORDE/AliACORDEdigit.cxx [new file with mode: 0644]
ACORDE/AliACORDEdigit.h [new file with mode: 0644]
ACORDE/AliACORDEhit.cxx [new file with mode: 0644]
ACORDE/AliACORDEhit.h [new file with mode: 0644]
ACORDE/AliACORDEv0.cxx [new file with mode: 0644]
ACORDE/AliACORDEv0.h [new file with mode: 0644]
ACORDE/AliACORDEv1.cxx [new file with mode: 0644]
ACORDE/AliACORDEv1.h [new file with mode: 0644]
ACORDE/AliGenACORDE.cxx [new file with mode: 0644]
ACORDE/AliGenACORDE.h [new file with mode: 0644]
ACORDE/Config.C [new file with mode: 0644]
ACORDE/DrawACORDE.C [new file with mode: 0644]
ACORDE/ViewACORDE.C [new file with mode: 0644]
ACORDE/libACORDE.pkg [new file with mode: 0644]

diff --git a/ACORDE/ACORDELinkDef.h b/ACORDE/ACORDELinkDef.h
new file mode 100644 (file)
index 0000000..20b143c
--- /dev/null
@@ -0,0 +1,21 @@
+#ifdef __CINT__
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+#pragma link off all globals;
+#pragma link off all classes;
+#pragma link off all functions;
+
+#pragma link C++ enum   ECRMode;
+#pragma link C++ class  AliACORDE+;
+#pragma link C++ class  AliACORDEConstants+;
+#pragma link C++ class  AliACORDEv0+;
+#pragma link C++ class  AliACORDEdigit+;
+#pragma link C++ class  AliACORDEhit+;
+#pragma link C++ class  AliGenACORDE+;
+#pragma link C++ class  AliACORDEv1+;
+#pragma link C++ class  AliACORDEModule+;
+
+#endif
diff --git a/ACORDE/AliACORDE.cxx b/ACORDE/AliACORDE.cxx
new file mode 100644 (file)
index 0000000..717f450
--- /dev/null
@@ -0,0 +1,219 @@
+/**************************************************************************
+ * 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$ */
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+//  Cosmic Rays ALICE Trigger                                                //
+//  This class contains the basic functions for the Cosmic Ray ALICE         //
+//  detector. Functions specific to one particular geometry are              //
+//  contained in the derived classes                                         //
+//
+// Begin_Html
+/*
+<img src="picts/AliACORDEClass.gif">
+</pre>
+<p>The responsible person for this module is
+<a href="mailto:Enrique.Gamez.Flores@cern.ch">Enrique Gamez Flores</a>.
+</font>
+<pre>
+*/
+//End_Html
+//             
+//
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#include "AliACORDE.h"
+
+#include <TTree.h>
+#include <TVirtualMC.h>
+
+#include "AliRun.h"
+#include "AliMagF.h"
+//#include "AliMC.h"
+
+//#include "AliACORDEhit.h"
+#include "AliACORDEModule.h"
+
+ClassImp(AliACORDE)
+
+//_____________________________________________________________________________
+AliACORDE::AliACORDE()
+  : AliDetector(),
+    fModule(0)
+{
+  //
+  // Default constructor
+  //
+}
+//_____________________________________________________________________________
+AliACORDE::AliACORDE(const char *name, const char *title)
+  : AliDetector(name, title),
+    fModule(0)
+{
+  //
+  // Standard constructor
+  //
+  //fHits =  new TClonesArray("AliACORDEhit", 400);
+  //gAlice->GetMCApp()->AddHitList(fHits);
+}
+
+//_____________________________________________________________________________
+AliACORDE::~AliACORDE()
+{
+  //
+  // Default destructor
+  //
+  if ( fModule ) { delete fModule; fModule = 0; }
+}
+
+//_____________________________________________________________________________
+void AliACORDE::CreateMaterials()
+{
+  // Magnatic field inside the pit
+  Int_t   isxfld = gAlice->Field()->Integ();
+  Float_t sxmgmx = gAlice->Field()->Max();
+
+  //Magnetic field above the Magnet.
+  Int_t xfield = 0;   // no Magnetic field.
+  Float_t xfieldm = 0;
+  Float_t xepsil = 0.1; // Tracking precission in cm. obove the pit
+
+  // --- Define the various materials for GEANT --- 
+  Float_t epsil, stmin, tmaxfd, deemax, stemax;
+  //
+  //     Aluminum 
+  AliMaterial(9,  "ALUMINIUM0$", 26.98, 13., 2.7, 8.9, 37.2);
+  AliMaterial(29, "ALUMINIUM1$", 26.98, 13., 2.7, 8.9, 37.2);
+  AliMaterial(49, "ALUMINIUM2$", 26.98, 13., 2.7, 8.9, 37.2);
+  //
+  //     Iron 
+  AliMaterial(10, "IRON0$    ", 55.85, 26., 7.87, 1.76, 17.1);
+  AliMaterial(30, "IRON1$    ", 55.85, 26., 7.87, 1.76, 17.1);
+  AliMaterial(50, "IRON2$    ", 55.85, 26., 7.87, 1.76, 17.1);
+  //
+  //     Air 
+  AliMaterial(15, "AIR0$     ", 14.61, 7.3, .001205, 30423.24, 67500.);
+  AliMaterial(35, "AIR1$     ", 14.61, 7.3, .001205, 30423.24, 67500.);
+  AliMaterial(55, "AIR2$     ", 14.61, 7.3, .001205, 30423.24, 67500.);
+  AliMaterial(75, "AIR3$     ", 14.61, 7.3, .001205, 30423.24, 67500.);
+  AliMaterial(95, "AIR4$     ", 14.61, 7.3, .001205, 30423.24, 67500.);
+
+
+  // Scintillator material polystyrene 
+  Float_t aP[2] = {12.011, 1.00794};
+  Float_t zP[2] = {6.0, 1.0};
+  Float_t wP[2] = {1.0, 1.0};
+  Float_t dP = 1.032;
+  AliMixture(13, "Polystyrene$", aP, zP, dP, -2, wP);
+  // Subalpine Molasse over the ALICE hall. 
+  Float_t aMolasse[10] = { 1., 12.01, 15.994, 22.99, 24.305, 26.98, 28.086, 39.1, 40.08, 55.85 };
+  Float_t zMolasse[10] = {1., 6., 8., 11., 12., 13., 14., 19., 20., 26.};
+  Float_t wMolasse[10] = {0.008, 0.043, 0.485, 0.007, 0.042, 0.037, 0.215, 0.023, 0.1, 0.04};
+  Float_t dMolasse = 2.40;
+  AliMixture(24, "Molasse$", aMolasse, zMolasse, dMolasse, 10, wMolasse);
+
+  // **************** 
+  //     Defines tracking media parameters. 
+  //     Les valeurs sont commentees pour laisser le defaut 
+  //     a GEANT (version 3-21, page CONS200), f.m. 
+  epsil  = .001;  // Tracking precision, Inside the pit
+  stemax = -1.;   // Maximum displacement for multiple scattering 
+  tmaxfd = -20.;  // Maximum angle due to field deflection 
+  deemax = -.3;   // Maximum fractional energy loss, DLS 
+  stmin  = -.8;
+  // *************** 
+
+  Float_t atmaxfd = 10.;
+  Float_t adeemax = -0.1;
+  Float_t aepsil = 0.1;
+  Float_t astmin = -10.;
+
+  //
+  //    Aluminum 
+  AliMedium(9,  "ALU_C0          ",  9, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
+  AliMedium(29, "ALU_C1          ", 29, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
+  AliMedium(49, "ALU_C2          ", 49, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
+  //
+  //    Iron 
+  AliMedium(10, "FE_C0           ", 10, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
+  AliMedium(30, "FE_C1           ", 30, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
+  AliMedium(50, "FE_C2           ", 50, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
+  //
+  //    Air 
+  AliMedium(15, "AIR_C0          ", 15, 0, isxfld, sxmgmx, atmaxfd, stemax, adeemax, aepsil, astmin);
+  AliMedium(35, "AIR_C1          ", 35, 0, isxfld, sxmgmx, atmaxfd, stemax, adeemax, aepsil, astmin);
+  AliMedium(55, "AIR_C2          ", 55, 0, isxfld, sxmgmx, atmaxfd, stemax, adeemax, aepsil, astmin);
+  AliMedium(75, "AIR_C4          ", 75, 0, isxfld, sxmgmx, atmaxfd, stemax, adeemax, aepsil, astmin);
+  AliMedium(95, "AIR_C5          ", 95, 0, isxfld, sxmgmx, atmaxfd, stemax, adeemax, aepsil, astmin);
+
+
+
+  // The scintillator of the CPV made of Polystyrene 
+  // scintillator -> idtmed[1112]
+  AliMedium(12 , "CPV scint.0     ", 13, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
+  AliMedium(13 , "CPV scint.1     ", 13, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
+  AliMedium(14 , "CPV scint.2     ", 13, 1, isxfld, sxmgmx, 10., stemax, deemax, epsil, stmin);
+
+  //     Molasse -> idtmed[1123]
+  AliMedium(24 , "Molasse         ", 24, 0, xfield, xfieldm, tmaxfd, stemax, deemax, xepsil, stmin);
+
+  // Concrete, in case if we need to put hte shafts by ourselves.
+
+  Float_t aconc[10] = { 1.,12.01,15.994,22.99,24.305,26.98,28.086,39.1,40.08,55.85 };
+  Float_t zconc[10] = { 1.,6.,8.,11.,12.,13.,14.,19.,20.,26. };
+  Float_t wconc[10] = { .01,.001,.529107,.016,.002,.033872,.337021,.013,.044,.014 };
+
+  AliMixture(17, "CONCRETE$", aconc, zconc, 2.35, 10, wconc);
+  //    Concrete 
+  AliMedium(17, "CC_C0            ", 17, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
+  AliMedium(27, "CC_C1            ", 17, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin); // MX24
+  AliMedium(37, "CC_C2            ", 17, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin); // PM25
+  AliMedium(47, "CC_C3            ", 17, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin); // PGC2
+
+}
+
+//_____________________________________________________________________________
+void AliACORDE::SetTreeAddress()
+{
+
+  TBranch *branch;
+  char branchname[20];
+  sprintf(branchname,"%s",GetName());
+  // Branch address for hit tree
+  TTree *treeH = fLoader->TreeH();
+  if (treeH ) {
+    branch = treeH->GetBranch(branchname);
+    if (branch) branch->SetAddress(&fHits);
+  }
+}
+
+//_____________________________________________________________________________
+void AliACORDE::MakeBranch(Option_t* opt)
+{
+  //
+  // Initializes the branches of the ACORDE inside the trees written
+  // for each event.
+  //
+  const char* oH = strstr(opt, "H");
+  if ( fLoader->TreeH() && oH && (fHits == 0x0) ) {
+    fHits = new TClonesArray("AliACORDEhit", 1000);
+    fNhits = 0;
+  }
+  AliDetector::MakeBranch(opt);
+}
diff --git a/ACORDE/AliACORDE.h b/ACORDE/AliACORDE.h
new file mode 100644 (file)
index 0000000..8a284ea
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef ALIACORDE_H
+#define ALIACORDE_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+////////////////////////////////////////////////
+//  Manager class for detector: ACORDE        //
+////////////////////////////////////////////////
+
+#include "AliDetector.h"
+
+class AliACORDEModule;
+
+class AliACORDE : public AliDetector {
+public:
+  AliACORDE();
+  AliACORDE(const char* name, const char* title);
+  virtual ~AliACORDE();
+
+  virtual void CreateMaterials();
+
+  virtual Int_t IsVersion() const { return -1; }
+
+  virtual TString Version() { return TString(""); }
+
+  virtual void SetTreeAddress();
+  virtual void SetModule(AliACORDEModule* module) {fModule = module;}
+  virtual const AliACORDEModule* GetModule() const {return fModule; }
+  virtual void MakeBranch(Option_t* opt = "");
+
+protected:
+  AliACORDEModule* fModule;
+private:
+  AliACORDE(const AliACORDE& crt);
+  AliACORDE& operator=(const AliACORDE& crt);
+
+  ClassDef(AliACORDE, 1) // Cosmic Ray Trigger (ACORDE) base class
+};
+#endif // ALIACORDE_H
diff --git a/ACORDE/AliACORDEConstants.cxx b/ACORDE/AliACORDEConstants.cxx
new file mode 100644 (file)
index 0000000..033981a
--- /dev/null
@@ -0,0 +1,191 @@
+ /**************************************************************************
+ * 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$ */
+
+////////////////////////////////////////////////////////////////////////
+//
+// AliACORDEConstants class
+//
+// This class serves to group constants needed by ACORDE detector in 1
+// easily accessible place. All constants are public const static data 
+// members. The class is never instatiated.
+// Author: Arturo Fernandez, Enrique Gamez
+//         FCFM-UAP, Mexico.
+//
+////////////////////////////////////////////////////////////////////////
+
+#include "AliACORDEConstants.h"
+
+AliACORDEConstants* AliACORDEConstants::fgInstance = 0;
+
+const Float_t AliACORDEConstants::fgkCageLenght          = 477.6;
+const Float_t AliACORDEConstants::fgkCageWidth           = 166.7;
+const Float_t AliACORDEConstants::fgkCageHeight          =  10.7;
+const Float_t AliACORDEConstants::fgkSinglePaletteLenght = 363.0;
+const Float_t AliACORDEConstants::fgkSinglePaletteWidth  =  19.7;
+const Float_t AliACORDEConstants::fgkSinglePaletteHeight =   1;
+const Float_t AliACORDEConstants::fgkActiveAreaGap       = 0.7;
+const Float_t AliACORDEConstants::fgkActiveAreaLenght    = AliACORDEConstants::fgkSinglePaletteLenght;
+const Float_t AliACORDEConstants::fgkActiveAreaWidth     = 156.7;
+const Float_t AliACORDEConstants::fgkActiveAreaHeight    = 2*AliACORDEConstants::fgkSinglePaletteHeight + AliACORDEConstants::fgkActiveAreaGap;
+const Float_t AliACORDEConstants::fgkMagnetWidth         = 654.4;
+const Float_t AliACORDEConstants::fgkMagnetLenght        = 1200;
+const Float_t AliACORDEConstants::fgkMagMinRadius        = 790;
+const Float_t AliACORDEConstants::fgkMagMaxRadius        = AliACORDEConstants::fgkMagMinRadius + 20;
+const Float_t AliACORDEConstants::fgkDepth               =4420; // cm
+
+ClassImp(AliACORDEConstants)
+
+//_____________________________________________________________________________
+AliACORDEConstants::AliACORDEConstants()
+  : TObject()
+{
+  // Default constructor
+}
+
+//_____________________________________________________________________________
+AliACORDEConstants::AliACORDEConstants(const AliACORDEConstants& ct)
+  : TObject(ct)
+{
+  // Copy constructor
+}
+
+//_____________________________________________________________________________
+AliACORDEConstants& AliACORDEConstants::operator=(const AliACORDEConstants&)
+{
+  // Asingment operator
+  return *this;
+}
+
+//_____________________________________________________________________________
+AliACORDEConstants* AliACORDEConstants::Instance()
+{
+  if ( !fgInstance ) {
+    fgInstance = new AliACORDEConstants;
+  }
+  return fgInstance;
+}
+
+//_____________________________________________________________________________
+AliACORDEConstants::~AliACORDEConstants()
+{
+  fgInstance = 0;
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEConstants::CageLenght() const
+{
+  // Module lenght
+  return fgkCageLenght;
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEConstants::CageWidth() const
+{
+  // Module width
+  return fgkCageWidth;
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEConstants::CageHeight() const
+{
+  // Module height
+  return fgkCageHeight;
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEConstants::SinglePaletteLenght() const
+{
+  // Lenght of the scintillator active zone for a single counter
+  return fgkSinglePaletteLenght;
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEConstants::SinglePaletteWidth() const
+{
+  // Width of the scintillator active zone for a single counter
+  return fgkSinglePaletteWidth;
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEConstants::SinglePaletteHeight() const
+{
+  // Height of the scintillator active zone for a single counter
+  return fgkSinglePaletteHeight;
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEConstants::ActiveAreaGap() const
+{ 
+  // Gap betwen scintillators
+  return fgkActiveAreaGap;
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEConstants::ActiveAreaLenght() const
+{
+  // Lenght of the scintillator active zone
+  return fgkActiveAreaLenght;
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEConstants::ActiveAreaWidth() const
+{
+  // Width of the scintillator active zone
+  return fgkActiveAreaWidth;
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEConstants::ActiveAreaHeight() const
+{
+  // Height of the scintillator active zone
+  return fgkActiveAreaHeight;
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEConstants::MagnetWidth() const
+{
+  // Magnet  width
+  return fgkMagnetWidth;
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEConstants::MagnetLenght() const
+{
+  // Magnet lenght
+  return fgkMagnetLenght;
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEConstants::MagMinRadius() const
+{
+  // Magnet Inner radius
+  return fgkMagMinRadius;
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEConstants::MagMaxRadius() const
+{
+  // Magnet outer radius
+  return fgkMagMaxRadius;
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEConstants::Depth() const
+{
+  // Alice IP depth
+  return fgkDepth;
+}
diff --git a/ACORDE/AliACORDEConstants.h b/ACORDE/AliACORDEConstants.h
new file mode 100644 (file)
index 0000000..64504d1
--- /dev/null
@@ -0,0 +1,86 @@
+#ifndef ALIACORDECONSTANTS_H
+#define ALIACORDECONSTANTS_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+////////////////////////////////////////////////////////////////////////
+//
+// AliACORDEConstants class
+//
+// This class serves to group constants needed by ACORDE detector in 1
+// easily accessible place. All constants are public const static data 
+// members. The class is never instatiated.
+//
+// Author: Arturo Fernandez, Enrique Gamez
+//         FCFM-UAP, Mexico.
+//
+/////////////////////////////////////////////////////////////////////////
+
+#include <TObject.h>
+
+enum ECRMode {
+  kSingleMuons,
+  kMuonBundle,
+  kMuonFlux
+};
+
+class AliACORDEConstants : public TObject {
+public:
+  virtual ~AliACORDEConstants();
+
+  static AliACORDEConstants* Instance();
+
+  Float_t CageLenght() const;
+  Float_t CageWidth() const;
+  Float_t CageHeight() const;
+
+  Float_t SinglePaletteLenght() const;
+  Float_t SinglePaletteWidth() const;
+  Float_t SinglePaletteHeight() const;
+
+  Float_t ActiveAreaGap() const;
+  Float_t ActiveAreaLenght() const;
+  Float_t ActiveAreaWidth() const;
+  Float_t ActiveAreaHeight() const;
+
+  Float_t MagnetWidth() const;
+  Float_t MagnetLenght() const;
+  Float_t MagMinRadius() const;
+  Float_t MagMaxRadius() const;
+
+  Float_t Depth() const;
+
+protected:
+  AliACORDEConstants();
+  AliACORDEConstants(const AliACORDEConstants& ct);
+  AliACORDEConstants& operator=(const AliACORDEConstants& ct);
+
+  static AliACORDEConstants* fgInstance; // static instanton
+
+  static const Float_t fgkCageLenght; // Cage lenght
+  static const Float_t fgkCageWidth;  // Cage width
+  static const Float_t fgkCageHeight; // Cage height
+
+  static const Float_t fgkSinglePaletteLenght; // Palette lenght
+  static const Float_t fgkSinglePaletteWidth;  // Palette width
+  static const Float_t fgkSinglePaletteHeight; // Palette height
+
+  static const Float_t fgkActiveAreaGap; // Scintillator active area
+
+  static const Float_t fgkActiveAreaLenght; // Active area lenght
+  static const Float_t fgkActiveAreaWidth;  // Active area width
+  static const Float_t fgkActiveAreaHeight; // Active area height
+
+  static const Float_t fgkMagnetWidth;  // Magnet widht
+  static const Float_t fgkMagnetLenght; // Magnet lenght
+  static const Float_t fgkMagMinRadius; // Magnet inside radius
+  static const Float_t fgkMagMaxRadius; // Magnet outer radius
+
+  static const Float_t fgkDepth; // Alice IP depth from surface
+
+ private:
+  ClassDef(AliACORDEConstants, 0)   // ACORDE(ACORDE) global constants
+};
+#endif // ALIACORDECONSTANTS_H
diff --git a/ACORDE/AliACORDEModule.cxx b/ACORDE/AliACORDEModule.cxx
new file mode 100644 (file)
index 0000000..21e4e09
--- /dev/null
@@ -0,0 +1,120 @@
+/**************************************************************************
+ * 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: */
+
+////////////////////////////////////////////////////////////////////////////
+//
+// ALICE Cosmic Ray Trigger
+//
+//  This class will provide the basic utilities to create the geometry of
+//  the scintillatio array. This array is basically only the array
+//  in the upper face of the magnet. The remaining arrays will be copies
+//  of this array.
+//
+//   Authors:
+//
+//   Arturo Fernandez <afernand@fcfm.buap.mx>
+//   Enrique Gamez    <egamez@fcfm.buap.mx>
+//
+////////////////////////////////////////////////////////////////////////////
+
+#include "AliACORDEModule.h"
+
+ClassImp(AliACORDEModule)
+
+//_____________________________________________________________________________
+AliACORDEModule::AliACORDEModule()
+  : TNamed(),
+    fScintillatorThickness(0),
+    fScintillatorWidth(0),
+    fScintillatorLength(0),
+    fFrameThickness(0),
+    fFrameWidth(0),
+    fFrameLength(0),
+    fNColumns(0),
+    fNRows(0),
+    fZGap(0),
+    fXGap(0)
+{
+  //
+  // Default constructor
+  //
+}
+
+//_____________________________________________________________________________
+AliACORDEModule::AliACORDEModule(const char* name, const char* title)
+  : TNamed(name, title),
+    fScintillatorThickness(1),
+    fScintillatorWidth(19.7),
+    fScintillatorLength(186),
+    fFrameThickness(10),
+    fFrameWidth(26),
+    fFrameLength(300),
+    fNColumns(2),
+    fNRows(10),
+    fZGap(100),
+    fXGap(0)
+{
+  //
+  // Standard constructor
+  //
+}
+
+//_____________________________________________________________________________
+AliACORDEModule::AliACORDEModule(const AliACORDEModule& mod)
+  : TNamed(mod),
+    fScintillatorThickness(mod.fScintillatorThickness),
+    fScintillatorWidth(mod.fScintillatorWidth),
+    fScintillatorLength(mod.fScintillatorLength),
+    fFrameThickness(mod.fFrameThickness),
+    fFrameWidth(mod.fFrameWidth),
+    fFrameLength(mod.fFrameLength),
+    fNColumns(mod.fNColumns),
+    fNRows(mod.fNRows),
+    fZGap(mod.fZGap),
+    fXGap(mod.fXGap)
+{
+  //
+  // Copy constructor
+  //
+}
+
+//_____________________________________________________________________________
+AliACORDEModule::~AliACORDEModule()
+{
+  //
+  // Default destructor
+  //
+}
+
+//_____________________________________________________________________________
+AliACORDEModule& AliACORDEModule::operator=(const AliACORDEModule& mod)
+{
+  //
+  // Asingment operator
+  //
+  fScintillatorThickness = mod.fScintillatorThickness;
+  fScintillatorWidth = mod.fScintillatorWidth;
+  fScintillatorLength = mod.fScintillatorLength;
+  fFrameThickness = mod.fFrameThickness;
+  fFrameWidth = mod.fFrameWidth;
+  fFrameLength = mod.fFrameLength;
+  fNColumns = mod.fNColumns;
+  fNRows = mod.fNRows;
+  fZGap = mod.fZGap;
+  fXGap = mod.fXGap;
+  return *this;
+}
diff --git a/ACORDE/AliACORDEModule.h b/ACORDE/AliACORDEModule.h
new file mode 100644 (file)
index 0000000..6bde8c5
--- /dev/null
@@ -0,0 +1,127 @@
+#ifndef ALIACORDEMODULE_H
+#define ALIACORDEMODULE_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id: */
+/////////////////////////////////
+// ACORDE module geometry manager //
+/////////////////////////////////
+
+#include <TNamed.h>
+
+class AliACORDEModule : public TNamed {
+public:
+  AliACORDEModule();
+  AliACORDEModule(const char* name, const char* title);
+  AliACORDEModule(const AliACORDEModule& mod);
+  virtual ~AliACORDEModule();
+
+  AliACORDEModule& operator=(const AliACORDEModule& mod);
+
+  void SetScintillatorThickness(Float_t thickness);
+  void SetScintillatorWidth(Float_t width);
+  void SetScintillatorLenght(Float_t length);
+
+  void SetFrameThickness(Float_t thickness);
+  void SetFrameWidth(Float_t width);
+  void SetFrameLength(Float_t length);
+
+  void SetNumberOfColumns(Int_t ncols);
+  void SetNumberOfRows(Int_t nrows);
+
+  void SetZGap(Float_t zgap);
+  void SetXGap(Float_t xgap);
+
+  Float_t ScintillatorThickness() const;
+  Float_t ScintillatorWidth() const;
+  Float_t ScintillatorLenght() const;
+
+  Float_t FrameThickness() const;
+  Float_t FrameWidth() const;
+  Float_t FrameLength() const;
+
+  Int_t NumberOfModules() const;
+  Int_t NumberOfColumns() const;
+  Int_t NumberOfRows() const;
+
+  Float_t ZGap() const;
+  Float_t XGap() const;
+
+private:
+  Float_t fScintillatorThickness; // Scintillator thickness
+  Float_t fScintillatorWidth; // Scintillator width
+  Float_t fScintillatorLength; // Scintillator length
+  Float_t fFrameThickness; // Aluminium frame thickness
+  Float_t fFrameWidth; // Aluminium frame width
+  Float_t fFrameLength; // Aliuminium frame length
+  Int_t fNColumns;//Number of modules per column per magnet face (z coordinate)
+  Int_t fNRows; // Number of module rows per magnet face (x coordinate)
+  Float_t fZGap; // Gap in Z betwen modules
+  Float_t fXGap; // Gap in X betwen modules
+  ClassDef(AliACORDEModule, 1)// ACORDE module geometry manager
+};
+
+inline void AliACORDEModule::SetScintillatorThickness(Float_t thick)
+{ fScintillatorThickness = thick; }
+
+inline void AliACORDEModule::SetScintillatorWidth(Float_t width)
+{ fScintillatorWidth = width; }
+
+inline void AliACORDEModule::SetScintillatorLenght(Float_t length)
+{ fScintillatorLength = length; }
+
+inline void AliACORDEModule::SetFrameThickness(Float_t thick)
+{ fFrameThickness = thick; }
+
+inline void AliACORDEModule::SetFrameWidth(Float_t width)
+{ fFrameWidth = width; }
+
+inline void AliACORDEModule::SetFrameLength(Float_t length)
+{ fFrameLength = length; }
+
+inline void AliACORDEModule::SetNumberOfColumns(Int_t ncols)
+{ fNColumns = ncols; }
+
+inline void AliACORDEModule::SetNumberOfRows(Int_t nrows)
+{ fNRows = nrows; }
+
+inline void AliACORDEModule::SetZGap(Float_t zgap)
+{ fZGap = zgap; }
+
+inline void AliACORDEModule::SetXGap(Float_t xgap)
+{ fXGap = xgap; }
+
+inline Float_t AliACORDEModule::ScintillatorThickness() const
+{ return fScintillatorThickness; }
+
+inline Float_t AliACORDEModule::ScintillatorWidth() const
+{ return fScintillatorWidth; }
+
+inline Float_t AliACORDEModule::ScintillatorLenght() const
+{ return fScintillatorLength; }
+
+inline Float_t AliACORDEModule::FrameThickness() const
+{ return fFrameThickness; }
+
+inline Float_t AliACORDEModule::FrameWidth() const
+{ return fFrameWidth; }
+
+inline Float_t AliACORDEModule::FrameLength() const
+{ return fFrameLength; }
+
+inline Int_t AliACORDEModule::NumberOfModules() const
+{ return fNColumns*fNRows; }
+
+inline Int_t AliACORDEModule::NumberOfColumns() const
+{ return fNColumns; }
+
+inline Int_t AliACORDEModule::NumberOfRows() const
+{ return fNRows; }
+
+inline Float_t AliACORDEModule::ZGap() const
+{ return fZGap; }
+
+inline Float_t AliACORDEModule::XGap() const
+{ return fXGap; }
+#endif // ALIACORDEMODULE_H
diff --git a/ACORDE/AliACORDEdigit.cxx b/ACORDE/AliACORDEdigit.cxx
new file mode 100644 (file)
index 0000000..6d6873e
--- /dev/null
@@ -0,0 +1,115 @@
+/**************************************************************************
+ * 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$ */
+
+////////////////////////////////////////////////////////////////////////////
+//  ACORDE digit: Id
+//
+// The digits are made in FinishEvent() by summing all the hits in a
+// counter.
+//   The main parts of the code need to be written.
+//
+////////////////////////////////////////////////////////////////////////////
+
+#include "AliACORDEdigit.h"
+
+#include <TArrayF.h>
+#include <TArrayI.h>
+
+ClassImp(AliACORDEdigit)
+
+//_____________________________________________________________________________
+AliACORDEdigit::AliACORDEdigit()
+  : AliDigit(),
+    fSector(0),
+    fPlate(0),
+    fStrip(0),
+    fPadx(0),
+    fPadz(0),
+    fNDigits(0),
+    fTdc(0),
+    fAdc(0)
+{
+  //
+  // Default constructor
+  //
+}
+
+//_____________________________________________________________________________
+AliACORDEdigit::AliACORDEdigit(Int_t* tracks, Int_t *vol, Float_t *digit)
+  : AliDigit(tracks),
+    fSector(vol[0]),
+    fPlate(vol[1]),
+    fStrip(vol[2]),
+    fPadx(vol[3]),
+    fPadz(vol[4]),
+    fNDigits(1),
+    fTdc(new TArrayF(fNDigits)),
+    fAdc(new TArrayF(fNDigits))
+{
+  
+  //
+  // Creates ACORDE digit
+  // The creator for the AliACORDEdigit class. This routine fills the
+  // AliACORDEdigit data members from the array digits. 
+  //
+  (*fTdc)[0] = digit[0];
+  (*fAdc)[0] = digit[1];
+}
+
+//_____________________________________________________________________________
+AliACORDEdigit::AliACORDEdigit(const AliACORDEdigit& digit)
+  : AliDigit(digit),
+    fSector(digit.fSector),
+    fPlate(digit.fPlate),
+    fStrip(digit.fStrip),
+    fPadx(digit.fPadx),
+    fPadz(digit.fPadz),
+    fNDigits(digit.fNDigits),
+    fTdc(digit.fTdc),  
+    fAdc(digit.fAdc)
+{
+  //
+  //-- Copy constructor
+  //
+}
+
+//_____________________________________________________________________________
+AliACORDEdigit::~AliACORDEdigit()
+{
+  //
+  //
+  //
+  if ( fAdc ) { delete fAdc; fAdc = 0; }
+  if ( fTdc ) { delete fTdc; fTdc = 0; }
+}
+
+//_____________________________________________________________________________
+AliACORDEdigit& AliACORDEdigit::operator=(const AliACORDEdigit& digit)
+{
+  //
+  //-- Asingment operator.
+  //
+  fSector = digit.fSector;
+  fPlate  = digit.fPlate;
+  fStrip  = digit.fStrip;
+  fPadx   = digit.fPadx;
+  fPadz   = digit.fPadz;
+  fNDigits = digit.fNDigits;
+  fTdc = digit.fTdc;
+  fAdc = digit.fAdc;
+  return *this;
+}
diff --git a/ACORDE/AliACORDEdigit.h b/ACORDE/AliACORDEdigit.h
new file mode 100644 (file)
index 0000000..9f4c1e3
--- /dev/null
@@ -0,0 +1,42 @@
+#ifndef ALIACORDEDIGIT_H
+#define ALIACORDEDIGIT_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+////////////////////////////////////////////////////////////////////////////
+//  ACORDE digit: Id
+//
+// The digits are made in FinishEvent() by summing all the hits in a 
+// counter.
+////////////////////////////////////////////////////////////////////////////
+
+#include "AliDigit.h"
+
+class TArrayF;
+class TArrayI;
+
+class AliACORDEdigit: public AliDigit  {
+public:
+  AliACORDEdigit();
+  AliACORDEdigit(Int_t* tracks, Int_t* vol, Float_t* digit);
+  AliACORDEdigit(const AliACORDEdigit& digit);
+  virtual ~AliACORDEdigit();
+
+  AliACORDEdigit& operator= (const AliACORDEdigit& digit);
+
+protected:
+  Int_t     fSector;  // number of sector
+  Int_t     fPlate;   // number of plate
+  Int_t     fStrip;   // number of strip
+  Int_t     fPadx;    // number of pad along x
+  Int_t     fPadz;    // number of pad along z
+  Int_t     fNDigits;  // dimension of fTdc array
+  TArrayF*  fTdc;     // tdc values for sdigit
+  TArrayF*  fAdc;     // adc values for sdigit
+
+private:
+    ClassDef(AliACORDEdigit,1)  //Digit (Header) object for set : ACORDE (ACORDE)
+};
+#endif // ALIACORDEDIGIT_H
diff --git a/ACORDE/AliACORDEhit.cxx b/ACORDE/AliACORDEhit.cxx
new file mode 100644 (file)
index 0000000..fa7b6a0
--- /dev/null
@@ -0,0 +1,151 @@
+/**************************************************************************
+ * 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$ */
+
+#include "AliACORDEhit.h"
+
+#include <TMath.h>
+
+#include "AliConst.h"
+
+ClassImp(AliACORDEhit)
+
+//____________________________________________________________________________
+AliACORDEhit::AliACORDEhit()
+  : AliHit(),
+    fId(0),
+    fPx(0),
+    fPy(0),
+    fPz(0),
+    fEloss(0),
+    fMedium(0)
+{
+  //
+  // default ctor for AliACORDEhit object
+  //
+}
+
+//_____________________________________________________________________________
+AliACORDEhit::AliACORDEhit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits)
+  : AliHit(shunt, track),
+    fId(hits[0]),
+    fPx(hits[4]),
+    fPy(hits[5]),
+    fPz(hits[6]),
+    fEloss(hits[7]),
+    fMedium(vol[0])
+{
+  //
+  // Constructor of hit object
+  //
+  fX = hits[1];
+  fY = hits[2];
+  fZ = hits[3];
+}
+
+//____________________________________________________________________________
+AliACORDEhit::AliACORDEhit(const AliACORDEhit & hit)
+  : AliHit(hit),
+    fId(hit.fId),
+    fPx(hit.fPx),
+    fPy(hit.fPy),
+    fPz(hit.fPz),
+    fEloss(hit.fEloss),
+    fMedium(hit.fMedium)
+{
+  //
+  // copy ctor
+  //
+  fX      = hit.fX;
+  fY      = hit.fY;
+  fZ      = hit.fZ;
+}
+
+//_____________________________________________________________________________
+AliACORDEhit::~AliACORDEhit()
+{
+  //
+  // Default destructor.
+  //
+}
+
+//_____________________________________________________________________________
+AliACORDEhit& AliACORDEhit::operator=(const AliACORDEhit & hit)
+{
+  //
+  // aisngment operator.
+  //
+  fId     = hit.fId;
+  fX      = hit.fX;
+  fY      = hit.fY;
+  fZ      = hit.fZ;
+  fPx     = hit.fPx;
+  fPy     = hit.fPy;
+  fPz     = hit.fPz;
+  fEloss  = hit.fEloss;
+  fMedium = hit.fMedium;
+  return *this;
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEhit::Energy() const
+{
+  //
+  //
+  //
+  return TMath::Sqrt(fPx*fPx + fPy*fPy + fPz*fPz);
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEhit::PolarAngle() const
+{
+  //
+  //
+  //
+  return kRaddeg*TMath::ACos(-fPy/this->Energy());
+}
+
+//_____________________________________________________________________________
+Float_t AliACORDEhit::AzimuthAngle() const
+{
+  //
+  //
+  //
+  return kRaddeg*TMath::ATan2(-fPx, -fPz);
+}
+
+//_____________________________________________________________________________
+Bool_t AliACORDEhit::operator==(const AliACORDEhit& hit)
+{
+  //
+  //
+  //
+  Float_t energy = TMath::Sqrt(fPx*fPx + fPy*fPy + fPz*fPz);
+  Float_t energy2=TMath::Sqrt(hit.fPx*hit.fPx+hit.fPy*hit.fPy+hit.fPz*hit.fPz);
+  return (energy == energy2);
+  //return (fTrack == hit.fTrack);
+}
+
+//_____________________________________________________________________________
+Bool_t AliACORDEhit::operator<(const AliACORDEhit& hit)
+{
+  //
+  //
+  //
+  Float_t energy = TMath::Sqrt(fPx*fPx + fPy*fPy + fPz*fPz);
+  Float_t energy2=TMath::Sqrt(hit.fPx*hit.fPx+hit.fPy*hit.fPy+hit.fPz*hit.fPz);
+  return (energy < energy2);
+}
diff --git a/ACORDE/AliACORDEhit.h b/ACORDE/AliACORDEhit.h
new file mode 100644 (file)
index 0000000..e9e6f17
--- /dev/null
@@ -0,0 +1,51 @@
+#ifndef ALIACORDEHIT_H
+#define ALIACORDEHIT_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+////////////////////////////////////////////////
+//                                            //
+//  Hit class for ACORDE                         //
+//  Interface                                 //
+//  Getters, Setters and member variables     //
+//  declared here                             //
+//                                            //
+////////////////////////////////////////////////
+
+#include "AliHit.h"
+
+class AliACORDEhit : public AliHit {  
+public:
+  AliACORDEhit();
+  AliACORDEhit(Int_t shunt, Int_t track, Int_t* vol, Float_t *hits);
+  AliACORDEhit(const AliACORDEhit& hit);
+  virtual ~AliACORDEhit();
+
+  AliACORDEhit& operator=(const AliACORDEhit& hit);
+  Bool_t operator==(const AliACORDEhit& hit);
+  Bool_t operator<(const AliACORDEhit& hit);
+
+  Float_t ParticleId()   const {return fId;}
+  Float_t Px()           const {return fPx;}
+  Float_t Py()           const {return fPy;}
+  Float_t Pz()           const {return fPz;}
+  Float_t Eloss()        const {return fEloss;}
+  Float_t Medium()       const {return fMedium;}
+  Float_t Energy()       const;
+  Float_t PolarAngle()   const;
+  Float_t AzimuthAngle() const;
+
+protected:
+  Float_t fId;     //
+  Float_t fPx;     //
+  Float_t fPy;     //
+  Float_t fPz;     //
+  Float_t fEloss;  //
+  Float_t fMedium; //
+
+private:
+  ClassDef(AliACORDEhit,1)  // Hit for ACORDE (ACORDE)
+};
+#endif /* ALIACORDEHIT_H */
diff --git a/ACORDE/AliACORDEv0.cxx b/ACORDE/AliACORDEv0.cxx
new file mode 100644 (file)
index 0000000..382178d
--- /dev/null
@@ -0,0 +1,336 @@
+/**************************************************************************
+ * 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$ */
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// ALICE Cosmic Ray Trigger                                                  //
+//                                                                           //
+//  This class contains the functions for version 0 of the ALICE Cosmic Ray  //
+//  Trigger. This version will be used to simulation comic rays in alice     //
+//  with all the detectors.                                                  //
+//
+//   Authors:
+//
+//   Arturo Fernandez <afernand@fcfm.buap.mx>
+//   Enrique Gamez    <egamez@fcfm.buap.mx>
+//
+//   Universidad Autonoma de Puebla
+//
+//
+//Begin_Html
+/*
+<img src="picts/AliACORDEv0Class.gif">
+</pre>
+<br clear=left>
+<p>The responsible person for this module is
+<a href="mailto:egamez@fcfm.buap.mx">Enrique Gamez</a>.
+</font>
+<pre>
+*/
+//End_Html
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#include "AliACORDEv0.h"
+
+#include <TGeometry.h>
+#include <TBRIK.h>
+#include <TNode.h>
+#include <TVirtualMC.h>
+
+#include "AliRun.h"
+#include "AliConst.h"
+
+#include "AliACORDEConstants.h"
+#include "AliACORDEModule.h"
+
+ClassImp(AliACORDEv0)
+//_____________________________________________________________________________
+AliACORDEv0::AliACORDEv0()
+  : AliACORDE()
+{
+  //
+  // Default constructor
+  //
+}
+//_____________________________________________________________________________
+AliACORDEv0::AliACORDEv0(const char *name, const char *title)
+  : AliACORDE(name, title)
+{
+  //
+  // Standard constructor
+  //
+  //Begin_Html
+  /*
+    <img src="picts/AliACORDEv0.gif">
+  */
+  //End_Html
+  //PH  SetMarkerColor(kRed);
+  //PH  SetMarkerStyle(kRed);
+  //PH  SetMarkerSize(0.4);
+}
+
+//_____________________________________________________________________________
+AliACORDEv0::~AliACORDEv0()
+{
+  //
+  // Default destructor
+  //
+}
+
+//_____________________________________________________________________________
+void AliACORDEv0::BuildGeometry()
+{
+  //
+  // Create the ROOT TNode geometry for the ACORDE
+  //
+
+  TNode *node, *top;
+
+  const Int_t kColorACORDE = kRed;
+
+  // Find the top node alice.
+  top = gAlice->GetGeometry()->GetNode("alice");
+
+  AliACORDEConstants* crtConstants = AliACORDEConstants::Instance();
+
+  new TBRIK("S_ACORDE_A", "ACORDE box", "void", 
+           crtConstants->ActiveAreaLenght()/2., 
+           crtConstants->ActiveAreaHeight()/2., 
+           crtConstants->ActiveAreaWidth()/2.);
+
+  
+  new TRotMatrix("Left", "Left", 90., 315., 90., 45., 0., 337.5);
+  new TRotMatrix("Right", "Right", 90., 45., 90., 315., 180., 202.5);
+  new TRotMatrix("Up", "Up", 90., 0., 90., 90., 0., 90.);
+  top->cd();
+
+  //
+  // Put 4 modules on the top of the magnet
+  Float_t box = crtConstants->CageWidth()/2.;
+  top->cd();
+  node = new TNode("upper1", "upper1", "S_ACORDE_A", 0., 790.,  3.*box, "Up");
+  node->SetLineColor(kColorACORDE);
+  fNodes->Add(node);
+
+  top->cd();
+  node = new TNode("upper2", "upper2", "S_ACORDE_A", 0., 790.,    box, "Up");
+  node->SetLineColor(kColorACORDE);
+  fNodes->Add(node);
+
+  top->cd();
+  node = new TNode("upper3", "upper3", "S_ACORDE_A", 0., 790., -1.*box, "Up");
+  node->SetLineColor(kColorACORDE);
+  fNodes->Add(node);
+
+  top->cd();
+  node = new TNode("upper4", "upper4", "S_ACORDE_A", 0., 790., -3.*box, "Up");
+  node->SetLineColor(kColorACORDE);
+  fNodes->Add(node);
+
+
+  // Modules on the left side.
+  Float_t xtragap = 10.;
+  Float_t initXside = (790.+xtragap)*TMath::Sin(2*22.5*kDegrad); //rigth side
+  Float_t initYside = (790.+xtragap)*TMath::Cos(2*22.5*kDegrad);
+  top->cd();
+  node = new TNode("upper5", "upper5", "S_ACORDE_A", initXside, initYside,  3.*box, "Left");
+  node->SetLineColor(kColorACORDE);
+  fNodes->Add(node);
+
+  top->cd();
+  node = new TNode("upper6", "upper6", "S_ACORDE_A", initXside, initYside,    box, "Left");
+  node->SetLineColor(kColorACORDE);
+  fNodes->Add(node);
+
+  top->cd();
+  node = new TNode("upper7", "upper7", "S_ACORDE_A", initXside, initYside, -1.*box, "Left");
+  node->SetLineColor(kColorACORDE);
+  fNodes->Add(node);
+
+  top->cd();
+  node = new TNode("upper8", "upper8", "S_ACORDE_A", initXside, initYside, -3.*box, "Left");
+  node->SetLineColor(kColorACORDE);
+  fNodes->Add(node);
+
+
+  // Modules on the right side.
+  top->cd();
+  node = new TNode("upper9", "upper9", "S_ACORDE_A", -initXside, initYside,  3.*box, "Right");
+  node->SetLineColor(kColorACORDE);
+  fNodes->Add(node);
+
+  top->cd();
+  node = new TNode("upper10", "upper10", "S_ACORDE_A", -initXside, initYside,    box, "Right");
+  node->SetLineColor(kColorACORDE);
+  fNodes->Add(node);
+
+  top->cd();
+  node = new TNode("upper11","upper11", "S_ACORDE_A", -initXside, initYside, -1.*box, "Right");
+  node->SetLineColor(kColorACORDE);
+  fNodes->Add(node);
+
+  top->cd();
+  node = new TNode("upper12","upper12", "S_ACORDE_A", -initXside, initYside, -3.*box, "Right");
+  node->SetLineColor(kColorACORDE);
+  fNodes->Add(node);
+
+}
+
+//_____________________________________________________________________________
+void AliACORDEv0::CreateGeometry()
+{
+  //
+  // Create geometry for the ACORDE array
+  //
+
+  Int_t  idrotm[2499];    // The rotation matrix.
+  Int_t* idtmed = fIdtmed->GetArray() - 1099;
+  AliACORDEConstants* crtConstants = AliACORDEConstants::Instance();
+
+  // Create the mother volume.
+  // This volume can be seen as the volume which ACORDE will ocupate
+  // above the upper face of the L3 magnet. Inside this volume the detectors
+  // aboce the magnet will be, then there will be two copies of this volume,
+  // one for each side.
+  Float_t box[3];
+  //box[0] = 2*crtConstants->MagMinRadius()*TMath::Sin(kDegrad*22.5);
+  box[0] = crtConstants->MagMinRadius()*TMath::Sin(kDegrad*22.5);
+  box[1] = crtConstants->MagMaxRadius() - crtConstants->MagMinRadius();
+  box[2] = crtConstants->MagnetLenght()/2;
+  gMC->Gsvolu("ACORDE1", "BOX", idtmed[1112], box, 3);
+
+  // Check if the AliACORDEModule instance have been set, otherwise
+  // use the default values
+  if ( !fModule ) {
+    Info("CreateGeometry", "Using default dimensions");
+    fModule = new AliACORDEModule("ACORDEmod", "Default module dimensions");
+  }
+
+  // The full module volume.
+  // This volume will be ocupied by all the material of the module
+  // the scintillators, the aluminium frame, etc.
+  box[0] = fModule->FrameLength()/2;
+  box[1] = fModule->FrameThickness()/2;
+  box[2] = fModule->FrameWidth()/2;
+  gMC->Gsvolu("ACORDE2", "BOX", idtmed[1114], box, 3);
+
+  // The scintillators
+  box[0] = crtConstants->SinglePaletteLenght()/4;
+  box[1] = crtConstants->SinglePaletteHeight();
+  box[2] = crtConstants->SinglePaletteWidth()/2;
+  gMC->Gsvolu("ACORDE3", "BOX", idtmed[1112], box, 3);
+  gMC->Gspos("ACORDE3", 1, "ACORDE2", 0, 2, 0, 0, "ONLY");
+
+  // The metallic frame
+  box[0] = fModule->FrameLength()/2;
+  box[1] = fModule->FrameThickness()/2;
+  box[2] = 2;
+  gMC->Gsvolu("ACORDE4", "BOX", idtmed[1108], box, 3);
+  gMC->Gspos("ACORDE4", 1, "ACORDE2", 0, 0,  13 - box[2], 0, "MANY");
+  gMC->Gspos("ACORDE4", 2, "ACORDE2", 0, 0, -13 + box[2], 0, "MANY");
+
+  box[0] = 2;
+  box[1] = fModule->FrameThickness()/2;
+  box[2] = fModule->FrameWidth()/2;
+  gMC->Gsvolu("ACORDE5", "BOX", idtmed[1108], box, 3);
+  gMC->Gspos("ACORDE5", 1, "ACORDE2",  140 - box[0], 0, 0, 0, "MANY");
+  gMC->Gspos("ACORDE5", 2, "ACORDE2", -140 + box[0], 0, 0, 0, "MANY");
+
+  // The support bars
+  box[0] = 2;
+  box[1] = fModule->FrameThickness()/2;
+  box[2] = 500;
+  gMC->Gsvolu("ACORDE6", "BOX", idtmed[1108], box, 3);
+
+  // Now put into the volume CR11 all the above volumes.
+  // 20 scintillation modules
+  // 4 support bars
+  Int_t copyNumber = 0;
+  for ( Int_t k = 0; k < fModule->NumberOfRows(); k++ ) {
+    Float_t zCoordinate = k*fModule->ZGap() - 450;
+    gMC->Gspos("ACORDE2",++copyNumber,"ACORDE1",-150, 15, zCoordinate, 0, "MANY");
+    gMC->Gspos("ACORDE2",++copyNumber,"ACORDE1",150, 15, zCoordinate, 0, "MANY");
+
+  }
+
+  // Put the support bars
+  gMC->Gspos("ACORDE6", 1, "ACORDE1",  -75, 5, 0, 0, "ONLY");
+  gMC->Gspos("ACORDE6", 2, "ACORDE1", -225, 5, 0, 0, "ONLY");
+  gMC->Gspos("ACORDE6", 3, "ACORDE1",   75, 5, 0, 0, "ONLY");
+  gMC->Gspos("ACORDE6", 4, "ACORDE1",  225, 5, 0, 0, "ONLY");
+
+  // Now put a copy of CR11 on the 3 upper faces of the magnet
+  // In the right side side of the magnet
+  AliMatrix(idrotm[231], 90, 45, 90, 135, 0, 0);
+  // In the left side side of the magnet
+  AliMatrix(idrotm[232], 90, 315, 90, 45, 0, 0);
+
+  Float_t x = crtConstants->MagMinRadius()+10;
+  gMC->Gspos("ACORDE1", 1, "ALIC", 0, x, 0, 0, "MANY");
+  gMC->Gspos("ACORDE1", 2, "ALIC", -x*TMath::Sin(kDegrad*45), x*TMath::Cos(kDegrad*45), 0, idrotm[231], "MANY");
+  gMC->Gspos("ACORDE1", 3, "ALIC",  x*TMath::Sin(kDegrad*45), x*TMath::Cos(kDegrad*45), 0, idrotm[232], "MANY");
+
+}
+
+//_____________________________________________________________________________
+void AliACORDEv0::DrawDetector() const
+{
+  //
+  // Draw a shaded view of the L3 magnet
+  //
+
+  Info("DrawDetector", "Drawing the module");
+
+  gMC->Gsatt("*", "seen", -1);
+
+  gMC->Gsatt("ALIC","seen",0);
+
+  gMC->Gsatt("L3MO","seen",0); // L3 Magnet, Mother
+  gMC->Gsatt("L3CO","seen",1); // Coils
+  gMC->Gsatt("L3C1","seen",1); // Coils
+  gMC->Gsatt("L3YO","seen",1); // Yoke
+  gMC->Gsatt("L3DO","seen",0); // return Yoke (DOOR)
+  gMC->Gsatt("L3FR","seen",1); // DOOR
+  gMC->Gsatt("L3IR","seen",0); // Inner layer
+  gMC->Gsatt("L3O1","seen",1); // Door opening
+  gMC->Gsatt("L3O2","seen",1); // Door opening
+
+  gMC->Gsatt("ACORDE1", "seen", 0); // ACORDE Mother
+  gMC->Gsatt("ACORDE2", "seen", 0); // Module air box
+  gMC->Gsatt("ACORDE3", "seen", 1); // Scintillators
+  gMC->Gsatt("ACORDE3", "colo", 2); // Scintillators
+  gMC->Gsatt("ACORDE4", "seen", 1); // Aluminium frame (long bars)
+  gMC->Gsatt("ACORDE4", "colo", 3); //
+  gMC->Gsatt("ACORDE5", "seen", 1); // Aluminium frame (short bars)
+  gMC->Gsatt("ACORDE5", "colo", 3); //
+  gMC->Gsatt("ACORDE6", "seen", 1); // Module support
+  gMC->Gsatt("ACORDE6", "colo", 3); //
+
+  gMC->Gdopt("hide", "on");
+  gMC->Gdopt("edge","off");
+  gMC->Gdopt("shad", "on");
+  gMC->Gsatt("*", "fill", 7);
+  gMC->SetClipBox("ALIC", 0, 3000, -3000, 3000, -6000, 6000);
+  gMC->DefaultRange();
+  //gMC->Gdraw("alic", 40, 30, 0, 10, 9.5, .009, .009);
+  gMC->Gdraw("alic", 30, 40, 0, -30, -60, .09, .09);
+  gMC->Gdhead(1111, "View of ACORDE(ACORDE)");
+  gMC->Gdman(18, 4, "MAN");
+}
diff --git a/ACORDE/AliACORDEv0.h b/ACORDE/AliACORDEv0.h
new file mode 100644 (file)
index 0000000..13a6d6a
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef ALIACORDEV0_H
+#define ALIACORDEV0_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+////////////////////////////////////////////////
+//  Manager class for detector: ACORDEv0         //
+////////////////////////////////////////////////
+
+#include "AliACORDE.h"
+
+class AliACORDEv0 : public AliACORDE {
+public:
+  AliACORDEv0();
+  AliACORDEv0(const char *name, const char *title);
+  virtual ~AliACORDEv0();
+
+  virtual void CreateGeometry();
+  virtual void BuildGeometry();
+  virtual void DrawDetector() const;
+
+protected:
+  virtual void CreateMolasse() {}
+  virtual void CreateShafts() {}
+
+private: 
+  AliACORDEv0(const AliACORDEv0& crt);
+  AliACORDEv0& operator=(const AliACORDEv0& crt);
+
+  ClassDef(AliACORDEv0,1) // Cosmic Ray Trigger (ACORDE).
+};
+#endif // ALIACORDEV0_H
diff --git a/ACORDE/AliACORDEv1.cxx b/ACORDE/AliACORDEv1.cxx
new file mode 100644 (file)
index 0000000..5c9413b
--- /dev/null
@@ -0,0 +1,681 @@
+/**************************************************************************
+ * 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$ */
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// ALICE Cosmic Ray Trigger                                                  //
+//                                                                           //
+//  This class contains the functions for version 0 of the ALICE Cosmic Ray  //
+//  Trigger. This vesion is suposed to work as standalone module             //
+//                                                                           //
+//
+//   Authors:
+//
+//   Arturo Fernandez <afernand@fcfm.buap.mx>
+//   Enrique Gamez    <egamez@fcfm.buap.mx>
+//
+//   Universidad Autonoma de Puebla
+//
+//
+//Begin_Html
+/*
+<img src="picts/AliACORDEv1Class.gif">
+</pre>
+<br clear=left>
+<p>The responsible person for this module is
+<a href="mailto:egamez@fcfm.buap.mx">Enrique Gamez</a>.
+</font>
+<pre>
+*/
+//End_Html
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#include "AliACORDEv1.h"
+
+#include <TClonesArray.h>
+#include <TLorentzVector.h>
+#include <TPDGCode.h>
+#include <TVirtualMC.h>
+
+#include "AliRun.h"
+#include "AliConst.h"
+
+#include "AliACORDEhit.h"
+#include "AliACORDEModule.h"
+#include "AliACORDEConstants.h"
+#include "AliMC.h"
+#include "AliLog.h"
+
+ClassImp(AliACORDEv1)
+//_____________________________________________________________________________
+AliACORDEv1::AliACORDEv1()
+  : AliACORDE()
+{
+  //
+  // Default constructor
+  //
+  fIshunt = 0;
+  fHits = 0;
+}
+//_____________________________________________________________________________
+AliACORDEv1::AliACORDEv1(const char *name, const char *title)
+  : AliACORDE(name, title)
+{
+  //
+  // Standard constructor
+  //
+  //Begin_Html
+  /*
+    <img src="picts/AliACORDEv1.gif">
+  */
+  //End_Html
+  fIshunt = 1; // All hits are associated with primary particles  
+
+  fHits =  new TClonesArray("AliACORDEhit",400);
+  gAlice->GetMCApp()->AddHitList(fHits);
+
+  //PH  SetMarkerColor(7);
+  //PH  SetMarkerStyle(2);
+  //PH  SetMarkerSize(0.4);
+}
+
+//_____________________________________________________________________________
+AliACORDEv1::~AliACORDEv1()
+{
+  //
+  // Default destructor
+  //
+}
+
+//_____________________________________________________________________________
+void AliACORDEv1::CreateMaterials()
+{
+  //
+  // Create Materials.
+  // Use the parent class definition of the materials
+  //
+  AliACORDE::CreateMaterials();
+}
+
+//_____________________________________________________________________________
+void AliACORDEv1::CreateGeometry()
+{
+  //
+  // Create geometry for the ACORDE array
+  //
+
+  Int_t  idrotm[2499];    // The rotation matrix.
+  Int_t* idtmed = fIdtmed->GetArray() - 1099 ;
+  AliACORDEConstants* crtConstants = AliACORDEConstants::Instance();
+
+  // Create the mother volume, the one which will contain all the material
+  // above the hall.
+  Float_t pbox[3];
+  pbox[0] = AliACORDEConstants::Instance()->Depth()*TMath::Tan(67.5*kDegrad);
+  //pbox[0] = 12073;
+  pbox[1] = crtConstants->Depth();
+  pbox[2] = pbox[0];
+  gMC->Gsvolu("ACORDE", "BOX", idtmed[1114], pbox, 3);
+  gMC->Gspos("ACORDE", 1, "ALIC", 0, 0, 0, 0, "ONLY");
+
+  // Shafts.
+  this->CreateShafts();
+
+  // Molasse.
+  this->CreateMolasse();
+
+  // This volume can be seen as the volume which ACORDE will ocupate
+  // above the upper face of the L3 magnet. Inside this volume the detectors
+  // aboce the magnet will be, then there will be two copies of this volume,
+  // one for each side.
+  Float_t box[3];
+  //box[0] = 2*crtConstants->MagMinRadius()*TMath::Sin(kDegrad*22.5);
+  box[0] = crtConstants->MagMinRadius()*TMath::Sin(kDegrad*22.5);
+  box[1] = crtConstants->MagMaxRadius() - crtConstants->MagMinRadius();
+  box[2] = crtConstants->MagnetLenght()/2;
+  gMC->Gsvolu("ACORDE1", "BOX", idtmed[1134], box, 3);
+
+  // Check if the AliACORDEModule instance have been set, otherwise
+  // use the default values
+  if ( !fModule ) {
+    Info("CreateGeometry", "Using default dimensions");
+    fModule = new AliACORDEModule("ACORDEmod", "Default module dimensions");
+  }
+
+  // The full module volume.
+  // This volume will be ocupied by all the material of the module
+  // the scintillators, the aluminium frame, etc.
+  box[0] = fModule->FrameLength()/2;
+  box[1] = fModule->FrameThickness()/2;
+  box[2] = fModule->FrameWidth()/2;
+  gMC->Gsvolu("ACORDE2", "BOX", idtmed[1114], box, 3);
+
+  // The scintillators
+  box[0] = crtConstants->SinglePaletteLenght()/4;
+  box[1] = crtConstants->SinglePaletteHeight();
+  box[2] = crtConstants->SinglePaletteWidth()/2;
+  gMC->Gsvolu("ACORDE3", "BOX", idtmed[1112], box, 3);
+  gMC->Gspos("ACORDE3", 1, "ACORDE2", 0, 2, 0, 0, "ONLY");
+
+  // The metallic frame
+  box[0] = fModule->FrameLength()/2;
+  box[1] = fModule->FrameThickness()/2;
+  box[2] = 2;
+  gMC->Gsvolu("ACORDE4", "BOX", idtmed[1108], box, 3);
+  gMC->Gspos("ACORDE4", 1, "ACORDE2", 0, 0,  13 - box[2], 0, "MANY");
+  gMC->Gspos("ACORDE4", 2, "ACORDE2", 0, 0, -13 + box[2], 0, "MANY");
+
+  box[0] = 2;
+  box[1] = fModule->FrameThickness()/2;
+  box[2] = fModule->FrameWidth()/2;
+  gMC->Gsvolu("ACORDE5", "BOX", idtmed[1108], box, 3);
+  gMC->Gspos("ACORDE5", 1, "ACORDE2",  140 - box[0], 0, 0, 0, "MANY");
+  gMC->Gspos("ACORDE5", 2, "ACORDE2", -140 + box[0], 0, 0, 0, "MANY");
+
+  // The support bars
+  box[0] = 2;
+  box[1] = fModule->FrameThickness()/2;
+  box[2] = 500;
+  gMC->Gsvolu("ACORDE6", "BOX", idtmed[1108], box, 3);
+
+  // Now put into the volume CR11 all the above volumes.
+  // 20 scintillation modules
+  // 4 support bars
+  Int_t copyNumber = 0;
+  for ( Int_t k = 0; k < fModule->NumberOfRows(); k++ ) {
+    Float_t zCoordinate = k*fModule->ZGap() - 450;
+    gMC->Gspos("ACORDE2",++copyNumber,"ACORDE1",-150, 15, zCoordinate, 0, "MANY");
+    gMC->Gspos("ACORDE2",++copyNumber,"ACORDE1",150, 15, zCoordinate, 0, "MANY");
+
+  }
+
+  // Put the support bars
+  gMC->Gspos("ACORDE6", 1, "ACORDE1",  -75, 5, 0, 0, "ONLY");
+  gMC->Gspos("ACORDE6", 2, "ACORDE1", -225, 5, 0, 0, "ONLY");
+  gMC->Gspos("ACORDE6", 3, "ACORDE1",   75, 5, 0, 0, "ONLY");
+  gMC->Gspos("ACORDE6", 4, "ACORDE1",  225, 5, 0, 0, "ONLY");
+
+  // Now put a copy of CR11 on the 3 upper faces of the magnet
+  // In the right side side of the magnet
+  AliMatrix(idrotm[231], 90, 45, 90, 135, 0, 0);
+  // In the left side side of the magnet
+  AliMatrix(idrotm[232], 90, 315, 90, 45, 0, 0);
+
+  Float_t x = crtConstants->MagMaxRadius();
+  gMC->Gspos("ACORDE1", 1, "ALIC", 0, x, 0, 0, "MANY");
+  gMC->Gspos("ACORDE1", 2, "ALIC", -x*TMath::Sin(kDegrad*45), x*TMath::Cos(kDegrad*45), 0, idrotm[231], "MANY");
+  gMC->Gspos("ACORDE1", 3, "ALIC",  x*TMath::Sin(kDegrad*45), x*TMath::Cos(kDegrad*45), 0, idrotm[232], "MANY");
+
+}
+
+//_____________________________________________________________________________
+void AliACORDEv1::CreateMolasse()
+{
+  //
+  //
+  //
+  Int_t  idrotm[2499];    // The rotation matrix.
+  Int_t* idtmed = fIdtmed->GetArray() - 1099 ;
+
+  Float_t px24radius = 2300/2;
+  Float_t px24X = 0;
+  //Float_t px24Y = ;
+  Float_t px24Z = 2300;
+
+  Float_t pm25radius = 910/2;
+  Float_t pm25X = 2100;
+  //Float_t pm25Y = ;
+  Float_t pm25Z = 0;
+
+  Float_t pgc2radius = 1100/2;
+  Float_t pgc2X = -375;
+  //Float_t pgc2Y = ;
+  Float_t pgc2Z = -(1900 + 2987.7);
+
+  Float_t concreteWidth = 100; // Standard width of the hall walls.
+
+
+  // Create a local mother volume.
+  Float_t pbox[3];
+  pbox[0] = AliACORDEConstants::Instance()->Depth()*TMath::Tan(67.5*kDegrad);
+  pbox[1] = AliACORDEConstants::Instance()->Depth()/2;
+  pbox[2] = pbox[0];
+  gMC->Gsvolu("CMO1", "BOX", idtmed[1114], pbox, 3);
+
+  // Now put the molasse exactly above the hall. OK
+  // Above the ceiling
+  Float_t ptubs[5];
+  ptubs[0] = 1170;
+  ptubs[1] = 2100 - pm25radius;
+  ptubs[2] = 1900/2 + px24radius;
+  ptubs[3] = 0;
+  ptubs[4] = 180;
+  gMC->Gsvolu("CMO2", "TUBS", idtmed[1123], ptubs, 5);
+  gMC->Gspos("CMO2", 1, "CMO1", 0, 500-AliACORDEConstants::Instance()->Depth()/2, ptubs[2]-1900, 0, "MANY");
+
+  // Molasse around the RB24/26 Wall. OK
+  ptubs[0] = 220 + 1600;
+  ptubs[1] = AliACORDEConstants::Instance()->Depth() - ptubs[0];
+  ptubs[2] = 2987.7/2 - 1100/4 - concreteWidth/2;
+  ptubs[3] = 0;
+  ptubs[4] = 180;
+  gMC->Gsvolu("CMO3", "TUBS", idtmed[1123], ptubs, 5);
+  gMC->Gspos("CMO3", 1, "CMO1", 70, 40-AliACORDEConstants::Instance()->Depth()/2, -1900 - ptubs[2], 0, "MANY");
+
+  // A big block above the RB24/26 wall. OK
+  pbox[0] = AliACORDEConstants::Instance()->Depth()*TMath::Tan(67.5*kDegrad);
+  pbox[1] = (AliACORDEConstants::Instance()->Depth() - 220 - 1600)/2;
+  pbox[2] = 2987.7/2 - 1100/4 - concreteWidth/2;
+  gMC->Gsvolu("CMO4", "BOX", idtmed[1123], pbox, 3);
+  gMC->Gspos("CMO4", 1, "CMO1", 0, AliACORDEConstants::Instance()->Depth()/2 - pbox[1], -1900 - pbox[2], 0, "MANY");
+  // Small blocks below the volume CMO4 on both sides of the wall RB24/26. OK
+  pbox[0] = (AliACORDEConstants::Instance()->Depth()*TMath::Tan(67.5*kDegrad) - ptubs[0])/2;
+  pbox[1] = AliACORDEConstants::Instance()->Depth()/2 - pbox[1];
+  gMC->Gsvolu("CM17", "BOX", idtmed[1123], pbox, 3);
+  gMC->Gspos("CM17", 1, "CMO1", AliACORDEConstants::Instance()->Depth()*TMath::Tan(67.5*kDegrad) - pbox[0], -AliACORDEConstants::Instance()->Depth()/2 + pbox[1], -1900 - pbox[2], 0, "MANY");
+  gMC->Gspos("CM17", 2, "CMO1", -AliACORDEConstants::Instance()->Depth()*TMath::Tan(67.5*kDegrad)+ pbox[0], -AliACORDEConstants::Instance()->Depth()/2 + pbox[1], -1900 - pbox[2], 0, "MANY");
+
+  // And a big block of molasse above the hall up to the surface. OK
+  pbox[0] = pm25X - pm25radius;
+  pbox[1] = (AliACORDEConstants::Instance()->Depth()-500-1170)/2;
+  pbox[2] = (1900 + 1150)/2;
+  gMC->Gsvolu("CMO5", "BOX", idtmed[1123], pbox, 3);
+  gMC->Gspos("CMO5", 1, "CMO1", 0,AliACORDEConstants::Instance()->Depth()/2-pbox[1], pbox[2]-1900, 0, "MANY");
+  // Small blocks of molasse betwen the blocks CMO2, CMO5 and PM25. Ok
+  pbox[0] = (pm25X - pm25radius - 1170)/2;
+  pbox[1] = 1000;
+  gMC->Gsvolu("CM16", "BOX", idtmed[1123], pbox, 3);
+  gMC->Gspos("CM16", 1, "CMO1", 1170 + pbox[0], -AliACORDEConstants::Instance()->Depth()/2+pbox[1], pbox[2] - 1900, 0, "MANY");
+
+  // Molasse around the shafts.
+  AliMatrix(idrotm[2003], 0, 0, 90, 0, 90, 90);
+  // Around the PX24, the open section. OK
+  ptubs[0] = px24radius + concreteWidth;
+  ptubs[1] = ptubs[0] + 1000;
+  ptubs[2] = (2300 - (5150 - AliACORDEConstants::Instance()->Depth()))/2;
+  ptubs[3] = 180 + kRaddeg*TMath::ASin(1070/ptubs[0]);
+  ptubs[4] = 180 -  kRaddeg*TMath::ASin(1070/ptubs[0]);
+  gMC->Gsvolu("CMO6", "TUBS", idtmed[1123], ptubs, 5);
+  gMC->Gspos("CMO6", 1, "CMO1", px24X, ptubs[2] - AliACORDEConstants::Instance()->Depth()/2, px24Z, idrotm[2003], "MANY");
+
+  // Around the PX24, the closed section. OK
+  Float_t ptube[3];
+  ptube[0] = px24radius + concreteWidth;
+  ptube[1] = ptube[0] + 1000;
+  ptube[2] = (5150 - 2300)/2;
+  gMC->Gsvolu("CMO7", "TUBE", idtmed[1123], ptube, 3);
+  gMC->Gspos("CMO7", 1, "CMO1", px24X, AliACORDEConstants::Instance()->Depth()/2 - ptube[2], px24Z, idrotm[2003], "MANY");
+
+  // Around PM25. OK
+  ptube[0] = pm25radius + concreteWidth;
+  ptube[1] = ptube[0] + 400;
+  ptube[2] = AliACORDEConstants::Instance()->Depth()/2;
+  gMC->Gsvolu("CMO8", "TUBE", idtmed[1123], ptube, 3);
+  gMC->Gspos("CMO8", 1, "CMO1", pm25X, 0, pm25Z, idrotm[2003], "MANY");
+  // On both sides of the PM25 along the HALL.
+  pbox[0] = (2100 + pm25radius - 1170)/2;
+  pbox[1] = AliACORDEConstants::Instance()->Depth()/2;
+  pbox[2] = (3*px24radius - pm25radius)/2;
+  gMC->Gsvolu("CM18", "BOX", idtmed[1123], pbox, 3);
+  gMC->Gspos("CM18", 1, "CMO1", 2100, 0, pbox[2] + pm25radius, 0, "MANY");
+
+  pbox[2] = (1900 - pm25radius)/2;
+  gMC->Gsvolu("CM19", "BOX", idtmed[1123], pbox, 3);
+  gMC->Gspos("CM19", 1, "CMO1", 2100, 0, -pbox[2] - pm25radius, 0, "MANY");
+
+  // Around the PGC2. OK
+  ptube[0] = pgc2radius + concreteWidth;
+  ptube[1] = 2987.7 - 740;
+  ptube[2] = AliACORDEConstants::Instance()->Depth()/2;
+  gMC->Gsvolu("CMO9", "TUBE", idtmed[1123], ptube, 3);
+  gMC->Gspos("CMO9", 1, "CMO1", pgc2X, 0, pgc2Z, idrotm[2003], "MANY");
+
+  // On both sides of the PGC2.OK
+  pbox[0] = (AliACORDEConstants::Instance()->Depth()*TMath::Tan(67.5*kDegrad) - 1100 - 375)/2;
+  pbox[1] = AliACORDEConstants::Instance()->Depth()/2;
+  pbox[2] = pgc2radius + concreteWidth;
+  gMC->Gsvolu("CM10", "BOX", idtmed[1123], pbox, 3);
+  gMC->Gspos("CM10", 1, "CMO1", AliACORDEConstants::Instance()->Depth()*TMath::Tan(67.5*kDegrad) - pbox[0], 0, pgc2Z, 0, "MANY");
+  gMC->Gspos("CM10", 2, "CMO1", -AliACORDEConstants::Instance()->Depth()*TMath::Tan(67.5*kDegrad) + pbox[0], 0, pgc2Z, 0, "MANY");
+
+  // big block of molasse behind the PX24. OK
+  pbox[0] = AliACORDEConstants::Instance()->Depth()*TMath::Tan(67.5*kDegrad);
+  pbox[1] = AliACORDEConstants::Instance()->Depth()/2;
+  pbox[2] = (pbox[0] - (2300 + 1150 + 100))/2;
+  gMC->Gsvolu("CM12", "BOX", idtmed[1123], pbox, 3);
+  gMC->Gspos("CM12", 1, "CMO1", px24X, 0, px24Z + px24radius + concreteWidth + pbox[2], 0, "MANY");
+
+  // big block of molasse in the opposite side of the PM25. OK
+  pbox[0] = (AliACORDEConstants::Instance()->Depth()*TMath::Tan(67.5*kDegrad) - 1150)/2;
+  pbox[1] = AliACORDEConstants::Instance()->Depth()/2;
+  pbox[2] = (1900 + 2300 + 1150)/2;
+  gMC->Gsvolu("CM13", "BOX", idtmed[1123], pbox, 3);
+  gMC->Gspos("CM13", 1, "CMO1", -1150 - pbox[0], 0, pbox[2] - 1900, 0, "MANY");
+
+  // big block of molasse behind the PM25. OK
+  pbox[0] = (AliACORDEConstants::Instance()->Depth()*TMath::Tan(67.5*kDegrad) - (2100 + 910/2 + 100))/2;
+  pbox[1] = AliACORDEConstants::Instance()->Depth()/2;
+  pbox[2] = (1900 + 2300 + 1150)/2;
+  gMC->Gsvolu("CM14", "BOX", idtmed[1123], pbox, 3);
+  gMC->Gspos("CM14", 1, "CMO1", pm25X + pm25radius + concreteWidth + pbox[0], 0, pbox[2] - 1900, 0, "MANY");
+
+  // big block of molasse behind the PGC2. OK
+  pbox[0] = AliACORDEConstants::Instance()->Depth()*TMath::Tan(67.5*kDegrad);
+  pbox[1] = AliACORDEConstants::Instance()->Depth()/2;
+  pbox[2] = (pbox[0] - (2987.7 + 1900 + 1100/2 + 100))/2;
+  gMC->Gsvolu("CM15", "BOX", idtmed[1123], pbox, 3);
+  gMC->Gspos("CM15", 1, "CMO1", 0, 0, -pbox[0] + pbox[2], 0, "MANY");
+
+  gMC->Gspos("CMO1",1,"ACORDE",0,AliACORDEConstants::Instance()->Depth()/2,0,0,"MANY");
+
+}
+
+//_____________________________________________________________________________
+void AliACORDEv1::CreateShafts()
+{
+  //
+  //
+  //
+  Int_t  idrotm[2499];    // The rotation matrix.
+  Int_t* idtmed = fIdtmed->GetArray() - 1099 ;
+
+  //
+  // Acces shafts
+  //
+  AliMatrix(idrotm[2001], 0, 0, 90, 0, 90, 90);
+
+
+  // Create a bing cilinder to hold the main structures in the shaft.
+  //   All the structures relative to the shaft will be put into
+  // this volume.
+  //   This shaft is composed by an open tube down in the hall, and
+  // a cilinder avobe the level of the ceiling.
+  Float_t ptube[3];
+  ptube[0] = 0;    // inner radius
+  ptube[1] = 1250; // outer radius
+  ptube[2] = 5150/2; // Half lenght in Z
+  gMC->Gsvolu("CSF1", "TUBE", idtmed[1114], ptube, 3);
+
+  Float_t ptubs[5];
+  // The open section of the PX24
+  ptubs[0] = 1150; // Inner radius
+  ptubs[1] = 1250; // Outer radius
+  ptubs[2] = 1300; // Half length
+  ptubs[3] = 180 + kRaddeg*TMath::ASin(1070/ptubs[0]); // starting angle
+  ptubs[4] = 180 -  kRaddeg*TMath::ASin(1070/ptubs[0]);
+  gMC->Gsvolu("CSF2", "TUBS", idtmed[1116], ptubs, 5);
+  gMC->Gspos("CSF2", 1, "CSF1", 0, 0, -ptube[2] + ptubs[2], 0, "MANY");
+
+  // The other part of the shaft.
+  ptube[0] = ptubs[0]; // Inner radius
+  ptube[1] = ptubs[1]; // Outer radius
+  ptube[2] = 5150/2 - ptubs[2]; // Half lenght
+  gMC->Gsvolu("CSF3", "TUBE", idtmed[1116], ptube, 3);
+  gMC->Gspos("CSF3", 1, "CSF1", 0, 0, 5150/2 - ptube[2], 0, "MANY");
+
+  Float_t pbox[3];
+  // Concrete walls along the shaft (next to the elevator.)
+  pbox[0] = 480/2;  // Half length in X
+  pbox[1] = 120/2;  // Half length in Y
+  pbox[2] = 5150/2; // Half length in Z
+  gMC->Gsvolu("CSW1", "BOX", idtmed[1116], pbox, 3);
+  gMC->Gspos("CSW1", 1, "CSF1", 820+pbox[0],  150+pbox[1], 0, 0, "MANY");
+  gMC->Gspos("CSW1", 2, "CSF1", 820+pbox[0], -300-pbox[1], 0, 0, "MANY");
+
+  //
+  pbox[0] = 120/2;  // Half length in X
+  pbox[1] = 750/2;  // Half length in Y
+  pbox[2] = 5150/2; // Half length in Z
+  gMC->Gsvolu("CSW2", "BOX", idtmed[1116], pbox, 3);
+  gMC->Gspos("CSW2", 1, "CSF1", 820-60, 150+pbox[1], 0, 0, "MANY");
+
+  //
+  pbox[0] = 120/2;  // Half length in X
+  pbox[1] = 600/2;  // Half lenght in Y
+  pbox[2] = 5150/2; // Half length in Z
+  gMC->Gsvolu("CSW3", "BOX", idtmed[1116], pbox, 3);
+  gMC->Gspos("CSW3", 1, "CSF1", 820-60, -300-pbox[1], 0, 0, "MANY");
+
+  // Material below the counting rooms.
+  pbox[0] = 400/2;
+  pbox[1] = 2300/2;
+  pbox[2] = 300/2;
+  gMC->Gsvolu("CSW4", "BOX", idtmed[1116], pbox, 3);
+  gMC->Gspos("CSW4",1,"CSF1",2300/2-pbox[0],0,3000-5150/2-pbox[2], 0, "MANY");
+
+  // Shielding plug.
+  pbox[0] = 1400/2;
+  pbox[1] = 2300/2;
+  pbox[2] = 170/2;
+  gMC->Gsvolu("CSW5", "BOX", idtmed[1116], pbox, 3);
+  gMC->Gspos("CSW5", 1, "CSF1", 0, 0, 3000-5150/2-130, 0, "MANY");
+
+  // The end of the support for the shielding plug.
+  pbox[0] = 170/2;
+  pbox[1] = 2300/2;
+  pbox[2] = 300/2;
+  gMC->Gsvolu("CSW6", "BOX", idtmed[1116], pbox, 3);
+  gMC->Gspos("CSW6",1,"CSF1",-1400/2-pbox[0],0,3000-5150/2-pbox[2],0,"MANY");
+
+  // ...
+  pbox[0] = 100/2;
+  pbox[1] = 2300/2;
+  pbox[2] = 450/2;
+  gMC->Gsvolu("CSW7", "BOX", idtmed[1116], pbox, 3);
+  gMC->Gspos("CSW7",1,"CSF1",-1400/2-170-pbox[0],0,3000-5150/2+pbox[2],0,"MANY");
+
+  // Material close to the pipe.
+  pbox[0] = 300/2;
+  pbox[1] = 2300/2;
+  pbox[2] = 170/2;
+  gMC->Gsvolu("CSW8", "BOX", idtmed[1116], pbox, 3);
+  gMC->Gspos("CSW8",1,"CSF1",-2300/2+pbox[0],0,2500-5150/2,0,"MANY");
+
+  // Now put the shaft into the mother volume.
+  gMC->Gspos("CSF1", 1, "ACORDE", 0, AliACORDEConstants::Instance()->Depth() - 5150/2, 2300, idrotm[2001], "MANY");
+
+  // PM25 Access Shaft
+  ptube[0] = 910/2;
+  ptube[1] = ptube[0] + 100;
+  ptube[2] = (5150 - 1166)/2;
+  gMC->Gsvolu("CSF4", "TUBE", idtmed[1116], ptube, 3);
+  gMC->Gspos("CSF4", 1, "ACORDE", 2100, AliACORDEConstants::Instance()->Depth()-ptube[2], 0, idrotm[2001], "MANY");
+
+  // PGC2 Access Shaft
+  ptube[0] = 1100/2;
+  ptube[1] = ptube[0] + 100;
+  ptube[2] = (5150 - 690)/2;
+  gMC->Gsvolu("CSF5", "TUBE", idtmed[1116], ptube, 3);
+  gMC->Gspos("CSF5", 1, "ACORDE", -375, AliACORDEConstants::Instance()->Depth()-ptube[2], -1900 - 2987.7, idrotm[2001], "MANY");
+
+}
+
+//_____________________________________________________________________________
+void AliACORDEv1::DrawDetector() const
+{
+  //
+  // Draw a shaded view of the L3 magnet
+  //
+  Info("DrawDetector", "Drawing ACORDE module");
+
+  gMC->Gsatt("*", "seen", -1);
+  gMC->Gsatt("ALIC", "seen", 0);
+  /*
+  gMC->Gsatt("L3MO","seen",0); // L3 Magnet, Mother
+  gMC->Gsatt("L3CO","seen",1); // Coils
+  gMC->Gsatt("L3C1","seen",1); // Coils
+  gMC->Gsatt("L3YO","seen",1); // Yoke
+  gMC->Gsatt("L3DO","seen",0); // return Yoke (DOOR)
+  gMC->Gsatt("L3FR","seen",1); // DOOR
+  gMC->Gsatt("L3IR","seen",0); // Inner layer
+  gMC->Gsatt("L3O1","seen",1); // Door opening
+  gMC->Gsatt("L3O2","seen",1); // Door opening
+  */
+  gMC->Gsatt("ACORDE", "seen",0); // ACORDE mother volume.
+
+  gMC->Gsatt("CMO1","seen",0); // Molasse.
+
+  gMC->Gsatt("CSF1","seen",0); // PX24 access shaft.
+  gMC->Gsatt("CSF2", "seen", 1); // PX24 open section
+  gMC->Gsatt("CSF3", "seen", 1); // PX24, upper part.
+  gMC->Gsatt("CSW1", "seen", 1);
+  gMC->Gsatt("CSW2", "seen", 1);
+  gMC->Gsatt("CSW3", "seen", 1);
+  gMC->Gsatt("CSW4", "seen", 1);
+  gMC->Gsatt("CSW5", "seen", 1);
+  gMC->Gsatt("CSW6", "seen", 1);
+  gMC->Gsatt("CSW7", "seen", 1);
+  gMC->Gsatt("CSW8", "seen", 1);
+
+  gMC->Gsatt("CSF4","seen",1); // PM25 access shaft.
+  gMC->Gsatt("CSF5","seen",1); // PGC2 access shaft.
+
+  gMC->Gsatt("ACORDE",  "seen", 0); // ACORDE Mother volume.
+  gMC->Gsatt("ACORDE1", "seen", 0); // ?
+  gMC->Gsatt("ACORDE2", "seen", 0); // Module air box
+  gMC->Gsatt("ACORDE3", "seen", 1); // Scintillators
+  gMC->Gsatt("ACORDE3", "colo", 2); // Scintillators
+  gMC->Gsatt("ACORDE4", "seen", 1); // Aluminium frame (long bars)
+  gMC->Gsatt("ACORDE4", "colo", 3); //
+  gMC->Gsatt("ACORDE5", "seen", 1); // Aluminium frame (short bars)
+  gMC->Gsatt("ACORDE5", "colo", 3); //
+  gMC->Gsatt("ACORDE6", "seen", 1); // Module support
+  gMC->Gsatt("ACORDE6", "colo", 3); //
+
+  gMC->Gdopt("hide", "on");
+  gMC->Gdopt("edge","off");
+  gMC->Gdopt("shad", "on");
+  gMC->Gsatt("*", "fill", 7);
+  gMC->SetClipBox("ALIC", 0, 3000, -3000, 3000, -6000, 6000);
+  gMC->DefaultRange();
+  gMC->Gdraw("alic", 70, 30, 0, 10, 9.5, .001, .001);
+  gMC->Gdhead(1111, "View of ACORDE(ACORDE)");
+  gMC->Gdman(18, 4, "MAN");
+
+}
+
+//_____________________________________________________________________________
+void AliACORDEv1::Init()
+{
+  //
+  // Initialise L3 magnet after it has been built
+  Int_t i;
+  //
+  if(AliLog::GetGlobalDebugLevel()>0) {
+    printf("\n%s: ",ClassName());
+    for(i=0;i<35;i++) printf("*");
+    printf(" ACORDEv1_INIT ");
+    for(i=0;i<35;i++) printf("*");
+    printf("\n%s: ",ClassName());
+    //
+    // Here the ACORDEv1 initialisation code (if any!)
+    for(i=0;i<80;i++) printf("*");
+    printf("\n");
+  }
+
+}
+
+//____________________________________________________________________________
+void AliACORDEv1::StepManager()
+{
+  //
+  // Called for every step in the Cosmic Ray Trigger
+  //
+  static Int_t   vol[1];
+  Int_t          ipart;
+  TLorentzVector pos;
+  TLorentzVector mom;
+
+  static Float_t hits[14];
+  static Float_t eloss;
+
+  if ( gMC->TrackPid() != kMuonMinus ) return;
+
+  // Only charged tracks
+  if ( !(gMC->TrackCharge()) ) return;
+
+  if (gMC->IsNewTrack()) {
+    // Reset the deposited energy
+    eloss = 0;
+  }
+
+  // Add th energy loss in each step.
+  eloss += gMC->Edep();
+
+  if ( ( (strcmp(gMC->CurrentVolName(),"ACORDE4") == 0) || // Magnet
+        (strcmp(gMC->CurrentVolName(),"ACORDE5") == 0) || // ACORDE
+        (strcmp(gMC->CurrentVolName(),"ACORDE6") == 0) || // Magnet Doors
+        (strcmp(gMC->CurrentVolName(),"CSF2") == 0) || // PX24
+        (strcmp(gMC->CurrentVolName(),"CSF3") == 0) || // PM25
+        (strcmp(gMC->CurrentVolName(),"CSF4") == 0) )  // PGC2
+       && gMC->IsTrackEntering() ) {
+
+  /*
+  if ( (strcmp(gMC->CurrentVolName(),"ACORDE3") == 0)
+       && gMC->IsTrackEntering() ) {
+  */
+    // Get current particle id(ipart),track position (pos) and momentum (mom)
+    gMC->TrackPosition(pos);
+    gMC->TrackMomentum(mom);
+    ipart = gMC->TrackPid();
+
+    ipart = gMC->TrackPid();
+    hits[0]  = (Float_t)ipart; //                 (fId)
+    
+    hits[1] = pos[0]; // X coordinate (fX)
+    hits[2] = pos[1]; // Y coordinate (fY)
+    hits[3] = pos[2]; // Z coordinate (fZ)
+    hits[4] = mom[0]; // Px           (fpxug)
+    hits[5] = mom[1]; // Py           (fpyug)
+    hits[6] = mom[2]; // Pz           (fpzug)
+    hits[7] = eloss;              // Energy loss
+
+    Info("StepManager", "X=%f", pos[0]);
+
+    // Tag the volumes
+    if      ( (strcmp(gMC->CurrentVolName(),"ACORDE4")==0) ) vol[0] = 1; // Magnet
+    else if ( (strcmp(gMC->CurrentVolName(),"ACORDE5")==0) ) vol[0] = 2; // ACORDE
+    else if ( (strcmp(gMC->CurrentVolName(),"ACORDE6")==0) ) vol[0] = 3; // Doors
+    else if ( (strcmp(gMC->CurrentVolName(),"CSF2")==0) ) vol[0] = 4; // PX24
+    else if ( (strcmp(gMC->CurrentVolName(),"CSF3")==0) ) vol[0] = 5; // PM25
+    else if ( (strcmp(gMC->CurrentVolName(),"CSF4")==0) ) vol[0] = 6; // PGC2
+    else                                                  vol[0] = -1;// ?
+    //vol[0]  = gMC->GetMedium();  //layer(flay)
+    Info("StepManager", "Adding hit");
+    AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber(),vol, hits);
+    Info("StepManager", "Hit added");
+    // Reset the deposited energy only when you reach the Magnet
+    if ( (strcmp(gMC->CurrentVolName(),"ACORDE4")==0) ) eloss = 0;
+
+  } else {
+    return;
+  }
+
+}
+
+//_____________________________________________________________________________
+void AliACORDEv1::AddHit(Int_t track, Int_t *vol, Float_t *hits)
+{
+  //
+  // Add a ACORDE hit
+  //
+  TClonesArray &lhits = *fHits;
+  new(lhits[fNhits++]) AliACORDEhit(fIshunt,track,vol,hits);
+}
diff --git a/ACORDE/AliACORDEv1.h b/ACORDE/AliACORDEv1.h
new file mode 100644 (file)
index 0000000..19a5b61
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef ALIACORDEV1_H
+#define ALIACORDEV1_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+////////////////////////////////////////////////
+//  Manager class for detector: ACORDEv1         //
+////////////////////////////////////////////////
+
+#include "AliACORDE.h"
+
+class AliACORDEv1 : public AliACORDE {
+public:
+  AliACORDEv1();
+  AliACORDEv1(const char *name, const char *title);
+  virtual ~AliACORDEv1();
+
+  virtual TString Version() { return TString("v1"); }
+  virtual Int_t IsVersion() const { return 1; }
+
+  virtual void AddHit(Int_t track, Int_t *vol, Float_t *hits);
+  //virtual void    FinishEvent();
+  //virtual void    ResetHits();
+  //virtual void    ResetDigits();
+
+  virtual void CreateMaterials();
+  virtual void CreateGeometry();
+
+  virtual void Init();
+  virtual void DrawDetector() const;
+  virtual void StepManager();
+
+protected:
+  virtual void CreateMolasse();
+  virtual void CreateShafts();
+
+private: 
+  AliACORDEv1(const AliACORDEv1& crt);
+  AliACORDEv1& operator=(const AliACORDEv1& crt);
+
+  ClassDef(AliACORDEv1, 1)  //Class for ACORDE, version 1, Shafts outside of AliHALL
+};
+
+#endif // ALIACORDEV1_H
diff --git a/ACORDE/AliGenACORDE.cxx b/ACORDE/AliGenACORDE.cxx
new file mode 100644 (file)
index 0000000..9ac2ea1
--- /dev/null
@@ -0,0 +1,565 @@
+/**************************************************************************
+ * 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$ */
+
+/////////////////////////////////////////////////////////////////////////////
+//
+//  Contain parametrizations to generate atmospheric muons, and also
+//  to generate single muons and muon bundles at surface level.
+//
+//Begin_Html
+/*
+<img src="picts/AliGenACORDEClass.gif">
+</pre>
+<br clear=left>
+<font size=+2 color=red>
+<p>The responsible person for this module is
+<a href="mailto:Enrique.Gamez.Flores@cern.ch">Enrique Gamez</a>.
+</font>
+<pre>
+*/
+//End_Html
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#include "AliGenACORDE.h"
+
+#include <TMCProcess.h>
+#include <TPDGCode.h>
+#include <TClonesArray.h>
+#include <TF1.h>
+#include <TH1F.h>
+
+#include "AliRun.h"
+#include "AliConst.h"
+
+ClassImp(AliGenACORDE)
+
+//_____________________________________________________________________________
+AliGenACORDE::AliGenACORDE()
+  : AliGenerator(),
+    fIpart(0),
+    fCRMode(kSingleMuons),
+    fCRModeName(0),
+    fXwidth(0),
+    fNx(1),
+    fZwidth(0),
+    fNz(1),
+    fMuonGrid(kFALSE),
+    fZenithMin(0),
+    fZenithMax(0),
+    fAzimuthMin(0),
+    fAzimuthMax(0),
+    fPRange(0),
+    fPResolution(1),
+    fAp(0),
+    fMomentumDist(0),
+    fUnfoldedMomentumDist(0),
+    fZenithDist(0),
+    fPDist(0)
+{
+  //
+  // Default ctor.
+  //
+}
+
+//_____________________________________________________________________________
+AliGenACORDE::AliGenACORDE(Int_t npart) 
+  : AliGenerator(npart),
+    fIpart(kMuonMinus),
+    fCRMode(kSingleMuons),
+    fCRModeName(0),
+    fXwidth(0),
+    fNx(1),
+    fZwidth(0),
+    fNz(1),
+    fMuonGrid(kFALSE),
+    fZenithMin(0),
+    fZenithMax(0),
+    fAzimuthMin(0),
+    fAzimuthMax(0),
+    fPRange(0),
+    fPResolution(1),
+    fAp(0),
+    fMomentumDist(0),
+    fUnfoldedMomentumDist(0),
+    fZenithDist(0),
+    fPDist(0)
+{
+  //
+  // Standard ctor.
+  //
+  fName = "ACORDE";
+  fTitle = "Cosmic Muons generator";
+
+  // Set the origin above the vertex, on the surface.
+  fOrigin[0] = 0.;
+  fOrigin[1] = AliACORDEConstants::Instance()->Depth(); // At the surface by default.
+  fOrigin[2] = 0.;
+}
+
+//_____________________________________________________________________________
+AliGenACORDE::AliGenACORDE(const AliGenACORDE& gen)
+  : AliGenerator(gen)
+{
+  //
+  // Copy constructor
+  //
+  gen.Copy(*this);
+}
+
+//_____________________________________________________________________________
+AliGenACORDE& AliGenACORDE::operator=(const AliGenACORDE& gen)
+{
+  //
+  // Asingment operator
+  //
+  gen.Copy(*this);
+  return *this;
+}
+
+//_____________________________________________________________________________
+AliGenACORDE::~AliGenACORDE()
+{
+  //
+  // Default dtor.
+  //
+  if ( fPDist ) {fPDist->Delete(); delete fPDist; fPDist = 0;}
+  if ( fUnfoldedMomentumDist ) delete fUnfoldedMomentumDist;
+  if ( fMomentumDist ) delete fMomentumDist;
+  if ( fAp )           delete fAp;
+  if ( fCRModeName )   delete fCRModeName;
+}
+
+//_____________________________________________________________________________
+void AliGenACORDE::Generate()
+{
+  //
+  // Generate on one trigger
+  // Call the respective method inside the loop for the number
+  // of tracks per trigger.
+
+  for (Int_t i = 0; i < fNpart; i++ ) {
+
+    if ( fCRMode == kMuonBundle ) {
+      this->GenerateOneMuonBundle();
+
+    } else if ( fCRMode == kSingleMuons ) {
+      this->GenerateOneSingleMuon(kTRUE);
+
+    } else {
+      // Generate only single muons following the parametrizations
+      // for atmospheric muons.
+      this->GenerateOneSingleMuon();
+
+    }
+
+  }
+}
+
+//_____________________________________________________________________________
+void AliGenACORDE::Init()
+{
+  //
+  // Initialize some internal methods.
+  //
+
+  // Determine some specific data members.
+  fPRange = TMath::Abs(fPMax-fPMin);
+
+  if ( fCRMode == kSingleMuons ) {
+    fCRModeName = new TString("Single Muons");
+    // Initialisation, check consistency of selected ranges
+    if(TestBit(kPtRange)&&TestBit(kMomentumRange)) 
+      Fatal("Init","You should not set the momentum range and the pt range!");
+    
+    if((!TestBit(kPtRange))&&(!TestBit(kMomentumRange))) 
+      Fatal("Init","You should set either the momentum or the pt range!");
+    
+  } else if ( fCRMode == kMuonBundle ) {
+    fCRModeName = new TString("Muon Bundles");
+
+  } else if ( fCRMode == kMuonFlux ) {
+    fCRModeName = new TString("Muon Fluxes");
+    // Initialize the ditribution functions.
+    this->InitMomentumGeneration();
+    this->InitZenithalAngleGeneration();
+    
+  } else {
+    Fatal("Generate", "Generation Mode unknown!\n");
+
+  }
+
+}
+
+//____________________________________________________________________________
+void AliGenACORDE::GenerateOneSingleMuon(Bool_t withFlatMomentum)
+{
+  //
+  // Generate One Single Muon
+  // This method will generate only one muon.
+  // The momentum will be randomly flat distributed if
+  // the paremeter "withFlatMomentum" is set to kTRUE,
+  // otherwise the momentum will generate acordingly the parametrization
+  // given by 
+  // and adpted from Bruno Alessandro's implementation with the
+  // CERNLIB to AliRoot.
+  // The "withFlatMomentum" parameter also will be used to generate
+  // the muons with a flat Zenithal angle distribution.
+  // Do the smearing here, so that means per track.
+
+  Float_t polar[3]= {0,0,0}; // Polarization parameters
+  Float_t origin[3];
+  Int_t nt;
+  Float_t p[3];
+  Float_t pmom, pt;
+  Float_t random[6];
+
+  // Take the azimuth random.
+  Rndm(random, 2);
+  Float_t azimuth = fAzimuthMin + (fAzimuthMax-fAzimuthMin)*random[0];
+  Float_t zenith = fZenithMin + (fZenithMax - fZenithMin)*random[1];
+
+  if ( withFlatMomentum ) {
+    Rndm(random,3);
+    if(TestBit(kMomentumRange)) {
+      pmom = -( fPMin + random[0]*(fPMax - fPMin) ); // always downwards.
+      pt = pmom*TMath::Sin(zenith*kDegrad);
+    } else {
+      pt = -( fPtMin + random[1]*(fPtMax - fPtMin)); // always downwards.
+      pmom = pt/TMath::Sin(zenith*kDegrad);
+    }
+
+  } else {
+    if ( fMomentumDist ) {
+      pmom = -this->GetMomentum(); // Always downwards.
+    } else {
+      pmom = -fPMin;
+    }
+    zenith = this->GetZenithAngle(pmom);  // In degrees
+    pt = pmom*TMath::Sin(zenith*kDegrad);
+  }
+
+  p[0] = pt*TMath::Sin(azimuth*kDegrad);
+  p[1] = pmom*TMath::Cos(zenith*kDegrad);
+  p[2] = pt*TMath::Cos(azimuth*kDegrad);
+
+  // Finaly the origin, with the smearing
+  Rndm(random,6);
+  origin[0] = AliACORDEConstants::Instance()->Depth()*TMath::Tan(zenith*kDegrad)*
+    TMath::Sin(azimuth*kDegrad)
+    + fOsigma[0]* TMath::Cos(2*random[0]*TMath::Pi())*TMath::Sqrt(-2*TMath::Log(random[1]));
+
+  origin[1] = AliACORDEConstants::Instance()->Depth();
+
+  origin[2] = AliACORDEConstants::Instance()->Depth()*TMath::Tan(zenith*kDegrad)*
+    TMath::Cos(azimuth*kDegrad)
+    + fOsigma[2]* TMath::Cos(2*random[2]*TMath::Pi())*TMath::Sqrt(-2*TMath::Log(random[3]));
+
+  // Put the track on the stack.
+  PushTrack(fTrackIt,-1,fIpart,p,origin,polar,0,kPPrimary,nt);
+
+}
+
+//____________________________________________________________________________
+void AliGenACORDE::GenerateOneMuonBundle()
+{
+  //
+  // Generate One Muon Bundle method
+  // This method will generate a bunch of muons following the
+  // procedure of the AliGenScan class.
+  // These muons will be generated with flat momentum.
+
+  Float_t polar[3]= {0,0,0}; // Polarization parameters
+  Float_t origin[3];
+  Float_t p[3];
+  Int_t nt;
+  Float_t pmom;
+  Float_t random[6];
+
+  Rndm(random, 3);
+  Float_t zenith = fZenithMin + (fZenithMax - fZenithMin)*random[1];
+  Float_t azimuth = fAzimuthMin + (fAzimuthMax-fAzimuthMin)*random[2];
+  //Float_t zenith = 10;
+  //Float_t azimuth = 30;
+
+  // Generate the kinematics a la AliGenScan (Andreas Morchs)
+  Float_t dx, dz;
+  if ( fNx > 0 ) {
+    dx = fXwidth/fNx;
+  } else {
+    dx = 1e10;
+    //dx = 100.;
+  }
+
+  if ( fNz > 0 ) {
+    dz = fZwidth/fNz;
+  } else {
+    dz = 1e10;
+    //dz = 100.;
+  }
+
+  origin[0] = AliACORDEConstants::Instance()->Depth()*TMath::Tan(zenith*kDegrad)*
+              TMath::Sin(azimuth*kDegrad);
+  //origin[0] = 0.;
+  origin[1] = AliACORDEConstants::Instance()->Depth();
+  //origin[1] = 900;
+  origin[2] = AliACORDEConstants::Instance()->Depth()*TMath::Tan(zenith*kDegrad)*
+              TMath::Cos(azimuth*kDegrad);
+    //origin[2] = 0.;
+
+  for (Int_t ix = 0; ix < fNx; ix++ ) {
+    for (Int_t iz = 0; iz < fNz; iz++ ) {
+      Rndm(random,6);
+      origin[0]+=ix*dx+2*(random[1]-0.5)*fOsigma[0];
+      origin[2]+=iz*dz+2*(random[2]-0.5)*fOsigma[2];
+      if ( random[4] < 0.5 ) {
+        origin[0] = -1*origin[0];
+      }
+      if ( random[5] < 0.5 ) {
+        origin[2] = -1*origin[2];
+      }
+
+      pmom = -(fPMin + random[3] *(fPMax - fPMax) ); // Always downwards
+      p[0] = TMath::Sin(zenith*kDegrad)*TMath::Sin(azimuth*kDegrad)*pmom;
+      p[1] = TMath::Cos(zenith*kDegrad)*pmom;
+      p[2] = TMath::Sin(zenith*kDegrad)*TMath::Cos(azimuth*kDegrad)*pmom;
+
+      PushTrack(fTrackIt, -1, fIpart, p, origin, polar, 0, kPPrimary, nt);
+    }
+
+  }
+
+}
+
+//____________________________________________________________________________
+void AliGenACORDE::SetGridRange(Int_t nx,Float_t xwidth, Int_t nz, Float_t zwidth)
+{
+  //
+  // Define the grid
+  // This data shuold be used for Muon bundles generation.
+  //
+  fXwidth=xwidth;
+  fNx=nx;
+  fZwidth=zwidth;
+  fNz=nz;
+
+  // Print a message  about the use, if the Mode has not been set, or
+  // it has to a different Mode.
+  if ( fCRMode != kMuonBundle ) {
+    Warning("SetRange","You have been specified a grid to generate muon bundles, but seems that you haven't choose this generation mode, or you have already select a different one");
+    fMuonGrid = kTRUE;
+  }
+}
+
+//____________________________________________________________________________
+void AliGenACORDE::InitApWeightFactors()
+{
+  //
+  // This factors will be  to correct the zenithal angle distribution
+  // acording the momentum
+
+  //
+  // Fill the array for the flux zenith angle dependence.
+  // at the index 0 of fAp[] will be the "factor" if we have a muon
+  // of 0 GeV.
+  Float_t a[6] = {-1.61, -1.50, -1.28, -0.94, -0.61, -0.22};
+  Float_t p[6] = { 0., 10., 30., 100., 300., 1000.};
+
+  // Get the information from the momentum
+  Int_t pEnd  = TMath::Abs(TMath::Nint(fPMax/fPResolution)) + 1;
+  // Initialize the Array of floats to hold the a(p) factors.
+  fAp = new TArrayF(pEnd);
+  
+  Int_t index = 0;
+
+  for (Int_t i = 0; i < pEnd; i++ ) {
+    Float_t currentP = ((Float_t)i)*fPResolution;
+    if ( currentP < p[1] )                          index = 0;
+    else if ( currentP >= p[1] && currentP < p[2] ) index = 1;
+    else if ( currentP >= p[2] && currentP < p[3] ) index = 2;
+    else if ( currentP >= p[3] && currentP < p[4] ) index = 3;
+    else if ( currentP >= p[4] )                    index = 4;
+
+    Float_t ap = (currentP -p[index])*(a[index+1] - a[index])/
+                 (p[index+1] - p[index]) + a[index];
+    fAp->AddAt(ap, i);
+  }
+
+}
+
+//___________________________________________________________________________
+void AliGenACORDE::InitMomentumGeneration()
+{
+  //
+  // Initialize a funtion to generate the momentum randomly
+  // acording this function.
+  //
+
+  // Check if we nned to initialize the function
+  if ( fPMin != fPMax ) {
+
+    // Check also if the function have been defined yet.
+    if ( !fMomentumDist ) {
+
+      // If not, use this function
+      const char* y      = "log10(x)";
+      
+      const char* h1Coef = "[0]*( %s*%s*%s/2 - (5*%s*%s/2) + 3*%s )";
+      const char* h2Coef = "[1]*( (-2*%s*%s*%s/3) + (3*%s*%s) - 10*%s/3 + 1 )";
+      const char* h3Coef = "[2]*( %s*%s*%s/6 - %s*%s/2 + %s/3 )";
+      const char* s2Coef = "[3]*( %s*%s*%s/3 - 2*%s*%s + 11*%s/3 - 2 )";
+      
+      const char* h = "%s + %s + %s + %s";
+      const char* flux = "pow(10., %s)";
+      const char* normalizedFlux = "0.86*x*x*x*pow(10., %s)";
+      const char* paramNames[4] = {"H1", "H2", "H3", "S1"};
+      
+      char buffer1[1024];
+      char buffer2[1024];
+      char buffer3[1024];
+      char buffer4[1024];
+      char buffer5[1024];
+      char buffer6[1024];
+      char buffer7[1024];
+
+      sprintf(buffer1, h1Coef, y, y, y, y, y, y);
+      sprintf(buffer2, h2Coef, y, y, y, y, y, y);
+      sprintf(buffer3, h3Coef, y, y, y, y, y, y);
+      sprintf(buffer4, s2Coef, y, y, y, y, y, y);
+      
+      sprintf(buffer5, h, buffer1, buffer2, buffer3, buffer4);
+      
+      sprintf(buffer6, flux, buffer5);
+      
+      fMomentumDist = new TF1("fMomentumDist", buffer6, fPMin, fPMax);
+      sprintf(buffer7, normalizedFlux, buffer5);
+      fUnfoldedMomentumDist = new TF1("fUnfoldedMomentumDist", buffer7, fPMin, fPMax);
+      for (Int_t i = 0; i < 4; i++ ) {
+       fMomentumDist->SetParName(i, paramNames[i]);
+       fUnfoldedMomentumDist->SetParName(i, paramNames[i]);
+      }
+      
+      fMomentumDist->SetParameter(0, 0.133);
+      fMomentumDist->SetParameter(1, -2.521);
+      fMomentumDist->SetParameter(2, -5.78);
+      fMomentumDist->SetParameter(3, -2.11);
+
+      fUnfoldedMomentumDist->SetParameter(0, 0.133);
+      fUnfoldedMomentumDist->SetParameter(1, -2.521);
+      fUnfoldedMomentumDist->SetParameter(2, -5.78);
+      fUnfoldedMomentumDist->SetParameter(3, -2.11);
+      
+    }
+
+  }
+
+}
+
+//____________________________________________________________________________
+void AliGenACORDE::InitZenithalAngleGeneration()
+{
+  //
+  // Initalize a distribution function for the zenith angle.
+  // This angle will be obtained randomly acording this function.
+  // The generated angles  will been in degrees.
+
+  // Check if we need to create the function.
+  if ( fZenithMin != fZenithMax ) {
+
+    // Check also if another function have been defined.
+    if ( !fZenithDist ) {
+      
+      // initialize the momentum dependent coefficients, a(p) 
+      this->InitApWeightFactors();
+
+      Int_t pEnd  = TMath::Abs(TMath::Nint(fPMax/fPResolution)) + 1;
+      char name[26];
+      char title[52];
+      fPDist = new TClonesArray("TH1F", pEnd);
+      TClonesArray &mom = *fPDist;
+      TH1F* zenith = 0;
+      Float_t weight = 0;
+      for ( Int_t i = 0; i < pEnd; i++ ) {
+       // Fill the distribution
+       sprintf(name, "zenith%d", i+1);
+       sprintf(title, "Zenith distribution, p=%f", fPMin+(Float_t)i);
+       zenith = new(mom[i]) TH1F(name, title, TMath::Abs(TMath::Nint(fZenithMax-fZenithMin)), TMath::Cos(fZenithMax*TMath::Pi()/180), TMath::Cos(fZenithMin*TMath::Pi()/180));
+
+       // Make a loop for the angle and fill the histogram for the weight
+       Int_t steps = 1000;
+       Float_t value = 0;
+       for (Int_t j = 0; j < steps; j++ ) {
+         value = TMath::Cos(fZenithMin*TMath::Pi()/180) + (Float_t)j * ( TMath::Cos(fZenithMax*TMath::Pi()/180) - TMath::Cos(fZenithMin*TMath::Pi()/180))/1000;
+         weight = 1 + fAp->At(i)*(1 - value);
+         zenith->Fill(value, weight);
+       }
+
+      }
+
+    } 
+
+  }
+
+}
+
+//____________________________________________________________________________
+Float_t AliGenACORDE::GetZenithAngle(Float_t mom) const
+{
+
+  Float_t zenith = 0.;
+  // Check if you need to generate a constant zenith angle.
+  if ( !fZenithDist ) {
+    // Check if you have defined an array of momentum functions
+    if ( fPDist ) {
+      Int_t pIndex = TMath::Abs(TMath::Nint(mom));
+      TH1F* cosZenithAngle = (TH1F*)fPDist->UncheckedAt(pIndex);
+      Float_t tmpzenith = TMath::ACos(cosZenithAngle->GetRandom());
+      // Correct the value
+      zenith = kRaddeg*tmpzenith;
+      return zenith;
+    } else {
+
+      if ( fCRMode != kMuonFlux ) {
+       // If you aren't generating muons obeying any ditribution
+       // only generate a flat zenith angle, acording the input settings
+       Float_t random[2];
+       Rndm(random, 2);
+       zenith = fZenithMin + (fZenithMax - fZenithMin)*random[0];
+
+      } else {
+       // Even if you are generating muons acording some distribution,
+       // but you don't want to ...
+       zenith = fZenithMin;
+
+      }
+
+    }
+  } else {
+    zenith = fZenithDist->GetRandom();
+  }
+
+  return zenith;
+}
+
+//_____________________________________________________________________________
+Float_t AliGenACORDE::GetMomentum() const
+{
+  //
+  //
+  //
+  return fMomentumDist->GetRandom();
+}
diff --git a/ACORDE/AliGenACORDE.h b/ACORDE/AliGenACORDE.h
new file mode 100644 (file)
index 0000000..938a922
--- /dev/null
@@ -0,0 +1,86 @@
+#ifndef ALIGENACORDE_H
+#define ALIGENACORDE_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+#include "AliGenerator.h"
+#include "AliACORDEConstants.h"
+
+class TClonesArray;
+class TF1;
+
+class AliGenACORDE : public AliGenerator {
+ public:
+  AliGenACORDE();
+  AliGenACORDE(Int_t npart);
+  AliGenACORDE(const AliGenACORDE& gen);
+  virtual ~AliGenACORDE();
+
+  AliGenACORDE& operator= (const AliGenACORDE& gen);
+
+  virtual void Init();
+  virtual void Generate();
+  virtual void SetPart(Int_t part) {fIpart = part;}
+
+  void SetMode(ECRMode mode) {fCRMode = mode;}
+  const TString*  GetMode() const {return fCRModeName;}
+
+  void SetZenithalAngleRange(Float_t min,Float_t max=0) {fZenithMin=min;fZenithMax=max;}
+  void SetAzimuthalAngleRange(Float_t min, Float_t max=0) {fAzimuthMin=min;fAzimuthMax=max;}
+
+  void SetGridRange(Int_t nx,Float_t xwidth, Int_t nz, Float_t zwidth);
+  Float_t GetMomentumResolution() const {return fPResolution;}
+
+  void SetMomentumDistrubutionFunction(TF1 *func) {fMomentumDist=func;}
+  void SetZenithalDistributionFunction(TF1 *func) {fZenithDist = func;}
+  void SetMomentumResolution(Float_t res=1.) {fPResolution=res;}
+
+  Float_t GetMomentum() const;
+  Float_t GetZenithAngle(Float_t mom) const;
+
+  // The following methods are for testing pourpuses
+  TF1* GetMomentumDistibution() const {return fMomentumDist;}
+  TF1* GetUnfoldedDistribution() const {return fUnfoldedMomentumDist;}
+
+  TClonesArray* GetArray() const {return fPDist;}
+
+ protected:
+  void InitApWeightFactors();
+  void InitMomentumGeneration();
+  void InitZenithalAngleGeneration();
+  void GenerateOneMuonBundle();
+  void GenerateOneSingleMuon(Bool_t withFlatMomentum=kFALSE);
+
+ private:
+  Int_t    fIpart;              //! Particle type.
+  ECRMode  fCRMode;             //! Cosmic muons generation method flag
+  TString* fCRModeName;         //! Cosmic muons generation mode name
+
+  Float_t  fXwidth;             //! X width of the grid
+  Int_t    fNx;                 //! Number of divisions in x
+  Float_t  fZwidth;             //! Z widht of the  grid
+  Int_t    fNz;                 //! Number of divisions in z
+  Bool_t   fMuonGrid;           //! Flag for method (Muon-bundles) checkout
+
+  Float_t  fZenithMin;          //! Minimum zenithal angle.
+  Float_t  fZenithMax;          //! Maximum zenithal angle.
+
+  Float_t  fAzimuthMin;         //! Minimum azimuthal angle.
+  Float_t  fAzimuthMax;         //! Maximum azimuthal angle.
+
+  Float_t  fPRange;             //! Cosmic muon momentum range width in GeVs.
+  Float_t  fPResolution;        //! Momentum resolution in GeVs.
+
+  TArrayF* fAp;                 //! a(p) correction factors for the ang. dist.
+
+  TF1*     fMomentumDist;       //! Function to generate the momentum dist.
+  TF1*     fUnfoldedMomentumDist; //!
+  TF1*     fZenithDist;         //! Function to generate the zenith angle dist.
+
+  TClonesArray* fPDist;         //! Array of fZenithDist, to be used by a(p).
+
+  ClassDef(AliGenACORDE, 1) // Generator for AliACORDE class
+};
+#endif // ALIGENACORDE_H
diff --git a/ACORDE/Config.C b/ACORDE/Config.C
new file mode 100644 (file)
index 0000000..43af15c
--- /dev/null
@@ -0,0 +1,423 @@
+static Int_t    eventsPerRun = 100;
+enum PprGeo_t 
+{
+    kHoles, kNoHoles
+};
+static PprGeo_t geo = kHoles;
+
+void Config()
+{
+    // 7-DEC-2000 09:00
+    // Switch on Transition Radiation simulation. 6/12/00 18:00
+    // iZDC=1  7/12/00 09:00
+    // ThetaRange is (0., 180.). It was (0.28,179.72) 7/12/00 09:00
+    // Theta range given through pseudorapidity limits 22/6/2001
+
+
+
+
+    // Set Random Number seed
+    // gRandom->SetSeed(12345);
+    TDatime dt;
+    UInt_t curtime=dt.Get();
+    UInt_t procid=gSystem->GetPid();
+    UInt_t seed=curtime-procid;
+    gRandom->SetSeed(seed);
+    cerr<<"Seed for random number generation= "<<seed<<endl; 
+    cout<<"Seed for random number generation= "<<seed<<endl;
+
+
+    new     AliGeant3("C++ Interface to Geant3");
+
+    if (!gSystem->Getenv("CONFIG_FILE"))
+    {
+        TFile  *rootfile = new TFile("galice.root", "recreate");
+
+        rootfile->SetCompressionLevel(2);
+    }
+
+    TGeant3 *geant3 = (TGeant3 *) gMC;
+
+    //
+    // Set External decayer
+    AliDecayer *decayer = new AliDecayerPythia();
+
+    decayer->SetForceDecay(kAll);
+    decayer->Init();
+    gMC->SetExternalDecayer(decayer);
+    //
+    //
+    //=======================================================================
+    // ******* GEANT STEERING parameters FOR ALICE SIMULATION *******
+    geant3->SetTRIG(1);         //Number of events to be processed 
+    geant3->SetSWIT(4, 10);
+    geant3->SetDEBU(0, 0, 1);
+    //geant3->SetSWIT(2,2);
+    geant3->SetDCAY(1);
+    geant3->SetPAIR(1);
+    geant3->SetCOMP(1);
+    geant3->SetPHOT(1);
+    geant3->SetPFIS(0);
+    geant3->SetDRAY(0);
+    geant3->SetANNI(1);
+    geant3->SetBREM(1);
+    geant3->SetMUNU(1);
+    geant3->SetCKOV(1);
+    geant3->SetHADR(4);         //Select pure GEANH (HADR 1) or GEANH/NUCRIN (HADR 3)
+    geant3->SetLOSS(2);
+    geant3->SetMULS(1);
+    geant3->SetRAYL(1);
+    geant3->SetAUTO(1);         //Select automatic STMIN etc... calc. (AUTO 1) or manual (AUTO 0)
+    geant3->SetABAN(0);         //Restore 3.16 behaviour for abandoned tracks
+    geant3->SetOPTI(2);         //Select optimisation level for GEANT geometry searches (0,1,2)
+    geant3->SetERAN(5.e-7);
+
+    Float_t cut = 1.e-3;        // 1MeV cut by default
+    Float_t tofmax = 1.e10;
+
+    //             GAM ELEC NHAD CHAD MUON EBREM MUHAB EDEL MUDEL MUPA TOFMAX
+    geant3->SetCUTS(cut, cut, cut, cut, cut, cut, cut, cut, cut, cut,
+                    tofmax);
+    //
+    //=======================================================================
+    // ************* STEERING parameters FOR ALICE SIMULATION **************
+    // --- Specify event type to be tracked through the ALICE setup
+    // --- All positions are in cm, angles in degrees, and P and E in GeV
+    if (gSystem->Getenv("CONFIG_NPARTICLES"))
+    {
+        int     nParticles = atoi(gSystem->Getenv("CONFIG_NPARTICLES"));
+    } else
+    {
+        int     nParticles = 50;
+    }
+
+    AliGenACORDE *gener = new AliGenACORDE(); // One generation per event
+    //TF1* zenithFunc = new TF1("zenith","1/cos(x)", 0. 65.);
+    //gener->SetZenithalDistributionFunction(zenithFunc);
+    //Float_t tend = 65.*TMath::Pi()/180.;
+    //TF1* momFunc = new TF1("momFunc", "x", 10., 1000.);
+    //gener->SetMomentumDistrubutionFunction(momFunc);
+    gener->SetZenithalAngleRange(0., 65.);
+    gener->SetAzimuthalAngleRange(0., 359.);
+    gener->SetMomentumResolution(1.); // GeVs
+    gener->SetSigma(0,0,0); // Sigma for smearing
+    gener->SetMomentumRange(10., 1000.); // in GeVs.
+
+    gener->SetPart(kMuonMinus);
+    // Two choices:
+    //           kMuonMinus
+    //           kMuonPlus
+
+    //gener->SetMode(kSingleMuons);// Single muons
+    //gener->SetMode(kMuonBundle);
+    gener->SetMode(kMuonFlux);
+    // three choises
+    //          kSingleMuons
+    //          kMuonBundle
+    //          kMuonFlux  <- Not available, yet
+
+    // If you choose kMuonBundle, you should set how many particles do you
+    // want and in wich region should the muons be generated, for instance
+    // if you want to generate n^2 muons, in a square of side 300 cm
+    //gener->SetRange(4, 300., 4, 300.);
+
+    //gener->SetVertexSmear(kPerEvent); // Set the smearing per Event
+
+    gener->Init(); // Intialize the generator.
+
+    // Set the tracking limits to include the Molasse
+    gAlice->TrackingLimits( 5000, 5000);
+
+    // 
+    // Activate this line if you want the vertex smearing to happen
+    // track by track
+    //
+    //gener->SetVertexSmear(perTrack); 
+    // Field (L3 0.4 T)
+    AliMagFMaps* field = new AliMagFMaps("Maps","Maps", 2, 1., 10., 1);
+    rootfile->cd();
+    gAlice->SetField(field);    
+
+
+    Int_t   iABSO  =  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   iPHOS  =  0;
+    Int_t   iPIPE  =  0;
+    Int_t   iPMD   =  0;
+    Int_t   iHMPID  =  0;
+    Int_t   iSHIL  =  0;
+    Int_t   iT0 =  0;
+    Int_t   iTOF   =  0;
+    Int_t   iTPC   =  0;
+    Int_t   iTRD   =  0;
+    Int_t   iZDC   =  0;
+    Int_t   iEMCAL =  0;
+    Int_t   iACORDE   =  1;
+    Int_t   iVZERO =  0;
+
+    //=================== Alice BODY parameters =============================
+    AliBODY *BODY = new AliBODY("BODY", "Alice envelop");
+
+    if (iMAG)
+    {
+        //=================== MAG parameters ============================
+        // --- Start with Magnet since detector layouts may be depending ---
+        // --- on the selected Magnet dimensions ---
+        AliMAG *MAG = new AliMAG("MAG", "Magnet");
+    }
+
+
+    if (iABSO)
+    {
+        //=================== ABSO parameters ============================
+        AliABSO *ABSO = new AliABSOv0("ABSO", "Muon Absorber");
+    }
+
+    if (iDIPO)
+    {
+        //=================== DIPO parameters ============================
+
+        AliDIPO *DIPO = new AliDIPOv2("DIPO", "Dipole version 2");
+    }
+
+    if (iHALL)
+    {
+        //=================== HALL parameters ============================
+
+        AliHALL *HALL = new AliHALL("HALL", "Alice Hall");
+    }
+
+
+    if (iFRAME)
+    {
+        //=================== FRAME parameters ============================
+
+        AliFRAMEv2 *FRAME = new AliFRAMEv2("FRAME", "Space Frame");
+       if (geo == kHoles) {
+           FRAME->SetHoles(1);
+       } else {
+           FRAME->SetHoles(0);
+       }
+    }
+
+    if (iSHIL)
+    {
+        //=================== SHIL parameters ============================
+
+        AliSHIL *SHIL = new AliSHILv2("SHIL", "Shielding Version 2");
+    }
+
+
+    if (iPIPE)
+    {
+        //=================== PIPE parameters ============================
+
+        AliPIPE *PIPE = new AliPIPEv0("PIPE", "Beam Pipe");
+    }
+    if(iITS) {
+
+    //=================== ITS parameters ============================
+    //
+    // As the innermost detector in ALICE, 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 Aliroot.
+    //
+    // Detailed geometries:         
+    //
+    //
+    //AliITS *ITS  = new AliITSv5symm("ITS","Updated ITS TDR detailed version with symmetric services");
+    //
+    //AliITS *ITS  = new AliITSv5asymm("ITS","Updates ITS TDR detailed version with asymmetric services");
+    //
+       AliITSvPPRasymm *ITS  = new AliITSvPPRasymm("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(kFALSE);                                         // don't touch this parameter if you're not an ITS developer
+    //    ITS->SetWriteDet("$ALICE_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
+       //
+    //AliITSvPPRsymm *ITS  = new AliITSvPPRsymm("ITS","New ITS PPR detailed version with symmetric services");
+    //ITS->SetMinorVersion(2);                                       // don't touch this parameter if you're not an ITS developer
+    //ITS->SetReadDet(kFALSE);                                       // don't touch this parameter if you're not an ITS developer
+    //ITS->SetWriteDet("$ALICE_ROOT/ITS/ITSgeometry_vPPRsymm2.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 !):
+    //                                                     
+    //
+    //AliITSvPPRcoarseasymm *ITS  = new AliITSvPPRcoarseasymm("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
+    //
+    //AliITS *ITS  = new AliITSvPPRcoarsesymm("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 ================================
+        // --- This allows the user to specify sectors for the SLOW (TPC geometry 2)
+        // --- Simulator. SecAL (SecAU) <0 means that ALL lower (upper)
+        // --- sectors are specified, any value other than that requires at least one 
+        // --- sector (lower or upper)to be specified!
+        // --- Reminder: sectors 1-24 are lower sectors (1-12 -> z>0, 13-24 -> z<0)
+        // ---           sectors 25-72 are the upper ones (25-48 -> z>0, 49-72 -> z<0)
+        // --- SecLows - number of lower sectors specified (up to 6)
+        // --- SecUps - number of upper sectors specified (up to 12)
+        // --- Sens - sensitive strips for the Slow Simulator !!!
+        // --- This does NOT work if all S or L-sectors are specified, i.e.
+        // --- if SecAL or SecAU < 0
+        //
+        //
+        //-----------------------------------------------------------------------------
+
+        //  gROOT->LoadMacro("SetTPCParam.C");
+        //  AliTPCParam *param = SetTPCParam();
+        AliTPC *TPC = new AliTPCv2("TPC", "Default");
+
+        // All sectors included 
+        TPC->SetSecAL(-1);
+        TPC->SetSecAU(-1);
+
+    }
+
+
+    if (iTOF) {
+       if (geo == kHoles) {
+        //=================== TOF parameters ============================
+           AliTOF *TOF = new AliTOFv2FHoles("TOF", "TOF with Holes");
+       } else {
+           AliTOF *TOF = new AliTOFv4T0("TOF", "normal TOF");
+       }
+    }
+
+
+    if (iHMPID)
+    {
+        //=================== HMPID parameters ===========================
+        AliHMPID *HMPID = new AliHMPIDv3("HMPID", "normal HMPID");
+
+    }
+
+
+    if (iZDC)
+    {
+        //=================== ZDC parameters ============================
+
+        AliZDC *ZDC = new AliZDCv2("ZDC", "normal ZDC");
+    }
+
+    if (iTRD)
+    {
+        //=================== TRD parameters ============================
+
+        AliTRD *TRD = new AliTRDv1("TRD", "TRD slow simulator");
+
+        // Select the gas mixture (0: 97% Xe + 3% isobutane, 1: 90% Xe + 10% CO2)
+        TRD->SetGasMix(1);
+       if (geo == kHoles) {
+           // With hole in front of PHOS
+           TRD->SetPHOShole();
+           // With hole in front of HMPID
+           TRD->SetHMPIDhole();
+       }
+           // Switch on TR
+           AliTRDsim *TRDsim = TRD->CreateTR();
+    }
+
+    if (iFMD)
+    {
+        //=================== FMD parameters ============================
+       AliFMD *FMD = new AliFMDv1("FMD", "normal FMD");
+        FMD->SetRingsSi1(256);
+        FMD->SetRingsSi2(128);
+        FMD->SetSectorsSi1(20);
+        FMD->SetSectorsSi2(40);      
+   }
+
+    if (iMUON)
+    {
+        //=================== MUON parameters ===========================
+
+        AliMUON *MUON = new AliMUONv1("MUON", "default");
+    }
+    //=================== PHOS parameters ===========================
+
+    if (iPHOS)
+    {
+        AliPHOS *PHOS = new AliPHOSv1("PHOS", "IHEP");
+    }
+
+
+    if (iPMD)
+    {
+        //=================== PMD parameters ============================
+        AliPMD *PMD = new AliPMDv1("PMD", "normal PMD");
+    }
+
+    if (iT0)
+    {
+        //=================== T0 parameters ============================
+        AliT0 *T0 = new AliT0v1("T0", "T0 Detector");
+    }
+
+    if (iEMCAL)
+    {
+        //=================== EMCAL parameters ============================
+        AliEMCAL *EMCAL = new AliEMCALv1("EMCAL", "EMCALArch1a");
+    }
+
+     if (iACORDE)
+    {
+        //=================== ACORDE parameters ============================
+        //AliACORDE *ACORDE = new AliACORDEv0("ACORDE", "normal ACORDE");
+       AliACORDE* ACORDE = new AliACORDEv1("ACORDE", "Special version Only with the ACORDE");
+    }
+
+     if (iVZERO)
+    {
+        //=================== ACORDE parameters ============================
+        AliVZERO *VZERO = new AliVZEROv2("VZERO", "normal VZERO");
+    }
+
+}
+
+Float_t EtaToTheta(Float_t arg){
+  return (180./TMath::Pi())*2.*atan(exp(-arg));
+}
diff --git a/ACORDE/DrawACORDE.C b/ACORDE/DrawACORDE.C
new file mode 100644 (file)
index 0000000..6a19b1c
--- /dev/null
@@ -0,0 +1,19 @@
+void DrawACORDE()
+{
+   gMC->Gsatt("*", "seen", -1);
+   gMC->Gsatt("alic", "seen", 0);
+   gROOT->LoadMacro("ViewACORDE.C");
+   gInterpreter->ProcessLine("ViewACORDE()");
+   //gMC->Gdopt("proj", "pers");
+   gMC->Gdopt("hide", "on");
+   gMC->Gdopt("shad", "on");
+   gMC->Gsatt("*", "fill", 7);
+   gMC->SetClipBox(".");
+   gMC->SetClipBox("ALIC", 0, 3000, -3000, 3000, -6000, 6000);
+   gMC->DefaultRange();
+   gMC->Gdraw("alic", 30, 40, 0, 10, 9.5, .0095, .0095);
+   //gMC->Gdraw("alic", 30, 40, 0, -30, -60, .09, .09); //Zoom right side
+   //gMC->Gdraw("alic", 30, 30, 0, 10, -10, .03, .03); // Zoom right side
+   gMC->Gdhead(1111, "View of ACORDE (ACORDE)");
+   gMC->Gdman(18, 4, "MAN");
+}
diff --git a/ACORDE/ViewACORDE.C b/ACORDE/ViewACORDE.C
new file mode 100644 (file)
index 0000000..08593c8
--- /dev/null
@@ -0,0 +1,25 @@
+void ViewACORDE()
+{
+   gMC->Gsatt("ALIC","seen",0);
+
+   gMC->Gsatt("L3MO","seen",0); // L3 Magnet, Mother
+   gMC->Gsatt("L3CO","seen",1); // Coils
+   gMC->Gsatt("L3C1","seen",1); // Coils
+   gMC->Gsatt("L3YO","seen",1); // Yoke
+   gMC->Gsatt("L3DO","seen",0); // return Yoke (DOOR)
+   gMC->Gsatt("L3FR","seen",1); // DOOR
+   gMC->Gsatt("L3IR","seen",0); // Inner layer
+   gMC->Gsatt("L3O1","seen",1); // Door opening
+   gMC->Gsatt("L3O2","seen",1); // Door opening
+
+   gMC->Gsatt("ACORDE1", "seen", 0); // ACORDE Mother
+   gMC->Gsatt("ACORDE2", "seen", 0); // Module air box
+   gMC->Gsatt("ACORDE3", "seen", 1); // Scintillators
+   gMC->Gsatt("ACORDE3", "colo", 2); // Scintillators
+   gMC->Gsatt("ACORDE4", "seen", 1); // Aluminium frame (long bars)
+   gMC->Gsatt("ACORDE4", "colo", 3); //
+   gMC->Gsatt("ACORDE5", "seen", 1); // Aluminium frame (short bars)
+   gMC->Gsatt("ACORDE5", "colo", 3); //
+   gMC->Gsatt("ACORDE6", "seen", 1); // Module support
+   gMC->Gsatt("ACORDE6", "colo", 3); //
+}
diff --git a/ACORDE/libACORDE.pkg b/ACORDE/libACORDE.pkg
new file mode 100644 (file)
index 0000000..b385f55
--- /dev/null
@@ -0,0 +1,6 @@
+SRCS = AliACORDE.cxx AliACORDEConstants.cxx AliACORDEv0.cxx AliACORDEdigit.cxx \
+       AliACORDEhit.cxx AliGenACORDE.cxx AliACORDEv1.cxx AliACORDEModule.cxx
+
+HDRS:= $(SRCS:.cxx=.h)
+
+DHDR:=ACORDELinkDef.h