ROOT logo
//-*- Mode: C++ -*-
// $Id$
#ifndef ALIHLTTRACKGEOMETRY_H
#define ALIHLTTRACKGEOMETRY_H
//* This file is property of and copyright by the ALICE HLT Project        * 
//* ALICE Experiment at CERN, All rights reserved.                         *
//* See cxx source for full Copyright notice                               *

/// @file   AliHLTTrackGeometry.h
/// @author Matthias Richter
/// @date   2011-05-20
/// @brief  Desciption of a track by a sequence of track points
///

#include <vector>
#include <TObject.h>
#include "AliHLTLogging.h"
#include "AliHLTDataTypes.h"
#include "AliHLTStdIncludes.h"
#include "AliHLTExternalTrackParam.h"
#include "AliHLTIndexGrid.h"

class AliHLTGlobalBarrelTrack;
class AliHLTSpacePointContainer;
class TH2;

/**
 * @class AliHLTTrackGeometry
 * Description of a track by a sequence of track points given by the
 * intersection of the track with a set of planes.
 *
 * Each plane describes a local 2D coordinate system with origin at the
 * norm vector going through global {0,0,0}. The local coordinates u and v
 * correspond to global y and z at zero alpha and theta. In that case, r
 * corresponds to global x.
 *
 * Each plane is identified by
 * - rotation angle alpha in the global xy plane
 * - rotation angle theta
 * - unique 32bit AliHLTUInt32_t plane id
 *
 * The geometry of planes can be defined in child classes defining the
 * plane id.
 * @ingroup alihlt_base
 */
class AliHLTTrackGeometry : public TObject, public AliHLTLogging
{
 public:
  /// standard constructor
  AliHLTTrackGeometry();
  /// copy constructor
  AliHLTTrackGeometry(const AliHLTTrackGeometry&);
  /// assignment operator
  AliHLTTrackGeometry& operator=(const AliHLTTrackGeometry&);

  /// destructor
  ~AliHLTTrackGeometry();

  typedef AliHLTIndexGrid<int, AliHLTUInt32_t> AliHLTTrackGrid;

  /// set the track id
  void SetTrackId(int trackId) {fTrackId=trackId;}
  /// get the track id
  int GetTrackId() const {return fTrackId;}

  enum {
    kLower = 0,
    kUpper = 1,
    kBoundsDimension
  };

  /**
   * class AliHLTTrackPlane
   * Helper class to describe a plane
   */
  class AliHLTTrackPlane {
  public:
    AliHLTTrackPlane(AliHLTUInt32_t id, float alpha, float r, float theta) 
      : fId(id), fAlpha(alpha), fR(r), fTheta(theta), fBoundsU(), fBoundsV() {
      fBoundsU[kLower]=-5.0; fBoundsU[kUpper]=5.0; fBoundsV[kLower]=-5.0; fBoundsV[kUpper]=5.0;
    }
    virtual ~AliHLTTrackPlane() {}

    /// id of the plane
    AliHLTUInt32_t GetId() const {return fId;}
    /// alpha of the plane
    float GetPlaneAlpha() const {return fAlpha;}
    /// radial distance from global {0,0,0}
    float GetPlaneR() const {return fR;}
    /// theta of the plane
    float GetPlaneTheta() const {return fTheta;}

    // set bounds of u coordinate
    void SetBoundsU(const float bounds[kBoundsDimension]) {
      fBoundsU[kLower]=bounds[kLower]; fBoundsU[kUpper]=bounds[kUpper];
    }
    // set bounds of v coordinate
    void SetBoundsV(const float bounds[kBoundsDimension]) {
      fBoundsV[kLower]=bounds[kLower]; fBoundsV[kUpper]=bounds[kUpper];
    }

    bool CheckBounds(float u, float v) const {
      return (u>=fBoundsU[kLower]) && (u<=fBoundsU[kUpper]) 
	&& (v>=fBoundsV[kLower]) && (v<=fBoundsV[kUpper]);
    }

  private:
    // standard constructor prohibited
    AliHLTTrackPlane();

    AliHLTUInt32_t fId; // unique id
    float fAlpha;       // alpha of the plane
    float fR;           // radial distance from global {0,0,0}
    float fTheta;       // theta of the plane
    float fBoundsU[kBoundsDimension];  // bounds u coordinate
    float fBoundsV[kBoundsDimension];  // bounds v coordinate
  };

  class AliHLTTrackPlaneYZ : public AliHLTTrackPlane {
  public:
    AliHLTTrackPlaneYZ(AliHLTUInt32_t id, float alpha, float r) 
      : AliHLTTrackPlane(id, alpha, r, 0.0) {}
    ~AliHLTTrackPlaneYZ() {}

  private:
    // standard constructor prohibited
    AliHLTTrackPlaneYZ();
  };

  struct AliHLTTrackSpacepoint {
    AliHLTTrackSpacepoint(AliHLTUInt32_t id, float dU=-1000., float dV=-1000.)
      : fId(id), fdU(dU), fdV(dV) {}

    int SetResidual(int coordinate, float value) {
      if (coordinate==0) fdU=value;
      else if (coordinate==1) fdV=value;
      return 0;
    }

    float GetResidual(int coordinate) const {
      if (coordinate==0) return fdU;
      else if (coordinate==1) return fdV;
      return -1000.;
    }

    AliHLTUInt32_t fId; // space point id
    float fdU;          // residual of the spacepoint
    float fdV;          // residual of the spacepoint
  };

  class AliHLTTrackPoint {
  public:
    // constructor
    AliHLTTrackPoint(AliHLTUInt32_t id, float u, float v)
      : fId(id), fU(u), fV(v), fSpacePoints() {}
    // copy constructor
    AliHLTTrackPoint(const AliHLTTrackPoint& src)
      : fId(src.fId), fU(src.fU), fV(src.fV), fSpacePoints(src.fSpacePoints) {}
    // assignment operator
    AliHLTTrackPoint& operator=(const AliHLTTrackPoint& src) {
      if (this!=&src) {fId=src.fId; fU=src.fU; fV=src.fV; fSpacePoints=src.fSpacePoints;}
      return *this;
    }
    ~AliHLTTrackPoint() {}

    bool operator==(const AliHLTTrackPoint& point) const {
      return point.fId==fId;
    }
    bool operator==(AliHLTUInt32_t id) const {
      return id==fId;
    }

    /// id of the plane
    AliHLTUInt32_t GetId() const {return fId;}
    /// u coordinate
    float GetU() const {return fU;}
    /// u coordinate
    float GetV() const {return fV;}

    /// check associate space point
    bool HaveAssociatedSpacePoint() const {
      return fSpacePoints.size()>0;
    }

    /// associate a space point
    int AddAssociatedSpacePoint(AliHLTUInt32_t spacepointId, float dU=-1000., float dV=-1000.) {
      fSpacePoints.push_back(AliHLTTrackSpacepoint(spacepointId, dU, dV));
      return 0;
    }

    const vector<AliHLTTrackSpacepoint>& GetSpacepoints() const {return fSpacePoints;}
    vector<AliHLTTrackSpacepoint>& GetSpacepoints() {return fSpacePoints;}

    int SetResidual(AliHLTUInt32_t id, int coordinate, float value) {
      for (unsigned i=0; i<fSpacePoints.size(); i++) {
	if (fSpacePoints[i].fId!=id) continue;
	return fSpacePoints[i].SetResidual(coordinate, value);
      }
      return -ENOENT;
    }

  private:
    // standard constructor prohibited
    AliHLTTrackPoint();

    AliHLTUInt32_t fId; // unique id
    float fU;           // u coordinate
    float fV;           // v coordinate
    vector<AliHLTTrackSpacepoint> fSpacePoints;
  };

  // interface to plane description

  /// alpha of the plane
  virtual float GetPlaneAlpha(AliHLTUInt32_t planeId) const = 0;
  /// radial distance from global {0,0,0}
  virtual float GetPlaneR(AliHLTUInt32_t planeId) const = 0;
  /// theta of the plane
  virtual float GetPlaneTheta(AliHLTUInt32_t planeId) const = 0;
  /// check bounds in u and v coordinate
  virtual bool CheckBounds(AliHLTUInt32_t planeId, float u, float v) const =0;

  // track interface

  /// calculate the track points, expects the global magnetic field to be initialized
  virtual int CalculateTrackPoints(const AliHLTExternalTrackParam& track) = 0;

  /// calculate the track points, expects the global magnetic field to be initialized
  virtual int CalculateTrackPoints(AliHLTGlobalBarrelTrack& track) = 0;

  /// associate all space points of the container to the calculated track points
  int AssociateSpacePoints(AliHLTSpacePointContainer& points);
  /// associate specified space points of the container to the calculated track points
  int AssociateSpacePoints(const AliHLTUInt32_t* trackpoints, AliHLTUInt32_t nofPoints, AliHLTSpacePointContainer& points);
  int AssociateUnusedSpacePoints(AliHLTSpacePointContainer& points);

  /// find the track point which can be associated to a spacepoint with coordinates and id
  virtual int FindMatchingTrackPoint(AliHLTUInt32_t spacepointId, float spacepoint[3], AliHLTUInt32_t& planeId) = 0;

  /// register track points in the index grid
  virtual int RegisterTrackPoints(AliHLTTrackGrid* pGrid) const;

  /// fill track points to index grid
  virtual int FillTrackPoints(AliHLTTrackGrid* pGrid) const;

  /// get track point of id
  const AliHLTTrackPoint* GetTrackPoint(AliHLTUInt32_t id) const;
  /// get track point of id
  AliHLTTrackPoint* GetTrackPoint(AliHLTUInt32_t id);

  /// create a collection of all points
  virtual AliHLTSpacePointContainer* ConvertToSpacePoints() const {return ConvertToSpacePoints(false);}
  virtual AliHLTSpacePointContainer* ConvertToSpacePoints(bool bAssociated) const;

  /// set the spacepoint associated with a track point
  /// @param  planeId       track point
  /// @param  spacepointId  space point id to be associated with track point
  /// @param  status        status flag
  /// @return 0 on success, -ENOENT planeId not found
  int SetAssociatedSpacePoint(AliHLTUInt32_t planeId, AliHLTUInt32_t spacepointId, int status, float fdU=0.0, float fdV=0.0);

  /// get the spacepoint associated with a track point
  /// @param  planeId       id of the track point
  /// @param  spacepointId  target to get the spacepoint data
  /// @return status flag if found, -ENOENT planeId not found, -ENODATA no associated spacepoint found
  int GetAssociatedSpacePoint(AliHLTUInt32_t planeId, AliHLTUInt32_t& spacepointId) const;

  // services

  int FillResidual(int coordinate, TH2* histo) const;

  void SetVerbosity(int verbosity) {fVerbosity=verbosity;}
  int GetVerbosity() const {return fVerbosity;}

  /// inherited from TObject: clear the object and reset pointer references
  virtual void Clear(Option_t * /*option*/ ="");

  /// inherited from TObject
  virtual void Print(Option_t *option="") const;

  virtual void Print(ostream& out, Option_t *option="") const;

  /// Inherited from TObject, draw the track points
  virtual void Draw(Option_t *option="");

 protected:
  int AddTrackPoint(const AliHLTTrackPoint& point, AliHLTUInt32_t selectionMask=kAliHLTVoidDataSpec);

  const vector<AliHLTTrackPoint>& TrackPoints() const {return fTrackPoints;}

 private:
  vector<AliHLTTrackPoint> fTrackPoints; // list of points
  vector<AliHLTUInt32_t> fSelectionMasks; // selection masks

  int fTrackId; // track id
  int fVerbosity; // verbosity

  ClassDef(AliHLTTrackGeometry, 0)
};

ostream& operator<<(ostream &out, const AliHLTTrackGeometry& c);

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