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 CreateWeightedRejectList.C
///
/// \brief Macro test for the creation of a RejectList object (for simulations) in the OCDB, for the MUON Tracke 
///
/// Usage:
///
/// root[0] .L CreateWeightedRejectList.C+
/// root[1] CreateWeightedRejectList("runlist.txt","local://$HOME/myLocalOCDB");
///
/// where runlist.txt has 2 integers per line = "run nevents"
/// where nevents is the number of events where there's (for instance) a CMUS1B trigger
///
///
/// Assuming the file coming from the Export feature of the logbook is runlist.logbook.txt =>
///
/// 115521;PHYSICS_1;1357;0.9
/// 115516;PHYSICS_1;944;0.9
///
/// The awk command below will output the needed format for this macro :
///
/// awk '{split ($0,a,";"); print a[1] " " a[3];}' runlist.logbook.txt =>
///
/// 115521 1357
/// 115516 944
///
/// \author Matthieu Lenhardt, Subatech
///

#include "AliCDBEntry.h"
#include "AliCDBManager.h"
#include "AliDAQ.h"
#include "AliDCSValue.h"
#include "AliMUONCDB.h"
#include "AliMUONCalibParamNI.h"
#include "AliMUONCalibrationData.h"
#include "AliMUONPadStatusMaker.h"
#include "AliMUONPadStatusMapMaker.h"
#include "AliMUONRecoParam.h"
#include "AliMUONRejectList.h"
#include "AliMUONRejectList.h"
#include "AliMUONTrackerData.h"
#include "AliMUONVCalibParam.h"
#include "AliMpBusPatch.h"
#include "AliMpCDB.h"
#include "AliMpConstants.h"
#include "AliMpDCSNamer.h"
#include "AliMpDDLStore.h"
#include "AliMpDEIterator.h"
#include "AliMpDEManager.h"
#include "AliMpDetElement.h"
#include "AliSysInfo.h"
#include "TEnv.h"
#include <Riostream.h>
#include <TFile.h>
#include <TGrid.h>
#include <TMap.h>
#include <TObjArray.h>
#include <TObject.h>
#include <TTree.h>
#include <vector>
#include "AliCounterCollection.h"

#include "AliMUONTrackerDataWrapper.h"
#include "AliMUONPainterDataRegistry.h"

class RunInfo
{
public:
  RunInfo(Int_t run, Long64_t nevents) : fNumber(run), fNevents(nevents) { }

  Int_t Number() const { return fNumber; }

  Long64_t Nevents() const { return fNevents; }

  void SetNevents(Long64_t n) { fNevents = n; }

private:
  Int_t fNumber;
  Long64_t fNevents;
};

std::ostream& operator<<(std::ostream& out, const RunInfo& run)
{
  out << Form("RUN %09d NEVENTS %lld",run.Number(),run.Nevents());
  return out;
}

AliMUONRejectList* CheckDE_BP_ManuPedestals(Int_t rejectMask, AliMUONPadStatusMaker& status);

Int_t AddEventsSingleRun(Int_t run_number, Long64_t nEvents,AliMUONRejectList& rejectedEvents);

std::vector<RunInfo> runs;

//______________________________________________________________________________
AliMUONRejectList* CreateWeightedRejectList(AliCounterCollection& cc,
                                            const char* ocdbPath="local:///Users/laurent/Alice/OCDBcopy2013",
                                            const char* weigthWithTrigger="CMSL7-B-NOPF-MUON")
{
  // create the reject using the runs in the collection
  //
  // the counter collection is expected to have "trigger","event","run" rubrics
  // and event:PSALL should be a valid one.
  //
  
  if (!gGrid)
  {
    TGrid::Connect("alien://");
  }
  
  AliCDBManager::Instance()->SetDefaultStorage(ocdbPath);
  
  AliMUONRejectList* weightedRejectList = new AliMUONRejectList;
  
  AliMUONRejectList rejectedEvents;

  TString sruns = cc.GetKeyWords("run");
  TObjArray* truns = sruns.Tokenize(",");
  
  TIter next(truns);
  TObjString* s;
  
  Double_t nEventsTotal(0.0);
  
  while ( ( s = static_cast<TObjString*>(next())) )
  {
    Int_t runNumber = s->String().Atoi();
    AliSysInfo::Instance()->AddStamp(Form("RUN%d",runNumber));
    Long64_t nEvents = cc.GetSum(Form("trigger:%s/event:PSALL/run:%d",weigthWithTrigger,runNumber));
    if (!nEvents)
    {
      std::cout << "No events for run " << runNumber << " ??" << std::endl;
      continue;
    }
    nEventsTotal += AddEventsSingleRun(runNumber,nEvents,rejectedEvents);
  }
  
  delete truns;
  
  AliMpDEIterator DEiter;
  
  for (DEiter.First(); !DEiter.IsDone(); DEiter.Next())
    if (DEiter.CurrentDEId() < 1100)
    {
      Int_t DEid = DEiter.CurrentDEId();
      
      Double_t nBadEventsDE = rejectedEvents.DetectionElementProbability(DEid);
      Double_t nEventsTotalDE = static_cast<Double_t>(nEventsTotal);
      Float_t probaDE = 0.0;
      if (nEventsTotalDE != 0.0)
        probaDE = nBadEventsDE / nEventsTotalDE;
      weightedRejectList->SetDetectionElementProbability(DEid, probaDE);
      
      Int_t nBusPatches = DEiter.CurrentDE()->GetNofBusPatches();
      for (Int_t ii = 0; ii < nBusPatches; ii++)
      {
        Int_t BPid = DEiter.CurrentDE()->GetBusPatchId(ii);
        
        Double_t nBadEventsBP = rejectedEvents.BusPatchProbability(BPid);
        Double_t nEventsTotalBP = nEventsTotalDE - nBadEventsDE;
        Float_t probaBP = 0.0;
        if (nEventsTotalBP != 0.0)
          probaBP = nBadEventsBP / nEventsTotalBP;
        weightedRejectList->SetBusPatchProbability(BPid, probaBP);
        
        Int_t nManus = AliMpDDLStore::Instance(kFALSE)->GetBusPatch(BPid, kFALSE)->GetNofManus();
        for (Int_t jj = 0; jj < nManus; jj++)
	      {
          Int_t manuId = AliMpDDLStore::Instance(kFALSE)->GetBusPatch(BPid, kFALSE)->GetManuId(jj);
          
          Double_t nBadEventsManu = rejectedEvents.ManuProbability(DEid, manuId);
          Double_t nEventsTotalManu = nEventsTotalBP - nBadEventsBP;
          Float_t probaManu = 0.0;
          if (nEventsTotalManu != 0.0)
            probaManu = nBadEventsManu / nEventsTotalManu;
          weightedRejectList->SetManuProbability(DEid, manuId, probaManu);
          
          for (Int_t channel = 0; channel < AliMpConstants::ManuNofChannels(); channel++)
          {
            Double_t nBadEventsChannel = rejectedEvents.ChannelProbability(DEid, manuId, channel);
            Double_t nEventsTotalChannel = nEventsTotalManu - nBadEventsManu;
            Float_t probaChannel = 0.0;
            if (nEventsTotalChannel != 0.0)
            {
              probaChannel = nBadEventsChannel / nEventsTotalChannel;
            }
            
            weightedRejectList->SetChannelProbability(DEid, manuId, channel, probaChannel);
          }
	      }
      }
    }
  
  
  AliMUONTrackerData* td = new AliMUONTrackerData("WeightedRejectList","RejectList",*weightedRejectList);
  
  AliMUONVTrackerDataMaker* dw = new AliMUONTrackerDataWrapper(td);
  
  AliMUONPainterDataRegistry::Instance()->Register(dw);

  return weightedRejectList;
}

//______________________________________________________________________________
bool CreateWeightedRejectList(const char* runlistfile="runlist.txt", 
                              const char* rejectListPath="local://$HOME/OCDB",
                              const char* author="Matthieu Lenhardt")
{
  /// Create a weighted RejectList for the runs included in the run list
  /// The cuts are the same that the one applied in the RecoParam used to create the ESDs.
  ///
  /// \param runlistfile : an ASCII file where each line is a pair "run nevents"
  /// \param rejectListPath : set this to the folder where the RejectList will be created (must have right access to it, of course)
  
  TGrid::Connect("alien://");
  
  ifstream in(runlistfile);
  int run, nevents;
  
  while ( in >> run >> nevents ) 
  {
    runs.push_back(RunInfo(run,nevents));
  };
  
  for ( std::vector<RunInfo>::size_type i = 0; i < runs.size(); ++i )
  {
    cout << runs[i] << endl;
  }
  
  if (runs.empty()) return false;
  
  Int_t firstRun = runs[0].Number();
  Int_t lastRun = runs[runs.size()-1].Number();
  
  const char* rawOCDB = "raw://";
  
  AliCDBManager* manager = AliCDBManager::Instance();

  manager->SetCacheFlag(kFALSE);
  
  manager->SetDefaultStorage(rawOCDB);

  manager->SetSpecificStorage("MUON/Calib/RejectList", rejectListPath);
  
  AliMUONRejectList weightedRejectList;
  AliMUONRejectList rejectedEvents;
  
  Long64_t nEventsTotal = 0;
  
  for (std::vector<RunInfo>::size_type ii = 0; ii < runs.size(); ++ii)
  {
    Int_t runNumber = runs[ii].Number();
    AliSysInfo::Instance()->AddStamp(Form("RUN%d",runNumber));
    Long64_t nEvents = runs[ii].Nevents();
    nEventsTotal += AddEventsSingleRun(runNumber, nEvents, rejectedEvents);
  }  
  
  AliMpDEIterator DEiter;
  
  for (DEiter.First(); !DEiter.IsDone(); DEiter.Next())
    if (DEiter.CurrentDEId() < 1100)
    {
      Int_t DEid = DEiter.CurrentDEId();
      
      Double_t nBadEventsDE = rejectedEvents.DetectionElementProbability(DEid);
      Double_t nEventsTotalDE = static_cast<Double_t>(nEventsTotal);
      Float_t probaDE = 0.0;
      if (nEventsTotalDE != 0.0)
        probaDE = nBadEventsDE / nEventsTotalDE;
      weightedRejectList.SetDetectionElementProbability(DEid, probaDE);
      
      Int_t nBusPatches = DEiter.CurrentDE()->GetNofBusPatches();
      for (Int_t ii = 0; ii < nBusPatches; ii++)
      {
        Int_t BPid = DEiter.CurrentDE()->GetBusPatchId(ii);
        
        Double_t nBadEventsBP = rejectedEvents.BusPatchProbability(BPid);
        Double_t nEventsTotalBP = nEventsTotalDE - nBadEventsDE;
        Float_t probaBP = 0.0;
        if (nEventsTotalBP != 0.0)
          probaBP = nBadEventsBP / nEventsTotalBP;
        weightedRejectList.SetBusPatchProbability(BPid, probaBP);
        
        Int_t nManus = AliMpDDLStore::Instance(kFALSE)->GetBusPatch(BPid, kFALSE)->GetNofManus();
        for (Int_t jj = 0; jj < nManus; jj++)
	      {
          Int_t manuId = AliMpDDLStore::Instance(kFALSE)->GetBusPatch(BPid, kFALSE)->GetManuId(jj);
          
          Double_t nBadEventsManu = rejectedEvents.ManuProbability(DEid, manuId);
          Double_t nEventsTotalManu = nEventsTotalBP - nBadEventsBP;
          Float_t probaManu = 0.0;
          if (nEventsTotalManu != 0.0)
            probaManu = nBadEventsManu / nEventsTotalManu;
          weightedRejectList.SetManuProbability(DEid, manuId, probaManu);
          
          for (Int_t channel = 0; channel < AliMpConstants::ManuNofChannels(); channel++)
          {
            Double_t nBadEventsChannel = rejectedEvents.ChannelProbability(DEid, manuId, channel);
            Double_t nEventsTotalChannel = nEventsTotalManu - nBadEventsManu;
            Float_t probaChannel = 0.0;
            if (nEventsTotalChannel != 0.0)
            {
              probaChannel = nBadEventsChannel / nEventsTotalChannel;
            }
            
            weightedRejectList.SetChannelProbability(DEid, manuId, channel, probaChannel);
          }
	      }
      }
    }
  
  
  AliMUONCDB::WriteToCDB(&weightedRejectList, "MUON/Calib/RejectList",
                         firstRun , lastRun, 
                         "Weighted reject List for MCH, for simulations only", 
                         author);
  
  return true;
}

//____________________________________________________________________________________________
AliMUONRejectList* CheckDE_BP_ManuPedestals(Int_t rejectMask, AliMUONPadStatusMaker& status)
{
  AliMUONRejectList* nBadChannels = new AliMUONRejectList;
  
  AliMpDEIterator DEiter;
  for (DEiter.First(); !DEiter.IsDone(); DEiter.Next())
    if (DEiter.CurrentDEId() < 1100)
    {
      Int_t DEid = DEiter.CurrentDEId();
      Int_t nBusPatches = DEiter.CurrentDE()->GetNofBusPatches();
      for (Int_t ii = 0; ii < nBusPatches; ii++)
      {
        Int_t BPid = DEiter.CurrentDE()->GetBusPatchId(ii);
        
        Int_t nManus = AliMpDDLStore::Instance(kFALSE)->GetBusPatch(BPid, kFALSE)->GetNofManus();
        for (Int_t jj = 0; jj < nManus; jj++)
	      {
          Int_t manuId = AliMpDDLStore::Instance(kFALSE)->GetBusPatch(BPid, kFALSE)->GetManuId(jj);
          
          Int_t nChannels = DEiter.CurrentDE()->NofChannelsInManu(manuId);
          for (Int_t channel = 0; channel < nChannels; channel++)
          {
            Int_t padStatus = status.PadStatus(DEid, manuId, channel);
            if ((rejectMask == 0 && padStatus != 0) || (padStatus & rejectMask) != 0)
            {
              nBadChannels->SetDetectionElementProbability(DEid, nBadChannels->DetectionElementProbability(DEid) + 1.0);
              nBadChannels->SetBusPatchProbability(BPid, nBadChannels->BusPatchProbability(BPid) + 1.0);
              nBadChannels->SetManuProbability(DEid, manuId, nBadChannels->ManuProbability(DEid, manuId) + 1.0);
              nBadChannels->SetChannelProbability(DEid, manuId, channel, 1.0);
            }
          }
	      }
      }
    }
  
  return nBadChannels;
}


//____________________________________________________________________________________________
Int_t AddEventsSingleRun(Int_t runNumber, Long64_t nEvents, AliMUONRejectList& rejectedEvents)
{
  AliCDBManager::Instance()->SetRun(runNumber);
  
  AliMpCDB::LoadAll();

  Double_t maxBadChannels = 80.0;
  
  AliMUONRecoParam *recoParam = AliMUONCDB::LoadRecoParam();
  AliMUONCalibrationData calibrationData(runNumber);
  AliMUONPadStatusMaker status(calibrationData);
  
  status.SetLimits(*recoParam);
  
  Int_t rejectMask = recoParam->PadGoodnessMask();
  
  // Functions to compute the number of bad channels at the DE, BP and Manu level
  AliMUONRejectList* nBadChannels = CheckDE_BP_ManuPedestals(rejectMask, status);
  
  AliMpDEIterator DEiter;
  for (DEiter.First(); !DEiter.IsDone(); DEiter.Next())
    if (DEiter.CurrentDEId() < 1100)
    {
      Int_t DEid = DEiter.CurrentDEId();
      Int_t nBusPatches = DEiter.CurrentDE()->GetNofBusPatches();
      
      Double_t nChannelsDE = static_cast<Double_t>(AliMpDDLStore::Instance(kFALSE)->GetDetElement(DEid)->NofChannels());
      Double_t nBadChannelsDE = nBadChannels->DetectionElementProbability(DEid);
      Double_t ratioBadChannelsDE = 0.0;
      if (nChannelsDE != 0.0)
        ratioBadChannelsDE = 100.0 * nBadChannelsDE / nChannelsDE;
      
      
      Bool_t goodDE = kTRUE;
      if (ratioBadChannelsDE >= maxBadChannels)
      {
        Double_t newRejectedEventsDE = rejectedEvents.DetectionElementProbability(DEid) + static_cast<Double_t>(nEvents);
        rejectedEvents.SetDetectionElementProbability(DEid, newRejectedEventsDE);
        goodDE = kFALSE;
      }
	  	
      if (goodDE)      
        for (Int_t ii = 0; ii < nBusPatches; ii++)
        {
          Int_t BPid = DEiter.CurrentDE()->GetBusPatchId(ii);
          Int_t nManus = AliMpDDLStore::Instance(kFALSE)->GetBusPatch(BPid, kFALSE)->GetNofManus();
          
          Double_t nChannelsBP = static_cast<Double_t>(nManus * AliMpConstants::ManuNofChannels());
          Double_t nBadChannelsBP = nBadChannels->BusPatchProbability(BPid);
          Double_t ratioBadChannelsBP = 100.0 * nBadChannelsBP / nChannelsBP;
          
          Bool_t goodBP = kTRUE;
          
          if (goodBP)
            if (ratioBadChannelsBP >= maxBadChannels)
            {
              Double_t newRejectedEventsBP = rejectedEvents.BusPatchProbability(BPid) + static_cast<Double_t>(nEvents);
              rejectedEvents.SetBusPatchProbability(BPid, newRejectedEventsBP);
              goodBP = kFALSE;
            }
          
          if (goodBP)
            for (Int_t jj = 0; jj < nManus; jj++)
            {
              Int_t manuId = AliMpDDLStore::Instance(kFALSE)->GetBusPatch(BPid, kFALSE)->GetManuId(jj);
              
              Double_t nChannelsManu = DEiter.CurrentDE()->NofChannelsInManu(manuId);;
              Double_t nBadChannelsManu = nBadChannels->ManuProbability(DEid, manuId);
              Double_t ratioBadChannelsManu = 100.0 * nBadChannelsManu / nChannelsManu;
              
              Bool_t goodManu = kTRUE;
              
              if (ratioBadChannelsManu >= maxBadChannels)
              {
                Double_t newRejectedEventsManu = rejectedEvents.ManuProbability(DEid, manuId) + static_cast<Double_t>(nEvents);
                rejectedEvents.SetManuProbability(DEid, manuId, newRejectedEventsManu);
                goodManu = kFALSE;
              }
              
              
              Int_t nChannels = DEiter.CurrentDE()->NofChannelsInManu(manuId);
              
              if (goodManu)
                for (Int_t channel = 0; channel < nChannels; channel++)
                  if (nBadChannels->ChannelProbability(DEid, manuId, channel) > 0.0)
                  {
                    Double_t newRejectedEventsChannel = rejectedEvents.ChannelProbability(DEid, manuId, channel) + static_cast<Double_t>(nEvents);
                    rejectedEvents.SetChannelProbability(DEid, manuId, channel, newRejectedEventsChannel);
                  } // end of Channels loop
            } // end of MANUs loop	    
        } // end of BPs loop
    } // end of DEs loop
  
  delete nBadChannels;
  
  return nEvents;
}

//______________________________________________________________________________
//
//
// The code below might be used someday to retrieve the number of events
// with at least one muon directly from a runlist, instead of requiring
// as input both the run numbers and the number of events.
//
// This approach though is not without its problems :
//
// - even if we are using tags, as the tags are chunk-based (for the moment at
//   least), it's pretty slow to loop on all the chunks (it is becoming usual
//   to get runs with some 600 chunks or so...)
// - if part of a run is not reconstructed (for whatever reason) with the pass
//   we use to compute the number of events with at least one muon, we might
//   underestimate its weight in the final rejectlist for the next passes (
//   if for the next passes the full run is correctly reconstructed for instance)
// - a muon in the tag = either a trigger track or a tracker track, i.e. we don't
//   know for sure it's a good track...
//
// Given all those reasons, we for the moment use a dumb approach : 
//
// - go to alice-logbook.cern.ch . Select the runs you want and the trigger class
//   you want (most probably CMUS1B), and export the list as (run,nevents)
// - run this macro with this (run,nevents) list
//
//______________________________________________________________________________

#if 0

#include "TChain.h"
#include "AliDetectorTagCuts.h"
#include "AliEventTagCuts.h"
#include "AliLHCTagCuts.h"
#include "AliRunTagCuts.h"
#include "AliTagAnalysis.h"
#include "TGridResult.h"

//______________________________________________________________________________
bool CreateXMLCollectionFromRunList(const char* collectionName, 
                                    const char* runlist,
                                    const char* type,
                                    int passNumber)
{
  /// From a list of run, create a collection with only events containing at least one muon
  /// \param collectionName : output name of the collection (without extension, which will be .xml)
  /// \param runlist : text file containing one integer per line = one run number per line
  /// \param type : files to consider, either ESD or AD
  /// \param passNumber : 1 or 2 most probably (to distinguish which reco pass is used)
  
  if (!gGrid) TGrid::Connect("alien://");
  if (!gGrid) 
  {
    return 0x0;
  }
  
  TString stype(type);
  stype.ToUpper();
  
  if ( stype != "ESD" && stype != "AOD" )
  {
    cout << "Only ESD or AOD type supported" << endl;
    return false;
  }
  
  ifstream in(gSystem->ExpandPathName(runlist));
  Int_t runNumber;
  Int_t ntagfiles(0);
  
  AliTagAnalysis tagAnalysis("ESD");
  
  while ( in >> runNumber ) 
  {
    TGridResult *res = gGrid->Query("/alice/data",
                                    Form("%09d/%ss/pass%d/*%d*/Run%d.Event*.ESD.tag.root",
                                         runNumber,stype.Data(),passNumber,runNumber,runNumber));
    Int_t nFiles = res->GetEntries();
    if (!nFiles) 
    {
      continue;
    }
    
    for (Int_t i = 0; i < nFiles; ++i) 
    {
      TString filename = res->GetKey(i, "turl");
      if(filename == "") continue;
      tagAnalysis.AddTagsFile(filename.Data(),kFALSE);
      ++ntagfiles;
    }
    delete res;
  }
  
  cout << ntagfiles << " tag files added" << endl;
  
  AliRunTagCuts runCuts;
  AliEventTagCuts eventCuts;
  AliLHCTagCuts lhcCuts;
  AliDetectorTagCuts detCuts;
  
  eventCuts.SetNMuonRange(1,99999);
  
  return tagAnalysis.CreateXMLCollection(collectionName,&runCuts,&lhcCuts,&detCuts,&eventCuts);  
  
}

//______________________________________________________________________________
TChain* CreateChainFromXMLCollection(const char* collectionName, const char* type)
{
  /// Create a chain from an XML collection file.
  
  if (!gGrid) TGrid::Connect("alien://");
  if (!gGrid) 
  {
    return 0x0;
  }
  
  TString stype(type);
  stype.ToUpper();
  
  if ( stype != "ESD" && stype != "AOD" )
  {
    cout << "Only ESD or AOD type supported" << endl;
    return 0x0;
  }
  
  AliTagAnalysis tagAnalysis(stype.Data());
  
  return tagAnalysis.CreateChainFromCollection(collectionName,stype=="ESD" ? "esdTree":"aodTree");
}

#endif
 CreateWeightedRejectList.C:1
 CreateWeightedRejectList.C:2
 CreateWeightedRejectList.C:3
 CreateWeightedRejectList.C:4
 CreateWeightedRejectList.C:5
 CreateWeightedRejectList.C:6
 CreateWeightedRejectList.C:7
 CreateWeightedRejectList.C:8
 CreateWeightedRejectList.C:9
 CreateWeightedRejectList.C:10
 CreateWeightedRejectList.C:11
 CreateWeightedRejectList.C:12
 CreateWeightedRejectList.C:13
 CreateWeightedRejectList.C:14
 CreateWeightedRejectList.C:15
 CreateWeightedRejectList.C:16
 CreateWeightedRejectList.C:17
 CreateWeightedRejectList.C:18
 CreateWeightedRejectList.C:19
 CreateWeightedRejectList.C:20
 CreateWeightedRejectList.C:21
 CreateWeightedRejectList.C:22
 CreateWeightedRejectList.C:23
 CreateWeightedRejectList.C:24
 CreateWeightedRejectList.C:25
 CreateWeightedRejectList.C:26
 CreateWeightedRejectList.C:27
 CreateWeightedRejectList.C:28
 CreateWeightedRejectList.C:29
 CreateWeightedRejectList.C:30
 CreateWeightedRejectList.C:31
 CreateWeightedRejectList.C:32
 CreateWeightedRejectList.C:33
 CreateWeightedRejectList.C:34
 CreateWeightedRejectList.C:35
 CreateWeightedRejectList.C:36
 CreateWeightedRejectList.C:37
 CreateWeightedRejectList.C:38
 CreateWeightedRejectList.C:39
 CreateWeightedRejectList.C:40
 CreateWeightedRejectList.C:41
 CreateWeightedRejectList.C:42
 CreateWeightedRejectList.C:43
 CreateWeightedRejectList.C:44
 CreateWeightedRejectList.C:45
 CreateWeightedRejectList.C:46
 CreateWeightedRejectList.C:47
 CreateWeightedRejectList.C:48
 CreateWeightedRejectList.C:49
 CreateWeightedRejectList.C:50
 CreateWeightedRejectList.C:51
 CreateWeightedRejectList.C:52
 CreateWeightedRejectList.C:53
 CreateWeightedRejectList.C:54
 CreateWeightedRejectList.C:55
 CreateWeightedRejectList.C:56
 CreateWeightedRejectList.C:57
 CreateWeightedRejectList.C:58
 CreateWeightedRejectList.C:59
 CreateWeightedRejectList.C:60
 CreateWeightedRejectList.C:61
 CreateWeightedRejectList.C:62
 CreateWeightedRejectList.C:63
 CreateWeightedRejectList.C:64
 CreateWeightedRejectList.C:65
 CreateWeightedRejectList.C:66
 CreateWeightedRejectList.C:67
 CreateWeightedRejectList.C:68
 CreateWeightedRejectList.C:69
 CreateWeightedRejectList.C:70
 CreateWeightedRejectList.C:71
 CreateWeightedRejectList.C:72
 CreateWeightedRejectList.C:73
 CreateWeightedRejectList.C:74
 CreateWeightedRejectList.C:75
 CreateWeightedRejectList.C:76
 CreateWeightedRejectList.C:77
 CreateWeightedRejectList.C:78
 CreateWeightedRejectList.C:79
 CreateWeightedRejectList.C:80
 CreateWeightedRejectList.C:81
 CreateWeightedRejectList.C:82
 CreateWeightedRejectList.C:83
 CreateWeightedRejectList.C:84
 CreateWeightedRejectList.C:85
 CreateWeightedRejectList.C:86
 CreateWeightedRejectList.C:87
 CreateWeightedRejectList.C:88
 CreateWeightedRejectList.C:89
 CreateWeightedRejectList.C:90
 CreateWeightedRejectList.C:91
 CreateWeightedRejectList.C:92
 CreateWeightedRejectList.C:93
 CreateWeightedRejectList.C:94
 CreateWeightedRejectList.C:95
 CreateWeightedRejectList.C:96
 CreateWeightedRejectList.C:97
 CreateWeightedRejectList.C:98
 CreateWeightedRejectList.C:99
 CreateWeightedRejectList.C:100
 CreateWeightedRejectList.C:101
 CreateWeightedRejectList.C:102
 CreateWeightedRejectList.C:103
 CreateWeightedRejectList.C:104
 CreateWeightedRejectList.C:105
 CreateWeightedRejectList.C:106
 CreateWeightedRejectList.C:107
 CreateWeightedRejectList.C:108
 CreateWeightedRejectList.C:109
 CreateWeightedRejectList.C:110
 CreateWeightedRejectList.C:111
 CreateWeightedRejectList.C:112
 CreateWeightedRejectList.C:113
 CreateWeightedRejectList.C:114
 CreateWeightedRejectList.C:115
 CreateWeightedRejectList.C:116
 CreateWeightedRejectList.C:117
 CreateWeightedRejectList.C:118
 CreateWeightedRejectList.C:119
 CreateWeightedRejectList.C:120
 CreateWeightedRejectList.C:121
 CreateWeightedRejectList.C:122
 CreateWeightedRejectList.C:123
 CreateWeightedRejectList.C:124
 CreateWeightedRejectList.C:125
 CreateWeightedRejectList.C:126
 CreateWeightedRejectList.C:127
 CreateWeightedRejectList.C:128
 CreateWeightedRejectList.C:129
 CreateWeightedRejectList.C:130
 CreateWeightedRejectList.C:131
 CreateWeightedRejectList.C:132
 CreateWeightedRejectList.C:133
 CreateWeightedRejectList.C:134
 CreateWeightedRejectList.C:135
 CreateWeightedRejectList.C:136
 CreateWeightedRejectList.C:137
 CreateWeightedRejectList.C:138
 CreateWeightedRejectList.C:139
 CreateWeightedRejectList.C:140
 CreateWeightedRejectList.C:141
 CreateWeightedRejectList.C:142
 CreateWeightedRejectList.C:143
 CreateWeightedRejectList.C:144
 CreateWeightedRejectList.C:145
 CreateWeightedRejectList.C:146
 CreateWeightedRejectList.C:147
 CreateWeightedRejectList.C:148
 CreateWeightedRejectList.C:149
 CreateWeightedRejectList.C:150
 CreateWeightedRejectList.C:151
 CreateWeightedRejectList.C:152
 CreateWeightedRejectList.C:153
 CreateWeightedRejectList.C:154
 CreateWeightedRejectList.C:155
 CreateWeightedRejectList.C:156
 CreateWeightedRejectList.C:157
 CreateWeightedRejectList.C:158
 CreateWeightedRejectList.C:159
 CreateWeightedRejectList.C:160
 CreateWeightedRejectList.C:161
 CreateWeightedRejectList.C:162
 CreateWeightedRejectList.C:163
 CreateWeightedRejectList.C:164
 CreateWeightedRejectList.C:165
 CreateWeightedRejectList.C:166
 CreateWeightedRejectList.C:167
 CreateWeightedRejectList.C:168
 CreateWeightedRejectList.C:169
 CreateWeightedRejectList.C:170
 CreateWeightedRejectList.C:171
 CreateWeightedRejectList.C:172
 CreateWeightedRejectList.C:173
 CreateWeightedRejectList.C:174
 CreateWeightedRejectList.C:175
 CreateWeightedRejectList.C:176
 CreateWeightedRejectList.C:177
 CreateWeightedRejectList.C:178
 CreateWeightedRejectList.C:179
 CreateWeightedRejectList.C:180
 CreateWeightedRejectList.C:181
 CreateWeightedRejectList.C:182
 CreateWeightedRejectList.C:183
 CreateWeightedRejectList.C:184
 CreateWeightedRejectList.C:185
 CreateWeightedRejectList.C:186
 CreateWeightedRejectList.C:187
 CreateWeightedRejectList.C:188
 CreateWeightedRejectList.C:189
 CreateWeightedRejectList.C:190
 CreateWeightedRejectList.C:191
 CreateWeightedRejectList.C:192
 CreateWeightedRejectList.C:193
 CreateWeightedRejectList.C:194
 CreateWeightedRejectList.C:195
 CreateWeightedRejectList.C:196
 CreateWeightedRejectList.C:197
 CreateWeightedRejectList.C:198
 CreateWeightedRejectList.C:199
 CreateWeightedRejectList.C:200
 CreateWeightedRejectList.C:201
 CreateWeightedRejectList.C:202
 CreateWeightedRejectList.C:203
 CreateWeightedRejectList.C:204
 CreateWeightedRejectList.C:205
 CreateWeightedRejectList.C:206
 CreateWeightedRejectList.C:207
 CreateWeightedRejectList.C:208
 CreateWeightedRejectList.C:209
 CreateWeightedRejectList.C:210
 CreateWeightedRejectList.C:211
 CreateWeightedRejectList.C:212
 CreateWeightedRejectList.C:213
 CreateWeightedRejectList.C:214
 CreateWeightedRejectList.C:215
 CreateWeightedRejectList.C:216
 CreateWeightedRejectList.C:217
 CreateWeightedRejectList.C:218
 CreateWeightedRejectList.C:219
 CreateWeightedRejectList.C:220
 CreateWeightedRejectList.C:221
 CreateWeightedRejectList.C:222
 CreateWeightedRejectList.C:223
 CreateWeightedRejectList.C:224
 CreateWeightedRejectList.C:225
 CreateWeightedRejectList.C:226
 CreateWeightedRejectList.C:227
 CreateWeightedRejectList.C:228
 CreateWeightedRejectList.C:229
 CreateWeightedRejectList.C:230
 CreateWeightedRejectList.C:231
 CreateWeightedRejectList.C:232
 CreateWeightedRejectList.C:233
 CreateWeightedRejectList.C:234
 CreateWeightedRejectList.C:235
 CreateWeightedRejectList.C:236
 CreateWeightedRejectList.C:237
 CreateWeightedRejectList.C:238
 CreateWeightedRejectList.C:239
 CreateWeightedRejectList.C:240
 CreateWeightedRejectList.C:241
 CreateWeightedRejectList.C:242
 CreateWeightedRejectList.C:243
 CreateWeightedRejectList.C:244
 CreateWeightedRejectList.C:245
 CreateWeightedRejectList.C:246
 CreateWeightedRejectList.C:247
 CreateWeightedRejectList.C:248
 CreateWeightedRejectList.C:249
 CreateWeightedRejectList.C:250
 CreateWeightedRejectList.C:251
 CreateWeightedRejectList.C:252
 CreateWeightedRejectList.C:253
 CreateWeightedRejectList.C:254
 CreateWeightedRejectList.C:255
 CreateWeightedRejectList.C:256
 CreateWeightedRejectList.C:257
 CreateWeightedRejectList.C:258
 CreateWeightedRejectList.C:259
 CreateWeightedRejectList.C:260
 CreateWeightedRejectList.C:261
 CreateWeightedRejectList.C:262
 CreateWeightedRejectList.C:263
 CreateWeightedRejectList.C:264
 CreateWeightedRejectList.C:265
 CreateWeightedRejectList.C:266
 CreateWeightedRejectList.C:267
 CreateWeightedRejectList.C:268
 CreateWeightedRejectList.C:269
 CreateWeightedRejectList.C:270
 CreateWeightedRejectList.C:271
 CreateWeightedRejectList.C:272
 CreateWeightedRejectList.C:273
 CreateWeightedRejectList.C:274
 CreateWeightedRejectList.C:275
 CreateWeightedRejectList.C:276
 CreateWeightedRejectList.C:277
 CreateWeightedRejectList.C:278
 CreateWeightedRejectList.C:279
 CreateWeightedRejectList.C:280
 CreateWeightedRejectList.C:281
 CreateWeightedRejectList.C:282
 CreateWeightedRejectList.C:283
 CreateWeightedRejectList.C:284
 CreateWeightedRejectList.C:285
 CreateWeightedRejectList.C:286
 CreateWeightedRejectList.C:287
 CreateWeightedRejectList.C:288
 CreateWeightedRejectList.C:289
 CreateWeightedRejectList.C:290
 CreateWeightedRejectList.C:291
 CreateWeightedRejectList.C:292
 CreateWeightedRejectList.C:293
 CreateWeightedRejectList.C:294
 CreateWeightedRejectList.C:295
 CreateWeightedRejectList.C:296
 CreateWeightedRejectList.C:297
 CreateWeightedRejectList.C:298
 CreateWeightedRejectList.C:299
 CreateWeightedRejectList.C:300
 CreateWeightedRejectList.C:301
 CreateWeightedRejectList.C:302
 CreateWeightedRejectList.C:303
 CreateWeightedRejectList.C:304
 CreateWeightedRejectList.C:305
 CreateWeightedRejectList.C:306
 CreateWeightedRejectList.C:307
 CreateWeightedRejectList.C:308
 CreateWeightedRejectList.C:309
 CreateWeightedRejectList.C:310
 CreateWeightedRejectList.C:311
 CreateWeightedRejectList.C:312
 CreateWeightedRejectList.C:313
 CreateWeightedRejectList.C:314
 CreateWeightedRejectList.C:315
 CreateWeightedRejectList.C:316
 CreateWeightedRejectList.C:317
 CreateWeightedRejectList.C:318
 CreateWeightedRejectList.C:319
 CreateWeightedRejectList.C:320
 CreateWeightedRejectList.C:321
 CreateWeightedRejectList.C:322
 CreateWeightedRejectList.C:323
 CreateWeightedRejectList.C:324
 CreateWeightedRejectList.C:325
 CreateWeightedRejectList.C:326
 CreateWeightedRejectList.C:327
 CreateWeightedRejectList.C:328
 CreateWeightedRejectList.C:329
 CreateWeightedRejectList.C:330
 CreateWeightedRejectList.C:331
 CreateWeightedRejectList.C:332
 CreateWeightedRejectList.C:333
 CreateWeightedRejectList.C:334
 CreateWeightedRejectList.C:335
 CreateWeightedRejectList.C:336
 CreateWeightedRejectList.C:337
 CreateWeightedRejectList.C:338
 CreateWeightedRejectList.C:339
 CreateWeightedRejectList.C:340
 CreateWeightedRejectList.C:341
 CreateWeightedRejectList.C:342
 CreateWeightedRejectList.C:343
 CreateWeightedRejectList.C:344
 CreateWeightedRejectList.C:345
 CreateWeightedRejectList.C:346
 CreateWeightedRejectList.C:347
 CreateWeightedRejectList.C:348
 CreateWeightedRejectList.C:349
 CreateWeightedRejectList.C:350
 CreateWeightedRejectList.C:351
 CreateWeightedRejectList.C:352
 CreateWeightedRejectList.C:353
 CreateWeightedRejectList.C:354
 CreateWeightedRejectList.C:355
 CreateWeightedRejectList.C:356
 CreateWeightedRejectList.C:357
 CreateWeightedRejectList.C:358
 CreateWeightedRejectList.C:359
 CreateWeightedRejectList.C:360
 CreateWeightedRejectList.C:361
 CreateWeightedRejectList.C:362
 CreateWeightedRejectList.C:363
 CreateWeightedRejectList.C:364
 CreateWeightedRejectList.C:365
 CreateWeightedRejectList.C:366
 CreateWeightedRejectList.C:367
 CreateWeightedRejectList.C:368
 CreateWeightedRejectList.C:369
 CreateWeightedRejectList.C:370
 CreateWeightedRejectList.C:371
 CreateWeightedRejectList.C:372
 CreateWeightedRejectList.C:373
 CreateWeightedRejectList.C:374
 CreateWeightedRejectList.C:375
 CreateWeightedRejectList.C:376
 CreateWeightedRejectList.C:377
 CreateWeightedRejectList.C:378
 CreateWeightedRejectList.C:379
 CreateWeightedRejectList.C:380
 CreateWeightedRejectList.C:381
 CreateWeightedRejectList.C:382
 CreateWeightedRejectList.C:383
 CreateWeightedRejectList.C:384
 CreateWeightedRejectList.C:385
 CreateWeightedRejectList.C:386
 CreateWeightedRejectList.C:387
 CreateWeightedRejectList.C:388
 CreateWeightedRejectList.C:389
 CreateWeightedRejectList.C:390
 CreateWeightedRejectList.C:391
 CreateWeightedRejectList.C:392
 CreateWeightedRejectList.C:393
 CreateWeightedRejectList.C:394
 CreateWeightedRejectList.C:395
 CreateWeightedRejectList.C:396
 CreateWeightedRejectList.C:397
 CreateWeightedRejectList.C:398
 CreateWeightedRejectList.C:399
 CreateWeightedRejectList.C:400
 CreateWeightedRejectList.C:401
 CreateWeightedRejectList.C:402
 CreateWeightedRejectList.C:403
 CreateWeightedRejectList.C:404
 CreateWeightedRejectList.C:405
 CreateWeightedRejectList.C:406
 CreateWeightedRejectList.C:407
 CreateWeightedRejectList.C:408
 CreateWeightedRejectList.C:409
 CreateWeightedRejectList.C:410
 CreateWeightedRejectList.C:411
 CreateWeightedRejectList.C:412
 CreateWeightedRejectList.C:413
 CreateWeightedRejectList.C:414
 CreateWeightedRejectList.C:415
 CreateWeightedRejectList.C:416
 CreateWeightedRejectList.C:417
 CreateWeightedRejectList.C:418
 CreateWeightedRejectList.C:419
 CreateWeightedRejectList.C:420
 CreateWeightedRejectList.C:421
 CreateWeightedRejectList.C:422
 CreateWeightedRejectList.C:423
 CreateWeightedRejectList.C:424
 CreateWeightedRejectList.C:425
 CreateWeightedRejectList.C:426
 CreateWeightedRejectList.C:427
 CreateWeightedRejectList.C:428
 CreateWeightedRejectList.C:429
 CreateWeightedRejectList.C:430
 CreateWeightedRejectList.C:431
 CreateWeightedRejectList.C:432
 CreateWeightedRejectList.C:433
 CreateWeightedRejectList.C:434
 CreateWeightedRejectList.C:435
 CreateWeightedRejectList.C:436
 CreateWeightedRejectList.C:437
 CreateWeightedRejectList.C:438
 CreateWeightedRejectList.C:439
 CreateWeightedRejectList.C:440
 CreateWeightedRejectList.C:441
 CreateWeightedRejectList.C:442
 CreateWeightedRejectList.C:443
 CreateWeightedRejectList.C:444
 CreateWeightedRejectList.C:445
 CreateWeightedRejectList.C:446
 CreateWeightedRejectList.C:447
 CreateWeightedRejectList.C:448
 CreateWeightedRejectList.C:449
 CreateWeightedRejectList.C:450
 CreateWeightedRejectList.C:451
 CreateWeightedRejectList.C:452
 CreateWeightedRejectList.C:453
 CreateWeightedRejectList.C:454
 CreateWeightedRejectList.C:455
 CreateWeightedRejectList.C:456
 CreateWeightedRejectList.C:457
 CreateWeightedRejectList.C:458
 CreateWeightedRejectList.C:459
 CreateWeightedRejectList.C:460
 CreateWeightedRejectList.C:461
 CreateWeightedRejectList.C:462
 CreateWeightedRejectList.C:463
 CreateWeightedRejectList.C:464
 CreateWeightedRejectList.C:465
 CreateWeightedRejectList.C:466
 CreateWeightedRejectList.C:467
 CreateWeightedRejectList.C:468
 CreateWeightedRejectList.C:469
 CreateWeightedRejectList.C:470
 CreateWeightedRejectList.C:471
 CreateWeightedRejectList.C:472
 CreateWeightedRejectList.C:473
 CreateWeightedRejectList.C:474
 CreateWeightedRejectList.C:475
 CreateWeightedRejectList.C:476
 CreateWeightedRejectList.C:477
 CreateWeightedRejectList.C:478
 CreateWeightedRejectList.C:479
 CreateWeightedRejectList.C:480
 CreateWeightedRejectList.C:481
 CreateWeightedRejectList.C:482
 CreateWeightedRejectList.C:483
 CreateWeightedRejectList.C:484
 CreateWeightedRejectList.C:485
 CreateWeightedRejectList.C:486
 CreateWeightedRejectList.C:487
 CreateWeightedRejectList.C:488
 CreateWeightedRejectList.C:489
 CreateWeightedRejectList.C:490
 CreateWeightedRejectList.C:491
 CreateWeightedRejectList.C:492
 CreateWeightedRejectList.C:493
 CreateWeightedRejectList.C:494
 CreateWeightedRejectList.C:495
 CreateWeightedRejectList.C:496
 CreateWeightedRejectList.C:497
 CreateWeightedRejectList.C:498
 CreateWeightedRejectList.C:499
 CreateWeightedRejectList.C:500
 CreateWeightedRejectList.C:501
 CreateWeightedRejectList.C:502
 CreateWeightedRejectList.C:503
 CreateWeightedRejectList.C:504
 CreateWeightedRejectList.C:505
 CreateWeightedRejectList.C:506
 CreateWeightedRejectList.C:507
 CreateWeightedRejectList.C:508
 CreateWeightedRejectList.C:509
 CreateWeightedRejectList.C:510
 CreateWeightedRejectList.C:511
 CreateWeightedRejectList.C:512
 CreateWeightedRejectList.C:513
 CreateWeightedRejectList.C:514
 CreateWeightedRejectList.C:515
 CreateWeightedRejectList.C:516
 CreateWeightedRejectList.C:517
 CreateWeightedRejectList.C:518
 CreateWeightedRejectList.C:519
 CreateWeightedRejectList.C:520
 CreateWeightedRejectList.C:521
 CreateWeightedRejectList.C:522
 CreateWeightedRejectList.C:523
 CreateWeightedRejectList.C:524
 CreateWeightedRejectList.C:525
 CreateWeightedRejectList.C:526
 CreateWeightedRejectList.C:527
 CreateWeightedRejectList.C:528
 CreateWeightedRejectList.C:529
 CreateWeightedRejectList.C:530
 CreateWeightedRejectList.C:531
 CreateWeightedRejectList.C:532
 CreateWeightedRejectList.C:533
 CreateWeightedRejectList.C:534
 CreateWeightedRejectList.C:535
 CreateWeightedRejectList.C:536
 CreateWeightedRejectList.C:537
 CreateWeightedRejectList.C:538
 CreateWeightedRejectList.C:539
 CreateWeightedRejectList.C:540
 CreateWeightedRejectList.C:541
 CreateWeightedRejectList.C:542
 CreateWeightedRejectList.C:543
 CreateWeightedRejectList.C:544
 CreateWeightedRejectList.C:545
 CreateWeightedRejectList.C:546
 CreateWeightedRejectList.C:547
 CreateWeightedRejectList.C:548
 CreateWeightedRejectList.C:549
 CreateWeightedRejectList.C:550
 CreateWeightedRejectList.C:551
 CreateWeightedRejectList.C:552
 CreateWeightedRejectList.C:553
 CreateWeightedRejectList.C:554
 CreateWeightedRejectList.C:555
 CreateWeightedRejectList.C:556
 CreateWeightedRejectList.C:557
 CreateWeightedRejectList.C:558
 CreateWeightedRejectList.C:559
 CreateWeightedRejectList.C:560
 CreateWeightedRejectList.C:561
 CreateWeightedRejectList.C:562
 CreateWeightedRejectList.C:563
 CreateWeightedRejectList.C:564
 CreateWeightedRejectList.C:565
 CreateWeightedRejectList.C:566
 CreateWeightedRejectList.C:567
 CreateWeightedRejectList.C:568
 CreateWeightedRejectList.C:569
 CreateWeightedRejectList.C:570
 CreateWeightedRejectList.C:571
 CreateWeightedRejectList.C:572
 CreateWeightedRejectList.C:573
 CreateWeightedRejectList.C:574
 CreateWeightedRejectList.C:575
 CreateWeightedRejectList.C:576
 CreateWeightedRejectList.C:577
 CreateWeightedRejectList.C:578
 CreateWeightedRejectList.C:579
 CreateWeightedRejectList.C:580
 CreateWeightedRejectList.C:581
 CreateWeightedRejectList.C:582
 CreateWeightedRejectList.C:583
 CreateWeightedRejectList.C:584
 CreateWeightedRejectList.C:585
 CreateWeightedRejectList.C:586
 CreateWeightedRejectList.C:587
 CreateWeightedRejectList.C:588
 CreateWeightedRejectList.C:589
 CreateWeightedRejectList.C:590
 CreateWeightedRejectList.C:591
 CreateWeightedRejectList.C:592
 CreateWeightedRejectList.C:593
 CreateWeightedRejectList.C:594
 CreateWeightedRejectList.C:595
 CreateWeightedRejectList.C:596
 CreateWeightedRejectList.C:597
 CreateWeightedRejectList.C:598
 CreateWeightedRejectList.C:599
 CreateWeightedRejectList.C:600
 CreateWeightedRejectList.C:601
 CreateWeightedRejectList.C:602
 CreateWeightedRejectList.C:603
 CreateWeightedRejectList.C:604
 CreateWeightedRejectList.C:605
 CreateWeightedRejectList.C:606
 CreateWeightedRejectList.C:607
 CreateWeightedRejectList.C:608
 CreateWeightedRejectList.C:609