ATLAS Offline Software
Loading...
Searching...
No Matches
TGCCableInPP.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
6
11
12namespace MuonTGC_Cabling {
13
14// Constructor & Destructor
15TGCCableInPP::TGCCableInPP(const std::string& filename)
17 m_database[TGCId::Endcap][TGCId::WD] = std::make_unique<TGCDatabaseInPP>(filename, "EWD");
18 m_database[TGCId::Endcap][TGCId::WT] = std::make_unique<TGCDatabaseInPP>(filename, "EWT");
19 m_database[TGCId::Endcap][TGCId::SD] = std::make_unique<TGCDatabaseInPP>(filename, "ESD");
20 m_database[TGCId::Endcap][TGCId::ST] = std::make_unique<TGCDatabaseInPP>(filename, "EST");
21 m_database[TGCId::Endcap][TGCId::WI] = std::make_unique<TGCDatabaseInPP>(filename, "EWI");
22 m_database[TGCId::Endcap][TGCId::SI] = std::make_unique<TGCDatabaseInPP>(filename, "ESI");
23 m_database[TGCId::Forward][TGCId::WD] = std::make_unique<TGCDatabaseInPP>(filename, "FWD");
24 m_database[TGCId::Forward][TGCId::WT] = std::make_unique<TGCDatabaseInPP>(filename, "FWT");
25 m_database[TGCId::Forward][TGCId::SD] = std::make_unique<TGCDatabaseInPP>(filename, "FSD");
26 m_database[TGCId::Forward][TGCId::ST] = std::make_unique<TGCDatabaseInPP>(filename, "FST");
27 m_database[TGCId::Forward][TGCId::WI] = std::make_unique<TGCDatabaseInPP>(filename, "FWI");
28 m_database[TGCId::Forward][TGCId::SI] = std::make_unique<TGCDatabaseInPP>(filename, "FSI");
29}
30
31
33 const bool orChannel) const {
34 if(channelId){
35 if(channelId->getChannelIdType()==TGCChannelId::ChannelIdType::PPIn)
36 return getChannelOut(channelId, orChannel);
37 if(channelId->getChannelIdType()==TGCChannelId::ChannelIdType::PPOut)
38 return getChannelIn(channelId, orChannel);
39 }
40 return nullptr;
41}
42
44 const bool orChannel) const {
45 if(ppout->isValid()==false) return nullptr;
46
47 TGCId::ModuleType moduleType = ppout->getModuleType();
48
49 int ndatabaseP = 1;
50 TGCDatabase* databaseP[2];
51 databaseP[0] = m_database[ppout->getRegionType()][moduleType].get();
52 // EI/FI
53 // wire(TGCId::WI) and strip(TGCId::SI) of a chamber
54 // use the same SLB chip
55 // The SLB chip is treated as TGCId::WI in TGCCableSLBToSSW.cxx
56 if(moduleType==TGCId::WI) {
57 databaseP[1] = m_database[ppout->getRegionType()][TGCId::SI].get();
58 ndatabaseP = 2;
59 }
60
61 int id=-1, block=-1, channel=-1;
62 bool found = false;
63
64 for(int idatabaseP=0; idatabaseP<ndatabaseP; idatabaseP++) {
65 // EI/FI
66 // wire(TGCId::WI) and strip(TGCId::SI) of a chamber
67 // use the same SLB chip
68 // The SLB chip is treated as TGCId::WI in TGCCableSLBToSSW.cxx
69 if(idatabaseP==1) {
70 moduleType = TGCId::SI;
71 }
72
73 int indexIn[TGCDatabaseInPP::NIndexIn] =
74 {ppout->getId(), ppout->getBlock(), ppout->getChannel()};
75 int i = databaseP[idatabaseP]->getIndexDBIn(indexIn);
76 if(i<0) continue;
77
78 if(orChannel==false){
79 // first channel
80 id = databaseP[idatabaseP]->getEntry(i,3);
81 block = databaseP[idatabaseP]->getEntry(i,4);
82 channel = databaseP[idatabaseP]->getEntry(i,5);
83 if(id==-1 && block==-1 && channel==-1) continue;
84 found = true;
85 break;
86 } else {
87 // ored channel
88 if(databaseP[idatabaseP]->getEntrySize(i)==9) {
89 id = databaseP[idatabaseP]->getEntry(i,6);
90 block = databaseP[idatabaseP]->getEntry(i,7);
91 channel = databaseP[idatabaseP]->getEntry(i,8);
92 found = true;
93 }
94 }
95 }
96
97 if(!found) return nullptr;
98
99 TGCChannelPPIn* ppin =
100 new TGCChannelPPIn(ppout->getSideType(),
101 moduleType,
102 ppout->getRegionType(),
103 ppout->getSector(),
104 id,
105 block,
106 channel);
107
108 return ppin;
109}
110
112 const bool orChannel) const {
113 if(ppin->isValid()==false) return nullptr;
114
115 const int ppinChannel = ppin->getChannel();
116 const int ppinBlock = ppin->getBlock();
117 const int ppinId = ppin->getId();
118
119 TGCDatabase* databaseP =
120 m_database[ppin->getRegionType()][ppin->getModuleType()].get();
121
122 TGCChannelPPOut* ppout = nullptr;
123 const int MaxEntry = databaseP->getMaxEntry();
124 for(int i=0; i<MaxEntry; i++){
125 bool cond1 = (databaseP->getEntry(i,5)==ppinChannel)&&
126 (databaseP->getEntry(i,4)==ppinBlock)&&
127 (databaseP->getEntry(i,3)==ppinId);
128
129 bool cond2 = (databaseP->getEntrySize(i)==9)&&
130 (databaseP->getEntry(i,8)==ppinChannel)&&
131 (databaseP->getEntry(i,7)==ppinBlock)&&
132 (databaseP->getEntry(i,6)==ppinId);
133
134 if(cond1 || cond2) {
135 int id = databaseP->getEntry(i,0);
136 int block = databaseP->getEntry(i,1);
137 int channel = databaseP->getEntry(i,2);
138
139 //TGCChannelSLBIn::CellType cellType = TGCChannelSLBIn::NoCellType;
140 int channelInSLB = -1;
141 bool adjacent = false;
142 TGCId::ModuleType moduleType = ppin->getModuleType();
143 if(block==0||block==2){//C,D
144 int lengthOfC = TGCChannelSLBIn::getLengthOfSLB(moduleType,
146 int lengthOfD = TGCChannelSLBIn::getLengthOfSLB(moduleType,
148 if(channel<lengthOfD){
149 int adjacentOfD = TGCChannelSLBIn::getAdjacentOfSLB(moduleType,
151 //cellType = TGCChannelSLBIn::CellD;
152 channelInSLB = channel;
153 if(channelInSLB<adjacentOfD||channelInSLB>=lengthOfD-adjacentOfD)
154 adjacent = true;
155 } else {
156 int adjacentOfC = TGCChannelSLBIn::getAdjacentOfSLB(moduleType,
158 //cellType = TGCChannelSLBIn::CellC;
159 channelInSLB = channel-lengthOfD;
160 if(channelInSLB<adjacentOfC||channelInSLB>=lengthOfC-adjacentOfC)
161 adjacent = true;
162 }
163 }
164 if(block==1||block==3){//A,B
165 int lengthOfA = TGCChannelSLBIn::getLengthOfSLB(moduleType,
167 int lengthOfB = TGCChannelSLBIn::getLengthOfSLB(moduleType,
169 if(channel<lengthOfB){
170 int adjacentOfB = TGCChannelSLBIn::getAdjacentOfSLB(moduleType,
172 //cellType = TGCChannelSLBIn::CellB;
173 channelInSLB = channel;
174 if(channelInSLB<adjacentOfB||channelInSLB>=lengthOfB-adjacentOfB)
175 adjacent = true;
176 } else {
177 int adjacentOfA = TGCChannelSLBIn::getAdjacentOfSLB(moduleType,
179 //cellType = TGCChannelSLBIn::CellA;
180 channelInSLB = channel-lengthOfB;
181 if(channelInSLB<adjacentOfA||channelInSLB>=lengthOfA-adjacentOfA)
182 adjacent = true;
183 }
184 }
185
186 if((moduleType == TGCId::SD) &&
187 (ppin->getRegionType() == TGCId::Endcap)){
188 // Strips of Middle doublets are ORed to the adjacent chamber
189 adjacent = cond2;
190 }
191
192 if(adjacent==orChannel){
193 ppout = new TGCChannelPPOut(ppin->getSideType(),
194 ppin->getModuleType(),
195 ppin->getRegionType(),
196 ppin->getSector(),
197 id,
198 block,
199 channel);
200 break;
201 }
202 }
203 }
204
205 return ppout;
206}
207
208} //end of namespace
virtual TGCChannelId * getChannelOut(const TGCChannelId *ppin, const bool orChannel=false) const
std::array< std::array< std::unique_ptr< TGCDatabase >, TGCId::MaxModuleType >, TGCId::MaxRegionType > m_database
virtual TGCChannelId * getChannel(const TGCChannelId *channelId, const bool orChannel=false) const
virtual TGCChannelId * getChannelIn(const TGCChannelId *ppout, const bool orChannel=false) const
TGCCable(CableType type=NoCableType)
Definition TGCCable.h:24
virtual bool isValid() const
static int getAdjacentOfSLB(TGCId::ModuleType moduleType, CellType cellType)
static int getLengthOfSLB(TGCId::ModuleType moduleType, CellType cellType)
virtual int getIndexDBIn(int *indexIn) const
virtual int getMaxEntry(void) const
virtual int getEntry(int entry, int column) const
virtual int getEntrySize(int entry) const
ModuleType getModuleType(void) const
Definition TGCId.h:122
RegionType getRegionType(void) const
Definition TGCId.h:125
virtual int getSector() const
Definition TGCId.h:129
SideType getSideType(void) const
Definition TGCId.h:121
int getId() const
Definition TGCId.h:131