88 {
89
90
91 for ( G4int i = 0; i < 43; i++ )
92 {
93 for ( G4int j = 0; j < 288; j++ ) { digiPointer[i][j] = -1; }
94 }
95
96 G4int
NHits, layerId, cellId, posFlag;
97 G4double edep, driftD, driftT, globalT, theta, cosTheta, enterAngle;
98 G4double mean, sigma, mean1, mean2, sigma1, sigma2, f, sig, delSig, fRandom, driftDNew,
99 driftTNew;
100 G4double tempEff;
101 G4double resLargest, resSmallest, resRatio;
102
103 G4DigiManager* DigiMan = G4DigiManager::GetDMpointer();
104
105
106 G4int THCID = -1;
107 THCID = DigiMan->GetHitsCollectionID( "BesMdcHitsCollection" );
108
109
112
113 if ( THC )
114 {
116 NHits = THC->entries();
117 for ( G4int i = 0; i <
NHits; i++ )
118 {
119 layerId = ( *THC )[i]->GetLayerNo();
120 cellId = ( *THC )[i]->GetCellNo();
121 edep = ( *THC )[i]->GetEdep();
122 driftD = ( *THC )[i]->GetDriftD();
123 globalT = ( *THC )[i]->GetGlobalT();
124 theta = ( *THC )[i]->GetTheta();
125 cosTheta =
cos( theta );
126 enterAngle = ( *THC )[i]->GetEnterAngle();
127 posFlag = ( *THC )[i]->GetPosFlag();
128
129
130 mdcCalPointer->SetHitPointer( ( *THC )[i] );
131
132
133 if ( effFlag == 0 )
134 {
135
136 tempEff = mdcTunningSvc->GetEff( layerId, cellId, driftD, cosTheta, posFlag );
137 }
138 else { tempEff = layerEff[layerId]; }
139 fRandom = G4UniformRand();
140 if ( fRandom > tempEff ) continue;
141
142
143
144 if ( smearFlag == 0 )
145 {
146 driftDNew = driftD;
147 }
148 else if ( smearFlag == 1 )
149 {
150
151
152 mdcTunningSvc->GetRes3( layerId, cellId, driftD, cosTheta, posFlag, enterAngle, f,
153 mean1, sigma1, mean2, sigma2, resLargest, resSmallest,
154 resRatio );
155
156
157
158
159
160 driftDNew =
161 Smear( driftD - ( f * mean1 + ( 1 - f ) * mean2 ), f, mean1, sigma1, mean2, sigma2,
162 resLargest, resSmallest, resRatio );
163 }
164 else if ( smearFlag == 2 )
165 {
166 driftDNew = Smear( driftD );
167 }
168 else
169 {
170 G4cerr << "MdcDigitizer::wrong smearFlag: " << smearFlag << G4endl;
171 abort();
172 }
173
174
175 driftTNew = mdcCalPointer->D2T( driftDNew );
176
177
178 driftTNew += mdcCalPointer->GetTimeWalk();
179
180
181 driftTNew += mdcCalPointer->GetT0();
182
183
184 driftTNew += globalT;
185
186
187
188
189
190 if ( std::isnan( driftTNew ) )
191 {
192 G4cout << "MdcDigitizer::error, driftT is nan" << G4endl;
193 continue;
194 }
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213 BesMdcDigi* newDigi = new BesMdcDigi();
214 newDigi->
SetTrackID( ( *THC )[i]->GetTrackID() );
219 G4int NbDigis = digisCollection->insert( newDigi );
220 digiPointer[layerId][cellId] = NbDigis - 1;
221 }
222
223 if ( noiseFlag == 1 ) AddNoise();
224 if ( noiseFlag == 2 )
225 {
226 ifstream readNoiseLevel(
"$MDCSIMROOT/share/noiselevel.txt" );
227 if ( !readNoiseLevel.good() )
228 { std::cout << " Error , noiselevel file not exist " << std::endl; }
229 else { std::cout << " MdcDigitizer:: Open noiselevel file " << std::endl; }
230 G4int NLayer = mdcGeoPointer->SignalLayerNo();
231 G4double level;
232 for ( G4int i = 0; i < NLayer; i++ )
233 {
234 readNoiseLevel >> level;
235 mixLevel.push_back( level );
236 }
237 AddNoise2();
238 }
239
240 if ( verboseLevel > 0 )
241 {
242 G4cout << "\n-------->digis Collection: in this event they are "
243 << digisCollection->entries() << " digis in the MDC chambers: " << G4endl;
244 digisCollection->PrintAllDigi();
245 }
246 StoreDigiCollection( digisCollection );
247 }
248}
double cos(const BesAngle a)
G4TDigiCollection< BesMdcDigi > BesMdcDigisCollection
G4THitsCollection< BesMdcHit > BesMdcHitsCollection
void NHits(const AList< TMLink > &links, unsigned nHits[50])
returns # of hits per layer.
void SetEdep(G4double de)
void SetCellNo(G4int cell)
void SetDriftT(G4double time)
void SetTrackID(G4int track)
void SetLayerNo(G4int layer)