본문 바로가기
대학원 생활

HEP01 Data cleaning using Coffea framework in CMS

by Miracle_Morning 2021. 7. 17.

 

 

Coffea Framework 을 이용해서, CMS data분석을 하는중에, 문서화가 너무 안 되어있어서 가장 처음으로 하는겸, 내가 잊어버리지 않으려고 정리를 시작한다.

가장 첫 번째로, 어떻게 Golden Json File 을 이용해서 GoodRun 이벤트만 골라내는지에 관한 내용을 써보았다.

(글의 순서는 바뀔 수 있다)

 

CMS 검출기로 부터 데이터를 얻을때, 특정 기간 동안에는 기기 고장 등, 이슈가 발생해서 Quality 가 좋지 못한 데이터 또한 스토리지에 들어올 수 있다. 다행히, CMS 데이터는 Run number 와 Luminosity Block 으로 언제 taken 된 데이터 인지 알아 낼 수 있고, 이를 통해서 정상적인 기간 동안의 데이터만 따로 얻을 수 있다. 이러한 데이터를 정리해 놓은 파일을 Golden json file 이라고 하고, 이 파일을 통해서 필요한 데이터만 걸러내는 과정을 여기서는 Good-run check 라 하겠다.

 

먼저, 앞서 말한 “정상적인 데이터 모음집” 인 Golden json file 을가지고 있어야한다. 이는 년도 별로 다른 파일로 존재하고 아래 링크에서 얻을 수 있다.

https://twiki.cern.ch/twiki/bin/view/CMS/PdmVLegacy2018Analysis

( 2018 년도 링크만 첨부했다, 다른 년도는 같은 pdmV 페이지에서 쉽게 찾을 수 있다)

 

Coffea framework 는 깔려 있다고 가정하고, 이제 모든 준비가 끝났다.

아래 코드 블록 하나로 Good-Run check 을 할 수 있다.

 

from coffea import lumi_tools
infile='INPUT DATA FILE'
events = NanoEventsFactory.from_root(infile, schemaclass=NanoAODSchema).events()


injson="PATH/FOR/JSON/FILE.json"
lumi_mask_builder = lumi_tools.LumiMask(injson)
lumimask = ak.Array(lumi_mask_builder.__call__(events.run,events.luminosityBlock))
events = events[lumimask]
print("{0}%  of files pass good-run conditions".format(len(events)/ len(Initial_events)))

 

Coffea 의 lumi_tools 모듈 중에 LumiMask 라는 클래스를 사용한다.

Masking 의 개념은 추후에 Columnar database에 관한 글을 올릴때 디테일하게 설명하겠다.

 

LumiMask 는__call__ 이라는 메소드를 갖고 있고 파라미터로 run number 와 Lumi block 을 받는다.

이유는 앞서 언급했듯이 data taken 에 관한 정보는 Run number 와 Lumi block 으로 알 수 있기 때문이다.

NanoAOD 샘플에는 run 과 luminosityBlock 의 이름으로 event contents가 있기 때문에 바로 불러서 넣어주면 된다.

 

그렇게 해서 lumimask 를 출력하면, [True False ..... ] 의 Boolean Array 가 나온다.

각 이벤트가 GoodRun 인지 아닌지를 boolean 으로 표현한 것이다.

하지만 type 을보면 numpy array 로, 이것을 Coffea 에서 표준으로 사용하는 Awkward array 로 바꾸려면 Ak.array() 메소드로 형변환을 해서 사용해야한다.

 

형 변환 된 lumimask 를 events array에 적용해주면 GoodRun 인 이벤트 array만 events 변수에 남게된다.