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$

#include "AliMUONTriggerTrackToTrackerClusters.h"

///\class AliMUONTriggerTrackToTrackerClusters
/// 
/// Class to convert trigger tracks into "fake" clusters in stations 4 and 5
///
/// Only intent is to be able to reconstruct data where stations 4 and 5 were
/// not functionning, typically early cosmic runs
///
///\author Laurent Aphecetche, Subatech

#include "AliCodeTimer.h"
#include "AliLog.h"
#include "AliMUONConstants.h"
#include "AliMUONGeometryTransformer.h"
#include "AliMUONTrack.h"
#include "AliMUONTrackExtrap.h"
#include "AliMUONTriggerTrack.h"
#include "AliMUONVCluster.h"
#include "AliMUONVClusterStore.h"
#include "AliMUONVTriggerTrackStore.h"
#include "AliMUONTrackParam.h"
#include "AliMpArea.h"
#include "AliMpDEManager.h"
#include <TMath.h>

///\cond CLASSIMP
ClassImp(AliMUONTriggerTrackToTrackerClusters)
///\endcond

//_____________________________________________________________________________
AliMUONTriggerTrackToTrackerClusters::AliMUONTriggerTrackToTrackerClusters(const AliMUONGeometryTransformer& transformer,
                                                                           AliMUONVTriggerTrackStore* trackStore)
: TObject(), fkTransformer(transformer), fTriggerTrackStore(trackStore)
{
  /// ctor. We do not take ownership of the trigger track store.
}

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

//_____________________________________________________________________________
Int_t 
AliMUONTriggerTrackToTrackerClusters::DetElemId(Int_t chamber, Double_t x, Double_t y,
                                                Double_t ex, Double_t ey,
                                                Double_t& z) const
{
  /// Find in which detection element (x,y) (global) position is.
  
  AliMpDEIterator it;
  
  AliMpArea a(x, y, ex, ey);
  
  it.First(chamber);
  
  while ( !it.IsDone() )
  {
    Int_t detElemId = it.CurrentDEId();
    
    AliMpArea* area = fkTransformer.GetDEArea(detElemId);
    
    if ( area->Overlap(a) ) 
    {
      // get z of the center of that DE.
      Double_t dummyx, dummyy;
      fkTransformer.Local2Global(detElemId,0,0,0,dummyx,dummyy,z);
      return detElemId;
    }
    it.Next();
  }
  
  return -1;
}

//_____________________________________________________________________________
Int_t 
AliMUONTriggerTrackToTrackerClusters::GenerateClusters(Int_t iChamber,
                                                       AliMUONVClusterStore& clusterStore) const
{
  /// Generate clusters in given chamber
  /// Return the number of clusters added to the clusterStore
  
  AliCodeTimerAuto(Form("Chamber %d",iChamber),0);
  
  TIter next(fTriggerTrackStore->CreateIterator());
  
  AliMUONTriggerTrack* track;
  Int_t nadded(0);
  
  while ( ( track = static_cast<AliMUONTriggerTrack*>(next()) ) )
  {
    nadded += GenerateClusters(iChamber,*track,clusterStore);
  }
  return nadded;
}

//_____________________________________________________________________________
Int_t 
AliMUONTriggerTrackToTrackerClusters::GenerateClusters(Int_t iChamber,
                                                       const AliMUONTriggerTrack& track,
                                                       AliMUONVClusterStore& clusterStore) const
{
  /// From a trigger track, generate 1 cluster in given chamber
  
  /// Get a (rough) guestimate of the track momentum
  
  Int_t nadded(0);
  
  Double_t z = AliMUONConstants::DefaultChamberZ(10);
  
  Double_t bendingCoord = track.GetY11();
  Double_t bendingSlope = TMath::Tan(track.GetThetay());
  
  Double_t bendingImpact = bendingCoord - z * bendingSlope;
  
  AliDebug(1,Form("TriggerTrack impact parameter=%e",bendingImpact));
  
  //  StdoutToAliDebug(1,track.Print());
  
  Double_t inverseBendingMomentum = 1. / AliMUONTrackExtrap::GetBendingMomentumFromImpactParam(bendingImpact);
  
  // Construct an AliMUONTrackParam from the trigger track, in order to be able to extrapolate it
  // to chambers 6..9 planes.
  
  AliMUONTrackParam trackParam;
  
  trackParam.SetZ(z);
  trackParam.SetNonBendingCoor(track.GetX11());
  trackParam.SetNonBendingSlope(TMath::Tan(track.GetThetax()));
  trackParam.SetBendingCoor(bendingCoord);
  trackParam.SetBendingSlope(bendingSlope);
  trackParam.SetInverseBendingMomentum(inverseBendingMomentum);
  
  Double_t dZ = AliMUONConstants::DefaultChamberZ(10) - AliMUONConstants::DefaultChamberZ(12);
  
  Double_t sigmaX = AliMUONConstants::TriggerNonBendingReso();
  
  Double_t sigmaY = AliMUONConstants::TriggerBendingReso();
  
  // Compute and set track parameters covariances
  TMatrixD paramCov(5,5);
  paramCov.Zero();
  
  // Non bending plane
  paramCov(0,0) = sigmaX*sigmaX;
  paramCov(0,1) = paramCov(0,0)/dZ;
  paramCov(1,0) = paramCov(0,1);
  paramCov(1,1) = 2.0*paramCov(0,0)/dZ/dZ;
  
  // Bending plane
  paramCov(2,2) = sigmaY*sigmaY;
  paramCov(2,3) = paramCov(2,2)/dZ;
  paramCov(3,2) = paramCov(2,3);
  paramCov(3,3) = 2.0*paramCov(2,2)/dZ/dZ;
  
  // Inverse bending momentum (50% error)
  paramCov(4,4) = 0.5*inverseBendingMomentum * 0.5*inverseBendingMomentum;
  
  // Set covariances
  trackParam.SetCovariances(paramCov);
  
  // add MCS effect in the iron wall
  const Float_t kFilterThickness = AliMUONConstants::MuonFilterZEnd()-AliMUONConstants::MuonFilterZBeg(); // cm
  AliMUONTrackExtrap::ExtrapToZCov(&trackParam, AliMUONConstants::MuonFilterZEnd()); // Extrap to iChamber
  AliMUONTrackExtrap::AddMCSEffect(&trackParam, kFilterThickness, AliMUONConstants::MuonFilterX0()); // Add MCS effects
  
  // Now we extrapolate this trackParam to chambers 6 -> 9
  Int_t nclusters = clusterStore.GetSize();
  
  AliMUONTrackParam tp(trackParam);
  
  Double_t zg = AliMUONConstants::DefaultChamberZ(iChamber);
  AliMUONTrackExtrap::ExtrapToZCov(&tp, zg); // Extrap to iChamber
  
  
  AliDebug(1,Form("iChamber=%d",iChamber));
  
  StdoutToAliDebug(1,tp.Print("FULLCOV"););
  
  Double_t x = tp.GetNonBendingCoor();
  Double_t y = tp.GetBendingCoor();
  const TMatrixD& cov = tp.GetCovariances();
  Double_t ex = TMath::Sqrt(cov(0,0));
  Double_t ey = TMath::Sqrt(cov(2,2));
  
  Double_t zde;
  
  Int_t detElemId = DetElemId(iChamber,x,y,ex,ey,zde);
  
  AliDebug(1,Form("zg = %e zde = %e",zg,zde));
  
  if ( AliMpDEManager::IsValidDetElemId(detElemId) ) 
  {
    AliMUONVCluster* rawCluster = clusterStore.Add(AliMpDEManager::GetChamberId(detElemId), detElemId, nclusters);
    
    ++nclusters;
    ++nadded;
    
    rawCluster->SetCharge(100.0);
    rawCluster->SetXYZ(x, y, zg);
    rawCluster->SetErrXY(ex,ey);
  }
  else
  {
    AliWarning(Form("No DE found at xg=%e yg=%e",x,y));
  }
  
  return nadded;
}
 AliMUONTriggerTrackToTrackerClusters.cxx:1
 AliMUONTriggerTrackToTrackerClusters.cxx:2
 AliMUONTriggerTrackToTrackerClusters.cxx:3
 AliMUONTriggerTrackToTrackerClusters.cxx:4
 AliMUONTriggerTrackToTrackerClusters.cxx:5
 AliMUONTriggerTrackToTrackerClusters.cxx:6
 AliMUONTriggerTrackToTrackerClusters.cxx:7
 AliMUONTriggerTrackToTrackerClusters.cxx:8
 AliMUONTriggerTrackToTrackerClusters.cxx:9
 AliMUONTriggerTrackToTrackerClusters.cxx:10
 AliMUONTriggerTrackToTrackerClusters.cxx:11
 AliMUONTriggerTrackToTrackerClusters.cxx:12
 AliMUONTriggerTrackToTrackerClusters.cxx:13
 AliMUONTriggerTrackToTrackerClusters.cxx:14
 AliMUONTriggerTrackToTrackerClusters.cxx:15
 AliMUONTriggerTrackToTrackerClusters.cxx:16
 AliMUONTriggerTrackToTrackerClusters.cxx:17
 AliMUONTriggerTrackToTrackerClusters.cxx:18
 AliMUONTriggerTrackToTrackerClusters.cxx:19
 AliMUONTriggerTrackToTrackerClusters.cxx:20
 AliMUONTriggerTrackToTrackerClusters.cxx:21
 AliMUONTriggerTrackToTrackerClusters.cxx:22
 AliMUONTriggerTrackToTrackerClusters.cxx:23
 AliMUONTriggerTrackToTrackerClusters.cxx:24
 AliMUONTriggerTrackToTrackerClusters.cxx:25
 AliMUONTriggerTrackToTrackerClusters.cxx:26
 AliMUONTriggerTrackToTrackerClusters.cxx:27
 AliMUONTriggerTrackToTrackerClusters.cxx:28
 AliMUONTriggerTrackToTrackerClusters.cxx:29
 AliMUONTriggerTrackToTrackerClusters.cxx:30
 AliMUONTriggerTrackToTrackerClusters.cxx:31
 AliMUONTriggerTrackToTrackerClusters.cxx:32
 AliMUONTriggerTrackToTrackerClusters.cxx:33
 AliMUONTriggerTrackToTrackerClusters.cxx:34
 AliMUONTriggerTrackToTrackerClusters.cxx:35
 AliMUONTriggerTrackToTrackerClusters.cxx:36
 AliMUONTriggerTrackToTrackerClusters.cxx:37
 AliMUONTriggerTrackToTrackerClusters.cxx:38
 AliMUONTriggerTrackToTrackerClusters.cxx:39
 AliMUONTriggerTrackToTrackerClusters.cxx:40
 AliMUONTriggerTrackToTrackerClusters.cxx:41
 AliMUONTriggerTrackToTrackerClusters.cxx:42
 AliMUONTriggerTrackToTrackerClusters.cxx:43
 AliMUONTriggerTrackToTrackerClusters.cxx:44
 AliMUONTriggerTrackToTrackerClusters.cxx:45
 AliMUONTriggerTrackToTrackerClusters.cxx:46
 AliMUONTriggerTrackToTrackerClusters.cxx:47
 AliMUONTriggerTrackToTrackerClusters.cxx:48
 AliMUONTriggerTrackToTrackerClusters.cxx:49
 AliMUONTriggerTrackToTrackerClusters.cxx:50
 AliMUONTriggerTrackToTrackerClusters.cxx:51
 AliMUONTriggerTrackToTrackerClusters.cxx:52
 AliMUONTriggerTrackToTrackerClusters.cxx:53
 AliMUONTriggerTrackToTrackerClusters.cxx:54
 AliMUONTriggerTrackToTrackerClusters.cxx:55
 AliMUONTriggerTrackToTrackerClusters.cxx:56
 AliMUONTriggerTrackToTrackerClusters.cxx:57
 AliMUONTriggerTrackToTrackerClusters.cxx:58
 AliMUONTriggerTrackToTrackerClusters.cxx:59
 AliMUONTriggerTrackToTrackerClusters.cxx:60
 AliMUONTriggerTrackToTrackerClusters.cxx:61
 AliMUONTriggerTrackToTrackerClusters.cxx:62
 AliMUONTriggerTrackToTrackerClusters.cxx:63
 AliMUONTriggerTrackToTrackerClusters.cxx:64
 AliMUONTriggerTrackToTrackerClusters.cxx:65
 AliMUONTriggerTrackToTrackerClusters.cxx:66
 AliMUONTriggerTrackToTrackerClusters.cxx:67
 AliMUONTriggerTrackToTrackerClusters.cxx:68
 AliMUONTriggerTrackToTrackerClusters.cxx:69
 AliMUONTriggerTrackToTrackerClusters.cxx:70
 AliMUONTriggerTrackToTrackerClusters.cxx:71
 AliMUONTriggerTrackToTrackerClusters.cxx:72
 AliMUONTriggerTrackToTrackerClusters.cxx:73
 AliMUONTriggerTrackToTrackerClusters.cxx:74
 AliMUONTriggerTrackToTrackerClusters.cxx:75
 AliMUONTriggerTrackToTrackerClusters.cxx:76
 AliMUONTriggerTrackToTrackerClusters.cxx:77
 AliMUONTriggerTrackToTrackerClusters.cxx:78
 AliMUONTriggerTrackToTrackerClusters.cxx:79
 AliMUONTriggerTrackToTrackerClusters.cxx:80
 AliMUONTriggerTrackToTrackerClusters.cxx:81
 AliMUONTriggerTrackToTrackerClusters.cxx:82
 AliMUONTriggerTrackToTrackerClusters.cxx:83
 AliMUONTriggerTrackToTrackerClusters.cxx:84
 AliMUONTriggerTrackToTrackerClusters.cxx:85
 AliMUONTriggerTrackToTrackerClusters.cxx:86
 AliMUONTriggerTrackToTrackerClusters.cxx:87
 AliMUONTriggerTrackToTrackerClusters.cxx:88
 AliMUONTriggerTrackToTrackerClusters.cxx:89
 AliMUONTriggerTrackToTrackerClusters.cxx:90
 AliMUONTriggerTrackToTrackerClusters.cxx:91
 AliMUONTriggerTrackToTrackerClusters.cxx:92
 AliMUONTriggerTrackToTrackerClusters.cxx:93
 AliMUONTriggerTrackToTrackerClusters.cxx:94
 AliMUONTriggerTrackToTrackerClusters.cxx:95
 AliMUONTriggerTrackToTrackerClusters.cxx:96
 AliMUONTriggerTrackToTrackerClusters.cxx:97
 AliMUONTriggerTrackToTrackerClusters.cxx:98
 AliMUONTriggerTrackToTrackerClusters.cxx:99
 AliMUONTriggerTrackToTrackerClusters.cxx:100
 AliMUONTriggerTrackToTrackerClusters.cxx:101
 AliMUONTriggerTrackToTrackerClusters.cxx:102
 AliMUONTriggerTrackToTrackerClusters.cxx:103
 AliMUONTriggerTrackToTrackerClusters.cxx:104
 AliMUONTriggerTrackToTrackerClusters.cxx:105
 AliMUONTriggerTrackToTrackerClusters.cxx:106
 AliMUONTriggerTrackToTrackerClusters.cxx:107
 AliMUONTriggerTrackToTrackerClusters.cxx:108
 AliMUONTriggerTrackToTrackerClusters.cxx:109
 AliMUONTriggerTrackToTrackerClusters.cxx:110
 AliMUONTriggerTrackToTrackerClusters.cxx:111
 AliMUONTriggerTrackToTrackerClusters.cxx:112
 AliMUONTriggerTrackToTrackerClusters.cxx:113
 AliMUONTriggerTrackToTrackerClusters.cxx:114
 AliMUONTriggerTrackToTrackerClusters.cxx:115
 AliMUONTriggerTrackToTrackerClusters.cxx:116
 AliMUONTriggerTrackToTrackerClusters.cxx:117
 AliMUONTriggerTrackToTrackerClusters.cxx:118
 AliMUONTriggerTrackToTrackerClusters.cxx:119
 AliMUONTriggerTrackToTrackerClusters.cxx:120
 AliMUONTriggerTrackToTrackerClusters.cxx:121
 AliMUONTriggerTrackToTrackerClusters.cxx:122
 AliMUONTriggerTrackToTrackerClusters.cxx:123
 AliMUONTriggerTrackToTrackerClusters.cxx:124
 AliMUONTriggerTrackToTrackerClusters.cxx:125
 AliMUONTriggerTrackToTrackerClusters.cxx:126
 AliMUONTriggerTrackToTrackerClusters.cxx:127
 AliMUONTriggerTrackToTrackerClusters.cxx:128
 AliMUONTriggerTrackToTrackerClusters.cxx:129
 AliMUONTriggerTrackToTrackerClusters.cxx:130
 AliMUONTriggerTrackToTrackerClusters.cxx:131
 AliMUONTriggerTrackToTrackerClusters.cxx:132
 AliMUONTriggerTrackToTrackerClusters.cxx:133
 AliMUONTriggerTrackToTrackerClusters.cxx:134
 AliMUONTriggerTrackToTrackerClusters.cxx:135
 AliMUONTriggerTrackToTrackerClusters.cxx:136
 AliMUONTriggerTrackToTrackerClusters.cxx:137
 AliMUONTriggerTrackToTrackerClusters.cxx:138
 AliMUONTriggerTrackToTrackerClusters.cxx:139
 AliMUONTriggerTrackToTrackerClusters.cxx:140
 AliMUONTriggerTrackToTrackerClusters.cxx:141
 AliMUONTriggerTrackToTrackerClusters.cxx:142
 AliMUONTriggerTrackToTrackerClusters.cxx:143
 AliMUONTriggerTrackToTrackerClusters.cxx:144
 AliMUONTriggerTrackToTrackerClusters.cxx:145
 AliMUONTriggerTrackToTrackerClusters.cxx:146
 AliMUONTriggerTrackToTrackerClusters.cxx:147
 AliMUONTriggerTrackToTrackerClusters.cxx:148
 AliMUONTriggerTrackToTrackerClusters.cxx:149
 AliMUONTriggerTrackToTrackerClusters.cxx:150
 AliMUONTriggerTrackToTrackerClusters.cxx:151
 AliMUONTriggerTrackToTrackerClusters.cxx:152
 AliMUONTriggerTrackToTrackerClusters.cxx:153
 AliMUONTriggerTrackToTrackerClusters.cxx:154
 AliMUONTriggerTrackToTrackerClusters.cxx:155
 AliMUONTriggerTrackToTrackerClusters.cxx:156
 AliMUONTriggerTrackToTrackerClusters.cxx:157
 AliMUONTriggerTrackToTrackerClusters.cxx:158
 AliMUONTriggerTrackToTrackerClusters.cxx:159
 AliMUONTriggerTrackToTrackerClusters.cxx:160
 AliMUONTriggerTrackToTrackerClusters.cxx:161
 AliMUONTriggerTrackToTrackerClusters.cxx:162
 AliMUONTriggerTrackToTrackerClusters.cxx:163
 AliMUONTriggerTrackToTrackerClusters.cxx:164
 AliMUONTriggerTrackToTrackerClusters.cxx:165
 AliMUONTriggerTrackToTrackerClusters.cxx:166
 AliMUONTriggerTrackToTrackerClusters.cxx:167
 AliMUONTriggerTrackToTrackerClusters.cxx:168
 AliMUONTriggerTrackToTrackerClusters.cxx:169
 AliMUONTriggerTrackToTrackerClusters.cxx:170
 AliMUONTriggerTrackToTrackerClusters.cxx:171
 AliMUONTriggerTrackToTrackerClusters.cxx:172
 AliMUONTriggerTrackToTrackerClusters.cxx:173
 AliMUONTriggerTrackToTrackerClusters.cxx:174
 AliMUONTriggerTrackToTrackerClusters.cxx:175
 AliMUONTriggerTrackToTrackerClusters.cxx:176
 AliMUONTriggerTrackToTrackerClusters.cxx:177
 AliMUONTriggerTrackToTrackerClusters.cxx:178
 AliMUONTriggerTrackToTrackerClusters.cxx:179
 AliMUONTriggerTrackToTrackerClusters.cxx:180
 AliMUONTriggerTrackToTrackerClusters.cxx:181
 AliMUONTriggerTrackToTrackerClusters.cxx:182
 AliMUONTriggerTrackToTrackerClusters.cxx:183
 AliMUONTriggerTrackToTrackerClusters.cxx:184
 AliMUONTriggerTrackToTrackerClusters.cxx:185
 AliMUONTriggerTrackToTrackerClusters.cxx:186
 AliMUONTriggerTrackToTrackerClusters.cxx:187
 AliMUONTriggerTrackToTrackerClusters.cxx:188
 AliMUONTriggerTrackToTrackerClusters.cxx:189
 AliMUONTriggerTrackToTrackerClusters.cxx:190
 AliMUONTriggerTrackToTrackerClusters.cxx:191
 AliMUONTriggerTrackToTrackerClusters.cxx:192
 AliMUONTriggerTrackToTrackerClusters.cxx:193
 AliMUONTriggerTrackToTrackerClusters.cxx:194
 AliMUONTriggerTrackToTrackerClusters.cxx:195
 AliMUONTriggerTrackToTrackerClusters.cxx:196
 AliMUONTriggerTrackToTrackerClusters.cxx:197
 AliMUONTriggerTrackToTrackerClusters.cxx:198
 AliMUONTriggerTrackToTrackerClusters.cxx:199
 AliMUONTriggerTrackToTrackerClusters.cxx:200
 AliMUONTriggerTrackToTrackerClusters.cxx:201
 AliMUONTriggerTrackToTrackerClusters.cxx:202
 AliMUONTriggerTrackToTrackerClusters.cxx:203
 AliMUONTriggerTrackToTrackerClusters.cxx:204
 AliMUONTriggerTrackToTrackerClusters.cxx:205
 AliMUONTriggerTrackToTrackerClusters.cxx:206
 AliMUONTriggerTrackToTrackerClusters.cxx:207
 AliMUONTriggerTrackToTrackerClusters.cxx:208
 AliMUONTriggerTrackToTrackerClusters.cxx:209
 AliMUONTriggerTrackToTrackerClusters.cxx:210
 AliMUONTriggerTrackToTrackerClusters.cxx:211
 AliMUONTriggerTrackToTrackerClusters.cxx:212
 AliMUONTriggerTrackToTrackerClusters.cxx:213
 AliMUONTriggerTrackToTrackerClusters.cxx:214
 AliMUONTriggerTrackToTrackerClusters.cxx:215
 AliMUONTriggerTrackToTrackerClusters.cxx:216
 AliMUONTriggerTrackToTrackerClusters.cxx:217
 AliMUONTriggerTrackToTrackerClusters.cxx:218
 AliMUONTriggerTrackToTrackerClusters.cxx:219
 AliMUONTriggerTrackToTrackerClusters.cxx:220
 AliMUONTriggerTrackToTrackerClusters.cxx:221
 AliMUONTriggerTrackToTrackerClusters.cxx:222
 AliMUONTriggerTrackToTrackerClusters.cxx:223
 AliMUONTriggerTrackToTrackerClusters.cxx:224
 AliMUONTriggerTrackToTrackerClusters.cxx:225
 AliMUONTriggerTrackToTrackerClusters.cxx:226
 AliMUONTriggerTrackToTrackerClusters.cxx:227
 AliMUONTriggerTrackToTrackerClusters.cxx:228
 AliMUONTriggerTrackToTrackerClusters.cxx:229