11 #include "THaDetMap.h"
14 #include "THaCutList.h"
20 #include "THaTrackProj.h"
35 THaApparatus* apparatus ) :
36 THaNonTrackingDetector(name,description,apparatus),
37 fPosAdcTimeWindowMin(0), fNegAdcTimeWindowMin(0),
38 fPosAdcTimeWindowMax(0), fNegAdcTimeWindowMax(0),
39 fPedPosDefault(0),fPedNegDefault(0),
40 fShPosPedLimit(0), fShNegPedLimit(0), fPosGain(0), fNegGain(0),
41 fClusterList(0), fLayerNames(0), fLayerZPos(0), BlockThick(0),
42 fNBlocks(0), fXPos(0), fYPos(0), fZPos(0), fPlanes(0), fArray(0)
54 THaNonTrackingDetector(),
55 fPosAdcTimeWindowMin(0), fNegAdcTimeWindowMin(0),
56 fPosAdcTimeWindowMax(0), fNegAdcTimeWindowMax(0),
57 fPedPosDefault(0),fPedNegDefault(0),
58 fShPosPedLimit(0), fShNegPedLimit(0), fPosGain(0), fNegGain(0),
59 fClusterList(0), fLayerNames(0), fLayerZPos(0), BlockThick(0),
60 fNBlocks(0), fXPos(0), fYPos(0), fZPos(0), fPlanes(0), fArray(0)
70 prefix[0] = tolower(GetApparatus()->
GetName()[0]);
78 {
"cal_layer_names", &layernamelist, kString},
87 vector<string> layer_names = Podd::vsplit(layernamelist);
90 cout <<
"THcShower::Setup ERROR: Number of layers " <<
fNTotLayers
91 <<
" doesn't agree with number of layer names "
92 << layer_names.size() << endl;
98 fLayerNames[i] =
new char[layer_names[i].length()+1];
102 char *desc =
new char[strlen(description)+100];
106 strcpy(desc, description);
107 strcat(desc,
" Plane ");
114 strcpy(desc, description);
115 strcat(desc,
" Array ");
128 cout <<
"From THcShower::Setup: created Shower planes for "
129 << GetApparatus()->GetName() <<
": ";
133 i < fNTotLayers-1 ? cout <<
", " : cout <<
".\n";
149 char EngineDID[] =
"xCAL";
150 EngineDID[0] = toupper(GetApparatus()->
GetName()[0]);
152 static const char*
const here =
"Init()";
153 Error( Here(here),
"Error filling detectormap for %s.", EngineDID );
160 InitHitList(fDetMap,
"THcRawShowerHit", fDetMap->GetTotNumChan()+1,
164 if( (status = THaNonTrackingDetector::Init( date )) )
165 return fStatus=status;
169 return fStatus=status;
174 return fStatus = status;
198 THaVar* vpresent = gHaVars->Find(
Form(
"%s.present",GetApparatus()->
GetName()));
202 return fStatus = kOK;
226 prefix[0]=tolower(GetApparatus()->
GetName()[0]);
235 {
"cal_num_neg_columns", &
fNegCols, kInt, 0, 1},
236 {
"cal_slop", &
fSlop, kDouble,0,1},
237 {
"cal_fv_test", &
fvTest, kInt,0,1},
238 {
"cal_fv_delta", &
fvDelta, kDouble,0,1},
239 {
"cal_ADCMode", &
fADCMode, kInt, 0, 1},
263 cout <<
"---------------------------------------------------------------\n";
264 cout <<
"Debug output from THcShower::ReadDatabase for "
265 << GetApparatus()->GetName() << endl;
267 cout <<
" Number of neg. columns = " <<
fNegCols << endl;
268 cout <<
" Slop parameter = " <<
fSlop << endl;
269 cout <<
" Fiducial volume test flag = " <<
fvTest << endl;
270 cout <<
" Fiducial volume excl. width = " <<
fvDelta << endl;
271 cout <<
" Initialize debug flag = " <<
fdbg_init_cal << endl;
272 cout <<
" Raw hit debug flag = " <<
fdbg_raw_cal << endl;
281 {
"cal_a_cor", &
fAcor, kDouble},
282 {
"cal_b_cor", &
fBcor, kDouble},
283 {
"cal_c_cor",
fCcor, kDouble, 2},
284 {
"cal_d_cor",
fDcor, kDouble, 2},
292 cout <<
" Coordinate correction constants:\n";
293 cout <<
" fAcor = " <<
fAcor << endl;
294 cout <<
" fBcor = " <<
fBcor << endl;
295 cout <<
" fCcor = " <<
fCcor[0] <<
", " <<
fCcor[1] << endl;
296 cout <<
" fDcor = " <<
fDcor[0] <<
", " <<
fDcor[1] << endl;
331 cout <<
" Plane " <<
fLayerNames[i] <<
":" << endl;
332 cout <<
" Block thickness: " <<
BlockThick[i] << endl;
333 cout <<
" NBlocks : " <<
fNBlocks[i] << endl;
334 cout <<
" Z Position : " <<
fLayerZPos[i] << endl;
335 cout <<
" Y Positions : " <<
fYPos[2*i] <<
", " <<
fYPos[2*i+1]
337 cout <<
" X Positions :";
339 cout <<
" " <<
fXPos[i][j];
355 cout <<
" Fiducial volume limits:" << endl;
356 cout <<
" Xmin = " <<
fvXmin <<
" Xmax = " <<
fvXmax << endl;
357 cout <<
" Ymin = " <<
fvYmin <<
" Ymax = " <<
fvYmax << endl;
367 cout <<
" Total number of blocks in the layers of calorimeter: " << dec
397 {
"cal_pos_cal_const", hcal_pos_cal_const, kDouble, fNTotBlocks},
399 {
"cal_pos_gain_cor", hcal_pos_gain_cor, kDouble, fNTotBlocks},
400 {
"cal_neg_cal_const", hcal_neg_cal_const, kDouble, fNTotBlocks},
402 {
"cal_neg_gain_cor", hcal_neg_gain_cor, kDouble, fNTotBlocks},
428 cout <<
" hcal_pos_cal_const:" << endl;
432 cout << hcal_pos_cal_const[j*fNBlocks[j]+i] <<
" ";
437 cout <<
" fShPosPedLimit:" << endl;
446 cout <<
" hcal_pos_gain_cor:" << endl;
450 cout << hcal_pos_gain_cor[j*fNBlocks[j]+i] <<
" ";
455 cout <<
" hcal_neg_cal_const:" << endl;
459 cout << hcal_neg_cal_const[j*fNBlocks[j]+i] <<
" ";
464 cout <<
" fShNegPedLimit:" << endl;
473 cout <<
" hcal_neg_gain_cor:" << endl;
477 cout << hcal_neg_gain_cor[j*fNBlocks[j]+i] <<
" ";
487 fPosGain[i] = hcal_pos_cal_const[i] * hcal_pos_gain_cor[i];
488 fNegGain[i] = hcal_neg_cal_const[i] * hcal_neg_gain_cor[i];
494 cout <<
" fPosGain:" << endl;
498 cout <<
fPosGain[j*fNBlocks[j]+i] <<
" ";
503 cout <<
" fNegGain:" << endl;
507 cout <<
fNegGain[j*fNBlocks[j]+i] <<
" ";
521 fOrigin.SetXYZ(xOrig, yOrig, zOrig);
525 cout <<
" Origin of the Calorimeter:" << endl;
526 cout <<
" Xorig = " << GetOrigin().X() << endl;
527 cout <<
" Yorig = " << GetOrigin().Y() << endl;
528 cout <<
" Zorig = " << GetOrigin().Z() << endl;
529 cout <<
"---------------------------------------------------------------\n";
547 if( mode == kDefine && fIsSetup )
return kOK;
548 fIsSetup = ( mode == kDefine );
553 {
"nhits",
"Number of hits",
"fNhits" },
554 {
"nclust",
"Number of layer clusters",
"fNclust" },
555 {
"nclusttrack",
"Number of layer cluster which matched best track",
"fNclustTrack" },
556 {
"xclusttrack",
"X pos of layer cluster which matched best track",
"fXclustTrack" },
557 {
"xtrack",
"X pos of track which matched layer cluster",
"fXTrack" },
558 {
"yclusttrack",
"Y pos of layer cluster which matched best track",
"fYclustTrack" },
559 {
"ytrack",
"Y pos of track which matched layer cluster",
"fYTrack" },
560 {
"etot",
"Total energy",
"fEtot" },
561 {
"etotnorm",
"Total energy divided by Central Momentum",
"fEtotNorm" },
562 {
"etrack",
"Track energy",
"fEtrack" },
563 {
"etracknorm",
"Total energy divided by track momentum",
"fEtrackNorm" },
564 {
"eprtrack",
"Track Preshower energy",
"fEPRtrack" },
565 {
"eprtracknorm",
"Preshower energy divided by track momentum",
"fEPRtrackNorm" },
566 {
"etottracknorm",
"Total energy divided by track momentum",
"fETotTrackNorm" },
567 {
"ntracks",
"Number of shower tracks",
"fNtracks" },
573 RVarDef array_vars[] = {
574 {
"sizeclustarray",
"Number of block in array cluster that matches track",
"fSizeClustArray" },
575 {
"nclustarraytrack",
"Number of cluster for Fly's eye which matched best track",
"fNclustArrayTrack" },
576 {
"nblock_high_ene",
"Block number in array with highest energy which matched best track",
"fNblockHighEnergy" },
577 {
"xclustarraytrack",
"X pos of cluster which matched best track",
"fXclustArrayTrack" },
578 {
"xtrackarray",
"X pos of track which matched cluster",
"fXTrackArray" },
579 {
"yclustarraytrack",
"Y pos of cluster which matched best track",
"fYclustArrayTrack" },
580 {
"ytrackarray",
"Y pos of track which matched cluster",
"fYTrackArray" },
584 DefineVarsFromList( array_vars, mode );
586 return DefineVarsFromList( vars, mode );
603 Podd::DeleteContainer(**i);
685 Podd::DeleteContainer(**i);
706 if(gHaCuts->Result(
"Pedestal_event")) {
778 if (Eneg>0) y =
fYPos[2*j]/2 ;
779 if (Epos>0) y =
fYPos[2*j+1]/2 ;
780 if (Epos>0 && Eneg>0) y = 0. ;
799 cout <<
"---------------------------------------------------------------\n";
800 cout <<
"Debug output from THcShower::CoarseProcess for "
801 << GetApparatus()->GetName() << endl;
803 cout <<
" event = " <<
fEvent << endl;
804 cout <<
" List of unclustered hits. Total hits: " <<
fNhits << endl;
807 cout <<
" hit " << i <<
": ";
815 assert( HitSet.empty() );
817 fNclust = (*fClusterList).size();
823 cout <<
" event = " <<
fEvent <<
" Clustered hits. Number of clusters: " << fNclust << endl;
827 ppcl != (*fClusterList).end(); ++ppcl) {
829 cout <<
" Cluster #" << i++
830 <<
": E=" <<
clE(*ppcl)
831 <<
" Epr=" <<
clEpr(*ppcl)
832 <<
" X=" <<
clX(*ppcl)
833 <<
" Z=" <<
clZ(*ppcl)
834 <<
" size=" << (**ppcl).size()
840 cout <<
" hit " << j++ <<
": ";
846 cout <<
"---------------------------------------------------------------\n";
856 for (
Int_t itrk=0; itrk<Ntracks; itrk++) {
858 THaTrack* theTrack =
static_cast<THaTrack*
>( tracks[itrk] );
862 theTrack->SetEnergy(save_energy);
877 while (HitSet.size() != 0) {
882 (*cluster).insert(*(--it));
885 bool clustered =
true;
896 if ((**i).isNeighbour(*k)) {
897 (*cluster).insert(*i);
903 if (clustered)
break;
906 if (clustered)
break;
911 ClusterList->push_back(cluster);
922 return x + h->
hitE();
954 Double_t Etot = accumulate((*cluster).begin(),(*cluster).end(),0.,
addE);
956 accumulate((*cluster).begin(),(*cluster).end(),0.,
addY)/Etot : -100.);
963 Double_t Etot = accumulate((*cluster).begin(),(*cluster).end(),0.,
addE);
965 accumulate((*cluster).begin(),(*cluster).end(),0.,
addX)/Etot : -100.);
973 Double_t Etot = accumulate((*cluster).begin(),(*cluster).end(),0.,
addE);
975 accumulate((*cluster).begin(),(*cluster).end(),0.,
addZ)/Etot : 0.);
981 return accumulate((*cluster).begin(),(*cluster).end(),0.,
addE);
987 return accumulate((*cluster).begin(),(*cluster).end(),0.,
addEpr);
998 if (side!=0&&side!=1&&side!=2) {
999 cout <<
"*** Wrong Side in clEplane:" << side <<
" ***" << endl;
1004 for (
THcShowerHitIt it=(*cluster).begin(); it!=(*cluster).end(); ++it) {
1005 if ((*it)->hitColumn() == iplane) pcluster.insert(*it);
1011 Eplane = accumulate(pcluster.begin(),pcluster.end(),0.,
addEpos);
1014 Eplane = accumulate(pcluster.begin(),pcluster.end(),0.,
addEneg);
1017 Eplane = accumulate(pcluster.begin(),pcluster.end(),0.,
addE);
1043 CalcTrackIntercept(Track, pathl, XTrFront, YTrFront);
1047 XTrFront += GetOrigin().X();
1048 YTrFront += GetOrigin().Y();
1064 CalcTrackIntercept(Track, pathl, XTrBack, YTrBack);
1066 XTrBack += GetOrigin().X();
1067 YTrBack += GetOrigin().Y();
1069 inFidVol = (XTrFront <= fvXmax) && (XTrFront >=
fvXmin) &&
1105 cout <<
"---------------------------------------------------------------\n";
1106 cout <<
"Debug output from THcShower::MatchCluster for "
1107 << GetApparatus()->GetName() << endl;
1108 cout <<
" event = " <<
fEvent << endl;
1110 cout <<
" Track at DC:"
1111 <<
" X = " << Track->GetX()
1112 <<
" Y = " << Track->GetY()
1113 <<
" Theta = " << Track->GetTheta()
1114 <<
" Phi = " << Track->GetPhi()
1116 cout <<
" Track at the front of Calorimeter:"
1117 <<
" X = " << XTrFront
1118 <<
" Y = " << YTrFront
1119 <<
" Pathl = " << pathl
1122 cout <<
" Fiducial volume test: inFidVol = " << inFidVol << endl;
1124 cout <<
" Matched cluster #" << mclust <<
", delatX= " << deltaX
1126 cout <<
"---------------------------------------------------------------\n";
1156 char prefix = GetApparatus()->GetName()[0];
1161 for (
UInt_t ip=L0; ip<L0+NLayers; ip++) {
1171 if (prefix ==
'H') {
1172 corpos =
Ycor(Ytr,0);
1173 corneg =
Ycor(Ytr,1);
1186 Etrk +=
clEplane(cluster,ip,0) * corpos;
1187 Etrk +=
clEplane(cluster,ip,1) * corneg;
1196 cout <<
"---------------------------------------------------------------\n";
1197 cout <<
"Debug output from THcShower::GetShEnergy for "
1198 << GetApparatus()->GetName() << endl;
1199 cout <<
" event = " <<
fEvent << endl;
1201 cout <<
" Track at the calorimeter: X = " << Xtr <<
" Y = " << Ytr;
1203 cout <<
", matched cluster #" << mclust <<
"." << endl;
1205 cout <<
", no matched cluster found." << endl;
1207 cout <<
" Layers from " << L0+1 <<
" to " << L0+NLayers <<
".\n";
1208 cout <<
" Coordinate corrected track energy = " << Etrk <<
"." << endl;
1209 cout <<
"---------------------------------------------------------------\n";
1225 for (
Int_t itrk=0; itrk<Ntracks; itrk++) {
1226 THaTrack* theTrack =
static_cast<THaTrack*
>( tracks[itrk] );
1227 if (theTrack->GetIndex()==0) {
1228 fEtrack=theTrack->GetEnergy();
1259 fPlanes[ip]-> AccumulateStat(tracks);
1267 cout <<
"---------------------------------------------------------------\n";
1268 cout <<
"Debug output from THcShower::FineProcess for "
1269 << GetApparatus()->GetName() << endl;
1270 cout <<
" event = " <<
fEvent << endl;
1271 cout <<
" Number of tracks = " << Ntracks << endl;
1273 cout <<
" matching cluster info " << endl;
1278 for (
Int_t itrk=0; itrk<Ntracks; itrk++) {
1279 THaTrack* theTrack =
static_cast<THaTrack*
>( tracks[itrk] );
1280 cout <<
" Track " << itrk <<
": "
1281 <<
" X = " << theTrack->GetX()
1282 <<
" Y = " << theTrack->GetY()
1283 <<
" Theta = " << theTrack->GetTheta()
1284 <<
" Phi = " << theTrack->GetPhi()
1285 <<
" Energy = " << theTrack->GetEnergy()
1289 cout <<
"---------------------------------------------------------------\n";
Int_t fdbg_sparsified_cal
std::string GetName(const std::string &scope_name)
virtual EStatus Init(const TDatime &run_time)
virtual Int_t FillMap(THaDetMap *detmap, const char *detectorname)
Double_t GetEneg(Int_t i)
Double_t addE(Double_t x, THcShowerHit *h)
Double_t addEneg(Double_t x, THcShowerHit *h)
virtual void Clear(Option_t *opt="")
void MissReport(const char *name)
THcShowerClusterList::iterator THcShowerClusterListIt
Double_t GetClMaxEnergyBlock()
Double_t * fNegAdcTimeWindowMax
Double_t addY(Double_t x, THcShowerHit *h)
Double_t clEplane(THcShowerCluster *cluster, Int_t iplane, Int_t side)
vector< THcShowerCluster * > THcShowerClusterList
Short_t Min(Short_t a, Short_t b)
virtual Int_t Decode(const THaEvData &)
virtual Int_t ProcessHits(TClonesArray *rawhits, Int_t nexthit)
TClonesArray * fRawHitList
friend class THcShowerPlane
virtual Int_t AccumulatePedestals(TClonesArray *rawhits, Int_t nexthit)
Double_t GetAnegP(Int_t i)
THcShowerCluster::iterator THcShowerClusterIt
THcShowerClusterList * fClusterList
friend class THcShowerArray
virtual Int_t CoarseProcess(TClonesArray &tracks)
Double_t fYclustArrayTrack
Double_t clEpr(THcShowerCluster *cluster)
Double_t GetEmean(Int_t i)
Double_t * fPosAdcTimeWindowMax
virtual Int_t CoarseProcessHits()
Int_t MatchCluster(THaTrack *, Double_t &, Double_t &)
Float_t GetShEnergy(THaTrack *)
Float_t GetShEnergy(THaTrack *, UInt_t NLayers, UInt_t L0=0)
virtual Int_t ProcessHits(TClonesArray *rawhits, Int_t nexthit)
virtual Int_t DefineVariables(EMode mode=kDefine)
Double_t clZ(THcShowerCluster *cluster)
void Error(const char *location, const char *msgfmt,...)
static const Int_t kADCDynamicPedestal
virtual Int_t FineProcess(TClonesArray &tracks)
void InitHitList(THaDetMap *detmap, const char *hitclass, Int_t maxhits, Int_t tdcref_cut=0, Int_t adcref_cut=0)
Save the electronics module to detector mapping and initialize a hit array of hits of class hitclass...
Double_t clY(THcShowerCluster *cluster)
Double_t addEpos(Double_t x, THcShowerHit *h)
void Setup(const char *name, const char *description)
char * Form(const char *fmt,...)
void CreateMissReportParms(const char *prefix)
virtual Int_t ReadDatabase(const TDatime &date)
Float_t YcorPr(Double_t y, Int_t side)
Double_t * fNegAdcTimeWindowMin
virtual void Clear(Option_t *opt="")
Double_t * fPosAdcTimeWindowMin
R__EXTERN class THcDetectorMap * gHcDetectorMap
THcShowerHitSet THcShowerCluster
Int_t AccumulateStat(TClonesArray &tracks)
virtual void CalculatePedestals()
virtual void CalculatePedestals()
Int_t LoadParmValues(const DBRequest *list, const char *prefix="")
Retrieve parameter values from the parameter cache.
Double_t GetEpos(Int_t i)
virtual Int_t End(THaRunBase *r=0)
Double_t clX(THcShowerCluster *cluster)
Generic segmented shower detector.
virtual Int_t AccumulatePedestals(TClonesArray *rawhits, Int_t nexthit)
ClassImp(THcDCLookupTTDConv) THcDCLookupTTDConv
you should not use this method at all Int_t Int_t z
One plane of shower blocks with side readout.
Double_t addEpr(Double_t x, THcShowerHit *h)
Short_t Max(Short_t a, Short_t b)
THcShowerPlane ** fPlanes
virtual Int_t CoarseProcessHits()
set< THcShowerHit * > THcShowerHitSet
Int_t MatchCluster(THaTrack *, Double_t &, Double_t &)
R__EXTERN class THcParmList * gHcParms
Double_t clE(THcShowerCluster *cluster)
Double_t fXclustArrayTrack
void ClusterHits(THcShowerHitSet &HitSet, THcShowerClusterList *ClusterList)
virtual Int_t CoarseProcess(TClonesArray &tracks)
virtual Int_t DecodeToHitList(const THaEvData &evdata, Bool_t suppress=kFALSE)
Populate the hitlist from the raw event data.
Double_t addX(Double_t x, THcShowerHit *h)
THcShowerHitSet::iterator THcShowerHitIt
virtual void Clear(Option_t *opt="")
virtual EStatus Init(const TDatime &run_time)
Double_t addZ(Double_t x, THcShowerHit *h)
A standard Hall C spectrometer apparatus.