ROOT logo
/**************************************************************************
* 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$

//-----------------------------------------------------------------------------
/// \class AliMUONVDigit
///
/// This is the base class of a MUON digit that most client code should deal with.
/// There should be no reason to have to use a concrete class in most cases.
///
/// All digits have basic features, like :
///
/// - a way to identify it : detection element, electronics card and
///   channel, cathode. Note that some static methods exists to compact 
///   those 4 informations into a single 4 bytes integer (stored in the
///   fUniqueID data member present in all TObjects). 
///
/// - its charge
///
/// - a set of boolean methods to indicate whether the digit has been calibrated, etc...
///
/// In addition, if HasMCInformation is true, the digit store also the list
/// of MC tracks that contributed to its charge
///
/// Also, if HasGeometryInformation is true, the digit knows the position and
/// the (half) dimensions (in cm) of the pad it corresponds to.
///
/// Note 1.
///
/// Please note that IsCalibrated and IsChargeInFC are two 
/// concepts closely related, but not equivalent, at least for SDigits.
///
/// For instance a SDigit can have its charge in fC but not being calibrated.
///
/// { SDigits coming from a simulation are yet to be merged (i.e. the
///   SDigitStore can contain several SDigits objects per channel), so, while
///   their charge is in femto-coulomb, they are not calibrated (e.g. pedestal
///   is not subtracted yet). }
///
/// Conversely, a calibrated (s)digit always has its charge in fC.
///
/// \author Laurent Aphecetche, Subatech
//-----------------------------------------------------------------------------

#include "AliMUONVDigit.h"

#include <Riostream.h>
#include <TClass.h>

using std::cout;
using std::endl;
using std::setw;
/// \cond CLASSIMP
ClassImp(AliMUONVDigit)
/// \endcond

//_____________________________________________________________________________
AliMUONVDigit::AliMUONVDigit(Int_t detElemId, Int_t eCardId,
                             Int_t eCardChannel, Int_t cathode)
: TObject() 
{
  /// Normal constructor for trigger digits
  SetUniqueID(BuildUniqueID(detElemId,eCardId,eCardChannel,cathode));
}

//_____________________________________________________________________________
AliMUONVDigit::AliMUONVDigit()
: TObject() 
{
  /// Default ctor
}

//_____________________________________________________________________________
AliMUONVDigit::~AliMUONVDigit()
{
  /// dtor
}

//_____________________________________________________________________________
Bool_t 
AliMUONVDigit::IsEqual(const TObject* object) const
{
  /// Whether we're equal to object. 
  /// WARNING : only based on our identifiers (de,manu,channel,cathode), not our
  /// content (i.e. charge, status...)
  
  const AliMUONVDigit* d = static_cast<const AliMUONVDigit*>(object);
    
  return ( DetElemId() == d->DetElemId() &&
           Cathode() == d->Cathode() &&
           ManuId() == d->ManuId() &&
           ManuChannel() == d->ManuChannel() );
}

//_____________________________________________________________________________
Int_t 
AliMUONVDigit::Compare(const TObject* object) const
{
  /// Compare two digits, trying to get as complete an order as possible.
  /// We sort by DE, then by charge, then by manu, etc...
  ///
  const AliMUONVDigit* d = static_cast<const AliMUONVDigit*>(object);
  
  if ( DetElemId() > d->DetElemId() ) 
  {
    return 1;
  }
  else if ( DetElemId() < d->DetElemId() )
  {
    return -1;
  }
  else
  {
    if ( Charge() > d->Charge() )
    {
      return 1;
    }
    else if ( Charge() < d->Charge() )
    {
      return -1;
    }
    else
    {
      if ( ManuId() > d->ManuId() )
      {
        return 1;
      }
      else if ( ManuId() < d->ManuId() )
      {
        return -1;
      }
      else
      {
        if ( ManuChannel() > d->ManuChannel() )
        {
          return 1;
        }
        else if ( ManuChannel() < d->ManuChannel() )
        {
          return -1;
        }
      }
    }
  }
  return 0;
}

//_____________________________________________________________________________
UInt_t 
AliMUONVDigit::BuildUniqueID(Int_t detElemId, Int_t manuId, 
                             Int_t manuChannel, Int_t cathode)
{
  /// Build a single integer with id information
  return ( ( detElemId ) | ( manuId << 12 ) | ( manuChannel << 24 )
                | ( cathode << 30 ) );
}

//_____________________________________________________________________________
Int_t
AliMUONVDigit::DetElemId(UInt_t uniqueID)
{
  /// Return detection element id part of the uniqueID
  return uniqueID & 0xFFF;
}

//_____________________________________________________________________________
Int_t
AliMUONVDigit::ManuChannel(UInt_t uniqueID)
{
  /// Return manuChannel part of the uniqueID
  return ( uniqueID & 0x3F000000 ) >> 24;
}

//_____________________________________________________________________________
Int_t
AliMUONVDigit::ManuId(UInt_t uniqueID)
{
  /// Return manuId part of the uniqueID
  return ( uniqueID & 0xFFF000 ) >> 12;
}

//_____________________________________________________________________________
Int_t
AliMUONVDigit::Cathode(UInt_t uniqueID)
{
  /// Return the cathode part of the uniqueID
  return ( uniqueID & 0x40000000 ) >> 30;
}

//_____________________________________________________________________________
void
AliMUONVDigit::DecodeUniqueID(UInt_t uniqueID,
                              Int_t& detElemId, Int_t& manuId, 
                              Int_t& manuChannel, Int_t& cathode)
{
  /// Unpack uniqueID into 4 elements
  detElemId = DetElemId(uniqueID);
  manuId = ManuId(uniqueID);
  manuChannel = ManuChannel(uniqueID);
  cathode = Cathode(uniqueID);
}

//_____________________________________________________________________________
const char*
AliMUONVDigit::GetName() const
{
  /// Return the name of this digit, composed of its id parts.
  return Form("DE%04d-%04d-%02d-%d",
              DetElemId(),ManuId(),ManuChannel(),Cathode());
}

//_____________________________________________________________________________
void
AliMUONVDigit::Print(Option_t* opt) const
{
  /// Dump to screen.
  ///
  /// If opt=="tracks", info on tracks are printed too.
  /// 
  /// The last part of the printout indicated the status of the digit :
  /// (S) means that digit is saturated
  /// (C) means that digit has been calibrated
  /// [fC] means that digit's charge is in femto-coulombs (fC)
  /// (U) means that digit is part of (has been used in) a cluster
  /// (+) is noise-only digit (added by the simulation)
  /// (X) has the IsConverted flag on (e.g. has been embedded)
  
  TString options(opt);
  options.ToLower();

  if ( options.Contains("zs") )
  {
    if ( IsCalibrated() && Charge() <= 0 )
    {
      return;
    }
    
    if ( !IsCalibrated() && ADC() <= 0 )
    {
      return;
    }
  }
  
  cout << Form("<%s>: ID %12u DE %4d Cath %d (Ix,Iy)=(%3d,%3d) (Manu,Channel)=(%4d,%2d)"
               ", Charge=%7.2f",
               ClassName(),GetUniqueID(),
               DetElemId(),Cathode(),PadX(),PadY(),ManuId(),ManuChannel(),Charge());  
  
  
  if ( IsSaturated() ) 
  {
    cout << "(S)";
  }
  else
  {
    cout << "   ";
  }
  
  if ( IsCalibrated() )
  {
    cout << "(C)";
  }
  else
  {
    cout << "   ";
  }

  if ( IsChargeInFC() )
  {
    cout << "[fC]";
  }
  else
  {
    cout << "    ";
  }
  
  if ( IsUsed() )
  {
    cout << "(U)";
  }
  else
  {
    cout << "   ";
  }
  
  if ( IsNoiseOnly() )
  {
    cout << "(+)";
  }
  else
  {
    cout << "   ";
  }
  
  if ( IsConverted() )
  {
    cout << "(X)";
  }
  else
  {
    cout << "   ";
  }
    
  cout << Form(" ADC=%4d",ADC());
  
  if ( IsCalibrated() )
  {
    // StatusMap is not set before calibration has occured (e.g.
    // SDigits cannot have it meaningfully filled)
    cout << Form(" StatusMap=%04x",StatusMap());    
  }

  if ( options.Contains("tracks") && HasMCInformation() )
  {
    cout << " Hit " << setw(3) << Hit();
    Int_t ntracks = Ntracks();
    if (ntracks) 
    {
      cout << " Tracks : " << setw(2) << ntracks;
      for ( Int_t i = 0; i < ntracks; ++i )
      {
        cout << " Track(" << i << ")=" << setw(3) << Track(i)
        << " Charge(" << i << ")=" << setw(5) << TrackCharge(i);
      }
    }
    else
    {
      cout << " no track info.";
    }
  }
  cout << endl;  
}
 AliMUONVDigit.cxx:1
 AliMUONVDigit.cxx:2
 AliMUONVDigit.cxx:3
 AliMUONVDigit.cxx:4
 AliMUONVDigit.cxx:5
 AliMUONVDigit.cxx:6
 AliMUONVDigit.cxx:7
 AliMUONVDigit.cxx:8
 AliMUONVDigit.cxx:9
 AliMUONVDigit.cxx:10
 AliMUONVDigit.cxx:11
 AliMUONVDigit.cxx:12
 AliMUONVDigit.cxx:13
 AliMUONVDigit.cxx:14
 AliMUONVDigit.cxx:15
 AliMUONVDigit.cxx:16
 AliMUONVDigit.cxx:17
 AliMUONVDigit.cxx:18
 AliMUONVDigit.cxx:19
 AliMUONVDigit.cxx:20
 AliMUONVDigit.cxx:21
 AliMUONVDigit.cxx:22
 AliMUONVDigit.cxx:23
 AliMUONVDigit.cxx:24
 AliMUONVDigit.cxx:25
 AliMUONVDigit.cxx:26
 AliMUONVDigit.cxx:27
 AliMUONVDigit.cxx:28
 AliMUONVDigit.cxx:29
 AliMUONVDigit.cxx:30
 AliMUONVDigit.cxx:31
 AliMUONVDigit.cxx:32
 AliMUONVDigit.cxx:33
 AliMUONVDigit.cxx:34
 AliMUONVDigit.cxx:35
 AliMUONVDigit.cxx:36
 AliMUONVDigit.cxx:37
 AliMUONVDigit.cxx:38
 AliMUONVDigit.cxx:39
 AliMUONVDigit.cxx:40
 AliMUONVDigit.cxx:41
 AliMUONVDigit.cxx:42
 AliMUONVDigit.cxx:43
 AliMUONVDigit.cxx:44
 AliMUONVDigit.cxx:45
 AliMUONVDigit.cxx:46
 AliMUONVDigit.cxx:47
 AliMUONVDigit.cxx:48
 AliMUONVDigit.cxx:49
 AliMUONVDigit.cxx:50
 AliMUONVDigit.cxx:51
 AliMUONVDigit.cxx:52
 AliMUONVDigit.cxx:53
 AliMUONVDigit.cxx:54
 AliMUONVDigit.cxx:55
 AliMUONVDigit.cxx:56
 AliMUONVDigit.cxx:57
 AliMUONVDigit.cxx:58
 AliMUONVDigit.cxx:59
 AliMUONVDigit.cxx:60
 AliMUONVDigit.cxx:61
 AliMUONVDigit.cxx:62
 AliMUONVDigit.cxx:63
 AliMUONVDigit.cxx:64
 AliMUONVDigit.cxx:65
 AliMUONVDigit.cxx:66
 AliMUONVDigit.cxx:67
 AliMUONVDigit.cxx:68
 AliMUONVDigit.cxx:69
 AliMUONVDigit.cxx:70
 AliMUONVDigit.cxx:71
 AliMUONVDigit.cxx:72
 AliMUONVDigit.cxx:73
 AliMUONVDigit.cxx:74
 AliMUONVDigit.cxx:75
 AliMUONVDigit.cxx:76
 AliMUONVDigit.cxx:77
 AliMUONVDigit.cxx:78
 AliMUONVDigit.cxx:79
 AliMUONVDigit.cxx:80
 AliMUONVDigit.cxx:81
 AliMUONVDigit.cxx:82
 AliMUONVDigit.cxx:83
 AliMUONVDigit.cxx:84
 AliMUONVDigit.cxx:85
 AliMUONVDigit.cxx:86
 AliMUONVDigit.cxx:87
 AliMUONVDigit.cxx:88
 AliMUONVDigit.cxx:89
 AliMUONVDigit.cxx:90
 AliMUONVDigit.cxx:91
 AliMUONVDigit.cxx:92
 AliMUONVDigit.cxx:93
 AliMUONVDigit.cxx:94
 AliMUONVDigit.cxx:95
 AliMUONVDigit.cxx:96
 AliMUONVDigit.cxx:97
 AliMUONVDigit.cxx:98
 AliMUONVDigit.cxx:99
 AliMUONVDigit.cxx:100
 AliMUONVDigit.cxx:101
 AliMUONVDigit.cxx:102
 AliMUONVDigit.cxx:103
 AliMUONVDigit.cxx:104
 AliMUONVDigit.cxx:105
 AliMUONVDigit.cxx:106
 AliMUONVDigit.cxx:107
 AliMUONVDigit.cxx:108
 AliMUONVDigit.cxx:109
 AliMUONVDigit.cxx:110
 AliMUONVDigit.cxx:111
 AliMUONVDigit.cxx:112
 AliMUONVDigit.cxx:113
 AliMUONVDigit.cxx:114
 AliMUONVDigit.cxx:115
 AliMUONVDigit.cxx:116
 AliMUONVDigit.cxx:117
 AliMUONVDigit.cxx:118
 AliMUONVDigit.cxx:119
 AliMUONVDigit.cxx:120
 AliMUONVDigit.cxx:121
 AliMUONVDigit.cxx:122
 AliMUONVDigit.cxx:123
 AliMUONVDigit.cxx:124
 AliMUONVDigit.cxx:125
 AliMUONVDigit.cxx:126
 AliMUONVDigit.cxx:127
 AliMUONVDigit.cxx:128
 AliMUONVDigit.cxx:129
 AliMUONVDigit.cxx:130
 AliMUONVDigit.cxx:131
 AliMUONVDigit.cxx:132
 AliMUONVDigit.cxx:133
 AliMUONVDigit.cxx:134
 AliMUONVDigit.cxx:135
 AliMUONVDigit.cxx:136
 AliMUONVDigit.cxx:137
 AliMUONVDigit.cxx:138
 AliMUONVDigit.cxx:139
 AliMUONVDigit.cxx:140
 AliMUONVDigit.cxx:141
 AliMUONVDigit.cxx:142
 AliMUONVDigit.cxx:143
 AliMUONVDigit.cxx:144
 AliMUONVDigit.cxx:145
 AliMUONVDigit.cxx:146
 AliMUONVDigit.cxx:147
 AliMUONVDigit.cxx:148
 AliMUONVDigit.cxx:149
 AliMUONVDigit.cxx:150
 AliMUONVDigit.cxx:151
 AliMUONVDigit.cxx:152
 AliMUONVDigit.cxx:153
 AliMUONVDigit.cxx:154
 AliMUONVDigit.cxx:155
 AliMUONVDigit.cxx:156
 AliMUONVDigit.cxx:157
 AliMUONVDigit.cxx:158
 AliMUONVDigit.cxx:159
 AliMUONVDigit.cxx:160
 AliMUONVDigit.cxx:161
 AliMUONVDigit.cxx:162
 AliMUONVDigit.cxx:163
 AliMUONVDigit.cxx:164
 AliMUONVDigit.cxx:165
 AliMUONVDigit.cxx:166
 AliMUONVDigit.cxx:167
 AliMUONVDigit.cxx:168
 AliMUONVDigit.cxx:169
 AliMUONVDigit.cxx:170
 AliMUONVDigit.cxx:171
 AliMUONVDigit.cxx:172
 AliMUONVDigit.cxx:173
 AliMUONVDigit.cxx:174
 AliMUONVDigit.cxx:175
 AliMUONVDigit.cxx:176
 AliMUONVDigit.cxx:177
 AliMUONVDigit.cxx:178
 AliMUONVDigit.cxx:179
 AliMUONVDigit.cxx:180
 AliMUONVDigit.cxx:181
 AliMUONVDigit.cxx:182
 AliMUONVDigit.cxx:183
 AliMUONVDigit.cxx:184
 AliMUONVDigit.cxx:185
 AliMUONVDigit.cxx:186
 AliMUONVDigit.cxx:187
 AliMUONVDigit.cxx:188
 AliMUONVDigit.cxx:189
 AliMUONVDigit.cxx:190
 AliMUONVDigit.cxx:191
 AliMUONVDigit.cxx:192
 AliMUONVDigit.cxx:193
 AliMUONVDigit.cxx:194
 AliMUONVDigit.cxx:195
 AliMUONVDigit.cxx:196
 AliMUONVDigit.cxx:197
 AliMUONVDigit.cxx:198
 AliMUONVDigit.cxx:199
 AliMUONVDigit.cxx:200
 AliMUONVDigit.cxx:201
 AliMUONVDigit.cxx:202
 AliMUONVDigit.cxx:203
 AliMUONVDigit.cxx:204
 AliMUONVDigit.cxx:205
 AliMUONVDigit.cxx:206
 AliMUONVDigit.cxx:207
 AliMUONVDigit.cxx:208
 AliMUONVDigit.cxx:209
 AliMUONVDigit.cxx:210
 AliMUONVDigit.cxx:211
 AliMUONVDigit.cxx:212
 AliMUONVDigit.cxx:213
 AliMUONVDigit.cxx:214
 AliMUONVDigit.cxx:215
 AliMUONVDigit.cxx:216
 AliMUONVDigit.cxx:217
 AliMUONVDigit.cxx:218
 AliMUONVDigit.cxx:219
 AliMUONVDigit.cxx:220
 AliMUONVDigit.cxx:221
 AliMUONVDigit.cxx:222
 AliMUONVDigit.cxx:223
 AliMUONVDigit.cxx:224
 AliMUONVDigit.cxx:225
 AliMUONVDigit.cxx:226
 AliMUONVDigit.cxx:227
 AliMUONVDigit.cxx:228
 AliMUONVDigit.cxx:229
 AliMUONVDigit.cxx:230
 AliMUONVDigit.cxx:231
 AliMUONVDigit.cxx:232
 AliMUONVDigit.cxx:233
 AliMUONVDigit.cxx:234
 AliMUONVDigit.cxx:235
 AliMUONVDigit.cxx:236
 AliMUONVDigit.cxx:237
 AliMUONVDigit.cxx:238
 AliMUONVDigit.cxx:239
 AliMUONVDigit.cxx:240
 AliMUONVDigit.cxx:241
 AliMUONVDigit.cxx:242
 AliMUONVDigit.cxx:243
 AliMUONVDigit.cxx:244
 AliMUONVDigit.cxx:245
 AliMUONVDigit.cxx:246
 AliMUONVDigit.cxx:247
 AliMUONVDigit.cxx:248
 AliMUONVDigit.cxx:249
 AliMUONVDigit.cxx:250
 AliMUONVDigit.cxx:251
 AliMUONVDigit.cxx:252
 AliMUONVDigit.cxx:253
 AliMUONVDigit.cxx:254
 AliMUONVDigit.cxx:255
 AliMUONVDigit.cxx:256
 AliMUONVDigit.cxx:257
 AliMUONVDigit.cxx:258
 AliMUONVDigit.cxx:259
 AliMUONVDigit.cxx:260
 AliMUONVDigit.cxx:261
 AliMUONVDigit.cxx:262
 AliMUONVDigit.cxx:263
 AliMUONVDigit.cxx:264
 AliMUONVDigit.cxx:265
 AliMUONVDigit.cxx:266
 AliMUONVDigit.cxx:267
 AliMUONVDigit.cxx:268
 AliMUONVDigit.cxx:269
 AliMUONVDigit.cxx:270
 AliMUONVDigit.cxx:271
 AliMUONVDigit.cxx:272
 AliMUONVDigit.cxx:273
 AliMUONVDigit.cxx:274
 AliMUONVDigit.cxx:275
 AliMUONVDigit.cxx:276
 AliMUONVDigit.cxx:277
 AliMUONVDigit.cxx:278
 AliMUONVDigit.cxx:279
 AliMUONVDigit.cxx:280
 AliMUONVDigit.cxx:281
 AliMUONVDigit.cxx:282
 AliMUONVDigit.cxx:283
 AliMUONVDigit.cxx:284
 AliMUONVDigit.cxx:285
 AliMUONVDigit.cxx:286
 AliMUONVDigit.cxx:287
 AliMUONVDigit.cxx:288
 AliMUONVDigit.cxx:289
 AliMUONVDigit.cxx:290
 AliMUONVDigit.cxx:291
 AliMUONVDigit.cxx:292
 AliMUONVDigit.cxx:293
 AliMUONVDigit.cxx:294
 AliMUONVDigit.cxx:295
 AliMUONVDigit.cxx:296
 AliMUONVDigit.cxx:297
 AliMUONVDigit.cxx:298
 AliMUONVDigit.cxx:299
 AliMUONVDigit.cxx:300
 AliMUONVDigit.cxx:301
 AliMUONVDigit.cxx:302
 AliMUONVDigit.cxx:303
 AliMUONVDigit.cxx:304
 AliMUONVDigit.cxx:305
 AliMUONVDigit.cxx:306
 AliMUONVDigit.cxx:307
 AliMUONVDigit.cxx:308
 AliMUONVDigit.cxx:309
 AliMUONVDigit.cxx:310
 AliMUONVDigit.cxx:311
 AliMUONVDigit.cxx:312
 AliMUONVDigit.cxx:313
 AliMUONVDigit.cxx:314
 AliMUONVDigit.cxx:315
 AliMUONVDigit.cxx:316
 AliMUONVDigit.cxx:317
 AliMUONVDigit.cxx:318
 AliMUONVDigit.cxx:319
 AliMUONVDigit.cxx:320
 AliMUONVDigit.cxx:321
 AliMUONVDigit.cxx:322
 AliMUONVDigit.cxx:323
 AliMUONVDigit.cxx:324
 AliMUONVDigit.cxx:325
 AliMUONVDigit.cxx:326
 AliMUONVDigit.cxx:327
 AliMUONVDigit.cxx:328
 AliMUONVDigit.cxx:329
 AliMUONVDigit.cxx:330
 AliMUONVDigit.cxx:331
 AliMUONVDigit.cxx:332
 AliMUONVDigit.cxx:333
 AliMUONVDigit.cxx:334
 AliMUONVDigit.cxx:335
 AliMUONVDigit.cxx:336
 AliMUONVDigit.cxx:337
 AliMUONVDigit.cxx:338
 AliMUONVDigit.cxx:339
 AliMUONVDigit.cxx:340
 AliMUONVDigit.cxx:341
 AliMUONVDigit.cxx:342
 AliMUONVDigit.cxx:343
 AliMUONVDigit.cxx:344
 AliMUONVDigit.cxx:345