StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
StMuEmcUtil.cxx
1 #include "StMuEmcUtil.h"
2 #include "StEvent.h"
3 #include "StMessMgr.h"
4 #include "StEventTypes.h"
5 #include "StMuEmcCollection.h"
6 #include "SystemOfUnits.h"
7 #include "StEmcUtil/geometry/StEmcGeom.h"
8 #include "StMuEmcTowerData.h"
9 
10 ClassImp(StMuEmcUtil)
11 
12 #define __EMC_HITS_ID_DIM__ 18000
13 
14 
15 StMuEmcUtil::StMuEmcUtil()
16  : TObject()
17 {
18  for(Int_t i =0;i<4;i++) mGeo[i]=StEmcGeom::getEmcGeom(i+1);
19 }
20 StMuEmcUtil::~StMuEmcUtil()
21 {
22 }
23 StMuEmcCollection* StMuEmcUtil::getMuEmc(const StEmcCollection *emccol)
24 {
25  if(!emccol) return NULL;
27  fillMuEmc(muEmc,emccol);
28  return muEmc;
29 }
30 StEmcCollection* StMuEmcUtil::getEmc(const StMuEmcCollection* muEmc)
31 {
32  if(!muEmc) return NULL;
34  fillEmc(emc,muEmc);
35  return emc;
36 }
37 void StMuEmcUtil::fillMuEmc(StMuEmcCollection *muEmc, const StEmcCollection *emccol)
38 {
39  if(!emccol) return;
40  if(!muEmc) return;
41 
42  // starting by hits;
43  //cout <<"Filling hits and clusters \n";
44  for(Int_t d=0; d<8; d++)
45  {
46  Int_t EmcDet=d+1;
47 
48  StDetectorId id = static_cast<StDetectorId>(d+kBarrelEmcTowerId);
49  const StEmcDetector* detector=emccol->detector(id);
50  if(detector)
51  {
52  Int_t maxMod = 121;
53  if(d>3) maxMod = 14;
54  //cout <<"Filling hits for detetor "<<EmcDet<<endl;
55  for(Int_t j=1;j<maxMod;j++)
56  {
57  const StEmcModule* module = detector->module(j);
58  if(module)
59  {
60  const StSPtrVecEmcRawHit& rawHit=module->hits();
61  Int_t nhits=(Int_t)rawHit.size();
62  if(nhits>0)
63  for(Int_t k=0;k<nhits;k++)
64  {
65  Int_t m = rawHit[k]->module();
66  Int_t e = rawHit[k]->eta();
67  Int_t s = abs(rawHit[k]->sub());
68  Int_t adc = rawHit[k]->adc();
69  Float_t energy = rawHit[k]->energy();
70  Int_t cal = rawHit[k]->calibrationType();
71  Int_t rid;
72  bool save = true;
73  if(d<4 && cal>127) save = false;
74  if(save)
75  {
76  if (d<4) // for the barrel
77  {
78  mGeo[d]->getId(m,e,s,rid);
79  }
80  else
81  {
82  if(getEndcapId(EmcDet,m,e,s,rid)) continue;// on error
83  }
84 
85  if(EmcDet == 1 || EmcDet == 5 ) // towers save only ADC
86  {
87  muEmc->setTowerADC(rid,adc,EmcDet);
88  }
89  if(EmcDet==2 || EmcDet == 6) //pre shower
90  {
91  muEmc->addPrsHit(EmcDet);
92  StMuEmcHit* muHit = muEmc->getPrsHit(muEmc->getNPrsHits(EmcDet)-1,EmcDet);
93  muHit->setId(rid);
94  muHit->setAdc(adc);
95  muHit->setEnergy(energy);
96  muHit->setCalType(cal);
97  }
98  if(EmcDet==3 || EmcDet==4 || EmcDet==7 || EmcDet==8)
99  {
100  muEmc->addSmdHit(EmcDet);
101  StMuEmcHit* muHit = muEmc->getSmdHit(muEmc->getNSmdHits(EmcDet)-1,EmcDet);
102  muHit->setId(rid);
103  muHit->setAdc(adc);
104  muHit->setEnergy(energy);
105  muHit->setCalType(cal);
106  }
107  }
108  }
109 
110  }
111  }
112  Int_t n_crate=0;
113  switch (EmcDet) {
114  case 1:
115  n_crate=StMuEmcTowerData::nBTowCrates;
116  break;
117  case 2:
118  n_crate=StMuEmcTowerData::nBPrsCrates;
119  break;
120  case 3:
121  n_crate=StMuEmcTowerData::nBSmdCrates;
122  break;
123  case 5:
124  n_crate=StMuEmcTowerData::nETowCrates;
125  break;
126  case 6:
127  n_crate=StMuEmcTowerData::nEPrsCrates;
128  break;
129  case 7:
130  n_crate=StMuEmcTowerData::nESmdCrates;
131  break;
132  }
133  for (Int_t i_crate=1; i_crate<=n_crate; i_crate++) {
134  muEmc->setCrateStatus(detector->crateStatus(i_crate),i_crate,EmcDet);
135  }
136  }
137  }
138 
139  return;
140 }
141 
142 void StMuEmcUtil::fillEmc(StEmcCollection* emc, const StMuEmcCollection* muEmc)
143 {
144  if(!muEmc) return;
145  if(!emc) return;
146  //cout <<"FILLING EMC COLLECTION\n";
147 
148  for(Int_t i=0;i<8;i++)
149  {
150  Int_t det=i+1;
151 
152  StDetectorId id = static_cast<StDetectorId>(i+kBarrelEmcTowerId);
153  int nMod = 120;
154  if(i>=4) nMod = 13;
155  StEmcDetector* detector = new StEmcDetector(id, nMod);
156  emc->setDetector(detector);
157  // hits
158  Int_t nh=0;
159  if (det==1) nh = 4800;
160  if (det==5) nh = 720;
161  if (det==2 || det ==6) nh=muEmc->getNPrsHits(det);
162  if (det==3 || det==4 || det==7 || det==8) nh=muEmc->getNSmdHits(det);
163  //cout <<"Number of hits for detector "<<det<<" = "<<nh<<endl;
164  for(Int_t j=0;j<nh;j++)
165  {
166  Bool_t save = kTRUE;
167  Int_t m,e,s,rid;
168  Int_t a=0,cal=0;
169  Float_t energy=0;
170  if(det==1 || det==5) // towers have only ADC
171  {
172  a = muEmc->getTowerADC(j+1,det);
173  if(det==1) mGeo[det-1]->getBin(j+1,m,e,s);
174  else {
175  if( getEndcapBin(det,j+1,m,e,s)) continue ;// on error
176  }
177  energy = 0;
178  cal = 0;
179  if(a==0) save = kFALSE;
180  }
181  if(det==2 || det ==6) //prs
182  {
183  const StMuEmcHit* hit=muEmc->getPrsHit(j,det);
184  if(hit)
185  {
186  rid=hit->getId();
187  if(det==2) mGeo[det-1]->getBin(rid,m,e,s);
188  else {
189  if( getEndcapBin(det,rid,m,e,s)) continue ;// on error
190  }
191  a=hit->getAdc();
192  cal=hit->getCalType();
193  energy=hit->getEnergy();
194  } else save = kFALSE;
195  }
196  if(det==3 || det==4 || det==7 || det==8) //smd
197  {
198  const StMuEmcHit* hit=muEmc->getSmdHit(j,det);
199  if(hit)
200  {
201  rid=hit->getId();
202  if(det<5) mGeo[det-1]->getBin(rid,m,e,s);
203  else {
204  if( getEndcapBin(det,rid,m,e,s)) continue ;// on error
205  }
206  a=hit->getAdc();
207  cal=hit->getCalType();
208  energy=hit->getEnergy();
209  } else save = kFALSE;
210  }
211  if(save)
212  {
213  StEmcRawHit* rawHit=new StEmcRawHit(id,(UInt_t)m,(UInt_t)e,(UInt_t)s,(UInt_t)a,energy);
214  rawHit->setCalibrationType(cal);
215  //cout <<"det = "<<det<<" Hit number "<<j<<" m = "<<m<<" e = "<<e<<" s = "<<s<<" adc = "<<a<<" en = "<<energy<<"\n";
216  detector->addHit(rawHit);
217  }
218  }
219 
220  Int_t n_crate=0;
221  switch (det) {
222  case 1:
223  n_crate=StMuEmcTowerData::nBTowCrates;
224  break;
225  case 2:
226  n_crate=StMuEmcTowerData::nBPrsCrates;
227  break;
228  case 3:
229  case 4:
230  n_crate=StMuEmcTowerData::nBSmdCrates;
231  break;
232  case 5:
233  n_crate=StMuEmcTowerData::nETowCrates;
234  break;
235  case 6:
236  n_crate=StMuEmcTowerData::nEPrsCrates;
237  break;
238  case 7:
239  case 8:
240  n_crate=StMuEmcTowerData::nESmdCrates;
241  break;
242  }
243  for (Int_t i_crate=1; i_crate<=n_crate; i_crate++) {
244  detector->setCrateStatus(i_crate,muEmc->getCrateStatus(i_crate,det));
245  }
246  }
247  return;
248 }
249 
250 //=================================================
251 //=================================================
252 int StMuEmcUtil::getEndcapId(int d,int m, int e, int s,int &rid) const {
253  rid=1;
254  /* first tower or first strip is default,
255  I do not like it, but it is the only safe value,JB
256  */
257 
258  TString text;
259 
260  if( m<=0 || m >12 || d<5 || d>8 ) {
261  text="m<=0 || m >12 || d<5 || d>8 ";
262  goto abort;
263  }
264 
265  switch (d) {
266 
267  case 5:
268  if( e<=0 || e>12 || s<=0 || s>5 ) {
269  text="e<=0 || e>12 || s<=0 || s>5 ,towers";
270  goto abort;
271  }
272  rid = 60*(m-1) + 12*(s-1) + e-1;
273  break;
274 
275  case 6:
276  if( e<=0 || e>12 || s<=0 || s>15 ) {
277  text="e<=0 || e>12 || s<=0 || s>15 , pre/post";
278  goto abort;
279  }
280  rid = 180*(m-1) + 12*(s-1) + e-1;
281  break;
282 
283  case 7:
284  case 8:
285  if( s!=1 || e<=0 || e>288 ) {
286  text=" s!=1 || e<=0 || e>288, SMD";
287  goto abort;
288  }
289  rid = 300*(m-1) + e-1;
290  break;
291  default:;
292  }
293 
294  rid++; // to compensate for counting from 1
295 
296  if( rid<=0 ) {
297  text=" rid<=0";
298  goto abort;
299  }
300 
301  return 0; // all went OK
302 
303  abort:
304  gMessMgr->Error() <<"StMuEmcUtil::getEndcapId(), FATAL internal error: "
305  <<text<<"\n d="<<d<<" m="<<m<<" e="<<" s="<<s<<" rid "<<rid
306  <<"\n ENDCAP data may be wrong, " << endm;
307  return 1;
308 }
309 
310 
311 int StMuEmcUtil::getEndcapBin(int d,int rid0,int &m, int &e, int &s) const
312 {
313  m=e=s=1;
314  /* first tower or first strip is default,
315  I do not like it, but it is the only safe value,JB
316  */
317 
318  TString text;
319  int rid=rid0-1;
320  int x;
321 
322  if( rid0<=0 || d<5 || d>8 ) {
323  text="rid0<=0 || d<5 || d>8 ";
324  goto abort;
325  }
326 
327  switch (d) {
328 
329  case 5:
330  m=1+ rid/60;
331  x=rid%60;
332  s=1 +x/12;
333  e=1 + x%12;
334  if ( m>12 || s<1 || s>5 || e>12 ) {
335  text=" m>12 || s<1 || s>5 || e>12 , tower";
336  goto abort;
337  }
338  break;
339 
340  case 6:
341  m=1+ rid/180;
342  x=rid%180;
343  s=1 +x/12;
344  e=1 + x%12;
345  if ( m>12 || s<1 || s>15 || e>12 ) {
346  text=" m>12 || s<1 || s>15 || e>12 , pre/post";
347  goto abort;
348  }
349  break;
350 
351  case 7:
352  case 8:
353  m=1+ rid/300;
354  s=1;
355  e=1 + rid%300;
356  if ( m>12 || e>288 || e <1 ) {
357  text=" m>12 || s<=0 || s>5 || e>12 , smd";
358  goto abort;
359  }
360  break;
361  default: ;
362  }
363 
364  return 0; // all went OK
365 
366  abort:
367  gMessMgr->Error() <<"StMuEmcUtil::getEndcapBin(), FATAL internal error: "
368  <<text<<"\n d="<<d<<" m="<<m<<" e="<<" s="<<s<<" rid0 "<<rid0
369  <<"\n ENDCAP data may be wrong, "
370  <<" assert() should be here, JB"<<endm;
371  return 1;
372 }
int getId() const
Return Module number.
Definition: StMuEmcHit.h:18
float getEnergy() const
Return Hit energy.
Definition: StMuEmcHit.h:21
int getAdc() const
Return ADC value.
Definition: StMuEmcHit.h:19
Int_t getBin(const Float_t phi, const Float_t eta, Int_t &m, Int_t &e, Int_t &s) const
Definition: StEmcGeom.h:321