00001
00002
00003
00004
00005
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <memory>
00024
00025
00026 #include "FWCore/Framework/interface/Frameworkfwd.h"
00027 #include "FWCore/Framework/interface/EDAnalyzer.h"
00028
00029 #include "FWCore/Framework/interface/Event.h"
00030 #include "FWCore/Framework/interface/MakerMacros.h"
00031
00032 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00033 #include "DataFormats/HeavyIonEvent/interface/CentralityProvider.h"
00034 #include "Math/Vector3D.h"
00035
00036 #include "DataFormats/Common/interface/Handle.h"
00037 #include "FWCore/Framework/interface/ESHandle.h"
00038 #include "DataFormats/CaloTowers/interface/CaloTowerCollection.h"
00039
00040 #include "DataFormats/HeavyIonEvent/interface/Centrality.h"
00041 #include "DataFormats/HeavyIonEvent/interface/CentralityBins.h"
00042
00043 #include "DataFormats/HeavyIonEvent/interface/EvtPlane.h"
00044 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00045 #include "DataFormats/TrackReco/interface/Track.h"
00046 #include "DataFormats/VertexReco/interface/Vertex.h"
00047 #include "DataFormats/VertexReco/interface/VertexFwd.h"
00048
00049 #include "FWCore/ServiceRegistry/interface/Service.h"
00050 #include "CommonTools/UtilAlgos/interface/TFileService.h"
00051 #include "CondFormats/DataRecord/interface/HeavyIonRPRcd.h"
00052 #include "CondFormats/HIObjects/interface/CentralityTable.h"
00053 #include "CondCore/DBOutputService/interface/PoolDBOutputService.h"
00054 #include "CondFormats/HIObjects/interface/RPFlatParams.h"
00055
00056 #include "RecoHI/HiEvtPlaneAlgos/interface/HiEvtPlaneFlatten.h"
00057 #include "TFile.h"
00058 #include "TH1.h"
00059 #include "TH2D.h"
00060 #include "TH2F.h"
00061 #include "TTree.h"
00062 #include "TH1I.h"
00063 #include "TF1.h"
00064 #include "TList.h"
00065 #include "TString.h"
00066 #include <time.h>
00067 #include <cstdlib>
00068 #include <vector>
00069
00070 #include "RecoHI/HiEvtPlaneAlgos/interface/HiEvtPlaneList.h"
00071
00072 using namespace std;
00073 using namespace hi;
00074
00075
00076
00077
00078
00079 class HiEvtPlaneFlatCalib : public edm::EDAnalyzer {
00080 public:
00081 explicit HiEvtPlaneFlatCalib(const edm::ParameterSet&);
00082 ~HiEvtPlaneFlatCalib();
00083
00084 private:
00085 virtual void beginJob() ;
00086 virtual void analyze(const edm::Event&, const edm::EventSetup&);
00087 virtual void endJob() ;
00088
00089
00090 edm::Service<TFileService> fs;
00091
00092 CentralityProvider * centrality_;
00093 int vs_sell;
00094 float vzr_sell;
00095 float vzErr_sell;
00096
00097 static const int NumCentBins=9;
00098 double wcent[10];
00099
00100 TH1D * hcent;
00101 TH1D * hvtx;
00102 TH1D * flatXhist[NumEPNames];
00103 TH1D * flatYhist[NumEPNames];
00104 TH1D * flatCnthist[NumEPNames];
00105
00106 TH1D * flatXDBhist[NumEPNames];
00107 TH1D * flatYDBhist[NumEPNames];
00108 TH1D * hPsi[NumEPNames];
00109 TH1D * hPsiFlat[NumEPNames];
00110 TH1D * hPsiFlatCent[NumEPNames][NumCentBins];
00111 TH1D * hPsiFlatSub1[NumEPNames];
00112 TH1D * hPsiFlatSub2[NumEPNames];
00113 Double_t epang[NumEPNames];
00114 HiEvtPlaneFlatten * flat[NumEPNames];
00115 RPFlatParams * rpFlat;
00116 int nRP;
00117 bool genFlatPsi_;
00118
00119 };
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 HiEvtPlaneFlatCalib::HiEvtPlaneFlatCalib(const edm::ParameterSet& iConfig)
00133 {
00134 genFlatPsi_ = iConfig.getUntrackedParameter<bool>("genFlatPsi_",true);
00135
00136
00137 wcent[0] = 0;
00138 wcent[1] = 5;
00139 wcent[2] = 10;
00140 wcent[3] = 20;
00141 wcent[4] = 30;
00142 wcent[5] = 40;
00143 wcent[6] = 50;
00144 wcent[7] = 60;
00145 wcent[8] = 70;
00146 wcent[9] = 100;
00147
00148
00149
00150 centrality_ = 0;
00151 hcent = fs->make<TH1D>("cent","cent",41,0,40);
00152 hvtx = fs->make<TH1D>("vtx","vtx",1000,-50,50);
00153
00154 Int_t FlatOrder = 21;
00155 for(int i = 0; i<NumEPNames; i++) {
00156 TFileDirectory subdir = fs->mkdir(Form("%s",EPNames[i].data()));
00157 flat[i] = new HiEvtPlaneFlatten();
00158 flat[i]->Init(FlatOrder,11,4,EPNames[i],EPOrder[i]);
00159 int nbins = flat[i]->GetHBins();
00160 flatXhist[i] = subdir.make<TH1D>(Form("x_%s",EPNames[i].data()),Form("x_%s",EPNames[i].data()),nbins,-0.5,nbins-0.5);
00161 flatYhist[i] = subdir.make<TH1D>(Form("y_%s",EPNames[i].data()),Form("y_%s",EPNames[i].data()),nbins,-0.5,nbins-0.5);
00162 flatCnthist[i] = subdir.make<TH1D>(Form("cnt_%s",EPNames[i].data()),Form("cnt_%s",EPNames[i].data()),nbins,-0.5,nbins-0.5);
00163 Double_t psirange = 4;
00164 if(EPOrder[i]==2 ) psirange = 2;
00165 if(EPOrder[i]==3 ) psirange = 1.5;
00166 if(EPOrder[i]==4 ) psirange = 1;
00167 if(EPOrder[i]==5) psirange = 0.8;
00168 if(EPOrder[i]==6) psirange = 0.6;
00169 hPsi[i] = subdir.make<TH1D>("psi","psi",800,-psirange,psirange);
00170 hPsi[i]->SetXTitle("#Psi");
00171 hPsi[i]->SetYTitle(Form("Counts (cent<80%c)",'%'));
00172 hPsiFlat[i] = subdir.make<TH1D>("psiFlat","psiFlat",800,-psirange,psirange);
00173 hPsiFlat[i]->SetXTitle("#Psi");
00174 hPsiFlat[i]->SetYTitle(Form("Counts (cent<80%c)",'%'));
00175 for(int j = 0; j<NumCentBins; j++) {
00176 TString hname = Form("psiFlat_%d_%d",(int) wcent[j],(int) wcent[j+1]);
00177 hPsiFlatCent[i][j] = subdir.make<TH1D>(hname.Data(),hname.Data(),800,-psirange,psirange);
00178 hPsiFlatCent[i][j]->SetXTitle("#Psi");
00179 hPsiFlatCent[i][j]->SetYTitle(Form("Counts (%d<cent#leq%d%c)",(int) wcent[j],(int) wcent[j+1],'%'));
00180 }
00181
00182 }
00183
00184 }
00185
00186
00187 HiEvtPlaneFlatCalib::~HiEvtPlaneFlatCalib()
00188 {
00189
00190
00191
00192
00193 }
00194
00195
00196
00197
00198
00199
00200
00201 void
00202 HiEvtPlaneFlatCalib::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
00203 {
00204 using namespace edm;
00205 using namespace reco;
00206
00207
00208
00209 if(!centrality_) centrality_ = new CentralityProvider(iSetup);
00210
00211 centrality_->newEvent(iEvent,iSetup);
00212 int bin = centrality_->getBin();
00213 double centval = 2.5*bin+1.25;
00214 hcent->Fill(bin);
00215
00216
00217
00218 edm::Handle<reco::VertexCollection> vertexCollection3;
00219 iEvent.getByLabel("hiSelectedVertex",vertexCollection3);
00220 const reco::VertexCollection * vertices3 = vertexCollection3.product();
00221 vs_sell = vertices3->size();
00222 if(vs_sell>0) {
00223 vzr_sell = vertices3->begin()->z();
00224 vzErr_sell = vertices3->begin()->zError();
00225 } else
00226 vzr_sell = -999.9;
00227
00228
00229
00230 if(genFlatPsi_) {
00231 edm::ESHandle<RPFlatParams> flatparmsDB_;
00232 iSetup.get<HeavyIonRPRcd>().get(flatparmsDB_);
00233 int flatTableSize = flatparmsDB_->m_table.size();
00234 for(int i = 0; i<flatTableSize; i++) {
00235 const RPFlatParams::EP* thisBin = &(flatparmsDB_->m_table[i]);
00236 for(int j = 0; j<NumEPNames; j++) {
00237 int indx = thisBin->RPNameIndx[j];
00238 if(indx>=0) {
00239 flat[indx]->SetXDB(i, thisBin->x[j]);
00240 flat[indx]->SetYDB(i, thisBin->y[j]);
00241 }
00242 }
00243 }
00244 }
00245
00246
00247
00248
00249
00250 Handle<reco::EvtPlaneCollection> evtPlanes;
00251 iEvent.getByLabel("hiEvtPlane","recoLevel",evtPlanes);
00252
00253 if(!evtPlanes.isValid()){
00254
00255 return ;
00256 }
00257
00258 for (EvtPlaneCollection::const_iterator rp = evtPlanes->begin();rp !=evtPlanes->end(); rp++) {
00259 if(rp->angle() > -5) {
00260 string baseName = rp->label();
00261 for(int i = 0; i< NumEPNames; i++) {
00262 if(EPNames[i].compare(baseName)==0) {
00263 double psiFlat = flat[i]->GetFlatPsi(rp->angle(),vzr_sell,bin);
00264 epang[i]=psiFlat;
00265 if(EPNames[i].compare(rp->label())==0) {
00266 flat[i]->Fill(rp->angle(),vzr_sell,bin);
00267 if(i==0) hvtx->Fill(vzr_sell);
00268
00269 if(centval<=80) hPsi[i]->Fill(rp->angle());
00270 if(genFlatPsi_) {
00271 if(centval<=80) hPsiFlat[i]->Fill(psiFlat);
00272 for(int j = 0; j<NumCentBins; j++) {
00273 if(centval>wcent[j]&¢val<=wcent[j+1]) hPsiFlatCent[i][j]->Fill(psiFlat);
00274 }
00275 }
00276 }
00277 }
00278 }
00279 }
00280 }
00281
00282 }
00283
00284
00285 void
00286 HiEvtPlaneFlatCalib::beginJob()
00287 {
00288 }
00289
00290
00291 void
00292 HiEvtPlaneFlatCalib::endJob() {
00293 for(int i = 0; i<NumEPNames; i++) {
00294 for(int j = 0; j<flat[i]->GetHBins();j++) {
00295 flatXhist[i]->SetBinContent(j+1,flat[i]->GetX(j));
00296 flatYhist[i]->SetBinContent(j+1,flat[i]->GetY(j));
00297 flatCnthist[i]->SetBinContent(j+1,flat[i]->GetCnt(j));
00298 }
00299 }
00300 }
00301
00302
00303 DEFINE_FWK_MODULE(HiEvtPlaneFlatCalib);