ROOT logo
#ifndef ALIANALYSISTASKMUONREFIT_H
#define ALIANALYSISTASKMUONREFIT_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id$ */ 

/// \ingroup muondep
/// \class AliAnalysisTaskMuonRefit
/// \brief intermediate task for refitting
//Author: Philippe Pillot - SUBATECH Nantes

#include <TString.h>
#include "AliAnalysisTaskSE.h"

class AliMUONVCluster;
class AliMUONGeometryTransformer;
class AliMUONESDInterface;
class AliMUONRefitter;
class AliMUONTriggerCircuit;
class AliMUONTrackHitPattern;

class AliAnalysisTaskMuonRefit : public AliAnalysisTaskSE {
public:
  
  AliAnalysisTaskMuonRefit();
  AliAnalysisTaskMuonRefit(const char *name);
  virtual ~AliAnalysisTaskMuonRefit();
  
  /// Set location of the default OCDB storage (if not set use "raw://")
  void SetDefaultStorage(const char* ocdbPath) { fDefaultStorage = ocdbPath; }
  
  // reset the cluster resolution (by default use the one set in the recoParam)
  void ResetClusterResolution(Int_t chId, Double_t valNB, Double_t valB);
  void ResetClusterResolution(Double_t valNB[10], Double_t valB[10]);
  
  /// Enable track improvement (clusters/tracks that do not pass the sigma cut will be removed)
  /// If sigmaCut < 0: use the one set in the recoParam
  /// By default the "improveTrack" flag and the sigma cut are taken from the recoParam
  void ImproveTracks(Bool_t flag = kTRUE, Double_t sigmaCut = -1.) {fImproveTracks = flag; fSigmaCut = sigmaCut;} 
  
  /// Set the sigma cut for tracker/trigger track matching (by default use the one set in the recoParam)
  void SetSigmaCutForTrigger(Double_t val) {fSigmaCutForTrigger = val;}
  
  /// Set the OCDB path to the alignment file used in the reco (if not set use default storage)
  void SetAlignStorage(const char* ocdbPath) { fOldAlignStorage = ocdbPath; }
  
  // set the OCDB path to the alignment files to be used to realign the clusters before refitting
  void ReAlign(const char* oldAlignStorage = 0x0, const char* newAlignStorage = "");
  
  // Set the magnetic field map to be used during refitting
  void SetFieldPath(const char* field) { fField = field; }
  
  /// set the flag to remove mono-cathod clusters (either considering all the pads or only the ones directly below)
  void RemoveMonoCathodClusters(Bool_t flag = kTRUE, Bool_t checkAllPads = kTRUE) {fRemoveMonoCathCl = flag; fCheckAllPads = checkAllPads;}
  
  /// Tag the refitted tracks rejected by improvement (or no longer matched) instead of removing them (or the trigger part)
  /// Eventually keep the old track parameters if the refitted track no longer match the trigger
  void TagBadTracks(Bool_t tag = kTRUE, Bool_t keep = kTRUE) {fTagBadTracks = tag; fKeepOldParam = keep;}
  
  virtual void   UserCreateOutputObjects();
  virtual void   UserExec(Option_t *);
  virtual void   NotifyRun();
  virtual void   Terminate(Option_t *);
  
private:
  
  /// Not implemented
  AliAnalysisTaskMuonRefit(const AliAnalysisTaskMuonRefit& rhs);
  /// Not implemented
  AliAnalysisTaskMuonRefit& operator = (const AliAnalysisTaskMuonRefit& rhs);
  
  void ModifyCluster(AliMUONVCluster& cl);
  void CheckPads(AliMUONVCluster *cl, Bool_t &hasBending, Bool_t &hasNonBending) const;
  void CheckPadsBelow(AliMUONVCluster *cl, Bool_t &hasBending, Bool_t &hasNonBending) const;
  Bool_t SetMagField() const;
  
private:
  
  Double_t fClusterResNB[10]; ///< cluster resolution in non-bending direction
  Double_t fClusterResB[10];  ///< cluster resolution in bending direction
  
  TString  fDefaultStorage;     ///< location of the default OCDB storage
  Bool_t   fImproveTracks;      ///< enable track improvement
  Double_t fSigmaCut;           ///< sigma cut for track improvement
  Double_t fSigmaCutForTrigger; ///< sigma cut for tracker/trigger track matching
  Bool_t   fReAlign;            ///< flag telling wether to re-align the spectrometer or not before refitting
  TString  fOldAlignStorage;    ///< location of the OCDB storage where to find old MUON/Align/Data (use the default one if empty)
  TString  fNewAlignStorage;    ///< location of the OCDB storage where to find new MUON/Align/Data (use the default one if empty)
  AliMUONGeometryTransformer *fOldGeoTransformer; //!< geometry transformer used to recontruct the present data
  AliMUONGeometryTransformer *fNewGeoTransformer; //!< new geometry transformer containing the new alignment to be applied
  TString  fField;              ///< magnetic field map to be used during refitting
  Bool_t   fRemoveMonoCathCl;   ///< remove or not the mono-cathod clusters
  Bool_t   fCheckAllPads;       ///< use all pads or only the ones directly below the cluster to look for mono-cathods
  Bool_t   fTagBadTracks;       ///< tag the bad tracks instead of removing them
  Bool_t   fKeepOldParam;       ///< keep old track parameters if the refitted track no longer match the trigger

  AliMUONTriggerCircuit  *fTriggerCircuit;  //!< trigger circuit
  AliMUONESDInterface    *fESDInterface;    //!< esd interface to recover muon objects
  AliMUONRefitter        *fRefitter;        //!< refitter object
  AliMUONTrackHitPattern *fTrackHitPattern; //!< object to perform the tracker/trigger track matching
  
  ClassDef(AliAnalysisTaskMuonRefit, 2); // track refitter
};

//________________________________________________________________________
inline void AliAnalysisTaskMuonRefit::ResetClusterResolution(Int_t chId, Double_t valNB, Double_t valB)
{
  /// set chamber non-bending and bending resolutions
  if (chId < 0 || chId >= 10) return;
  fClusterResNB[chId] = valNB;
  fClusterResB[chId] = valB;
}

//________________________________________________________________________
inline void AliAnalysisTaskMuonRefit::ResetClusterResolution(Double_t valNB[10], Double_t valB[10])
{
  /// set chambers non-bending and bending resolutions
  for (Int_t i = 0; i < 10; i++) {
    fClusterResNB[i] = valNB[i];
    fClusterResB[i] = valB[i];
  }
}

//________________________________________________________________________
inline void AliAnalysisTaskMuonRefit::ReAlign(const char* oldAlignStorage, const char* newAlignStorage)
{
  /// Set the flag to activate the re-alignment and the specific storage where to find the old/new alignment data.
  /// If oldAlignStorage = 0x0 we assume the spectrometer was not aligned before (default geometry)
  /// If old(new)AlignStorage = "" we assume the old(new) alignment data are in the default storage
  if (oldAlignStorage) fOldAlignStorage = oldAlignStorage;
  else fOldAlignStorage = "none";
  fNewAlignStorage = newAlignStorage;
  fReAlign = kTRUE;
}

#endif

 AliAnalysisTaskMuonRefit.h:1
 AliAnalysisTaskMuonRefit.h:2
 AliAnalysisTaskMuonRefit.h:3
 AliAnalysisTaskMuonRefit.h:4
 AliAnalysisTaskMuonRefit.h:5
 AliAnalysisTaskMuonRefit.h:6
 AliAnalysisTaskMuonRefit.h:7
 AliAnalysisTaskMuonRefit.h:8
 AliAnalysisTaskMuonRefit.h:9
 AliAnalysisTaskMuonRefit.h:10
 AliAnalysisTaskMuonRefit.h:11
 AliAnalysisTaskMuonRefit.h:12
 AliAnalysisTaskMuonRefit.h:13
 AliAnalysisTaskMuonRefit.h:14
 AliAnalysisTaskMuonRefit.h:15
 AliAnalysisTaskMuonRefit.h:16
 AliAnalysisTaskMuonRefit.h:17
 AliAnalysisTaskMuonRefit.h:18
 AliAnalysisTaskMuonRefit.h:19
 AliAnalysisTaskMuonRefit.h:20
 AliAnalysisTaskMuonRefit.h:21
 AliAnalysisTaskMuonRefit.h:22
 AliAnalysisTaskMuonRefit.h:23
 AliAnalysisTaskMuonRefit.h:24
 AliAnalysisTaskMuonRefit.h:25
 AliAnalysisTaskMuonRefit.h:26
 AliAnalysisTaskMuonRefit.h:27
 AliAnalysisTaskMuonRefit.h:28
 AliAnalysisTaskMuonRefit.h:29
 AliAnalysisTaskMuonRefit.h:30
 AliAnalysisTaskMuonRefit.h:31
 AliAnalysisTaskMuonRefit.h:32
 AliAnalysisTaskMuonRefit.h:33
 AliAnalysisTaskMuonRefit.h:34
 AliAnalysisTaskMuonRefit.h:35
 AliAnalysisTaskMuonRefit.h:36
 AliAnalysisTaskMuonRefit.h:37
 AliAnalysisTaskMuonRefit.h:38
 AliAnalysisTaskMuonRefit.h:39
 AliAnalysisTaskMuonRefit.h:40
 AliAnalysisTaskMuonRefit.h:41
 AliAnalysisTaskMuonRefit.h:42
 AliAnalysisTaskMuonRefit.h:43
 AliAnalysisTaskMuonRefit.h:44
 AliAnalysisTaskMuonRefit.h:45
 AliAnalysisTaskMuonRefit.h:46
 AliAnalysisTaskMuonRefit.h:47
 AliAnalysisTaskMuonRefit.h:48
 AliAnalysisTaskMuonRefit.h:49
 AliAnalysisTaskMuonRefit.h:50
 AliAnalysisTaskMuonRefit.h:51
 AliAnalysisTaskMuonRefit.h:52
 AliAnalysisTaskMuonRefit.h:53
 AliAnalysisTaskMuonRefit.h:54
 AliAnalysisTaskMuonRefit.h:55
 AliAnalysisTaskMuonRefit.h:56
 AliAnalysisTaskMuonRefit.h:57
 AliAnalysisTaskMuonRefit.h:58
 AliAnalysisTaskMuonRefit.h:59
 AliAnalysisTaskMuonRefit.h:60
 AliAnalysisTaskMuonRefit.h:61
 AliAnalysisTaskMuonRefit.h:62
 AliAnalysisTaskMuonRefit.h:63
 AliAnalysisTaskMuonRefit.h:64
 AliAnalysisTaskMuonRefit.h:65
 AliAnalysisTaskMuonRefit.h:66
 AliAnalysisTaskMuonRefit.h:67
 AliAnalysisTaskMuonRefit.h:68
 AliAnalysisTaskMuonRefit.h:69
 AliAnalysisTaskMuonRefit.h:70
 AliAnalysisTaskMuonRefit.h:71
 AliAnalysisTaskMuonRefit.h:72
 AliAnalysisTaskMuonRefit.h:73
 AliAnalysisTaskMuonRefit.h:74
 AliAnalysisTaskMuonRefit.h:75
 AliAnalysisTaskMuonRefit.h:76
 AliAnalysisTaskMuonRefit.h:77
 AliAnalysisTaskMuonRefit.h:78
 AliAnalysisTaskMuonRefit.h:79
 AliAnalysisTaskMuonRefit.h:80
 AliAnalysisTaskMuonRefit.h:81
 AliAnalysisTaskMuonRefit.h:82
 AliAnalysisTaskMuonRefit.h:83
 AliAnalysisTaskMuonRefit.h:84
 AliAnalysisTaskMuonRefit.h:85
 AliAnalysisTaskMuonRefit.h:86
 AliAnalysisTaskMuonRefit.h:87
 AliAnalysisTaskMuonRefit.h:88
 AliAnalysisTaskMuonRefit.h:89
 AliAnalysisTaskMuonRefit.h:90
 AliAnalysisTaskMuonRefit.h:91
 AliAnalysisTaskMuonRefit.h:92
 AliAnalysisTaskMuonRefit.h:93
 AliAnalysisTaskMuonRefit.h:94
 AliAnalysisTaskMuonRefit.h:95
 AliAnalysisTaskMuonRefit.h:96
 AliAnalysisTaskMuonRefit.h:97
 AliAnalysisTaskMuonRefit.h:98
 AliAnalysisTaskMuonRefit.h:99
 AliAnalysisTaskMuonRefit.h:100
 AliAnalysisTaskMuonRefit.h:101
 AliAnalysisTaskMuonRefit.h:102
 AliAnalysisTaskMuonRefit.h:103
 AliAnalysisTaskMuonRefit.h:104
 AliAnalysisTaskMuonRefit.h:105
 AliAnalysisTaskMuonRefit.h:106
 AliAnalysisTaskMuonRefit.h:107
 AliAnalysisTaskMuonRefit.h:108
 AliAnalysisTaskMuonRefit.h:109
 AliAnalysisTaskMuonRefit.h:110
 AliAnalysisTaskMuonRefit.h:111
 AliAnalysisTaskMuonRefit.h:112
 AliAnalysisTaskMuonRefit.h:113
 AliAnalysisTaskMuonRefit.h:114
 AliAnalysisTaskMuonRefit.h:115
 AliAnalysisTaskMuonRefit.h:116
 AliAnalysisTaskMuonRefit.h:117
 AliAnalysisTaskMuonRefit.h:118
 AliAnalysisTaskMuonRefit.h:119
 AliAnalysisTaskMuonRefit.h:120
 AliAnalysisTaskMuonRefit.h:121
 AliAnalysisTaskMuonRefit.h:122
 AliAnalysisTaskMuonRefit.h:123
 AliAnalysisTaskMuonRefit.h:124
 AliAnalysisTaskMuonRefit.h:125
 AliAnalysisTaskMuonRefit.h:126
 AliAnalysisTaskMuonRefit.h:127
 AliAnalysisTaskMuonRefit.h:128
 AliAnalysisTaskMuonRefit.h:129
 AliAnalysisTaskMuonRefit.h:130
 AliAnalysisTaskMuonRefit.h:131
 AliAnalysisTaskMuonRefit.h:132
 AliAnalysisTaskMuonRefit.h:133
 AliAnalysisTaskMuonRefit.h:134
 AliAnalysisTaskMuonRefit.h:135
 AliAnalysisTaskMuonRefit.h:136
 AliAnalysisTaskMuonRefit.h:137
 AliAnalysisTaskMuonRefit.h:138