MINOS data structure

I. ADAMO Subschema: MINOS Geometry

/* This .ddl file describes the detector configuration for the gminos program (GEANT & MINOS).

The RSet's have not yet been specified ....

*/

SUBSCHEMA MINOSGeom : 'Detector configuration'

  AUTHOR     'Robert Hatcher'
  VERSION    '1.7'
  DATE       '1997.10.20'
  REVIEWER   'no one (yet)'
      
/*


Some terminology:

Plane
The plane is the basic building block of the detector. Planes come in two forms: active (detector) and passive (absorber). The list of currently implemented active planes are: The list of possible absorber planes is: Planes are identified by their key type (L,F,R,T or A,B,C...) and an instance value. The instance character (1..9,A..Z) is used to distinguish between different geometries (eg. different plate thickness, etc) for planes of the same type. The instance '*' is used to set default values for a given key type, but no real (constructed) volume is allowed to use '*' as its instance. GEANT volume names for planes are then given by the (key,instance) and 'PL', as in L1PL, F2PL, B9PL, or RAPL.
Module
A module is given by the ordering of NAPlnMdl passive planes each followed by an active plane. Skipping a passive plane or an active plane can be accomplished by specifying an appropriate K or T plane. Each active plane may undergo one of 4 standard rotations.
Supermodule
The supermodule is a collection of identical modules, with the possibility of empty space up- and downstream of the first and last module. Any magnetic field winding coils necessary for B planes are also contained in this volume; the instance number of the B planes determines both the field map and the coil placement (and thus all B planes in a given supermodule must have identical values).
The active planes have a sub-structure. A given plane kiPL (k=key,i=instance) actually serves as a clipping region (and thus probably should be designated with a tracking medium of air). The components are inserted by a routine Fill_LST_PL(chpl,..), Fill_FLS_PL(chpl,..), or Fill_RPC_PL(chpl,..), as appropriate. The current method involves inserting a box into the plane; sub-dividing the box into extrusions; inserting components into the extrusions. Later, alternative methods of inserting individual extrusions directly into the plane may be explored. By convention a plane is normally constructed with "wires"/"fibers" (the cell axis) running along the x direction and extrusions and cell numbers increasing in y. This will often be referred to as an 'X plane'. Such generic planes are then rotated by -90° (Y), +45° (U), -45° (V) to get the other orientations.
Plane (PL)
The Plane erves as an overall clipping volume.
Division Box (BX)
The Division box is a rectangular box that can be divided along the y axis;
this division can not be done on the Plane if it is an octogon.
Extrusion (XT)
The Extrusion epresents the gas tight sleeve (LST,RPC).
Comb (CB)
The comb serves as a base plate and finger material.
Cell (CL)
Cell volumes displace the comb material;
Cells are the regions in which hits are generated/recorded.
Cover (CV)
The Cover is optional; it is a plane sheet of material. In the RPC it serves as the second plate.
As the specification of the guts of a extrusion are refined, this structure may change.


Define some new 'types'.

*/

  DEFINE ATTRIBUTE

    RotmType = CHA4 'X'|'Y'|'U'|'V'|'N'   :'legal rotation types';
      /* X: cell axis parallel to X axis */
      /* Y: cell axis parallel to Y axis */
      /* U, V: like X,Y rotated 45 deg clockwise (as viewed along +z) */
      /* N: no rotation - equivalent to X */

    GlobalPos = REAL                      :'global co-ordinate';

    ShapeName = CHA4 'BOX '|'TUBE'|'PGON' 
                                    :'restricted list of GEANT shapes';
    OnlyType  = CHA4 'ONLY'|'MANY'  :'GSPOS flag';

  END ATTRIBUTE

/*


The ESet GeomMisc holds assorted single variables related to the geometry.

*/

  DEFINE ESET 

    GeomMisc =
      ( NearFar     = INTE        : '-1=Near 1=Far',
        NSupmdl     = INTE [1,15] : 'number of supermodules',
        VMARS(3)    = REAL        : 'half-lengths (cm) of "world"',
                                   /* MAster Reference System */
        VHall(3)    = REAL        : 'half-lengths (cm) of hall volume',
        LINRThick   = REAL        : 'thickness (cm) of hall "liner"'
      );

/*


The ESet SuperModule contains the information concerning the organization and placement of an entire supermodule. The ESet MdlOrg specifies the ordering of planes within a module. By placing this information in a table separate from the SuperModule ESet, we can allow a completely arbitrary number of planes in a module. There remains built into the structure the requirement that planes be paired passive followed by an active. The index key ISupInMdl serves as an index for picking out the type given the pair of values (ISup,InMdl); since all modules in a super-module are identical in form that value is unnecessary in order to determine the plane type.

*/

    SuperModule =
      ( NActvPln   = INTE         : '# of active planes in supermodule',
                                    /* NActvPln must be NMdl* NAPlnMdl */
        NAPlnMdl   = INTE [1,16]  : '# active planes per module',
        NMdl       = INTE [1,300] : '# of modules in supermodule',
        CoilSet    = INTE         : 'arrangement of coils',
        CoilI      = REAL         : 'scale factor for B field (-1=focus mu-)',
                                    /* assumed to scale as coil current */
        SupX0      = REAL         : 'X offset (cm) s-m from hall centerline',
        SupY0      = REAL         : 'Y offset (cm) s-m from hall centerline',
        UpSpace    = REAL         : 'space (cm) upstream of first module',
        DnSpace    = REAL         : 'space (cm) downstream of last module',
        Xmin       = GlobalPos    : 'minimum X (cm) of containment box',
        Xmax       = GlobalPos    : 'maximum X (cm) of containment box',
        Ymin       = GlobalPos    : 'minimum Y (cm) of containment box',
        Ymax       = GlobalPos    : 'maximum Y (cm) of containment box',
        Zmin       = GlobalPos    : 'minimum Z (cm) of containment box',
        Zmax       = GlobalPos    : 'maximum Z (cm) of containment box'
      );
 
    MdlOrg =
      ( ISup        = INTE [1,15] : 'super-module #',
        InMdl       = INTE [1,16] : 'index in *Module*',
        PasvType    = CHA4        : 'type (key,inst) of each passive plane',
        ActvType    = CHA4        : 'type (key,inst) of each active plane',
        ActvRotm    = RotmType    : 'rotation of active plane'
                                   /* the rotation is one of X,Y,U,V */
      ) : 'the ordering of planes in a module'
      KEY
        ISupInMdl   = (ISup,InMdl) : 'key for indexing';
      END KEY;
/*


The ESet PlanePos collects together the z placement of the planes. For purposes of this table they are grouped as pairs of passive and active planes. The table should be ordered in z and the ID number corresponds to the global numbering scheme: 1, 2, ... number of active planes in the detector. The GEANT hierarchial numbering scheme (of Supermodule,module,in_module) is explicitly given as well. The Rotm variable is included for convience.

*/

    PlanePos =
      ( ISuper      = INTE [1,15]  : 'supermodule number',
        IModule     = INTE [1,300] : 'module number',
        InMdl       = INTE [1,16]  : 'pasv/actv plane pair in module',
	PairZmin    = GlobalPos    : 'upstream extent of pair',
        PairZmax    = GlobalPos    : 'downstream extent (including air gap)',
        PasvName    = CHA4         : 'name of passive plane',
        XYPasv(2)   = GlobalPos    : 'X/Y (cm) center of passive plane',
        ZFrntPasv   = GlobalPos    : 'Z (cm) front face of passive plane',
        ActvName    = CHA4         : 'name of active plane',
        XYActv(2)   = GlobalPos    : 'X/Y (cm) center of active plane',
        ZFrntActv   = GlobalPos    : 'Z (cm) front face of active plane',
        Rotm        = CHA4         : 'rotation of active plane'
      ) : 'position/orientation of the planes'
      KEY
        IndxSMI     = (ISuper,IModule,InMdl) : 'index for regular ordering';
      END KEY;

/*


The ESet CellPos records the placement of cells in an active plane relative to the plane center and in the nominal "X" orientation.

*/

    CellPos =
      ( PlnName       = CHA4    : 'name of active plane',
	IExtr         = INTE    : 'extrusion number',
	ICell         = INTE    : 'cell number',
	XYZReadout(3) = REAL    : 'position of readout end',
	XYZFarend(3)  = REAL    : 'position of far end'
      ) : 'cell positions relative to plane center'
      KEY
        CellIndex   = (PlnName,IExtr,ICell) : 'key for indexing';
      END KEY;

/*


The ESet PlaneSpec represents the information concerning the generic plane of a (key,instance) pair. The overall geometry of the plane is recorded, along with sufficient information to retrieve information stored by cell (ie. hits). A minimal specification of the cell geometry is kept.

For composite planes (eg. active planes) AbsLen, RadLen, Density should be averages of the components of the extrusion; this should allow analysis code to depend on these quantities rather than things such as absolute numbers of planes, etc.

*/

    PlaneSpec =
      ( PlnName     = CHA4        : 'plane name (ie. key,instance,PL)',
        Shape       = ShapeName   : 'GEANT shape name',
        Width       = REAL        : 'face-to-face width of plane (cm)',
        Length      = REAL        : 'height of plane (cm)',
        Thickness   = REAL        : 'z thickness of plane (cm)',
        AirGap(2)   = REAL        : 'z space necessary up&down stream (cm)',
                                    /* to allow for wavy-ness */
        TMedium     = CHA4        : 'tracking medium',
                                    /* first 4 characters of a medium */
        BMap        = INTE [0,*]  : 'associated magnetic field map',
        DigiType    = INTE [0,3]  : 'hit/digit 0=none,1=LST,2=FLS,3=RPC',
        AbsLen      = REAL        : '(average) absorption length (cm)',
        RadLen      = REAL        : '(average) radiation length (cm)',
        Density     = REAL        : '(average) density (g/cm**3)',
        NExtru      = INTE [0,*]  : '# of extrusion in the plane',
        NCell       = INTE [0,*]  : '# of cells in each extrusion',
        CellWidth   = REAL        : 'transverse size of cell volume (cm)',
        CellThick   = REAL        : 'z depth of cell volume (cm)',
        CoverSide   = INTE [-1,1] : 'open side of comb',
        NGSVol      = INTE [1,10] : 'max len of GSVOLU parameter array',
        GSVol(10)   = REAL        : 'GSVOLU specification array',
        NLevel      = INTE [0,9]  : '# of added levels to specify cell',
        NamePth(9)  = CHA4        : 'name path to cell',
        NumbPth(9)  = INTE [0,*]  : 'max # of each level in path to cell'
      ); 

/*


The ESet BeamSystem describes the position of the beam used and the flags that co-ordinate the generation of events.

*/

    BeamSystem =
      ( X0          = REAL        : 'X origin of beam in world system',
        Y0          = REAL        : 'Y origin of beam in world system',
        Z0          = REAL        : 'Z origin of beam in world system',
	dXdZ        = REAL        : 'dx/dz slope of beam',
        dYdZ        = REAL        : 'dy/dz slope of beam',
        KineMethod  = INTE        : 'interaction generator method',
                              /* 0 = user supplied code          */
                              /* 1 = read StdHep file            */
                              /* 2 = Soudan2 cross sections, etc */
        FluxMethod  = INTE        : 'neutrino flux method',
                              /* 0 = energy pulled from histograms (far) */
                              /* 1 = Miller/Mufson flux files */
                              /* 2 = Hylen gbeam ntuple files */
	FluxFile    = CH64        : 'identifying file name'
      );

/*


The ESet SubVolSpec and SubVolPos represents the information concerning the components inserted into plane volumes. This gives a full accounting of the details concerning active plane components; as might be necessary to distinguish between, say, a LST plane constructed with a plastic comb vs. an aluminum one.

*/

    SubVolSpec =
      ( VolName     = CHA4        : 'volume name',
        Shape       = ShapeName   : 'GEANT volume shape',  
        TMedium     = CHA4        : 'tracking medium',
                                    /* first 4 characters of a medium */
        NGSVol      = INTE [1,10] : 'max len of GSVOLU parameter array',
        GSVol(10)   = REAL        : 'GSVOLU specification array'
      );

    SubVolPos =
      ( VolName     = CHA4        : 'daughter volume name',
        ICopy       = INTE [1,*]  : 'copy number',
        VolMother   = CHA4        : 'volume name of mother',
        XPos        = REAL        : 'x pos of daughter 0 in mother frame',
        YPos        = REAL        : 'y pos of daughter 0 in mother frame',
        ZPos        = REAL        : 'z pos of daughter 0 in mother frame',
        IRot        = INTE        : 'rotation matrix number',
        Only        = OnlyType    : 'only/many flag'
      );

/*


The ESet CoilTube represents the information concerning coil winding volumes.

*/
    CoilTube =
      ( ISuper      = INTE [1,15] : 'super module #',
        Name        = CHA4        : 'volume name',
        ICopy       = INTE        : 'copy number',
        ITreeDepth  = INTE        : 'high # volumes supercede lower ones',
        XYZ1(3)     = GlobalPos   : 'position of one end',
        XYZ2(3)     = GlobalPos   : 'position of other end',
        OuterRadius = REAL        : 'outer radius of cylinder (annulus)',
        InnerRadius = REAL        : 'inner radius of annulus',
        TMedium     = CHA4        : 'tracking medium',
                                    /* first 4 characters of a medium */
        Zmin        = GlobalPos   : 'absolute minimum Z',
        Zmax        = GlobalPos   : 'absolute maximum Z'
                                    /* these can be generous (for sorting) */
      ) : 'volume associated with winding coil'; 

  END ESET

  DEFINE RSET

/*


The RSet

*/
    (PlanePos [1,1] -> [1,*] PlaneSpec BY PasvSpec)
       : 'point to the PlaneSpec for the Passive plane of pair';

    (PlanePos [1,1] -> [1,*] PlaneSpec BY ActvSpec)
       : 'point to the PlaneSpec for the Active plane of pair';


  END RSET

/*
*/

END SUBSCHEMA


hatcher@astro.indiana.edu
- updated Mon Feb 23 18:43:35 EST 1998 -