ROOT logo
/*************************************************************************
 * Copyright(c) 2004, 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$ */
/**
 * @file    AliFMDBaseDigit.cxx
 * @author  Christian Holm Christensen <cholm@nbi.dk>
 * @date    Mon Mar 27 12:37:41 2006
 * @brief   Digits for the FMD 
 * @ingroup FMD_base
 */
//////////////////////////////////////////////////////////////////////
//
//  Digits classes for the FMD                
//
//  Digits consists of
//   - Detector #
//   - Ring ID                                             
//   - Sector #     
//   - Strip #
//   - ADC count in this channel                                  
//
//  Digits consists of
//   - Detector #
//   - Ring ID                                             
//   - Sector #     
//   - Strip #
//   - Total energy deposited in the strip
//   - ADC count in this channel                                  
//
// As the Digits and SDigits have so much in common, the classes
// AliFMDDigit and AliFMDSDigit are implemented via a base
// class AliFMDBaseDigit.
///
//              +-----------------+
//              | AliFMDBaseDigit |
//              +-----------------+
//                      ^
//                      |
//                +------------+
//                |            |
//      +-------------+ +--------------+
//      | AliFMDDigit |	| AliFMDSDigit |
//      +-------------+	+--------------+
//
// (Note, that I'd really would have liked to implement AliFMDHit as a
// derived class from some base class - say AliFMDStrip, and the Digit
// classes would (eventually) have derived from that as well.
// However, ROOT doesn't do well with multiple inheritance, so I chose
// not to anyway).
//
// Latest changes by Christian Holm Christensen
//
//////////////////////////////////////////////////////////////////////

#include "AliFMDBaseDigit.h"	// ALIFMDDIGIT_H
#include "AliFMDStripIndex.h"
#include "Riostream.h"		// ROOT_Riostream
// #include <TString.h>
// #include <AliLog.h>
#include "AliFMDDebug.h" // Better debug macros

//====================================================================
using std::cout;
using std::flush;
ClassImp(AliFMDBaseDigit)
#if 0
  ; // This is here to keep Emacs from indenting the next line
#endif

//____________________________________________________________________
AliFMDBaseDigit::AliFMDBaseDigit()
  : fDetector(0), 
    fRing('\0'), 
    fSector(0), 
    fStrip(0), 
    fName("")
{
  // 
  // CTOR 
  //
}

//____________________________________________________________________
AliFMDBaseDigit::AliFMDBaseDigit(UShort_t detector, 
				 Char_t   ring, 
				 UShort_t sector, 
				 UShort_t strip)
  : AliDigit(), 
    fDetector(detector), 
    fRing(ring), 
    fSector(sector), 
    fStrip(strip),
    fName("")
{
  //
  // Creates a base data digit object
  //
  // Parameters 
  //
  //    detector  Detector # (1, 2, or 3)                      
  //    ring	  Ring ID ('I' or 'O')
  //    sector	  Sector # (For inner/outer rings: 0-19/0-39)
  //    strip	  Strip # (For inner/outer rings: 0-511/0-255)
}

//____________________________________________________________________
AliFMDBaseDigit::AliFMDBaseDigit(Int_t*   tracks, 
				 UShort_t detector, 
				 Char_t   ring, 
				 UShort_t sector, 
				 UShort_t strip)
  : AliDigit(tracks), 
    fDetector(detector), 
    fRing(ring), 
    fSector(sector), 
    fStrip(strip),
    fName("")
{
  //
  // Creates a base data digit object
  //
  // Parameters 
  //
  //    tracks    Array of 3 track labels
  //    detector  Detector # (1, 2, or 3)                      
  //    ring	  Ring ID ('I' or 'O')
  //    sector	  Sector # (For inner/outer rings: 0-19/0-39)
  //    strip	  Strip # (For inner/outer rings: 0-511/0-255)
}

//____________________________________________________________________
void
AliFMDBaseDigit::Print(Option_t* /* option*/) const 
{
  // Print digit to standard out 
  cout << ClassName() << ": FMD" << fDetector << fRing 
       << '[' << std::setw(2) << fSector 
       << ',' << std::setw(3) << fStrip << ']' << flush;
}

//____________________________________________________________________
const char*
AliFMDBaseDigit::GetName() const 
{ 
  // Get the name of a FMD digit.
  if (fName.IsNull()) 
    fName = Form("FMD%d%c[%2d,%3d]", fDetector, fRing, fSector, fStrip);
  return fName.Data();
}
#define fMaxStrips  512
#define fMaxSectors 40
#define fMaxRings   2

//____________________________________________________________________
ULong_t
AliFMDBaseDigit::Hash() const
{
  // Calculate a hash value based on the detector coordinates. 
#if 1  
  return AliFMDStripIndex::Pack(fDetector, fRing, fSector, fStrip);
#else
  size_t ringi = (fRing == 'I' ||  fRing == 'i' ? 0 : 1);
  return fStrip + fMaxStrips * 
    (fSector + fMaxSectors * (ringi + fMaxRings * (fDetector - 1)));
#endif
}


//____________________________________________________________________
Int_t
AliFMDBaseDigit::Compare(const TObject* o) const
{
  // Compare to other digit.  If the passed pointer to TObject does
  // not point to an object of class AliFMDBaseDigit (or one of it's
  // derived classes), then a fatal exception is made. 
  // 
  // Returns -1, if this object's detector coordinates are smaller
  // than passed object's detector coordinates. 
  // 
  // Returns  0, if this object's detector coordinates is the same as
  // passed object's detector coordinates.  
  // 
  // Returns  1, if this object's detector coordinates are larger
  // than passed object's detector coordinates. 
  if (!o) 
    AliFatal("Can not compare to NULL!");
  if (o->IsA() != AliFMDBaseDigit::Class()) 
    AliFatal(Form("Cannot compare to a %s object", o->ClassName()));
  // AliFMDBaseDigit* of = static_cast<AliFMDBaseDigit*>(o);
  if (Hash() == o->Hash()) return 0;
  if (Hash() < o->Hash()) return -1;
  return 1;
}

//____________________________________________________________________
void
AliFMDBaseDigit::AddTrack(Int_t track)
{
  // 
  // Add a track referenc
  // 
  // Parameters:
  //    trackno The track number
  //  
  if      (fTracks[0] == -1) fTracks[0] = track;
  else if (fTracks[1] == -1) fTracks[1] = track;
  else if (fTracks[2] == -1) fTracks[2] = track;
  else 
    AliFMDDebug(1, ("While adding track label to %s for %s: "
		    "All 3 track labels used, can't add "
		    "reference to track %d",
		    ClassName(), GetName(), track));
}

//____________________________________________________________________
UShort_t
AliFMDBaseDigit::GetNTrack() const
{
  // 
  // Get the number of track references (max 3)
  // 
  // 
  // Return:
  //    Number of valid track references. 
  //
  for (Int_t i = 3; i > 0; i--) 
    if (fTracks[i-1] != -1) return i;
  return 0;
}


//____________________________________________________________________
//
// EOF
//
 AliFMDBaseDigit.cxx:1
 AliFMDBaseDigit.cxx:2
 AliFMDBaseDigit.cxx:3
 AliFMDBaseDigit.cxx:4
 AliFMDBaseDigit.cxx:5
 AliFMDBaseDigit.cxx:6
 AliFMDBaseDigit.cxx:7
 AliFMDBaseDigit.cxx:8
 AliFMDBaseDigit.cxx:9
 AliFMDBaseDigit.cxx:10
 AliFMDBaseDigit.cxx:11
 AliFMDBaseDigit.cxx:12
 AliFMDBaseDigit.cxx:13
 AliFMDBaseDigit.cxx:14
 AliFMDBaseDigit.cxx:15
 AliFMDBaseDigit.cxx:16
 AliFMDBaseDigit.cxx:17
 AliFMDBaseDigit.cxx:18
 AliFMDBaseDigit.cxx:19
 AliFMDBaseDigit.cxx:20
 AliFMDBaseDigit.cxx:21
 AliFMDBaseDigit.cxx:22
 AliFMDBaseDigit.cxx:23
 AliFMDBaseDigit.cxx:24
 AliFMDBaseDigit.cxx:25
 AliFMDBaseDigit.cxx:26
 AliFMDBaseDigit.cxx:27
 AliFMDBaseDigit.cxx:28
 AliFMDBaseDigit.cxx:29
 AliFMDBaseDigit.cxx:30
 AliFMDBaseDigit.cxx:31
 AliFMDBaseDigit.cxx:32
 AliFMDBaseDigit.cxx:33
 AliFMDBaseDigit.cxx:34
 AliFMDBaseDigit.cxx:35
 AliFMDBaseDigit.cxx:36
 AliFMDBaseDigit.cxx:37
 AliFMDBaseDigit.cxx:38
 AliFMDBaseDigit.cxx:39
 AliFMDBaseDigit.cxx:40
 AliFMDBaseDigit.cxx:41
 AliFMDBaseDigit.cxx:42
 AliFMDBaseDigit.cxx:43
 AliFMDBaseDigit.cxx:44
 AliFMDBaseDigit.cxx:45
 AliFMDBaseDigit.cxx:46
 AliFMDBaseDigit.cxx:47
 AliFMDBaseDigit.cxx:48
 AliFMDBaseDigit.cxx:49
 AliFMDBaseDigit.cxx:50
 AliFMDBaseDigit.cxx:51
 AliFMDBaseDigit.cxx:52
 AliFMDBaseDigit.cxx:53
 AliFMDBaseDigit.cxx:54
 AliFMDBaseDigit.cxx:55
 AliFMDBaseDigit.cxx:56
 AliFMDBaseDigit.cxx:57
 AliFMDBaseDigit.cxx:58
 AliFMDBaseDigit.cxx:59
 AliFMDBaseDigit.cxx:60
 AliFMDBaseDigit.cxx:61
 AliFMDBaseDigit.cxx:62
 AliFMDBaseDigit.cxx:63
 AliFMDBaseDigit.cxx:64
 AliFMDBaseDigit.cxx:65
 AliFMDBaseDigit.cxx:66
 AliFMDBaseDigit.cxx:67
 AliFMDBaseDigit.cxx:68
 AliFMDBaseDigit.cxx:69
 AliFMDBaseDigit.cxx:70
 AliFMDBaseDigit.cxx:71
 AliFMDBaseDigit.cxx:72
 AliFMDBaseDigit.cxx:73
 AliFMDBaseDigit.cxx:74
 AliFMDBaseDigit.cxx:75
 AliFMDBaseDigit.cxx:76
 AliFMDBaseDigit.cxx:77
 AliFMDBaseDigit.cxx:78
 AliFMDBaseDigit.cxx:79
 AliFMDBaseDigit.cxx:80
 AliFMDBaseDigit.cxx:81
 AliFMDBaseDigit.cxx:82
 AliFMDBaseDigit.cxx:83
 AliFMDBaseDigit.cxx:84
 AliFMDBaseDigit.cxx:85
 AliFMDBaseDigit.cxx:86
 AliFMDBaseDigit.cxx:87
 AliFMDBaseDigit.cxx:88
 AliFMDBaseDigit.cxx:89
 AliFMDBaseDigit.cxx:90
 AliFMDBaseDigit.cxx:91
 AliFMDBaseDigit.cxx:92
 AliFMDBaseDigit.cxx:93
 AliFMDBaseDigit.cxx:94
 AliFMDBaseDigit.cxx:95
 AliFMDBaseDigit.cxx:96
 AliFMDBaseDigit.cxx:97
 AliFMDBaseDigit.cxx:98
 AliFMDBaseDigit.cxx:99
 AliFMDBaseDigit.cxx:100
 AliFMDBaseDigit.cxx:101
 AliFMDBaseDigit.cxx:102
 AliFMDBaseDigit.cxx:103
 AliFMDBaseDigit.cxx:104
 AliFMDBaseDigit.cxx:105
 AliFMDBaseDigit.cxx:106
 AliFMDBaseDigit.cxx:107
 AliFMDBaseDigit.cxx:108
 AliFMDBaseDigit.cxx:109
 AliFMDBaseDigit.cxx:110
 AliFMDBaseDigit.cxx:111
 AliFMDBaseDigit.cxx:112
 AliFMDBaseDigit.cxx:113
 AliFMDBaseDigit.cxx:114
 AliFMDBaseDigit.cxx:115
 AliFMDBaseDigit.cxx:116
 AliFMDBaseDigit.cxx:117
 AliFMDBaseDigit.cxx:118
 AliFMDBaseDigit.cxx:119
 AliFMDBaseDigit.cxx:120
 AliFMDBaseDigit.cxx:121
 AliFMDBaseDigit.cxx:122
 AliFMDBaseDigit.cxx:123
 AliFMDBaseDigit.cxx:124
 AliFMDBaseDigit.cxx:125
 AliFMDBaseDigit.cxx:126
 AliFMDBaseDigit.cxx:127
 AliFMDBaseDigit.cxx:128
 AliFMDBaseDigit.cxx:129
 AliFMDBaseDigit.cxx:130
 AliFMDBaseDigit.cxx:131
 AliFMDBaseDigit.cxx:132
 AliFMDBaseDigit.cxx:133
 AliFMDBaseDigit.cxx:134
 AliFMDBaseDigit.cxx:135
 AliFMDBaseDigit.cxx:136
 AliFMDBaseDigit.cxx:137
 AliFMDBaseDigit.cxx:138
 AliFMDBaseDigit.cxx:139
 AliFMDBaseDigit.cxx:140
 AliFMDBaseDigit.cxx:141
 AliFMDBaseDigit.cxx:142
 AliFMDBaseDigit.cxx:143
 AliFMDBaseDigit.cxx:144
 AliFMDBaseDigit.cxx:145
 AliFMDBaseDigit.cxx:146
 AliFMDBaseDigit.cxx:147
 AliFMDBaseDigit.cxx:148
 AliFMDBaseDigit.cxx:149
 AliFMDBaseDigit.cxx:150
 AliFMDBaseDigit.cxx:151
 AliFMDBaseDigit.cxx:152
 AliFMDBaseDigit.cxx:153
 AliFMDBaseDigit.cxx:154
 AliFMDBaseDigit.cxx:155
 AliFMDBaseDigit.cxx:156
 AliFMDBaseDigit.cxx:157
 AliFMDBaseDigit.cxx:158
 AliFMDBaseDigit.cxx:159
 AliFMDBaseDigit.cxx:160
 AliFMDBaseDigit.cxx:161
 AliFMDBaseDigit.cxx:162
 AliFMDBaseDigit.cxx:163
 AliFMDBaseDigit.cxx:164
 AliFMDBaseDigit.cxx:165
 AliFMDBaseDigit.cxx:166
 AliFMDBaseDigit.cxx:167
 AliFMDBaseDigit.cxx:168
 AliFMDBaseDigit.cxx:169
 AliFMDBaseDigit.cxx:170
 AliFMDBaseDigit.cxx:171
 AliFMDBaseDigit.cxx:172
 AliFMDBaseDigit.cxx:173
 AliFMDBaseDigit.cxx:174
 AliFMDBaseDigit.cxx:175
 AliFMDBaseDigit.cxx:176
 AliFMDBaseDigit.cxx:177
 AliFMDBaseDigit.cxx:178
 AliFMDBaseDigit.cxx:179
 AliFMDBaseDigit.cxx:180
 AliFMDBaseDigit.cxx:181
 AliFMDBaseDigit.cxx:182
 AliFMDBaseDigit.cxx:183
 AliFMDBaseDigit.cxx:184
 AliFMDBaseDigit.cxx:185
 AliFMDBaseDigit.cxx:186
 AliFMDBaseDigit.cxx:187
 AliFMDBaseDigit.cxx:188
 AliFMDBaseDigit.cxx:189
 AliFMDBaseDigit.cxx:190
 AliFMDBaseDigit.cxx:191
 AliFMDBaseDigit.cxx:192
 AliFMDBaseDigit.cxx:193
 AliFMDBaseDigit.cxx:194
 AliFMDBaseDigit.cxx:195
 AliFMDBaseDigit.cxx:196
 AliFMDBaseDigit.cxx:197
 AliFMDBaseDigit.cxx:198
 AliFMDBaseDigit.cxx:199
 AliFMDBaseDigit.cxx:200
 AliFMDBaseDigit.cxx:201
 AliFMDBaseDigit.cxx:202
 AliFMDBaseDigit.cxx:203
 AliFMDBaseDigit.cxx:204
 AliFMDBaseDigit.cxx:205
 AliFMDBaseDigit.cxx:206
 AliFMDBaseDigit.cxx:207
 AliFMDBaseDigit.cxx:208
 AliFMDBaseDigit.cxx:209
 AliFMDBaseDigit.cxx:210
 AliFMDBaseDigit.cxx:211
 AliFMDBaseDigit.cxx:212
 AliFMDBaseDigit.cxx:213
 AliFMDBaseDigit.cxx:214
 AliFMDBaseDigit.cxx:215
 AliFMDBaseDigit.cxx:216
 AliFMDBaseDigit.cxx:217
 AliFMDBaseDigit.cxx:218
 AliFMDBaseDigit.cxx:219
 AliFMDBaseDigit.cxx:220
 AliFMDBaseDigit.cxx:221
 AliFMDBaseDigit.cxx:222
 AliFMDBaseDigit.cxx:223
 AliFMDBaseDigit.cxx:224
 AliFMDBaseDigit.cxx:225
 AliFMDBaseDigit.cxx:226
 AliFMDBaseDigit.cxx:227
 AliFMDBaseDigit.cxx:228
 AliFMDBaseDigit.cxx:229
 AliFMDBaseDigit.cxx:230
 AliFMDBaseDigit.cxx:231
 AliFMDBaseDigit.cxx:232
 AliFMDBaseDigit.cxx:233
 AliFMDBaseDigit.cxx:234
 AliFMDBaseDigit.cxx:235
 AliFMDBaseDigit.cxx:236
 AliFMDBaseDigit.cxx:237
 AliFMDBaseDigit.cxx:238
 AliFMDBaseDigit.cxx:239
 AliFMDBaseDigit.cxx:240
 AliFMDBaseDigit.cxx:241
 AliFMDBaseDigit.cxx:242
 AliFMDBaseDigit.cxx:243
 AliFMDBaseDigit.cxx:244
 AliFMDBaseDigit.cxx:245
 AliFMDBaseDigit.cxx:246
 AliFMDBaseDigit.cxx:247