The CES (Central Electromagnetic Strips)or
Shower Maximum Detector is located at 7 radiation lengths
inside the CEM (Central Electromagnetic Calorimeter)and is
designed to determine the position as well as the
transverse development of the shower. It does that by measuring
the charge deposition on orthogonal strips (in
the Z direction) and wires (in the Phi direction). Here are
some useful parameters related to the CES (taken from
"The CDF Central Electromagnetic Calorimeter", Nucl.Instr.
and Methods A 267 (1988) 272-279):
Radius from the beam line | 183.9 cm |
Wire Channels (64) | |
Section 1 | 121.2 cm from the 90º edge |
Wires | 32 x 1.45484 cm |
Section 2 | 121.2-239.6 cm from the 90º edge |
Wires | 32 x 1.45484 cm |
Strip Channels (128) | |
Section 1 | 6.2-121.2 cm from the 90º edge |
Strips | 69 x 1.67 cm |
Section 2 | 121.2-239.6 cm from the 90º edge |
Strips | 59 x 2.01 cm |
Total Thickness | 0.75 in. |
0.069 radiation lengths | |
0.022 absorption lengths | |
Gas | 95%/5% Ar/CO2 |
*** If you want to jump to examples right away, go to section 5. ***
Name of package Contents
-StripChamberGeometry
Classes that access and build the CES geometry. It also contains
all the local to global (as well as local to strips units) transformations
(see class ScWedge).
-ShowerMax
Classes that contains all the algorithms used in the clustering (mainly
StripCollectionMaker and
CesClusterMaker).See Section 4
for a description of these algorithms.
-CalorObjects
The strip object classes (
CesCluster and
CesClusterColl)are kept
here. See Section 3 for a detailed description of the objects.
-ShowerMaxMods
The module that builds the CES objects (CesClusterColl)
, i.e.
CentralStripClusterModule is kept here.
There are 2 types ofCES
objects: the streamable CesCluster object,
whichcontains all the strips information, and
the storable
CesClusterCollobject, which is a collection of
CesClusterobjects. A brief description of the
objects is given below:
3.1- CesCluster
This is a streamable object inheriting
from the abstract class ShowerMaxCluster. The
accessor function from the base class are:
float
clusterWidth() width of the cluster(from
fit)
Detector
region ()
???
float
energy()
raw energy of the cluster
float
localCoord() fitted position
of the local coordinate of the cluster
float
globalCoord() global coordinate ofthe
cluster (Z for the strips, Phi for the wires)
int
module()
phi wedge of the cluster
int
side()
barrel of the cluster (0=west, 1=east)
int
view()
0=wire cluster, 1=strip cluster
Other accessor functions:
float raw_position()
raw local coordinate of the cluster (Z for the strip cluster, X for thewire
cluster)
float fitted_position()
fitted local coordinate of the cluster (Z for the strip cluster, X forthe
wire cluster)
float global_position()
global coordinate of the cluster (Z for the strip cluster, Phi for thewire
cluster)
float raw_energy()
raw energy of the cluster
float fitted_energy()
fitted energy of the cluster
float chi2()
chi2 of the strip OR the wire cluster
float width()
width of the strip OR the wire cluster
float width_error()
error on the width of the strip OR the wire cluster
float dist_track_cluster()
distance track cluster (for track based clusters only)
uint2 first_element()
first strip/wire nr in the strip/wire cluster
uint2 number_elements()
number of strips/wires in the strip/wire cluster
const vector<ScStrip> strips()
vector of strips which make the strip cluster (see ScStrip for all theaccessors)
const vector<ScWire> wires()
vector of strips which make the strip cluster (see ScWire for all the accessors)
3.2- CesClusterColl
This is a storable object which contains
a collection of CesClusters. There are 2 classes of clusters (see Section
4). The
Track-based clusters, which are seeded by a track andtheStrip-based
(or unbiased) clusters, which are seeded by a strip.
These 2 types of clusters are sorted out in the collection
with the help of a description string:
"Track_based_seed
" for the track based cluster
"Strip_based_seed
" for the strip based cluster
See Section 5, for examples on how to access these clusters.
4-Strip Clustering: strategies and algorithms
There
are two types of clustering algorithm, as far as the CES is concerned:
- the "track-based" algorithm is designed mostly for charge electromagnetic
particles (mostly electrons) and finds the seed of
the cluster usingthe extrapolation
of a track to the CES radius.
- the "strip
based" or "unbiased" CES clustering is basically the runI
Stpana algorithm. It sorts the strips/wires by decreasing
energy and seedsthe cluster
with the highest energy strip.
These two algorithms build a collection
of strips/wires which is stored in a vector (ScStrip or ScWire, in StripChamberGeometry)
and passed by reference
to the do_cluster
method in
CesClusterMaker (in ShowerMax). Therefore,the actual clustering
algorithm is
the same in the2 cases;
the only difference is the strips/wires included in the collection.
The clustering method computes the cluster
energy and positionand
performs a fit to a standard profile (the fit is based on a quadraticinterpolation.
See CDF Note 1329, "DEFINITION
OF CES CHISQUARE"),inorder
to correct the position of the cluster.
4.1 - Track based algorithm:
The algorithm starts by extrapolating
a track to the CES radius (method extrapolate_track
in
StripCollectionMaker). It records the
X and Z coordinatesofthe
track in the CES local coordinate system and forms the collectionby
-Finding
the strip which is hit (toStripsUnits in ScWedge (StripChamberGeometry).
-Adding
N strips (this number is tunable in the tcl file, see Section 5)around the
strip hit.
Once the collection
is formed, it is passed by reference to the cluster maker. With this algorithm,
each track in the event (which passes some
Pt and eta cuts,set in
the tcl file) has an associated cluster.
4.2 - Strip based algorithm:
This is the runI Stpana algorithm.
The method findStripSeed
sorts the strips/wires by decreasing energy and tags as seed strip/wireall
the
strips above a certain
energy threshold (adjustable in the tcl file). The strip/wire collectionis
then formed by gathering N strips around the seed
strip in the method
get_seed_based_strips.All the strips belonging
to a clusters are tagged and removed from theremaining collection of strips
(so in this algorithma
strip cannot belong to 2 clusters, unlike the previous one).
5- Examples
5.1 - How to checkout, compile, link and run the CentralStripClusterModule
Here is the basic steps to do in order to run the clustering module:
>newrel -t development ces
>cd ces
>addpkg -h ShowerMaxMods
>gmake
>cd ShowerMaxMods
>../bin/IRIX6-KCC_3_3/Cesana < run_Cesana.tcl > logfile
Remark: right now the Ces code is not validated, so if you want the gmake to build the executable, you have to add the line
BINS = Cesana in the GNUmakefile
Parameters in the tcl file:
Parameter Name | Description | Default |
printStripsCes | Print collection of strips | 0 |
seedThrsCes | Seed energy threshold for the strips/wires | 0.15 |
stripThrsCes | Energy threshold for each strip/wire in the collection | 0.15 |
numberWiresCes | Number of wires in the collection | 11 |
numberStripsCes | Number of strips in the collection | 11 |
Collection_strategy | 0=strip based algorithm 1=track based algorithm 2=both |
2 |
PtminCes | Minimum Pt for the track seeding the cluster | 1 |
EtaminCes | Minimum pseudorapidity for the track seeding the cluster | -1.2 |
EtamaxCes | Maximum pseudorapidity for the track seeding the cluster | 1.2 |
printCluster | print parameters of the cluster | 0 |
seedCThrs | Seed energy threshold for the cluster | 0.15 |
stripCThrs | Energy threshold for every strip/wire in the cluster | 0.15 |
numberCWires | Number of wires in the cluster | 11 |
numberCStrips | Number of strips in the cluster | 11 |
Chi2Min | Maximum Chi2 of the cluster | 100 |
5.2 - Different ways to find CesClusters in a dst file
If you want to access all the clusters in the event, the easiest way is:
for (EventRecord::ConstIterator ci(record,"CesClusterColl");ci.is_valid();++ci) {
ConstHandle<CesClusterColl> ch(ci);
for (CesClusterColl::const_iterator cc0=ch->contents().begin();cc0!=ch->contents().end();cc0++) {
// Find local coordinate of the cluster
float coord0 = cl0.localCoord();
}
If you want to access a specific cluster collection, you can do the following:
std::string description = "Track_based_seed";
CesClusterColl_ch cesClusterColl_ch;
StorableObject::SelectByDescription selector( description );
EventRecord::ConstIterator iter( theEvent, selector );
if(iter.is_invalid()){
cerr << "Error: could not find CES cluster collection" << endl;
return AppResult::OK;
}
cesClusterColl_ch = CesClusterColl_ch(iter);
const CesClusterColl::CesClusterVector cesClusters = cesClusterColl_ch->contents();
... and then loop over the Ces vector
For the strip based seed, replace with:
std::string description = "Strip_based_seed";
or, easier, use the find method:
std::string description = "Track_based_seed";
CesClusterColl::Error cesStatus = CesClusterColl::find(anEvent,description);
if (cesStatus == CesClusterColl::ERROR){
cerr << "Error in JetExampleModule: could not find jet collection" << endl;
return AppResult::ERROR;
}
const CesClusterColl::CesClusterVector cesClusters = cesColl_ch->contents();
5.3 - How to perform some basic transformations
Say you have found the local coordinate of the cluster: xces in the module m, barrel b and you want to know what is
the corresponding phi in the CDF coordinate system; here is what you do:
// Initialize geometry for CES
const AbsScDetectorNode *theScDetector=CdfDetector::instance()->getScDetector();
const CdfScWedgeSet *myWedgeSet=theScDetector->getWedgeSet();
// Local coordinate of the cluster
float x_ces = ciCesCluster->fitted_z_strip();
ScWedgeCode waferCode (ciCesCluster->side(),ciCesCluster->module());
CdfScWedgeSet::ConstIterator ww=myWedgeSet->find(waferCode);
if (ww!=myWedgeSet->end()) {
HepPoint3D pos = (*ww).getGlobalPositionVector(x_ces,unsigned(0));
double phi_ces=pos.phi();
}
// Get the strip/wire number corresponding to the intersection of the track with the CES
StripCollectionMaker StripCol;
// Get the extrapolated position of the track
int match = StripCol.extrapolate_track(theTrack);
int stripNo,wireNo;
if(match){ // if the track extrapolates to a physical region of the CES
float zloc= StripCol.get_Zlocal();
float xloc= StripCol.get_Xlocal();
int mod = StripCol.getModule(); int sid = StripCol.getSide();
const AbsScDetectorNode *theScDetector=CdfDetector::instance()->getScDetector();
const CdfScWedgeSet *myWedgeSet=theScDetector->getWedgeSet();
ScWedgeCode waferCode (mod,sid);
CdfScWedgeSet::ConstIterator ww=myWedgeSet->find(waferCode);
if (ww!=myWedgeSet->end()) {
stripNo = (*ww).toStripUnits(zloc,unsigned(0)); // Bad convention 0=strip but 1=strip cluster...
wireNo = (*ww).toStripUnits(xloc,unsigned(1));
}
}
6 - Validation plots
These plots have been produced with the executable CentralStripClusterTest (except
the plot from commissioning run data).
Single 5 GeV electrons
Single 10 GeV electrons
Single 15 GeV electrons
J/Psi -> e e
t - tbar
(NEW) Data: 1 x 8 store (from conversion)
Commissioning run data (from conversion)
Some other plots of interest:
CES efficiency from run I (Steve Kulhman)
Strip clusters in (ieta, iphi) (Andrea Bocci)
View of a strip and a wire cluster from Joe's event display (Joe Boudreau)
Last update: 9/03/01 by Michael Riveline