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

//____________________________________________________________________
//
//  ESD information from the FMD 
//  Contains information on:
//	Charged particle multiplicty per strip (rough estimate)
//	Psuedo-rapdity per strip
//  Latest changes by Christian Holm Christensen
//
#include "AliESDFMD.h"		// ALIFMDESD_H
#include "AliLog.h"		// ALILOG_H
#include "Riostream.h"		// ROOT_Riostream
#include <TMath.h>

//____________________________________________________________________
ClassImp(AliESDFMD)
#if 0
  ; // This is here to keep Emacs for indenting the next line
#endif


//____________________________________________________________________
namespace {
  // Private implementation of a AliFMDMap::ForOne to use in
  // forwarding to AliESDFMD::ForOne
  class ForMultiplicity : public AliFMDMap::ForOne 
  {
  public:
    ForMultiplicity(const AliESDFMD& o, AliESDFMD::ForOne& a)
      : fObject(o), fAlgo(a) 
    {}
    Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, 
		      Float_t m)
    {
      Float_t e = fObject.Eta(d, r, 0, t);
      return fAlgo.operator()(d, r, s, t, m, e);
    }
    Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, Int_t)
    {
      return kTRUE;
    }
    Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, UShort_t)
    {
      return kTRUE;
    }
    Bool_t operator()(UShort_t, Char_t, UShort_t, UShort_t, Bool_t)
    {
      return kTRUE;
    }
  protected:
    const AliESDFMD&   fObject;
    AliESDFMD::ForOne& fAlgo;
  };

  // Private implementation of AliESDFMD::ForOne to print an 
  // object 
  class Printer : public AliESDFMD::ForOne
  {
  public:
    Printer() : fOldD(0), fOldR('-'), fOldS(1024) {}
    Bool_t operator()(UShort_t d, Char_t r, UShort_t s, UShort_t t, 
		      Float_t m, Float_t e)
    {
      if (d != fOldD) { 
	if (fOldD != 0) printf("\n");
	fOldD = d;
	fOldR = '-';
	printf("FMD%d", fOldD);
      }
      if (r != fOldR) { 
	fOldR = r;
	fOldS = 1024;
	printf("\n %s ring", (r == 'I' ? "Inner" : "Outer"));
      }
      if (s != fOldS) { 
	fOldS = s;
	printf("\n  Sector %d", fOldS);
      }
      if (t % 4 == 0)                   printf("\n   %3d-%3d ", t, t+3);
      if (m == AliESDFMD::kInvalidMult) printf("------/");
      else                              printf("%6.3f/", m);
      if (e == AliESDFMD::kInvalidEta)  printf("------ ");
      else                              printf("%6.3f ", e);

      return kTRUE;
    }
  private:
    UShort_t fOldD;
    Char_t   fOldR;
    UShort_t fOldS;
  };
}

//____________________________________________________________________
AliESDFMD::AliESDFMD()
  : fMultiplicity(0, 0, 0, 0),
    fEta(AliFMDFloatMap::kMaxDetectors, 
	 AliFMDFloatMap::kMaxRings, 
	 1,
	 AliFMDFloatMap::kMaxStrips), 
    fNoiseFactor(0),
    fAngleCorrected(kFALSE)
{
  // Default CTOR
}
  
//____________________________________________________________________
AliESDFMD::AliESDFMD(const AliESDFMD& other)
  : TObject(other), 
    fMultiplicity(other.fMultiplicity),
    fEta(other.fEta),
    fNoiseFactor(other.fNoiseFactor),
    fAngleCorrected(other.fAngleCorrected)
{
  // Default CTOR
}

//____________________________________________________________________
AliESDFMD& 
AliESDFMD::operator=(const AliESDFMD& other)
{
  // Default CTOR
  if(this == &other) return *this;

  TObject::operator=(other);
  fMultiplicity   = other.fMultiplicity;
  fEta            = other.fEta;

  // These two lines were missing prior to version 4 of this class 
  fNoiseFactor    = other.fNoiseFactor;
  fAngleCorrected = other.fAngleCorrected;

  return *this;
}

//____________________________________________________________________
void 
AliESDFMD::Copy(TObject &obj) const
{
  // this overwrites the virtual TOBject::Copy()
  // to allow run time copying without casting
  // in AliESDEvent

  if(this==&obj)return;
  AliESDFMD *robj = dynamic_cast<AliESDFMD*>(&obj);
  if(!robj)return; // not an AliESDFMD
  *robj = *this;
}

//____________________________________________________________________
void
AliESDFMD::CheckNeedUShort(TFile* file) 
{
  fMultiplicity.CheckNeedUShort(file);
  fEta.CheckNeedUShort(file);
}

//____________________________________________________________________
void
AliESDFMD::Clear(Option_t* )
{
  fMultiplicity.Reset(kInvalidMult);
  fEta.Reset(kInvalidEta);
}


//____________________________________________________________________
Float_t
AliESDFMD::Multiplicity(UShort_t detector, Char_t ring, UShort_t sector, 
			UShort_t strip) const
{
  // Return rough estimate of charged particle multiplicity in the
  // strip FMD<detector><ring>[<sector>,<strip>]. 
  // 
  // Note, that this should at most be interpreted as the sum
  // multiplicity of secondaries and primaries. 
  return fMultiplicity(detector, ring, sector, strip);
}

//____________________________________________________________________
Float_t
AliESDFMD::Eta(UShort_t detector, Char_t ring, UShort_t /* sector */, 
	       UShort_t strip) const
{
  // Return pseudo-rapidity of the strip
  // FMD<detector><ring>[<sector>,<strip>].  (actually, the sector
  // argument is ignored, as it is assumed that the primary vertex is
  // a (x,y) = (0,0), and that the modules are aligned with a
  // precision better than 2 degrees in the azimuthal angle). 
  // 
  return fEta(detector, ring, 0, strip);
}

//____________________________________________________________________
Float_t
AliESDFMD::Phi(UShort_t detector, Char_t ring, UShort_t sector, UShort_t) const
{
  // Return azimuthal angle (in degrees) of the strip
  // FMD<detector><ring>[<sector>,<strip>].  
  // 
  Float_t baseAng = (detector == 1 ? 90 : 
		     detector == 2 ?  0 : 180);
  Float_t dAng    = ((detector == 3 ? -1 : 1) * 360 / 
		     (ring == 'I' || ring == 'i' ? 
		      AliFMDMap::kNSectorInner : 
		      AliFMDMap::kNSectorOuter));
  Float_t ret =  baseAng + dAng * (sector + .5);
  if (ret > 360) ret -= 360;
  if (ret <   0) ret += 360;
  return ret;
  
}

//____________________________________________________________________
Float_t
AliESDFMD::Theta(UShort_t detector, Char_t ring, UShort_t, UShort_t strip) const
{
  // Return polar angle from beam line (in degrees) of the strip
  // FMD<detector><ring>[<sector>,<strip>].  
  // 
  // This value is calculated from eta and therefor takes into account
  // the Z position of the interaction point. 
  Float_t eta   = Eta(detector, ring, 0, strip);
  Float_t theta = TMath::ATan(2 * TMath::Exp(-eta));
  if (theta < 0) theta += TMath::Pi();
  theta *= 180. / TMath::Pi();
  return theta;
}

//____________________________________________________________________
Float_t
AliESDFMD::R(UShort_t, Char_t ring, UShort_t, UShort_t strip) const
{
  // Return radial distance from beam line (in cm) of the strip
  // FMD<detector><ring>[<sector>,<strip>].  
  // 
  
  // Numbers are from AliFMDRing
  Float_t  lR  = (ring == 'I' || ring == 'i' ?  4.522 : 15.4);
  Float_t  hR  = (ring == 'I' || ring == 'i' ? 17.2   : 28.0);
  UShort_t nS  = (ring == 'I' || ring == 'i' ? 
		  AliFMDMap::kNStripInner : 
		  AliFMDMap::kNStripOuter);
  Float_t  dR  = (hR - lR) / nS;
  Float_t  ret = lR + dR * (strip + .5);
  return ret;
  
}

//____________________________________________________________________
void
AliESDFMD::SetMultiplicity(UShort_t detector, Char_t ring, UShort_t sector, 
			   UShort_t strip, Float_t mult)
{
  // Return rough estimate of charged particle multiplicity in the
  // strip FMD<detector><ring>[<sector>,<strip>]. 
  // 
  // Note, that this should at most be interpreted as the sum
  // multiplicity of secondaries and primaries. 
  fMultiplicity(detector, ring, sector, strip) = mult;
}

//____________________________________________________________________
void
AliESDFMD::SetEta(UShort_t detector, Char_t ring, UShort_t /* sector */, 
		  UShort_t strip, Float_t eta)
{
  // Set pseudo-rapidity of the strip
  // FMD<detector><ring>[<sector>,<strip>].  (actually, the sector
  // argument is ignored, as it is assumed that the primary vertex is
  // a (x,y) = (0,0), and that the modules are aligned with a
  // precision better than 2 degrees in the azimuthal angle). 
  // 
  fEta(detector, ring, 0, strip) = eta;
}

//____________________________________________________________________
Bool_t
AliESDFMD::ForEach(AliESDFMD::ForOne& a) const
{
  ForMultiplicity i(*this, a);
  return fMultiplicity.ForEach(i);
}
//____________________________________________________________________
void
AliESDFMD::Print(Option_t* /* option*/) const
{
  // Print all information to standard output. 
  std::cout << "AliESDFMD:" << std::endl;
  Printer p;
  ForEach(p);
  printf("\n");
#if 0
  for (UShort_t det = 1; det <= fMultiplicity.MaxDetectors(); det++) {
    for (UShort_t ir = 0; ir < fMultiplicity.MaxRings(); ir++) {
      Char_t ring = (ir == 0 ? 'I' : 'O');
      std::cout << "FMD" << det << ring << ":" << std::endl;
      for  (UShort_t sec = 0; sec < fMultiplicity.MaxSectors(); sec++) {
	std::cout << " Sector # " << sec << ":" << std::flush;
	for (UShort_t str = 0; str < fMultiplicity.MaxStrips(); str++) {
	  if (str % 6 == 0) std::cout << "\n  " << std::flush;
	  Float_t m = fMultiplicity(det, ring, sec, str);
	  Float_t e = fEta(det, ring, 0, str);
	  if (m == kInvalidMult && e == kInvalidEta) break;
	  if (m == kInvalidMult) std::cout << " ---- ";
	  else                   std::cout << Form("%6.3f", m);
	  std::cout << "/";
	  if (e == kInvalidEta)  std::cout << " ---- ";
	  else                   std::cout << Form("%-6.3f", e);
	  std::cout << " " << std::flush;
	}
	std::cout << std::endl;
      }
    }
  }
#endif
}


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