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$ */

/// \ingroup macros
/// \file MUONClusterInfo.C
/// \brief Macro to fill AliMUONClusterInfo objects
///
/// \author Philippe Pillot, SUBATECH

#if !defined(__CINT__) || defined(__MAKECINT__)
#include <TStopwatch.h>
#include <TFile.h>
#include <TObjArray.h>
#include <TTree.h>
#include <TString.h>
#include <Riostream.h>
#include <TRandom.h>
#include <TROOT.h>
#include <TMath.h>

// STEER includes
#include "AliESDEvent.h"
#include "AliRecoParam.h"
#include "AliCDBManager.h"
#include "AliRunLoader.h"
#include "AliLoader.h"
#include "AliHeader.h"

// MUON includes
#include "AliMpConstants.h"
#include "AliMpSegmentation.h"
#include "AliMpVSegmentation.h"
#include "AliMpPad.h"
#include "AliMUONCDB.h"
#include "AliMUONCalibrationData.h"
#include "AliMUONVCalibParam.h"
#include "AliMUONPadInfo.h"
#include "AliMUONClusterInfo.h"
#include "AliMUONRecoParam.h"
#include "AliMUONESDInterface.h"
#include "AliMUONVDigit.h"
#include "AliMUONVDigitStore.h"
#include "AliMUONVCluster.h"
#include "AliMUONVClusterStore.h"
#include "AliMUONTrack.h"
#include "AliMUONTrackParam.h"
#endif

const Int_t printLevel = 1;

TTree* GetESDTree(TFile *esdFile);
UInt_t buildClusterMap(AliMUONTrack &track);

//-----------------------------------------------------------------------
void MUONClusterInfo(Int_t nevents = -1, const char* esdFileName = "AliESDs.root", const char* inFileName = "galice.root",
		     const TString ocdbPath = "local://$ALICE_ROOT/OCDB", const char* outFileName = "clusterInfo.root")
{
  /// 1) if (esdFileName != "")
  /// loop over ESD event and fill AliMUONClusterInfo object with cluster + corresponding track parameters;
  /// 2) if (inFileName != "")
  /// loop over RecPoints and fill AliMUONClusterInfo object with cluster not attached to a track;
  /// 3) write results in a new root file.
  ///
  /// ******************************************* WARNING ******************************************* ///
  /// track parameters at each cluster are recomputed by the interface using Kalman filter + Smoother ///
  /// (It can be changed by resetting the tracker in the interface with a new recoParam object)       ///
  /// and the magnetic field set in the function prepare()                                            ///
  /// ******************************************* WARNING ******************************************* ///
  
  Bool_t useESD = (strcmp(esdFileName,""));
  Bool_t useRecPoints = (strcmp(inFileName,""));
  if (!useESD && !useRecPoints) {
    Error("MUONClusterInfo","you must provide ESD and/or galice root file(s)");
    return;
  }
  
  AliMUONClusterInfo* clusterInfo = new AliMUONClusterInfo();
  AliMUONPadInfo padInfo;
  AliMUONCalibrationData* calibData = 0x0;
  AliMUONESDInterface esdInterface;
  AliMUONVClusterStore* clusterStore = 0x0;
  AliMUONVDigitStore* digitStore = 0x0;
  
  // open the ESD file and tree and connect the ESD event
  TFile* esdFile = 0x0;
  TTree* esdTree = 0x0;
  AliESDEvent* esd = 0x0;
  Int_t runNumber = -1;
  if (useESD) {
    esdFile = TFile::Open(esdFileName);
    esdTree = GetESDTree(esdFile);
    esd = new AliESDEvent();
    esd->ReadFromTree(esdTree);
    if (esdTree->GetEvent(0) <= 0) {
      Error("MUONClusterInfo", "no ESD object found for event 0");
      return;
    }
    runNumber = esd->GetRunNumber();
  }
  
  // get the cluster from RecPoints
  AliRunLoader * rl = 0x0;
  AliLoader* MUONLoader = 0x0;
  if (useRecPoints) {
    rl = AliRunLoader::Open(inFileName,"MUONLoader");
    MUONLoader = rl->GetDetectorLoader("MUON");
    MUONLoader->LoadRecPoints("READ");   
    MUONLoader->LoadDigits("READ");
    rl->LoadHeader();
    if (runNumber < 0) runNumber = rl->GetHeader()->GetRun();
  }
  
  // load necessary data from OCDB
  AliCDBManager::Instance()->SetDefaultStorage(ocdbPath);
  AliCDBManager::Instance()->SetRun(runNumber);
  if (!AliMUONCDB::LoadField()) return;
  if (!AliMUONCDB::LoadMapping(kTRUE)) return;
  AliMUONRecoParam* recoParam = AliMUONCDB::LoadRecoParam();
  if (!recoParam) return;
  
  // reset tracker for track restoring initial track parameters at cluster
  AliMUONESDInterface::ResetTracker(recoParam);
  
  // prepare access to calibration data
  calibData = new AliMUONCalibrationData(runNumber);
  
  // prepare the output tree
  gROOT->cd();
  TFile* clusterInfoFile = TFile::Open(outFileName, "RECREATE");
  clusterInfoFile->SetCompressionLevel(1);
  
  TTree* clusterInfoTree = new TTree("clusterInfoTree","clusterInfoTree");
  clusterInfoTree->Branch("clusterInfo", &clusterInfo, 32000, 99);
  
  // timer start...
  TStopwatch timer;
  
  // Loop over events
  if (useESD) {
    if (nevents > 0) nevents = TMath::Min(nevents,(Int_t)esdTree->GetEntries());
    else nevents = (Int_t)esdTree->GetEntries();
  } else {
    if (nevents > 0) nevents = TMath::Min(nevents,(Int_t)rl->GetNumberOfEvents());
    else nevents = (Int_t)rl->GetNumberOfEvents();
  }
  for (Int_t iEvent = 0; iEvent < nevents; iEvent++) {
    
    //----------------------------------------------//
    // -------------- process event --------------- //
    //----------------------------------------------//
    // get the ESD of current event
    if (useESD) {
      esdTree->GetEvent(iEvent);
      if (!esd) {
        Error("MUONClusterInfo", "no ESD object found for event %d", iEvent);
        return;
      }
      // load the current esd event
      esdInterface.LoadEvent(*esd);
      // get digit store
      if (!useRecPoints) digitStore = esdInterface.GetDigits();
    }
    
    if (useRecPoints) {
      if (!(rl->GetEvent(iEvent) == 0)) {
        Error("MUONClusterInfo", "unable to load event %d", iEvent);
	return;
      }
      // get the clusters of current event
      TTree* treeR = MUONLoader->TreeR();
      clusterStore = AliMUONVClusterStore::Create(*treeR);
      if ( clusterStore != 0x0 ) {
	clusterStore->Clear();
	clusterStore->Connect(*treeR);
	treeR->GetEvent(0);
      }
      // get the digits of current event
      TTree* treeD = MUONLoader->TreeD();
      if (treeD) {
	digitStore = AliMUONVDigitStore::Create(*treeD);
	if ( digitStore != 0x0 ) {
	  digitStore->Clear();
	  digitStore->Connect(*treeD);
	  treeD->GetEvent(0);
	}
      }
    }
    
    //----------------------------------------------//
    // ------------- fill cluster info ------------ //
    //----------------------------------------------//
    // --- loop over the refitted tracks ---
    if (useESD) {
      
      TIter nextTrack(esdInterface.CreateTrackIterator());
      AliMUONTrack* track;
      while ((track = static_cast<AliMUONTrack*>(nextTrack()))) {
	
	UInt_t muonClusterMap = buildClusterMap(*track);
	
	// loop over clusters
	AliMUONTrackParam* trackParam = static_cast<AliMUONTrackParam*>(track->GetTrackParamAtCluster()->First());
	while (trackParam) {
	  clusterInfo->Clear("C");
	  
	  // fill cluster info
	  AliMUONVCluster* cluster = trackParam->GetClusterPtr();
	  clusterInfo->SetRunId(esd->GetRunNumber());
	  clusterInfo->SetEventId(iEvent);
	  clusterInfo->SetZ(cluster->GetZ());
	  clusterInfo->SetClusterId(cluster->GetUniqueID());
	  clusterInfo->SetClusterXY(cluster->GetX(), cluster->GetY());
	  clusterInfo->SetClusterXYErr(cluster->GetErrX(), cluster->GetErrY());
	  clusterInfo->SetClusterChi2(cluster->GetChi2());
	  clusterInfo->SetClusterCharge(cluster->GetCharge());
	  
	  // fill track info
	  clusterInfo->SetTrackId(track->GetUniqueID());
	  clusterInfo->SetTrackXY(trackParam->GetNonBendingCoor(), trackParam->GetBendingCoor());
	  clusterInfo->SetTrackThetaXY(TMath::ATan(trackParam->GetNonBendingSlope()), TMath::ATan(trackParam->GetBendingSlope()));
	  clusterInfo->SetTrackP(trackParam->P());
	  const TMatrixD paramCov = trackParam->GetCovariances();
	  clusterInfo->SetTrackXYErr(TMath::Sqrt(paramCov(0,0)), TMath::Sqrt(paramCov(2,2)));
	  clusterInfo->SetTrackChi2(track->GetNormalizedChi2());
	  clusterInfo->SetTrackCharge((Short_t)trackParam->GetCharge());
	  clusterInfo->SetTrackNHits(track->GetNClusters());
	  clusterInfo->SetTrackChamberHitMap(muonClusterMap);
	  
	  // fill pad info if available	  
	  if (digitStore) for (Int_t i=0; i<cluster->GetNDigits(); i++) {
	    AliMUONVDigit* digit = digitStore->FindObject(cluster->GetDigitId(i));
	    if (!digit) continue;
	    
	    // pad location
	    const AliMpVSegmentation* seg = AliMpSegmentation::Instance()->
	    GetMpSegmentation(digit->DetElemId(),AliMp::GetCathodType(digit->Cathode()));
	    AliMpPad pad = seg->PadByIndices(digit->PadX(), digit->PadY());
	    
	    // calibration parameters
	    AliMUONVCalibParam* ped = calibData->Pedestals(digit->DetElemId(), digit->ManuId());
	    AliMUONVCalibParam* gain = calibData->Gains(digit->DetElemId(), digit->ManuId());
	    Int_t manuChannel = digit->ManuChannel();
	    Int_t planeType = 0;
	    if ( digit->ManuId() & AliMpConstants::ManuMask(AliMp::kNonBendingPlane)) {
	      planeType = 1;
	    }
	    
	    // fill pad info
	    padInfo.SetPadId(digit->GetUniqueID());
	    padInfo.SetPadPlaneType(planeType);
	    padInfo.SetPadXY(pad.GetPositionX(), pad.GetPositionY());
	    padInfo.SetPadDimXY(pad.GetDimensionX(), pad.GetDimensionY());
	    padInfo.SetPadCharge((Double_t)digit->Charge());
	    padInfo.SetPadADC(digit->ADC());
	    padInfo.SetSaturated(digit->IsSaturated());
	    padInfo.SetCalibrated(digit->IsCalibrated());
	    padInfo.SetPedestal(ped->ValueAsFloatFast(manuChannel,0), ped->ValueAsFloatFast(manuChannel,1));
	    padInfo.SetGain(gain->ValueAsFloatFast(manuChannel,0), gain->ValueAsFloatFast(manuChannel,1),
			    gain->ValueAsFloatFast(manuChannel,2), gain->ValueAsFloatFast(manuChannel,3));
	    
	    clusterInfo->AddPad(padInfo);
	  }
	  
	  // remove clusters attached to a track
	  if (useRecPoints) {
	    AliMUONVCluster* cl = clusterStore->FindObject(cluster->GetUniqueID());
	    if (cl) clusterStore->Remove(*cl);
	  }
	  
	  // fill cluster info tree
	  clusterInfoTree->Fill();
	  
	  trackParam = static_cast<AliMUONTrackParam*>(track->GetTrackParamAtCluster()->After(trackParam));
	}
	
      }
      
    }
    
    // --- loop over clusters not attached to a track ---
    if (useRecPoints) {
      
      TIter nextCluster(clusterStore->CreateIterator());
      AliMUONVCluster *cluster;
      while ( ( cluster = static_cast<AliMUONVCluster*>(nextCluster()) ) ) {
	
	clusterInfo->Clear("C");
	
	// fill cluster info
	clusterInfo->SetRunId(rl->GetRunNumber());
	clusterInfo->SetEventId(iEvent);
	clusterInfo->SetZ(cluster->GetZ());
	clusterInfo->SetClusterId(cluster->GetUniqueID());
	clusterInfo->SetClusterXY(cluster->GetX(), cluster->GetY());
	clusterInfo->SetClusterXYErr(cluster->GetErrX(), cluster->GetErrY());
	clusterInfo->SetClusterChi2(cluster->GetChi2());
	clusterInfo->SetClusterCharge(cluster->GetCharge());
	
	// fill dummy track info
	clusterInfo->SetTrackId(0);
	clusterInfo->SetTrackXY(0.,0.);
	clusterInfo->SetTrackThetaXY(0.,0.);
	clusterInfo->SetTrackP(0.);
	clusterInfo->SetTrackXYErr(0.,0.);
	clusterInfo->SetTrackChi2(0.);
	clusterInfo->SetTrackCharge(0);
	clusterInfo->SetTrackNHits(0);
	clusterInfo->SetTrackChamberHitMap(0);
	
	// fill pad info if available	  
	if (digitStore) for (Int_t i=0; i<cluster->GetNDigits(); i++) {
	  AliMUONVDigit* digit = digitStore->FindObject(cluster->GetDigitId(i));
	  if (!digit) continue;
	  
	  // pad location
	  const AliMpVSegmentation* seg = AliMpSegmentation::Instance()->
	  GetMpSegmentation(digit->DetElemId(),AliMp::GetCathodType(digit->Cathode()));
	  AliMpPad pad = seg->PadByIndices(digit->PadX(), digit->PadY());
	  
	  // calibration parameters
	  AliMUONVCalibParam* ped = calibData->Pedestals(digit->DetElemId(), digit->ManuId());
	  AliMUONVCalibParam* gain = calibData->Gains(digit->DetElemId(), digit->ManuId());
	  Int_t manuChannel = digit->ManuChannel();
	  Int_t planeType = 0;
	  if ( digit->ManuId() & AliMpConstants::ManuMask(AliMp::kNonBendingPlane)) {
	    planeType = 1;
	  }
	  
	  // fill pad info
	  padInfo.SetPadId(digit->GetUniqueID());
	  padInfo.SetPadPlaneType(planeType);
	  padInfo.SetPadXY(pad.GetPositionX(), pad.GetPositionY());
	  padInfo.SetPadDimXY(pad.GetDimensionX(), pad.GetDimensionY());
	  padInfo.SetPadCharge((Double_t)digit->Charge());
	  padInfo.SetPadADC(digit->ADC());
	  padInfo.SetSaturated(digit->IsSaturated());
	  padInfo.SetCalibrated(digit->IsCalibrated());
	  padInfo.SetPedestal(ped->ValueAsFloatFast(manuChannel,0), ped->ValueAsFloatFast(manuChannel,1));
	  padInfo.SetGain(gain->ValueAsFloatFast(manuChannel,0), gain->ValueAsFloatFast(manuChannel,1),
			  gain->ValueAsFloatFast(manuChannel,2), gain->ValueAsFloatFast(manuChannel,3));
	  
	  clusterInfo->AddPad(padInfo);
	}
	
	// fill cluster info tree
	clusterInfoTree->Fill();
	
      }
      
      delete digitStore;
      delete clusterStore;
      
    }
    
  }
  
  // ...timer stop
  timer.Stop();
  printf("Writing Tree\n");
  // write output tree
  clusterInfoFile->cd();
  clusterInfoTree->Write();
  printf("Deleting Tree\n");
  delete clusterInfoTree;
  printf("Closing File\n");
  clusterInfoFile->Close();
  
  // free memory
  printf("Deleting calibData\n");
  delete calibData;
  printf("Deleting clusterInfo\n");
  delete clusterInfo;
  if (useRecPoints) {
    MUONLoader->UnloadDigits();
    MUONLoader->UnloadRecPoints();
    rl->UnloadHeader();
    delete rl;
  }
  if (useESD) {
    esdFile->Close();
    delete esd;
  }
  cout<<endl<<"time to fill cluster/track info: R:"<<timer.RealTime()<<" C:"<<timer.CpuTime()<<endl<<endl;
}

//-----------------------------------------------------------------------
TTree* GetESDTree(TFile *esdFile)
{
  /// Check that the file is properly open
  /// Return pointer to the ESD Tree
  
  if (!esdFile || !esdFile->IsOpen()) {
    Error("GetESDTree", "opening ESD file failed");
    exit(-1);
  }
  
  TTree* tree = (TTree*) esdFile->Get("esdTree");
  if (!tree) {
    Error("GetESDTree", "no ESD tree found");
    exit(-1);
  }
  
  return tree;
  
}

      
//-----------------------------------------------------------------------
UInt_t buildClusterMap(AliMUONTrack &track)
{
  /// Build the map of clusters in tracking chambers
  
  UInt_t muonClusterMap = 0;
  
  AliMUONTrackParam* trackParam = static_cast<AliMUONTrackParam*>(track.GetTrackParamAtCluster()->First());
  while (trackParam) {
    
    muonClusterMap |= BIT(trackParam->GetClusterPtr()->GetChamberId());
    
    trackParam = static_cast<AliMUONTrackParam*>(track.GetTrackParamAtCluster()->After(trackParam));
  }
  
  return muonClusterMap;
  
}

 MUONClusterInfo.C:1
 MUONClusterInfo.C:2
 MUONClusterInfo.C:3
 MUONClusterInfo.C:4
 MUONClusterInfo.C:5
 MUONClusterInfo.C:6
 MUONClusterInfo.C:7
 MUONClusterInfo.C:8
 MUONClusterInfo.C:9
 MUONClusterInfo.C:10
 MUONClusterInfo.C:11
 MUONClusterInfo.C:12
 MUONClusterInfo.C:13
 MUONClusterInfo.C:14
 MUONClusterInfo.C:15
 MUONClusterInfo.C:16
 MUONClusterInfo.C:17
 MUONClusterInfo.C:18
 MUONClusterInfo.C:19
 MUONClusterInfo.C:20
 MUONClusterInfo.C:21
 MUONClusterInfo.C:22
 MUONClusterInfo.C:23
 MUONClusterInfo.C:24
 MUONClusterInfo.C:25
 MUONClusterInfo.C:26
 MUONClusterInfo.C:27
 MUONClusterInfo.C:28
 MUONClusterInfo.C:29
 MUONClusterInfo.C:30
 MUONClusterInfo.C:31
 MUONClusterInfo.C:32
 MUONClusterInfo.C:33
 MUONClusterInfo.C:34
 MUONClusterInfo.C:35
 MUONClusterInfo.C:36
 MUONClusterInfo.C:37
 MUONClusterInfo.C:38
 MUONClusterInfo.C:39
 MUONClusterInfo.C:40
 MUONClusterInfo.C:41
 MUONClusterInfo.C:42
 MUONClusterInfo.C:43
 MUONClusterInfo.C:44
 MUONClusterInfo.C:45
 MUONClusterInfo.C:46
 MUONClusterInfo.C:47
 MUONClusterInfo.C:48
 MUONClusterInfo.C:49
 MUONClusterInfo.C:50
 MUONClusterInfo.C:51
 MUONClusterInfo.C:52
 MUONClusterInfo.C:53
 MUONClusterInfo.C:54
 MUONClusterInfo.C:55
 MUONClusterInfo.C:56
 MUONClusterInfo.C:57
 MUONClusterInfo.C:58
 MUONClusterInfo.C:59
 MUONClusterInfo.C:60
 MUONClusterInfo.C:61
 MUONClusterInfo.C:62
 MUONClusterInfo.C:63
 MUONClusterInfo.C:64
 MUONClusterInfo.C:65
 MUONClusterInfo.C:66
 MUONClusterInfo.C:67
 MUONClusterInfo.C:68
 MUONClusterInfo.C:69
 MUONClusterInfo.C:70
 MUONClusterInfo.C:71
 MUONClusterInfo.C:72
 MUONClusterInfo.C:73
 MUONClusterInfo.C:74
 MUONClusterInfo.C:75
 MUONClusterInfo.C:76
 MUONClusterInfo.C:77
 MUONClusterInfo.C:78
 MUONClusterInfo.C:79
 MUONClusterInfo.C:80
 MUONClusterInfo.C:81
 MUONClusterInfo.C:82
 MUONClusterInfo.C:83
 MUONClusterInfo.C:84
 MUONClusterInfo.C:85
 MUONClusterInfo.C:86
 MUONClusterInfo.C:87
 MUONClusterInfo.C:88
 MUONClusterInfo.C:89
 MUONClusterInfo.C:90
 MUONClusterInfo.C:91
 MUONClusterInfo.C:92
 MUONClusterInfo.C:93
 MUONClusterInfo.C:94
 MUONClusterInfo.C:95
 MUONClusterInfo.C:96
 MUONClusterInfo.C:97
 MUONClusterInfo.C:98
 MUONClusterInfo.C:99
 MUONClusterInfo.C:100
 MUONClusterInfo.C:101
 MUONClusterInfo.C:102
 MUONClusterInfo.C:103
 MUONClusterInfo.C:104
 MUONClusterInfo.C:105
 MUONClusterInfo.C:106
 MUONClusterInfo.C:107
 MUONClusterInfo.C:108
 MUONClusterInfo.C:109
 MUONClusterInfo.C:110
 MUONClusterInfo.C:111
 MUONClusterInfo.C:112
 MUONClusterInfo.C:113
 MUONClusterInfo.C:114
 MUONClusterInfo.C:115
 MUONClusterInfo.C:116
 MUONClusterInfo.C:117
 MUONClusterInfo.C:118
 MUONClusterInfo.C:119
 MUONClusterInfo.C:120
 MUONClusterInfo.C:121
 MUONClusterInfo.C:122
 MUONClusterInfo.C:123
 MUONClusterInfo.C:124
 MUONClusterInfo.C:125
 MUONClusterInfo.C:126
 MUONClusterInfo.C:127
 MUONClusterInfo.C:128
 MUONClusterInfo.C:129
 MUONClusterInfo.C:130
 MUONClusterInfo.C:131
 MUONClusterInfo.C:132
 MUONClusterInfo.C:133
 MUONClusterInfo.C:134
 MUONClusterInfo.C:135
 MUONClusterInfo.C:136
 MUONClusterInfo.C:137
 MUONClusterInfo.C:138
 MUONClusterInfo.C:139
 MUONClusterInfo.C:140
 MUONClusterInfo.C:141
 MUONClusterInfo.C:142
 MUONClusterInfo.C:143
 MUONClusterInfo.C:144
 MUONClusterInfo.C:145
 MUONClusterInfo.C:146
 MUONClusterInfo.C:147
 MUONClusterInfo.C:148
 MUONClusterInfo.C:149
 MUONClusterInfo.C:150
 MUONClusterInfo.C:151
 MUONClusterInfo.C:152
 MUONClusterInfo.C:153
 MUONClusterInfo.C:154
 MUONClusterInfo.C:155
 MUONClusterInfo.C:156
 MUONClusterInfo.C:157
 MUONClusterInfo.C:158
 MUONClusterInfo.C:159
 MUONClusterInfo.C:160
 MUONClusterInfo.C:161
 MUONClusterInfo.C:162
 MUONClusterInfo.C:163
 MUONClusterInfo.C:164
 MUONClusterInfo.C:165
 MUONClusterInfo.C:166
 MUONClusterInfo.C:167
 MUONClusterInfo.C:168
 MUONClusterInfo.C:169
 MUONClusterInfo.C:170
 MUONClusterInfo.C:171
 MUONClusterInfo.C:172
 MUONClusterInfo.C:173
 MUONClusterInfo.C:174
 MUONClusterInfo.C:175
 MUONClusterInfo.C:176
 MUONClusterInfo.C:177
 MUONClusterInfo.C:178
 MUONClusterInfo.C:179
 MUONClusterInfo.C:180
 MUONClusterInfo.C:181
 MUONClusterInfo.C:182
 MUONClusterInfo.C:183
 MUONClusterInfo.C:184
 MUONClusterInfo.C:185
 MUONClusterInfo.C:186
 MUONClusterInfo.C:187
 MUONClusterInfo.C:188
 MUONClusterInfo.C:189
 MUONClusterInfo.C:190
 MUONClusterInfo.C:191
 MUONClusterInfo.C:192
 MUONClusterInfo.C:193
 MUONClusterInfo.C:194
 MUONClusterInfo.C:195
 MUONClusterInfo.C:196
 MUONClusterInfo.C:197
 MUONClusterInfo.C:198
 MUONClusterInfo.C:199
 MUONClusterInfo.C:200
 MUONClusterInfo.C:201
 MUONClusterInfo.C:202
 MUONClusterInfo.C:203
 MUONClusterInfo.C:204
 MUONClusterInfo.C:205
 MUONClusterInfo.C:206
 MUONClusterInfo.C:207
 MUONClusterInfo.C:208
 MUONClusterInfo.C:209
 MUONClusterInfo.C:210
 MUONClusterInfo.C:211
 MUONClusterInfo.C:212
 MUONClusterInfo.C:213
 MUONClusterInfo.C:214
 MUONClusterInfo.C:215
 MUONClusterInfo.C:216
 MUONClusterInfo.C:217
 MUONClusterInfo.C:218
 MUONClusterInfo.C:219
 MUONClusterInfo.C:220
 MUONClusterInfo.C:221
 MUONClusterInfo.C:222
 MUONClusterInfo.C:223
 MUONClusterInfo.C:224
 MUONClusterInfo.C:225
 MUONClusterInfo.C:226
 MUONClusterInfo.C:227
 MUONClusterInfo.C:228
 MUONClusterInfo.C:229
 MUONClusterInfo.C:230
 MUONClusterInfo.C:231
 MUONClusterInfo.C:232
 MUONClusterInfo.C:233
 MUONClusterInfo.C:234
 MUONClusterInfo.C:235
 MUONClusterInfo.C:236
 MUONClusterInfo.C:237
 MUONClusterInfo.C:238
 MUONClusterInfo.C:239
 MUONClusterInfo.C:240
 MUONClusterInfo.C:241
 MUONClusterInfo.C:242
 MUONClusterInfo.C:243
 MUONClusterInfo.C:244
 MUONClusterInfo.C:245
 MUONClusterInfo.C:246
 MUONClusterInfo.C:247
 MUONClusterInfo.C:248
 MUONClusterInfo.C:249
 MUONClusterInfo.C:250
 MUONClusterInfo.C:251
 MUONClusterInfo.C:252
 MUONClusterInfo.C:253
 MUONClusterInfo.C:254
 MUONClusterInfo.C:255
 MUONClusterInfo.C:256
 MUONClusterInfo.C:257
 MUONClusterInfo.C:258
 MUONClusterInfo.C:259
 MUONClusterInfo.C:260
 MUONClusterInfo.C:261
 MUONClusterInfo.C:262
 MUONClusterInfo.C:263
 MUONClusterInfo.C:264
 MUONClusterInfo.C:265
 MUONClusterInfo.C:266
 MUONClusterInfo.C:267
 MUONClusterInfo.C:268
 MUONClusterInfo.C:269
 MUONClusterInfo.C:270
 MUONClusterInfo.C:271
 MUONClusterInfo.C:272
 MUONClusterInfo.C:273
 MUONClusterInfo.C:274
 MUONClusterInfo.C:275
 MUONClusterInfo.C:276
 MUONClusterInfo.C:277
 MUONClusterInfo.C:278
 MUONClusterInfo.C:279
 MUONClusterInfo.C:280
 MUONClusterInfo.C:281
 MUONClusterInfo.C:282
 MUONClusterInfo.C:283
 MUONClusterInfo.C:284
 MUONClusterInfo.C:285
 MUONClusterInfo.C:286
 MUONClusterInfo.C:287
 MUONClusterInfo.C:288
 MUONClusterInfo.C:289
 MUONClusterInfo.C:290
 MUONClusterInfo.C:291
 MUONClusterInfo.C:292
 MUONClusterInfo.C:293
 MUONClusterInfo.C:294
 MUONClusterInfo.C:295
 MUONClusterInfo.C:296
 MUONClusterInfo.C:297
 MUONClusterInfo.C:298
 MUONClusterInfo.C:299
 MUONClusterInfo.C:300
 MUONClusterInfo.C:301
 MUONClusterInfo.C:302
 MUONClusterInfo.C:303
 MUONClusterInfo.C:304
 MUONClusterInfo.C:305
 MUONClusterInfo.C:306
 MUONClusterInfo.C:307
 MUONClusterInfo.C:308
 MUONClusterInfo.C:309
 MUONClusterInfo.C:310
 MUONClusterInfo.C:311
 MUONClusterInfo.C:312
 MUONClusterInfo.C:313
 MUONClusterInfo.C:314
 MUONClusterInfo.C:315
 MUONClusterInfo.C:316
 MUONClusterInfo.C:317
 MUONClusterInfo.C:318
 MUONClusterInfo.C:319
 MUONClusterInfo.C:320
 MUONClusterInfo.C:321
 MUONClusterInfo.C:322
 MUONClusterInfo.C:323
 MUONClusterInfo.C:324
 MUONClusterInfo.C:325
 MUONClusterInfo.C:326
 MUONClusterInfo.C:327
 MUONClusterInfo.C:328
 MUONClusterInfo.C:329
 MUONClusterInfo.C:330
 MUONClusterInfo.C:331
 MUONClusterInfo.C:332
 MUONClusterInfo.C:333
 MUONClusterInfo.C:334
 MUONClusterInfo.C:335
 MUONClusterInfo.C:336
 MUONClusterInfo.C:337
 MUONClusterInfo.C:338
 MUONClusterInfo.C:339
 MUONClusterInfo.C:340
 MUONClusterInfo.C:341
 MUONClusterInfo.C:342
 MUONClusterInfo.C:343
 MUONClusterInfo.C:344
 MUONClusterInfo.C:345
 MUONClusterInfo.C:346
 MUONClusterInfo.C:347
 MUONClusterInfo.C:348
 MUONClusterInfo.C:349
 MUONClusterInfo.C:350
 MUONClusterInfo.C:351
 MUONClusterInfo.C:352
 MUONClusterInfo.C:353
 MUONClusterInfo.C:354
 MUONClusterInfo.C:355
 MUONClusterInfo.C:356
 MUONClusterInfo.C:357
 MUONClusterInfo.C:358
 MUONClusterInfo.C:359
 MUONClusterInfo.C:360
 MUONClusterInfo.C:361
 MUONClusterInfo.C:362
 MUONClusterInfo.C:363
 MUONClusterInfo.C:364
 MUONClusterInfo.C:365
 MUONClusterInfo.C:366
 MUONClusterInfo.C:367
 MUONClusterInfo.C:368
 MUONClusterInfo.C:369
 MUONClusterInfo.C:370
 MUONClusterInfo.C:371
 MUONClusterInfo.C:372
 MUONClusterInfo.C:373
 MUONClusterInfo.C:374
 MUONClusterInfo.C:375
 MUONClusterInfo.C:376
 MUONClusterInfo.C:377
 MUONClusterInfo.C:378
 MUONClusterInfo.C:379
 MUONClusterInfo.C:380
 MUONClusterInfo.C:381
 MUONClusterInfo.C:382
 MUONClusterInfo.C:383
 MUONClusterInfo.C:384
 MUONClusterInfo.C:385
 MUONClusterInfo.C:386
 MUONClusterInfo.C:387
 MUONClusterInfo.C:388
 MUONClusterInfo.C:389
 MUONClusterInfo.C:390
 MUONClusterInfo.C:391
 MUONClusterInfo.C:392
 MUONClusterInfo.C:393
 MUONClusterInfo.C:394
 MUONClusterInfo.C:395
 MUONClusterInfo.C:396
 MUONClusterInfo.C:397
 MUONClusterInfo.C:398
 MUONClusterInfo.C:399
 MUONClusterInfo.C:400
 MUONClusterInfo.C:401
 MUONClusterInfo.C:402
 MUONClusterInfo.C:403
 MUONClusterInfo.C:404
 MUONClusterInfo.C:405
 MUONClusterInfo.C:406
 MUONClusterInfo.C:407
 MUONClusterInfo.C:408
 MUONClusterInfo.C:409
 MUONClusterInfo.C:410
 MUONClusterInfo.C:411
 MUONClusterInfo.C:412
 MUONClusterInfo.C:413
 MUONClusterInfo.C:414
 MUONClusterInfo.C:415
 MUONClusterInfo.C:416
 MUONClusterInfo.C:417
 MUONClusterInfo.C:418
 MUONClusterInfo.C:419
 MUONClusterInfo.C:420
 MUONClusterInfo.C:421
 MUONClusterInfo.C:422
 MUONClusterInfo.C:423
 MUONClusterInfo.C:424
 MUONClusterInfo.C:425
 MUONClusterInfo.C:426
 MUONClusterInfo.C:427
 MUONClusterInfo.C:428
 MUONClusterInfo.C:429
 MUONClusterInfo.C:430
 MUONClusterInfo.C:431
 MUONClusterInfo.C:432
 MUONClusterInfo.C:433
 MUONClusterInfo.C:434
 MUONClusterInfo.C:435
 MUONClusterInfo.C:436
 MUONClusterInfo.C:437
 MUONClusterInfo.C:438
 MUONClusterInfo.C:439
 MUONClusterInfo.C:440
 MUONClusterInfo.C:441