CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SiPixelRecHitModule.cc
Go to the documentation of this file.
6 // STL
7 #include <vector>
8 #include <memory>
9 #include <string>
10 #include <iostream>
11 #include <stdlib.h>
12 
13 // Data Formats
20 //
21 // Constructors
22 //
26  id_(id)
27 {
28 }
29 
30 //
31 // Destructor
32 //
34 //
35 // Book histograms
36 //
38  bool twoD, bool reducedSet, bool isUpgrade) {
39 
40  bool barrel = DetId(id_).subdetId() == static_cast<int>(PixelSubdetector::PixelBarrel);
41  bool endcap = DetId(id_).subdetId() == static_cast<int>(PixelSubdetector::PixelEndcap);
42  bool isHalfModule = false;
43  if(barrel){
44  if (!isUpgrade) {
45  isHalfModule = PixelBarrelName(DetId(id_)).isHalfModule();
46  } else if (isUpgrade) {
47  isHalfModule = PixelBarrelNameUpgrade(DetId(id_)).isHalfModule();
48  }
49  }
50 
51  std::string hid;
52  // Get collection name and instantiate Histo Id builder
53  edm::InputTag src = iConfig.getParameter<edm::InputTag>( "src" );
54  // Get DQM interface
55 
56 
57  if(type==0){
58  SiPixelHistogramId* theHistogramId = new SiPixelHistogramId( src.label() );
59  if(!reducedSet)
60  {
61  if(twoD){
62  // XYPosition
63  hid = theHistogramId->setHistoId("xypos",id_);
64  meXYPos_ = iBooker.book2D(hid,"XY Position",100,-1.,1,100,-4,4);
65  meXYPos_->setAxisTitle("X Position",1);
66  meXYPos_->setAxisTitle("Y Position",2);
67  }
68  else{
69  // projections of XYPosition
70  hid = theHistogramId->setHistoId("xypos",id_);
71  meXYPos_px_ = iBooker.book1D(hid+"_px","X Position",100,-1.,1);
72  meXYPos_px_->setAxisTitle("X Position",1);
73  meXYPos_py_ = iBooker.book1D(hid+"_py","Y Position",100,-4,4);
74  meXYPos_py_->setAxisTitle("Y Position",1);
75  }
76  }
77  hid = theHistogramId->setHistoId("ClustX",id_);
78  meClustX_ = iBooker.book1D(hid, "RecHit X size", 10, 0., 10.);
79  meClustX_->setAxisTitle("RecHit size X dimension", 1);
80  hid = theHistogramId->setHistoId("ClustY",id_);
81  meClustY_ = iBooker.book1D(hid, "RecHit Y size", 15, 0., 15.);
82  meClustY_->setAxisTitle("RecHit size Y dimension", 1);
83 
84  hid = theHistogramId->setHistoId("ErrorX",id_);
85  meErrorX_ = iBooker.book1D(hid, "RecHit error X", 100,0.,0.02);
86  meErrorX_->setAxisTitle("RecHit error X", 1);
87  hid = theHistogramId->setHistoId("ErrorY",id_);
88  meErrorY_ = iBooker.book1D(hid, "RecHit error Y", 100,0.,0.02);
89  meErrorY_->setAxisTitle("RecHit error Y", 1);
90 
91  //Removed to save offline memory
92  //hid = theHistogramId->setHistoId("nRecHits",id_);
93  //menRecHits_ = iBooker.book1D(hid, "# of rechits in this module", 8, 0, 8);
94  //menRecHits_->setAxisTitle("number of rechits",1);
95  delete theHistogramId;
96  }
97 
98  if(type==1 && barrel){
99  uint32_t DBladder;
100  if (!isUpgrade) { DBladder = PixelBarrelName(DetId(id_)).ladderName(); }
101  else { DBladder = PixelBarrelNameUpgrade(DetId(id_)).ladderName(); }
102  char sladder[80]; sprintf(sladder,"Ladder_%02i",DBladder);
103  hid = src.label() + "_" + sladder;
104  if(isHalfModule) hid += "H";
105  else hid += "F";
106  if(!reducedSet)
107  {
108  if(twoD){
109  meXYPosLad_ = iBooker.book2D("xypos_" + hid,"XY Position",100,-1.,1,100,-4,4);
110  meXYPosLad_->setAxisTitle("X Position",1);
111  meXYPosLad_->setAxisTitle("Y Position",2);
112  }
113  else{
114  // projections of XYPosition
115  meXYPosLad_px_ = iBooker.book1D("xypos_"+hid+"_px","X Position",100,-1.,1);
116  meXYPosLad_px_->setAxisTitle("X Position",1);
117  meXYPosLad_py_ = iBooker.book1D("xypos_"+hid+"_py","Y Position",100,-4,4);
118  meXYPosLad_py_->setAxisTitle("Y Position",1);
119  }
120  }
121  meClustXLad_ = iBooker.book1D("ClustX_" +hid, "RecHit X size", 10, 0., 10.);
122  meClustXLad_->setAxisTitle("RecHit size X dimension", 1);
123  meClustYLad_ = iBooker.book1D("ClustY_" +hid,"RecHit Y size", 15, 0.,15.);
124  meClustYLad_->setAxisTitle("RecHit size Y dimension", 1);
125  meErrorXLad_ = iBooker.book1D("ErrorX_"+hid, "RecHit error X", 100,0.,0.02);
126  meErrorXLad_->setAxisTitle("RecHit error X", 1);
127  meErrorYLad_ = iBooker.book1D("ErrorY_"+hid, "RecHit error Y", 100,0.,0.02);
128  meErrorYLad_->setAxisTitle("RecHit error Y", 1);
129  menRecHitsLad_ = iBooker.book1D("nRecHits_"+hid, "# of rechits in this module", 8, 0, 8);
130  menRecHitsLad_->setAxisTitle("number of rechits",1);
131 
132  }
133 
134  if(type==2 && barrel){
135 
136  uint32_t DBlayer;
137  if (!isUpgrade) { DBlayer = PixelBarrelName(DetId(id_)).layerName(); }
138  else { DBlayer = PixelBarrelNameUpgrade(DetId(id_)).layerName(); }
139  char slayer[80]; sprintf(slayer,"Layer_%i",DBlayer);
140  hid = src.label() + "_" + slayer;
141 
142  if(!reducedSet)
143  {
144  if(twoD){
145  meXYPosLay_ = iBooker.book2D("xypos_" + hid,"XY Position",100,-1.,1,100,-4,4);
146  meXYPosLay_->setAxisTitle("X Position",1);
147  meXYPosLay_->setAxisTitle("Y Position",2);
148  }
149  else{
150  // projections of XYPosition
151  meXYPosLay_px_ = iBooker.book1D("xypos_"+hid+"_px","X Position",100,-1.,1);
152  meXYPosLay_px_->setAxisTitle("X Position",1);
153  meXYPosLay_py_ = iBooker.book1D("xypos_"+hid+"_py","Y Position",100,-4,4);
154  meXYPosLay_py_->setAxisTitle("Y Position",1);
155  }
156  }
157 
158  meClustXLay_ = iBooker.book1D("ClustX_" +hid, "RecHit X size", 10, 0., 10.);
159  meClustXLay_->setAxisTitle("RecHit size X dimension", 1);
160  meClustYLay_ = iBooker.book1D("ClustY_" +hid,"RecHit Y size", 15, 0.,15.);
161  meClustYLay_->setAxisTitle("RecHit size Y dimension", 1);
162  meErrorXLay_ = iBooker.book1D("ErrorX_"+hid, "RecHit error X", 100,0.,0.02);
163  meErrorXLay_->setAxisTitle("RecHit error X", 1);
164  meErrorYLay_ = iBooker.book1D("ErrorY_"+hid, "RecHit error Y", 100,0.,0.02);
165  meErrorYLay_->setAxisTitle("RecHit error Y", 1);
166  menRecHitsLay_ = iBooker.book1D("nRecHits_"+hid, "# of rechits in this module", 8, 0, 8);
167  menRecHitsLay_->setAxisTitle("number of rechits",1);
168 
169  }
170 
171  if(type==3 && barrel){
172  uint32_t DBmodule;
173  if (!isUpgrade) { DBmodule = PixelBarrelName(DetId(id_)).moduleName(); }
174  else { DBmodule = PixelBarrelNameUpgrade(DetId(id_)).moduleName(); }
175  char smodule[80]; sprintf(smodule,"Ring_%i",DBmodule);
176  hid = src.label() + "_" + smodule;
177 
178  if(!reducedSet)
179  {
180  if(twoD){
181  meXYPosPhi_ = iBooker.book2D("xypos_" + hid,"XY Position",100,-1.,1,100,-4,4);
182  meXYPosPhi_->setAxisTitle("X Position",1);
183  meXYPosPhi_->setAxisTitle("Y Position",2);
184  }
185  else{
186  // projections of XYPosition
187  meXYPosPhi_px_ = iBooker.book1D("xypos_"+hid+"_px","X Position",100,-1.,1);
188  meXYPosPhi_px_->setAxisTitle("X Position",1);
189  meXYPosPhi_py_ = iBooker.book1D("xypos_"+hid+"_py","Y Position",100,-4,4);
190  meXYPosPhi_py_->setAxisTitle("Y Position",1);
191  }
192  }
193  meClustXPhi_ = iBooker.book1D("ClustX_" +hid, "RecHit X size", 10, 0., 10.);
194  meClustXPhi_->setAxisTitle("RecHit size X dimension", 1);
195  meClustYPhi_ = iBooker.book1D("ClustY_" +hid,"RecHit Y size", 15, 0.,15.);
196  meClustYPhi_->setAxisTitle("RecHit size Y dimension", 1);
197  meErrorXPhi_ = iBooker.book1D("ErrorX_"+hid, "RecHit error X", 100,0.,0.02);
198  meErrorXPhi_->setAxisTitle("RecHit error X", 1);
199  meErrorYPhi_ = iBooker.book1D("ErrorY_"+hid, "RecHit error Y", 100,0.,0.02);
200  meErrorYPhi_->setAxisTitle("RecHit error Y", 1);
201  menRecHitsPhi_ = iBooker.book1D("nRecHits_"+hid, "# of rechits in this module", 8, 0, 8);
202  menRecHitsPhi_->setAxisTitle("number of rechits",1);
203 
204  }
205 
206  if(type==4 && endcap){
207  uint32_t blade;
208  if (!isUpgrade) { blade= PixelEndcapName(DetId(id_)).bladeName(); }
209  else { blade= PixelEndcapNameUpgrade(DetId(id_)).bladeName(); }
210 
211  char sblade[80]; sprintf(sblade, "Blade_%02i",blade);
212  hid = src.label() + "_" + sblade;
213 // meXYPosBlade_ = iBooker.book2D("xypos_" + hid,"XY Position",100,-1.,1,100,-4,4);
214 // meXYPosBlade_->setAxisTitle("X Position",1);
215 // meXYPosBlade_->setAxisTitle("Y Position",2);
216 
217  meClustXBlade_ = iBooker.book1D("ClustX_" +hid, "RecHit X size", 10, 0., 10.);
218  meClustXBlade_->setAxisTitle("RecHit size X dimension", 1);
219  meClustYBlade_ = iBooker.book1D("ClustY_" +hid,"RecHit Y size", 15, 0.,15.);
220  meClustYBlade_->setAxisTitle("RecHit size Y dimension", 1);
221  meErrorXBlade_ = iBooker.book1D("ErrorX_"+hid, "RecHit error X", 100,0.,0.02);
222  meErrorXBlade_->setAxisTitle("RecHit error X", 1);
223  meErrorYBlade_ = iBooker.book1D("ErrorY_"+hid, "RecHit error Y", 100,0.,0.02);
224  meErrorYBlade_->setAxisTitle("RecHit error Y", 1);
225  menRecHitsBlade_ = iBooker.book1D("nRecHits_"+hid, "# of rechits in this module", 8, 0, 8);
226  menRecHitsBlade_->setAxisTitle("number of rechits",1);
227 
228  }
229  if(type==5 && endcap){
230  uint32_t disk;
231  if (!isUpgrade) { disk = PixelEndcapName(DetId(id_)).diskName(); }
232  else { disk = PixelEndcapNameUpgrade(DetId(id_)).diskName(); }
233 
234  char sdisk[80]; sprintf(sdisk, "Disk_%i",disk);
235  hid = src.label() + "_" + sdisk;
236 // meXYPosDisk_ = iBooker.book2D("xypos_" + hid,"XY Position",100,-1.,1,100,-4,4);
237 // meXYPosDisk_->setAxisTitle("X Position",1);
238 // meXYPosDisk_->setAxisTitle("Y Position",2);
239 
240  meClustXDisk_ = iBooker.book1D("ClustX_" +hid, "RecHit X size", 10, 0., 10.);
241  meClustXDisk_->setAxisTitle("RecHit size X dimension", 1);
242  meClustYDisk_ = iBooker.book1D("ClustY_" +hid,"RecHit Y size", 15, 0.,15.);
243  meClustYDisk_->setAxisTitle("RecHit size Y dimension", 1);
244  meErrorXDisk_ = iBooker.book1D("ErrorX_"+hid, "RecHit error X", 100,0.,0.02);
245  meErrorXDisk_->setAxisTitle("RecHit error X", 1);
246  meErrorYDisk_ = iBooker.book1D("ErrorY_"+hid, "RecHit error Y", 100,0.,0.02);
247  meErrorYDisk_->setAxisTitle("RecHit error Y", 1);
248  menRecHitsDisk_ = iBooker.book1D("nRecHits_"+hid, "# of rechits in this module", 8, 0, 8);
249  menRecHitsDisk_->setAxisTitle("number of rechits",1);
250 
251  }
252 
253  if(type==6 && endcap){
254  uint32_t panel;
255  uint32_t module;
256  if (!isUpgrade) {
257  panel= PixelEndcapName(DetId(id_)).pannelName();
259  } else {
262  }
263 
264  char slab[80]; sprintf(slab, "Panel_%i_Ring_%i",panel, module);
265  hid = src.label() + "_" + slab;
266 
267  if(!reducedSet)
268  {
269  if(twoD){
270  meXYPosRing_ = iBooker.book2D("xypos_" + hid,"XY Position",100,-1.,1,100,-4,4);
271  meXYPosRing_->setAxisTitle("X Position",1);
272  meXYPosRing_->setAxisTitle("Y Position",2);
273  }
274  else{
275  // projections of XYPosition
276  meXYPosRing_px_ = iBooker.book1D("xypos_"+hid+"_px","X Position",100,-1.,1);
277  meXYPosRing_px_->setAxisTitle("X Position",1);
278  meXYPosRing_py_ = iBooker.book1D("xypos_"+hid+"_py","Y Position",100,-4,4);
279  meXYPosRing_py_->setAxisTitle("Y Position",1);
280  }
281  }
282  meClustXRing_ = iBooker.book1D("ClustX_" +hid, "RecHit X size", 10, 0., 10.);
283  meClustXRing_->setAxisTitle("RecHit size X dimension", 1);
284  meClustYRing_ = iBooker.book1D("ClustY_" +hid,"RecHit Y size", 15, 0.,15.);
285  meClustYRing_->setAxisTitle("RecHit size Y dimension", 1);
286  meErrorXRing_ = iBooker.book1D("ErrorX_"+hid, "RecHit error X", 100,0.,0.02);
287  meErrorXRing_->setAxisTitle("RecHit error X", 1);
288  meErrorYRing_ = iBooker.book1D("ErrorY_"+hid, "RecHit error Y", 100,0.,0.02);
289  meErrorYRing_->setAxisTitle("RecHit error Y", 1);
290  menRecHitsRing_ = iBooker.book1D("nRecHits_"+hid, "# of rechits in this module", 8, 0, 8);
291  menRecHitsRing_->setAxisTitle("number of rechits",1);
292 
293  }
294 
295 }
296 //
297 // Fill histograms
298 //
299 void SiPixelRecHitModule::fill(const float& rechit_x, const float& rechit_y,
300  const int& sizeX, const int& sizeY,
301  const float& lerr_x, const float& lerr_y,
302  bool modon, bool ladon, bool layon, bool phion,
303  bool bladeon, bool diskon, bool ringon,
304  bool twoD, bool reducedSet) {
305 
306  bool barrel = DetId(id_).subdetId() == static_cast<int>(PixelSubdetector::PixelBarrel);
307  bool endcap = DetId(id_).subdetId() == static_cast<int>(PixelSubdetector::PixelEndcap);
308 
309  //std::cout << rechit_x << " " << rechit_y << " " << sizeX << " " << sizeY << std::endl;
310  if(modon){
311  meClustX_->Fill(sizeX);
312  meClustY_->Fill(sizeY);
313  meErrorX_->Fill(lerr_x);
314  meErrorY_->Fill(lerr_y);
315  if(!reducedSet)
316  {
317  if(twoD) meXYPos_->Fill(rechit_x, rechit_y);
318  else {
319  meXYPos_px_->Fill(rechit_x);
320  meXYPos_py_->Fill(rechit_y);
321  }
322  }
323  }
324  //std::cout<<"number of detector units="<<numberOfDetUnits<<std::endl;
325 
326  if(ladon && barrel){
327  meClustXLad_->Fill(sizeX);
328  meClustYLad_->Fill(sizeY);
329  meErrorXLad_->Fill(lerr_x);
330  meErrorYLad_->Fill(lerr_y);
331  if(!reducedSet)
332  {
333  if(twoD) meXYPosLad_->Fill(rechit_x, rechit_y);
334  else{
335  meXYPosLad_px_->Fill(rechit_x);
336  meXYPosLad_py_->Fill(rechit_y);
337  }
338  }
339  }
340 
341  if(layon && barrel){
342  meClustXLay_->Fill(sizeX);
343  meClustYLay_->Fill(sizeY);
344  meErrorXLay_->Fill(lerr_x);
345  meErrorYLay_->Fill(lerr_y);
346  if(!reducedSet)
347  {
348  if(twoD) meXYPosLay_->Fill(rechit_x, rechit_y);
349  else{
350  meXYPosLay_px_->Fill(rechit_x);
351  meXYPosLay_py_->Fill(rechit_y);
352  }
353  }
354  }
355 
356  if(phion && barrel){
357  meClustXPhi_->Fill(sizeX);
358  meClustYPhi_->Fill(sizeY);
359  meErrorXPhi_->Fill(lerr_x);
360  meErrorYPhi_->Fill(lerr_y);
361  if(!reducedSet)
362  {
363  if(twoD) meXYPosPhi_->Fill(rechit_x, rechit_y);
364  else{
365  meXYPosPhi_px_->Fill(rechit_x);
366  meXYPosPhi_py_->Fill(rechit_y);
367  }
368  }
369  }
370 
371  if(bladeon && endcap){
372  //meXYPosBlade_->Fill(rechit_x, rechit_y);
373  meClustXBlade_->Fill(sizeX);
374  meClustYBlade_->Fill(sizeY);
375  meErrorXBlade_->Fill(lerr_x);
376  meErrorYBlade_->Fill(lerr_y);
377  }
378 
379  if(diskon && endcap){
380  //meXYPosDisk_->Fill(rechit_x, rechit_y);
381  meClustXDisk_->Fill(sizeX);
382  meClustYDisk_->Fill(sizeY);
383  meErrorXDisk_->Fill(lerr_x);
384  meErrorYDisk_->Fill(lerr_y);
385  }
386 
387  if(ringon && endcap){
388  meClustXRing_->Fill(sizeX);
389  meClustYRing_->Fill(sizeY);
390  meErrorXRing_->Fill(lerr_x);
391  meErrorYRing_->Fill(lerr_y);
392  if(!reducedSet)
393  {
394  if(twoD) meXYPosRing_->Fill(rechit_x, rechit_y);
395  else{
396  meXYPosRing_px_->Fill(rechit_x);
397  meXYPosRing_py_->Fill(rechit_y);
398  }
399  }
400  }
401 }
402 
403 void SiPixelRecHitModule::nfill(const int& nrec, bool modon, bool ladon, bool layon, bool phion, bool bladeon, bool diskon, bool ringon) {
404 
405  bool barrel = DetId(id_).subdetId() == static_cast<int>(PixelSubdetector::PixelBarrel);
406  bool endcap = DetId(id_).subdetId() == static_cast<int>(PixelSubdetector::PixelEndcap);
407 
408  //if(modon) menRecHits_->Fill(nrec);
409  //barrel
410  if(ladon && barrel) menRecHitsLad_->Fill(nrec);
411  if(layon && barrel) menRecHitsLay_->Fill(nrec);
412  if(phion && barrel) menRecHitsPhi_->Fill(nrec);
413  //endcap
414  if(bladeon && endcap) menRecHitsBlade_->Fill(nrec);
415  if(diskon && endcap) menRecHitsDisk_->Fill(nrec);
416  if(ringon && endcap) menRecHitsRing_->Fill(nrec);
417 }
int plaquetteName() const
plaquetteId (in pannel)
MonitorElement * menRecHitsLay_
type
Definition: HCALResponse.h:21
T getParameter(std::string const &) const
MonitorElement * meXYPosPhi_px_
MonitorElement * meClustYRing_
MonitorElement * meClustXLay_
MonitorElement * meXYPosPhi_
void nfill(const int &nrec, bool modon=true, bool ladon=false, bool layon=false, bool phion=false, bool bladeon=false, bool diskon=false, bool ringon=false)
MonitorElement * meXYPosPhi_py_
MonitorElement * meErrorXDisk_
MonitorElement * meClustYPhi_
SiPixelRecHitModule()
Default constructor.
int moduleName() const
module id (index in z)
MonitorElement * meXYPosLay_py_
MonitorElement * meClustXDisk_
MonitorElement * meClustYDisk_
MonitorElement * meErrorY_
MonitorElement * meErrorYRing_
bool isHalfModule() const
full or half module
~SiPixelRecHitModule()
Destructor.
MonitorElement * meClustXLad_
MonitorElement * meErrorYPhi_
int plaquetteName() const
plaquetteId (in pannel)
MonitorElement * meXYPosRing_px_
MonitorElement * meXYPosLay_
MonitorElement * meErrorXLad_
MonitorElement * meClustX_
void Fill(long long x)
MonitorElement * meClustXBlade_
MonitorElement * meClustXPhi_
MonitorElement * meXYPosLad_px_
int bladeName() const
blade id
MonitorElement * meErrorXBlade_
bool isHalfModule() const
full or half module
MonitorElement * meXYPosRing_
MonitorElement * meErrorYLad_
MonitorElement * menRecHitsRing_
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:115
MonitorElement * meXYPosLay_px_
int bladeName() const
blade id
MonitorElement * meClustXRing_
MonitorElement * meXYPos_py_
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
MonitorElement * meErrorYLay_
MonitorElement * meXYPos_
int diskName() const
disk id
std::string setHistoId(std::string variable, uint32_t &rawId)
Set Histogram Id.
Definition: DetId.h:18
int ladderName() const
ladder id (index in phi)
int ladderName() const
ladder id (index in phi)
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:133
MonitorElement * meXYPosLad_
int moduleName() const
module id (index in z)
int layerName() const
layer id
MonitorElement * meErrorYDisk_
MonitorElement * menRecHitsDisk_
std::string const & label() const
Definition: InputTag.h:42
MonitorElement * meErrorX_
MonitorElement * menRecHitsPhi_
int pannelName() const
pannel id
MonitorElement * menRecHitsLad_
MonitorElement * meClustYLad_
MonitorElement * meClustY_
void book(const edm::ParameterSet &iConfig, DQMStore::IBooker &iBooker, int type=0, bool twoD=true, bool reducedSet=false, bool isUpgrade=false)
Book histograms.
MonitorElement * meXYPosRing_py_
int diskName() const
disk id
int pannelName() const
pannel id
void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)
MonitorElement * meXYPosLad_py_
MonitorElement * meErrorXLay_
int layerName() const
layer id
MonitorElement * menRecHitsBlade_
MonitorElement * meClustYBlade_
void fill(const float &rechit_x, const float &rechit_y, const int &sizeX, const int &sizeY, const float &lerr_x, const float &lerr_y, bool modon=true, bool ladon=false, bool layon=false, bool phion=false, bool bladeon=false, bool diskon=false, bool ringon=false, bool twoD=true, bool reducedSet=false)
Fill histograms.
MonitorElement * meClustYLay_
MonitorElement * meXYPos_px_
MonitorElement * meErrorXRing_
MonitorElement * meErrorYBlade_
MonitorElement * meErrorXPhi_