From: martinez Date: Wed, 9 Sep 2009 17:16:55 +0000 (+0000) Subject: Task for adding MC labels (if rawdata are produced) to the ESD muon tracks using... X-Git-Url: http://git.uio.no/git/?a=commitdiff_plain;h=63c5d0a6d3b92abf963bfe9250cb13389e651078;p=u%2Fmrichter%2FAliRoot.git Task for adding MC labels (if rawdata are produced) to the ESD muon tracks using the RecoCheck algorithm (Philippe) --- diff --git a/PWG3/PWG3muondepLinkDef.h b/PWG3/PWG3muondepLinkDef.h index a69c65503b9..bc4dc3a03d3 100644 --- a/PWG3/PWG3muondepLinkDef.h +++ b/PWG3/PWG3muondepLinkDef.h @@ -7,6 +7,7 @@ #pragma link C++ class AliAnalysisTaskMuonTrackingEff+; #pragma link C++ class AliCheckMuonDetEltResponse+; #pragma link C++ class AliAnalysisTaskRecoCheck+; +#pragma link C++ class AliAnalysisTaskESDMCLabelAddition+; #endif diff --git a/PWG3/libPWG3muondep.pkg b/PWG3/libPWG3muondep.pkg index 361960d7a7c..3ee15b2a7ea 100644 --- a/PWG3/libPWG3muondep.pkg +++ b/PWG3/libPWG3muondep.pkg @@ -2,7 +2,8 @@ SRCS:= muondep/AliAnalysisTaskMuonTrackingEff.cxx \ muondep/AliCheckMuonDetEltResponse.cxx \ - muondep/AliAnalysisTaskRecoCheck.cxx + muondep/AliAnalysisTaskRecoCheck.cxx \ + muondep/AliAnalysisTaskESDMCLabelAddition.cxx HDRS:= $(SRCS:.cxx=.h) diff --git a/PWG3/muondep/AddTaskESDMCLabelAddition.C b/PWG3/muondep/AddTaskESDMCLabelAddition.C new file mode 100644 index 00000000000..e00b8217eba --- /dev/null +++ b/PWG3/muondep/AddTaskESDMCLabelAddition.C @@ -0,0 +1,40 @@ +AliAnalysisTaskESDMCLabelAddition *AddTaskESDMCLabelAddition(Bool_t useKineFilter=kTRUE) +{ +// Creates a filter task and adds it to the analysis manager. +// This file allows the creation of MC labels (based on the code of Philippe P.) + + // Get the pointer to the existing analysis manager via the static access method. + //============================================================================== + AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager(); + if (!mgr) { + ::Error("AddTaskESDMCLabelAddition", "No analysis manager to connect to."); + return NULL; + } + + TString type = mgr->GetInputEventHandler()->GetDataType(); + // Check if MC handler is connected in case kine filter requested + AliMCEventHandler *mcH = (AliMCEventHandler*)mgr->GetMCtruthEventHandler(); + if (!mcH && useKineFilter) { + ::Error("AddTaskESDFilter", "No MC handler connected while kine filtering requested"); + return NULL; + } + + if (useKineFilter) { + AliAnalysisTaskMCParticleFilter *kinefilter = new AliAnalysisTaskMCParticleFilter("Particle Kine Filter"); + mgr->AddTask(kinefilter); + } + + + // Create the task, add it to the manager and configure it. + //=========================================================================== + // Barrel tracks filter + AliAnalysisTaskESDMCLabelAddition *ESDMCLabeltask = new AliAnalysisTaskESDMCLabelAddition("ESD MC Labels addition"); + mgr->AddTask(ESDMCLabeltask); + + // Create ONLY the output containers for the data produced by the task. + // Get and connect other common input/output containers via the manager as below + //============================================================================== + mgr->ConnectInput (ESDMCLabeltask, 0, mgr->GetCommonInputContainer()); + + return ESDMCLabeltask; +} diff --git a/PWG3/muondep/AliAnalysisTaskESDMCLabelAddition.cxx b/PWG3/muondep/AliAnalysisTaskESDMCLabelAddition.cxx new file mode 100644 index 00000000000..b467f51d96b --- /dev/null +++ b/PWG3/muondep/AliAnalysisTaskESDMCLabelAddition.cxx @@ -0,0 +1,237 @@ +/************************************************************************** + * 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. * + **************************************************************************/ + +// Add the muon tracks to the generic AOD track branch during the +// filtering of the ESD - R. Arnaldi 5/5/08 + +#include +#include +#include + +#include "AliAnalysisTaskESDMCLabelAddition.h" +#include "AliAnalysisManager.h" +#include "AliESDEvent.h" +#include "AliAODEvent.h" +#include "AliESDInputHandler.h" +#include "AliAODHandler.h" +#include "AliAnalysisFilter.h" +#include "AliESDtrack.h" +#include "AliESDMuonTrack.h" +#include "AliESDMuonCluster.h" +#include "AliESDVertex.h" +#include "AliMultiplicity.h" +#include "AliLog.h" +#include "AliStack.h" +#include "AliMCEvent.h" +#include "AliMCEventHandler.h" +#include "AliAODMCParticle.h" + +#include "AliMUONRecoCheck.h" +#include "AliMUONESDInterface.h" +#include "AliMUONTrack.h" +#include "AliMUONTrackParam.h" +#include "AliMUONVTrackStore.h" +#include "AliMUONVCluster.h" +#include "AliMUONVClusterStore.h" + +ClassImp(AliAnalysisTaskESDMCLabelAddition) + +// sigma cut applied to match a reconstructed cluster with a trackref +const Double_t AliAnalysisTaskESDMCLabelAddition::fgkSigmaCut = 10.; + +//---------------------------------------------------------------------- +AliAnalysisTaskESDMCLabelAddition::AliAnalysisTaskESDMCLabelAddition(): + AliAnalysisTaskSE() +{ + // Default constructor +} + + +//---------------------------------------------------------------------- +AliAnalysisTaskESDMCLabelAddition::AliAnalysisTaskESDMCLabelAddition(const char* name): + AliAnalysisTaskSE(name) +{ + // Constructor +} + + +//---------------------------------------------------------------------- +void AliAnalysisTaskESDMCLabelAddition::UserCreateOutputObjects() +{ +} + + +//---------------------------------------------------------------------- +void AliAnalysisTaskESDMCLabelAddition::Init() +{ + if (fDebug > 1) AliInfo("Init() \n"); +} + + +//---------------------------------------------------------------------- +void AliAnalysisTaskESDMCLabelAddition::UserExec(Option_t */*option*/) +{ + // Execute analysis for current event + Long64_t ientry = Entry(); + printf("MCLabel Addition: Analysing event # %5d\n", (Int_t) ientry); + + AddMCLabel(); +} + + +//---------------------------------------------------------------------- +void AliAnalysisTaskESDMCLabelAddition::AddMCLabel() +{ + // Load ESD event + AliESDEvent* esd = dynamic_cast(InputEvent()); + + // Load MC event + AliMCEventHandler *mcH = 0; + if(MCEvent()) mcH = (AliMCEventHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetMCtruthEventHandler()); + + // Get reference tracks + AliMUONRecoCheck rc(esd,mcH); + AliMUONVTrackStore* trackRefStore = rc.TrackRefs(-1); + + // Loop over reconstructed tracks + AliESDMuonTrack *esdTrack = 0x0; + Int_t nMuTracks = esd->GetNumberOfMuonTracks(); + for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) { + + esdTrack = esd->GetMuonTrack(nMuTrack); + + // skip ghosts + if (!esdTrack->ContainTrackerData()) continue; + + // try to match the reconstructed track with a simulated one + AliMUONTrack* matchedTrackRef = MatchWithTrackRef(*esdTrack, *trackRefStore); + + if (matchedTrackRef) { + + // set the MC label + esdTrack->SetLabel(matchedTrackRef->GetUniqueID()); + + // remove already matched trackRefs + trackRefStore->Remove(*matchedTrackRef); + + } + + } + +} + + +//---------------------------------------------------------------------- +void AliAnalysisTaskESDMCLabelAddition::Terminate(Option_t */*option*/) +{ + // Terminate analysis + // + if (fDebug > 1) printf("AnalysisESDfilter: Terminate() \n"); +} + + +//---------------------------------------------------------------------- +AliMUONTrack* AliAnalysisTaskESDMCLabelAddition::ESDToMUON(AliESDMuonTrack &esdTrack) +{ + /// Convert an ESD track into a MUON track with dummy parameters (just to fill the clusters). + /// It is the responsability of the user to delete the track afterward + + AliMUONTrack *track = new AliMUONTrack(); + + // ckeck whether the ESD track contains clusters + if(!esdTrack.ClustersStored()) return track; + + // track parameters at first cluster + AliMUONTrackParam param; + AliMUONESDInterface::GetParamAtFirstCluster(esdTrack, param); + AliMUONESDInterface::GetParamCov(esdTrack, param); + + // create empty cluster + AliMUONVClusterStore* cStore = AliMUONESDInterface::NewClusterStore(); + AliMUONVCluster* cluster = cStore->CreateCluster(0,0,0); + + // loop over ESD clusters + AliESDMuonCluster *esdCluster = (AliESDMuonCluster*) esdTrack.GetClusters().First(); + while (esdCluster) { + + // copy cluster information + AliMUONESDInterface::ESDToMUON(*esdCluster, *cluster); + + // only set the Z parameter to avoid error in the AddTrackParamAtCluster(...) method + param.SetZ(cluster->GetZ()); + + // add common track parameters at current cluster + track->AddTrackParamAtCluster(param, *cluster, kTRUE); + + esdCluster = (AliESDMuonCluster*) esdTrack.GetClusters().After(esdCluster); + } + + // clean memory + delete cluster; + delete cStore; + + return track; + +} + + +//---------------------------------------------------------------------- +AliMUONTrack* AliAnalysisTaskESDMCLabelAddition::MatchWithTrackRef(AliESDMuonTrack &esdTrack, + AliMUONVTrackStore &trackRefStore) +{ + /// Return the trackRef matched with the reconstructed track and the fraction of matched clusters + + AliMUONTrack *matchedTrackRef = 0x0; + + // convert ESD track to MUON track + AliMUONTrack *track = ESDToMUON(esdTrack); + + // look for the corresponding simulated track if any + TIter next(trackRefStore.CreateIterator()); + AliMUONTrack* trackRef; + while ( ( trackRef = static_cast(next()) ) ) { + + // check compatibility + if (TrackMatched(*track, *trackRef)) { + matchedTrackRef = trackRef; + break; + } + + } + + // clean memory + delete track; + + return matchedTrackRef; + +} + + +//---------------------------------------------------------------------- +Bool_t AliAnalysisTaskESDMCLabelAddition::TrackMatched(AliMUONTrack &track, AliMUONTrack &trackRef) +{ + /// Try to match 2 tracks + + Bool_t compTrack[10]; + Int_t nMatchClusters = track.CompatibleTrack(&trackRef, fgkSigmaCut, compTrack); + Double_t fractionOfMatchCluster = ((Double_t)nMatchClusters) / ((Double_t)track.GetNClusters()); + + if ((compTrack[0] || compTrack[1] || compTrack[2] || compTrack[3]) && // at least 1 cluster matched in st 1 & 2 + (compTrack[6] || compTrack[7] || compTrack[8] || compTrack[9]) && // at least 1 cluster matched in st 4 & 5 + fractionOfMatchCluster > 0.5) return kTRUE; // more than 50% of clusters matched + else return kFALSE; + +} + diff --git a/PWG3/muondep/AliAnalysisTaskESDMCLabelAddition.h b/PWG3/muondep/AliAnalysisTaskESDMCLabelAddition.h new file mode 100644 index 00000000000..958569d9d82 --- /dev/null +++ b/PWG3/muondep/AliAnalysisTaskESDMCLabelAddition.h @@ -0,0 +1,47 @@ +#ifndef ALIANALYSISTASKESDMCLABELADDITION_H +#define ALIANALYSISTASKESDMCLABELADDITION_H + +/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * + * See cxx source for full Copyright notice */ + +#include +#include "AliAnalysisTaskSE.h" + +class AliAnalysisFilter; +class AliStack; +class AliESDMuonTrack; +class AliMUONTrack; +class AliMUONVTrackStore; + +class AliAnalysisTaskESDMCLabelAddition : public AliAnalysisTaskSE +{ + + public: + AliAnalysisTaskESDMCLabelAddition(); + AliAnalysisTaskESDMCLabelAddition(const char* name); + virtual ~AliAnalysisTaskESDMCLabelAddition() {;} + // Implementation of interface methods + virtual void UserCreateOutputObjects(); + virtual void Init(); + virtual void LocalInit() {Init();} + virtual void UserExec(Option_t *option); + virtual void Terminate(Option_t *option); + + + private: + + static const Double_t fgkSigmaCut; // sigma cut applied to match a reconstructed cluster with a trackref + + AliAnalysisTaskESDMCLabelAddition(const AliAnalysisTaskESDMCLabelAddition&); + AliAnalysisTaskESDMCLabelAddition& operator=(const AliAnalysisTaskESDMCLabelAddition&); + + void AddMCLabel(); + AliMUONTrack* ESDToMUON(AliESDMuonTrack &esdTrack); + AliMUONTrack* MatchWithTrackRef(AliESDMuonTrack &esdTrack, AliMUONVTrackStore &trackRefStore); + Bool_t TrackMatched(AliMUONTrack &track, AliMUONTrack &trackRef); + + ClassDef(AliAnalysisTaskESDMCLabelAddition, 1); // Analysis task for standard ESD filtering + +}; + +#endif