LCOV - code coverage report
Current view: top level - MUON/MUONrec - AliMUONTriggerTrackToTrackerClusters.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1 78 1.3 %
Date: 2016-06-14 17:26:59 Functions: 1 9 11.1 %

          Line data    Source code
       1             : /**************************************************************************
       2             : * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
       3             : *                                                                        *
       4             : * Author: The ALICE Off-line Project.                                    *
       5             : * Contributors are mentioned in the code where appropriate.              *
       6             : *                                                                        *
       7             : * Permission to use, copy, modify and distribute this software and its   *
       8             : * documentation strictly for non-commercial purposes is hereby granted   *
       9             : * without fee, provided that the above copyright notice appears in all   *
      10             : * copies and that both the copyright notice and this permission notice   *
      11             : * appear in the supporting documentation. The authors make no claims     *
      12             : * about the suitability of this software for any purpose. It is          *
      13             : * provided "as is" without express or implied warranty.                  *
      14             : **************************************************************************/
      15             : 
      16             : // $Id$
      17             : 
      18             : #include "AliMUONTriggerTrackToTrackerClusters.h"
      19             : 
      20             : ///\class AliMUONTriggerTrackToTrackerClusters
      21             : /// 
      22             : /// Class to convert trigger tracks into "fake" clusters in stations 4 and 5
      23             : ///
      24             : /// Only intent is to be able to reconstruct data where stations 4 and 5 were
      25             : /// not functionning, typically early cosmic runs
      26             : ///
      27             : ///\author Laurent Aphecetche, Subatech
      28             : 
      29             : #include "AliCodeTimer.h"
      30             : #include "AliLog.h"
      31             : #include "AliMUONConstants.h"
      32             : #include "AliMUONGeometryTransformer.h"
      33             : #include "AliMUONTrack.h"
      34             : #include "AliMUONTrackExtrap.h"
      35             : #include "AliMUONTriggerTrack.h"
      36             : #include "AliMUONVCluster.h"
      37             : #include "AliMUONVClusterStore.h"
      38             : #include "AliMUONVTriggerTrackStore.h"
      39             : #include "AliMUONTrackParam.h"
      40             : #include "AliMpArea.h"
      41             : #include "AliMpDEManager.h"
      42             : #include <TMath.h>
      43             : 
      44             : ///\cond CLASSIMP
      45          18 : ClassImp(AliMUONTriggerTrackToTrackerClusters)
      46             : ///\endcond
      47             : 
      48             : //_____________________________________________________________________________
      49             : AliMUONTriggerTrackToTrackerClusters::AliMUONTriggerTrackToTrackerClusters(const AliMUONGeometryTransformer& transformer,
      50             :                                                                            AliMUONVTriggerTrackStore* trackStore)
      51           0 : : TObject(), fkTransformer(transformer), fTriggerTrackStore(trackStore)
      52           0 : {
      53             :   /// ctor. We do not take ownership of the trigger track store.
      54           0 : }
      55             : 
      56             : //_____________________________________________________________________________
      57             : AliMUONTriggerTrackToTrackerClusters::~AliMUONTriggerTrackToTrackerClusters()
      58           0 : {
      59             :   /// dtor
      60           0 : }
      61             : 
      62             : //_____________________________________________________________________________
      63             : Int_t 
      64             : AliMUONTriggerTrackToTrackerClusters::DetElemId(Int_t chamber, Double_t x, Double_t y,
      65             :                                                 Double_t ex, Double_t ey,
      66             :                                                 Double_t& z) const
      67             : {
      68             :   /// Find in which detection element (x,y) (global) position is.
      69             :   
      70           0 :   AliMpDEIterator it;
      71             :   
      72           0 :   AliMpArea a(x, y, ex, ey);
      73             :   
      74           0 :   it.First(chamber);
      75             :   
      76           0 :   while ( !it.IsDone() )
      77             :   {
      78           0 :     Int_t detElemId = it.CurrentDEId();
      79             :     
      80           0 :     AliMpArea* area = fkTransformer.GetDEArea(detElemId);
      81             :     
      82           0 :     if ( area->Overlap(a) ) 
      83             :     {
      84             :       // get z of the center of that DE.
      85           0 :       Double_t dummyx, dummyy;
      86           0 :       fkTransformer.Local2Global(detElemId,0,0,0,dummyx,dummyy,z);
      87             :       return detElemId;
      88           0 :     }
      89           0 :     it.Next();
      90           0 :   }
      91             :   
      92           0 :   return -1;
      93           0 : }
      94             : 
      95             : //_____________________________________________________________________________
      96             : Int_t 
      97             : AliMUONTriggerTrackToTrackerClusters::GenerateClusters(Int_t iChamber,
      98             :                                                        AliMUONVClusterStore& clusterStore) const
      99             : {
     100             :   /// Generate clusters in given chamber
     101             :   /// Return the number of clusters added to the clusterStore
     102             :   
     103           0 :   AliCodeTimerAuto(Form("Chamber %d",iChamber),0);
     104             :   
     105           0 :   TIter next(fTriggerTrackStore->CreateIterator());
     106             :   
     107             :   AliMUONTriggerTrack* track;
     108             :   Int_t nadded(0);
     109             :   
     110           0 :   while ( ( track = static_cast<AliMUONTriggerTrack*>(next()) ) )
     111             :   {
     112           0 :     nadded += GenerateClusters(iChamber,*track,clusterStore);
     113             :   }
     114             :   return nadded;
     115           0 : }
     116             : 
     117             : //_____________________________________________________________________________
     118             : Int_t 
     119             : AliMUONTriggerTrackToTrackerClusters::GenerateClusters(Int_t iChamber,
     120             :                                                        const AliMUONTriggerTrack& track,
     121             :                                                        AliMUONVClusterStore& clusterStore) const
     122             : {
     123             :   /// From a trigger track, generate 1 cluster in given chamber
     124             :   
     125             :   /// Get a (rough) guestimate of the track momentum
     126             :   
     127             :   Int_t nadded(0);
     128             :   
     129           0 :   Double_t z = AliMUONConstants::DefaultChamberZ(10);
     130             :   
     131           0 :   Double_t bendingCoord = track.GetY11();
     132           0 :   Double_t bendingSlope = TMath::Tan(track.GetThetay());
     133             :   
     134           0 :   Double_t bendingImpact = bendingCoord - z * bendingSlope;
     135             :   
     136           0 :   AliDebug(1,Form("TriggerTrack impact parameter=%e",bendingImpact));
     137             :   
     138             :   //  StdoutToAliDebug(1,track.Print());
     139             :   
     140           0 :   Double_t inverseBendingMomentum = 1. / AliMUONTrackExtrap::GetBendingMomentumFromImpactParam(bendingImpact);
     141             :   
     142             :   // Construct an AliMUONTrackParam from the trigger track, in order to be able to extrapolate it
     143             :   // to chambers 6..9 planes.
     144             :   
     145           0 :   AliMUONTrackParam trackParam;
     146             :   
     147           0 :   trackParam.SetZ(z);
     148           0 :   trackParam.SetNonBendingCoor(track.GetX11());
     149           0 :   trackParam.SetNonBendingSlope(TMath::Tan(track.GetThetax()));
     150           0 :   trackParam.SetBendingCoor(bendingCoord);
     151           0 :   trackParam.SetBendingSlope(bendingSlope);
     152           0 :   trackParam.SetInverseBendingMomentum(inverseBendingMomentum);
     153             :   
     154           0 :   Double_t dZ = AliMUONConstants::DefaultChamberZ(10) - AliMUONConstants::DefaultChamberZ(12);
     155             :   
     156           0 :   Double_t sigmaX = AliMUONConstants::TriggerNonBendingReso();
     157             :   
     158           0 :   Double_t sigmaY = AliMUONConstants::TriggerBendingReso();
     159             :   
     160             :   // Compute and set track parameters covariances
     161           0 :   TMatrixD paramCov(5,5);
     162           0 :   paramCov.Zero();
     163             :   
     164             :   // Non bending plane
     165           0 :   paramCov(0,0) = sigmaX*sigmaX;
     166           0 :   paramCov(0,1) = paramCov(0,0)/dZ;
     167           0 :   paramCov(1,0) = paramCov(0,1);
     168           0 :   paramCov(1,1) = 2.0*paramCov(0,0)/dZ/dZ;
     169             :   
     170             :   // Bending plane
     171           0 :   paramCov(2,2) = sigmaY*sigmaY;
     172           0 :   paramCov(2,3) = paramCov(2,2)/dZ;
     173           0 :   paramCov(3,2) = paramCov(2,3);
     174           0 :   paramCov(3,3) = 2.0*paramCov(2,2)/dZ/dZ;
     175             :   
     176             :   // Inverse bending momentum (50% error)
     177           0 :   paramCov(4,4) = 0.5*inverseBendingMomentum * 0.5*inverseBendingMomentum;
     178             :   
     179             :   // Set covariances
     180           0 :   trackParam.SetCovariances(paramCov);
     181             :   
     182             :   // add MCS effect in the iron wall
     183           0 :   const Float_t kFilterThickness = AliMUONConstants::MuonFilterZEnd()-AliMUONConstants::MuonFilterZBeg(); // cm
     184           0 :   AliMUONTrackExtrap::ExtrapToZCov(&trackParam, AliMUONConstants::MuonFilterZEnd()); // Extrap to iChamber
     185           0 :   AliMUONTrackExtrap::AddMCSEffect(&trackParam, kFilterThickness, AliMUONConstants::MuonFilterX0()); // Add MCS effects
     186             :   
     187             :   // Now we extrapolate this trackParam to chambers 6 -> 9
     188           0 :   Int_t nclusters = clusterStore.GetSize();
     189             :   
     190           0 :   AliMUONTrackParam tp(trackParam);
     191             :   
     192           0 :   Double_t zg = AliMUONConstants::DefaultChamberZ(iChamber);
     193           0 :   AliMUONTrackExtrap::ExtrapToZCov(&tp, zg); // Extrap to iChamber
     194             :   
     195             :   
     196           0 :   AliDebug(1,Form("iChamber=%d",iChamber));
     197             :   
     198           0 :   StdoutToAliDebug(1,tp.Print("FULLCOV"););
     199             :   
     200           0 :   Double_t x = tp.GetNonBendingCoor();
     201           0 :   Double_t y = tp.GetBendingCoor();
     202           0 :   const TMatrixD& cov = tp.GetCovariances();
     203           0 :   Double_t ex = TMath::Sqrt(cov(0,0));
     204           0 :   Double_t ey = TMath::Sqrt(cov(2,2));
     205             :   
     206           0 :   Double_t zde;
     207             :   
     208           0 :   Int_t detElemId = DetElemId(iChamber,x,y,ex,ey,zde);
     209             :   
     210           0 :   AliDebug(1,Form("zg = %e zde = %e",zg,zde));
     211             :   
     212           0 :   if ( AliMpDEManager::IsValidDetElemId(detElemId) ) 
     213             :   {
     214           0 :     AliMUONVCluster* rawCluster = clusterStore.Add(AliMpDEManager::GetChamberId(detElemId), detElemId, nclusters);
     215             :     
     216             :     ++nclusters;
     217             :     ++nadded;
     218             :     
     219           0 :     rawCluster->SetCharge(100.0);
     220           0 :     rawCluster->SetXYZ(x, y, zg);
     221           0 :     rawCluster->SetErrXY(ex,ey);
     222           0 :   }
     223             :   else
     224             :   {
     225           0 :     AliWarning(Form("No DE found at xg=%e yg=%e",x,y));
     226             :   }
     227             :   
     228             :   return nadded;
     229           0 : }

Generated by: LCOV version 1.11