22 const vector<TrajectoryMeasurement> & measurements = trajectory->measurements();
23 for(vector<TrajectoryMeasurement>::const_iterator it = measurements.begin(); it!=measurements.end(); it++){
27 if( !trajState.
isValid())
continue;
32 double cosine = trackDirection.
z()/trackDirection.mag();
35 if(!useStrip)
continue;
42 const std::vector<uint8_t> & amplitudes = matchedHit->monoHit()->cluster()->amplitudes();
43 mono.
charge = accumulate(amplitudes.begin(), amplitudes.end(), 0);
45 for(
unsigned int i=0;
i<amplitudes.size();
i++){
if(amplitudes[
i]>=254)mono.
NSaturating++;}
47 const std::vector<uint8_t> & amplitudesSt = matchedHit->stereoHit()->cluster()->amplitudes();
48 stereo.
charge = accumulate(amplitudesSt.begin(), amplitudesSt.end(), 0);
50 for(
unsigned int i=0;
i<amplitudes.size();
i++){
if(amplitudes[
i]>=254)stereo.
NSaturating++;}
52 mono.
detId= matchedHit->monoHit()->geographicalId();
53 stereo.
detId= matchedHit->stereoHit()->geographicalId();
56 hits.push_back(stereo);
59 if(!useStrip)
continue;
67 const std::vector<uint8_t> & amplitudes = singleHit->
cluster()->amplitudes();
68 mono.
charge = accumulate(amplitudes.begin(), amplitudes.end(), 0);
70 for(
unsigned int i=0;
i<amplitudes.size();
i++){
if(amplitudes[
i]>=254)mono.
NSaturating++;}
75 }
else if(
const SiStripRecHit2D* singleHit=dynamic_cast<const SiStripRecHit2D*>(recHit)){
76 if(!useStrip)
continue;
83 const std::vector<uint8_t> & amplitudes = singleHit->cluster()->amplitudes();
84 mono.
charge = accumulate(amplitudes.begin(), amplitudes.end(), 0);
86 for(
unsigned int i=0;
i<amplitudes.size();
i++){
if(amplitudes[
i]>=254)mono.
NSaturating++;}
88 mono.
detId= singleHit->geographicalId();
91 }
else if(
const SiStripRecHit1D* single1DHit=dynamic_cast<const SiStripRecHit1D*>(recHit)){
92 if(!useStrip)
continue;
99 const std::vector<uint8_t> & amplitudes = single1DHit->cluster()->amplitudes();
100 mono.
charge = accumulate(amplitudes.begin(), amplitudes.end(), 0);
102 for(
unsigned int i=0;
i<amplitudes.size();
i++){
if(amplitudes[
i]>=254)mono.
NSaturating++;}
104 mono.
detId= single1DHit->geographicalId();
105 hits.push_back(mono);
108 }
else if(
const SiPixelRecHit* pixelHit=dynamic_cast<const SiPixelRecHit*>(recHit)){
109 if(!usePixel)
continue;
116 pixel.
charge = pixelHit->cluster()->charge();
118 pixel.
detId= pixelHit->geographicalId();
119 hits.push_back(pixel);
132 size_t n = hits.size();
133 for(
size_t i = 0;
i<
n;
i ++)
137 return (n>0)?
pow(result/n,1./expo):0.;
146 Int_t NofMax=0; Int_t recur255=1; Int_t recur254=1;
147 bool MaxOnStart=
false;
bool MaxInMiddle=
false, MaxOnEnd =
false;
150 if(ampls.size()!=1 && ((ampls[0]>ampls[1])
151 || (ampls.size()>2 && ampls[0]==ampls[1] && ampls[1]>ampls[2] && ampls[0]!=254 && ampls[0]!=255)
152 || (ampls.size()==2 && ampls[0]==ampls[1] && ampls[0]!=254 && ampls[0]!=255)) ){
153 NofMax=NofMax+1; MaxOnStart=
true; }
157 for (
unsigned int i =1;
i < ampls.size()-1;
i++) {
158 if( (ampls[
i]>ampls[
i-1] && ampls[
i]>ampls[
i+1])
159 || (ampls.size()>3 &&
i>0 &&
i<ampls.size()-2 && ampls[
i]==ampls[
i+1] && ampls[
i]>ampls[
i-1] && ampls[
i]>ampls[
i+2] && ampls[
i]!=254 && ampls[
i]!=255) ){
160 NofMax=NofMax+1; MaxInMiddle=
true; MaxPos=
i;
162 if(ampls[
i]==255 && ampls[
i]==ampls[
i-1]) {
164 MaxPos=
i-(recur255/2);
165 if(ampls[
i]>ampls[
i+1]){NofMax=NofMax+1;MaxInMiddle=
true;}
167 if(ampls[
i]==254 && ampls[
i]==ampls[
i-1]) {
169 MaxPos=
i-(recur254/2);
170 if(ampls[
i]>ampls[
i+1]){NofMax=NofMax+1;MaxInMiddle=
true;}
176 if(ampls[ampls.size()-1]>ampls[ampls.size()-2]
177 || (ampls.size()>2 && ampls[ampls.size()-1]==ampls[ampls.size()-2] && ampls[ampls.size()-2]>ampls[ampls.size()-3] )
178 || ampls[ampls.size()-1]==255){
179 NofMax=NofMax+1; MaxOnEnd=
true; }
182 if(ampls.size()==1){ NofMax=1;}
200 bool shapecdtn=
false;
203 Float_t C_M=0.0; Float_t C_D=0.0; Float_t C_Mn=10000; Float_t C_Dn=10000; Float_t C_Mnn=10000; Float_t C_Dnn=10000;
205 Float_t coeff1=1.7; Float_t coeff2=2.0;
206 Float_t coeffn=0.10; Float_t coeffnn=0.02; Float_t noise=4.0;
210 if(MaxOnStart==
true){
211 C_M=(Float_t)ampls[0]; C_D=(Float_t)ampls[1];
212 if(ampls.size()<3) shapecdtn=
true ;
213 else if(ampls.size()==3){C_Dn=(Float_t)ampls[2] ;
if(C_Dn<=coeff1*coeffn*C_D+coeff2*coeffnn*C_M+2*noise || C_D==255) shapecdtn=
true;}
214 else if(ampls.size()>3){ C_Dn=(Float_t)ampls[2]; C_Dnn=(Float_t)ampls[3] ;
215 if((C_Dn<=coeff1*coeffn*C_D+coeff2*coeffnn*C_M+2*noise || C_D==255)
216 && C_Dnn<=coeff1*coeffn*C_Dn+coeff2*coeffnn*C_D+2*noise){
222 C_M=(Float_t)ampls[ampls.size()-1]; C_D=(Float_t)ampls[ampls.size()-2];
223 if(ampls.size()<3) shapecdtn=
true ;
224 else if(ampls.size()==3){C_Dn=(Float_t)ampls[0] ;
if(C_Dn<=coeff1*coeffn*C_D+coeff2*coeffnn*C_M+2*noise || C_D==255) shapecdtn=
true;}
225 else if(ampls.size()>3){C_Dn=(Float_t)ampls[ampls.size()-3] ; C_Dnn=(Float_t)ampls[ampls.size()-4] ;
226 if((C_Dn<=coeff1*coeffn*C_D+coeff2*coeffnn*C_M+2*noise || C_D==255)
227 && C_Dnn<=coeff1*coeffn*C_Dn+coeff2*coeffnn*C_D+2*noise){
232 if(MaxInMiddle==
true){
233 C_M=(Float_t)ampls[MaxPos];
234 int LeftOfMaxPos=MaxPos-1;
if(LeftOfMaxPos<=0)LeftOfMaxPos=0;
235 int RightOfMaxPos=MaxPos+1;
if(RightOfMaxPos>=(
int)ampls.size())RightOfMaxPos=ampls.size()-1;
237 if(ampls[LeftOfMaxPos]<ampls[RightOfMaxPos]){ C_D=(Float_t)ampls[RightOfMaxPos]; C_Mn=(Float_t)ampls[LeftOfMaxPos];CDPos=RightOfMaxPos;}
else{ C_D=(Float_t)ampls[LeftOfMaxPos]; C_Mn=(Float_t)ampls[RightOfMaxPos];CDPos=LeftOfMaxPos;}
238 if(C_Mn<coeff1*coeffn*C_M+coeff2*coeffnn*C_D+2*noise || C_M==255){
239 if(ampls.size()==3) shapecdtn=
true ;
240 else if(ampls.size()>3){
242 if(ampls.size()-CDPos-1==0){
245 if(ampls.size()-CDPos-1==1){
246 C_Dn=(Float_t)ampls[CDPos+1];
249 if(ampls.size()-CDPos-1>1){
250 C_Dn=(Float_t)ampls[CDPos+1];
251 C_Dnn=(Float_t)ampls[CDPos+2];
254 C_Mnn=(Float_t)ampls[MaxPos-2];
256 else if(MaxPos<2) C_Mnn=0;
263 C_Dn=(Float_t)ampls[0];
267 C_Dn=(Float_t)ampls[CDPos-1];
268 C_Dnn=(Float_t)ampls[CDPos-2];
270 if(ampls.size()-LeftOfMaxPos>1 && MaxPos+2<(int)(ampls.size())-1){
271 C_Mnn=(Float_t)ampls[MaxPos+2];
274 if((C_Dn<=coeff1*coeffn*C_D+coeff2*coeffnn*C_M+2*noise || C_D==255)
275 && C_Mnn<=coeff1*coeffn*C_Mn+coeff2*coeffnn*C_M+2*noise
276 && C_Dnn<=coeff1*coeffn*C_Dn+coeff2*coeffnn*C_D+2*noise) {
284 if(ampls.size()==1){shapecdtn=
true;}
LocalVector localDirection() const
std::vector< DeDxHit > DeDxHitCollection
ClusterRef const & cluster() const
DetId geographicalId() const
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< float >, ROOT::Math::LocalCoordinateSystemTag > LocalVector
vector in local coordinate system
Power< A, B >::type pow(const A &a, const B &b)