データ - Activate or Deactivate
Last update: 2003/07/18
ATLAS Japan版のAtlfastのヘッダーファイル
$ATLJ_TOP_DIR/src/atlasj_atlfast/atlasj_atlfast/ATLASJ_Event.h
を見ると分かりますが、public: つまり、全データに直接アクセスできます。
本来のC++では"悪い"とされている実装です。しかしながら、現状では
ATLAS Japan版のAtlfast
Athena版のAtlfast
DC1
...
のすべてに共通なメンバ関数を準備することは不可能だと判断しました。
public: (色分けは後述)
Int_t Nrun; // ActivateInfo
Int_t Ievnt; // ActivateInfo
Float_t Wt; // ActivateInfo
Int_t Np; // ActivateGen
Int_t Idgen[100]; //[Np] // ActivateGen
Int_t Iddet[100]; //[Np] // ActivateGen
Float_t Pgen[100][4]; //[Np] // ActivateGen
Float_t Vgen[100][3]; //[Np] // ActivateGen
Int_t Istgen[100]; //[Np] // ActivateOther
UInt_t Posdet[100]; //[Np] // ActivateOther
Int_t Posmo[100]; //[Np] // ActivateOther
Int_t Nmu; // ActivateMuon
UInt_t Nisomu; // ActivateMuon
Int_t Chgmu[20]; //[Nmu] // ActivateMuon
Int_t Posmu[20]; //[Nmu] // ActivateMuon
Float_t Pmu[20][3]; //[Nmu] // ActivateMuon
UInt_t Trgmu[20]; //[Nmu] // ActivateOther
UInt_t Clusmu[20]; //[Nmu] // ActivateOther
Int_t Nel; // ActivateElec
Int_t Chgel[20]; //[Nel] // ActivateElec
Int_t Posel[20]; //[Nel] // ActivateElec
Float_t Pel[20][3]; //[Nel] // ActivateElec
Int_t Nph; // ActivateGamma
Int_t Posph[20]; //[Nph] // ActivateGamma
Float_t Pph[20][3]; //[Nph] // ActivateGamma
Int_t Njt; // ActivateJet
Int_t Idjt[100]; //[Njt] // ActivateJet
Int_t Posjt[100]; //[Njt] // ActivateJet
Float_t Pjt[100][3]; //[Njt] // ActivateJet
Float_t Etaini[100]; //[Njt] // ActivateCell
Float_t Phiini[100]; //[Njt] // ActivateCell
Float_t Pmiss[2]; // ActivateMissPt
Float_t Pnu[2]; // ActivateOther
Float_t Circ; // ActivateOther
Float_t Thrust; // ActivateOther
Float_t Oblat; // ActivateOther
UChar_t Trig[10]; // ActivateOther
Int_t Ncel; // ActivateCell
Float_t Etacel[1000]; //[Ncel] // ActivateCell
Float_t Phicel[1000]; //[Ncel] // ActivateCell
Float_t Ecel[1000]; //[Ncel] // ActivateCell
Int_t Nclus; // ActivateOther
Float_t Etaseed[50]; //[Nclus] // ActivateOther
Float_t Phiseed[50]; //[Nclus] // ActivateOther
Float_t Eclus[50]; //[Nclus] // ActivateOther
Int_t Ntrck; // ActivateTrk
Int_t Postrck[500]; //[Ntrck] // ActivateTrk
Float_t D0det[500]; //[Ntrck] // ActivateTrk
Float_t Z0det[500]; //[Ntrck] // ActivateTrk
Float_t Ptrkdet[500][3]; //[Ntrck] // ActivateTrk
Float_t Qtrkdet[500]; //[Ntrck] // ActivateTrk
Float_t D0gen[500]; //[Ntrck] // ActivateOther
Float_t Z0gen[500]; //[Ntrck] // ActivateOther
Float_t Ptrkgen[500][3]; //[Ntrck] // ActivateOther
Float_t Qtrkgen[500]; //[Ntrck] // ActivateOther
当り前ですが、これらのデータに直接アクセスする解析コードは
ATLAS Japan版のAtlfast
Athena版のAtlfast
DC1
...
のすべてに共通に使えません。
多機能なAthena版 Atlfastに移行する必要性がある場合にも、あまりにも不便です。
現状では、以下のようなメンバ関数を準備してこれらの違いを吸収するような設計になっています。
つまり、GetMuonList()のParticle*でMuonを利用する限り、その元を気にする必要はなくなります。
(ATLAS Japan版Atlfastを中心に考えたため将来変更が必要になるかもしれません。)
public:
const std::vector & GetMuonList() const { return MuonList; }
const std::vector & GetElecList() const { return ElecList; }
const std::vector & GetGammaList() const { return GammaList; }
const std::vector & GetJetList() const { return JetList; }
const std::vector & GetTrkList() const { return TrkList; }
const std::vector & GetGenList() const { return GenList; }
const std::vector & GetCellList() const { return CellList; }
std::vector & GetMuonList() { return MuonList; }
std::vector & GetElecList() { return ElecList; }
std::vector & GetGammaList() { return GammaList; }
std::vector & GetJetList() { return JetList; }
std::vector & GetTrkList() { return TrkList; }
std::vector & GetGenList() { return GenList; }
std::vector & GetCellList() { return CellList; }
double GetMissPx() const { return missPx; }
double GetMissPy() const { return missPy; }
int GetRunNumber() const { return indexRun; }
int GetEventNumber() const { return indexEvent; }
double GetEventWeight() const { return eventWeight; }
int IsMC() const { return isMCFlag; } // Real Data or MC Data?
int GetModeMC() const { return modeMC; } // Fast or Full etc?
int IsDebug() const { return debugFlag; } // Debug mode? 基本的にcout等でメッセージを出す。
int IsSkim() const { return doSkim; } // 保存したいイベントかどうか?
void SetDebug(int f) { debugFlag = f; }
void SetSkim(int f) { doSkim = f; }
前節のZZ.cxxに
// Which data are used?
// 必要なデータだけをロードするためのおまじない。
// ここでは、Muon関係のデータだけをロードするようにした。
DeactivateAll();
ActivateMuon();
という行がありました。
コメントにあるように、おまじないと言ってごまかしましたが、ROOTではそれなりに重要です。
ROOTファイルの全データにアクセスできる状態にしておくと正直言って遅いです。
我々のNtuple(h2root前のファイル)にはたくさんのパラメータ(55)が保存されているため
すべてをメモリー上にロードするのに時間がかかるからです。
DC(Data Challenge)のCBNTになるとより膨大なパラメータ(725!)になります。
そのため、アクセスするデータだけロードする必要があります。
これは将来改善されるらしい(MLでの話)ですが、現状ではユーザーがどうにかしなければなりません。
ATLAS Japan版Atlfastではデフォルトでは上記のメンバの内、赤色がロードされ、青色がロードされません。
今回の例では、Muonだけで十分なのですべてをロードしないように設定してから
そのあと、Muonだけロードするような操作をしています。
上記の // ActivateInfo という意味は、
ActivateInfo() --> ロードする。
DeactivateInfo() --> ロードしない。
というメンバ関数が準備されているということです。
更に、個別にロードしたい場合は
ActivateInfo("Np") --> Npをロードする。
DeactivateInfo("Np") --> Npをロードしない。
のようにします。つまり、ActivateInfo(const std::string&)等のメンバ関数もあります。
ATLAS Japan版Atlfast以外に関してはまだ実装が不十分なものが多いので
ソースを見て"おかしいなー"と思ったら指摘してください。
Go to the next page
Go to the previous page
Go to the main page
jtanaka