データ - 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